[vlc-devel] [PATCH v2 25/29] opengl: refactor renderer creation and destruction
Romain Vimont
rom1v at videolabs.io
Thu Feb 6 14:17:54 CET 2020
Replace opengl_init_program() and opengl_deinit_program() by
CreateRenderer() and DeleteRenderer(), independant of
vout_display_opengl_t.
---
modules/video_output/opengl/vout_helper.c | 49 +++++++++++------------
1 file changed, 23 insertions(+), 26 deletions(-)
diff --git a/modules/video_output/opengl/vout_helper.c b/modules/video_output/opengl/vout_helper.c
index 6a502543b8..0095ac4dd2 100644
--- a/modules/video_output/opengl/vout_helper.c
+++ b/modules/video_output/opengl/vout_helper.c
@@ -357,12 +357,11 @@ error:
}
static void
-opengl_deinit_program(vout_display_opengl_t *vgl)
+DeleteRenderer(struct vlc_gl_renderer *renderer)
{
- struct vlc_gl_renderer *renderer = vgl->renderer;
vlc_gl_interop_Delete(renderer->interop);
if (renderer->program_id != 0)
- vgl->vt.DeleteProgram(renderer->program_id);
+ renderer->vt->DeleteProgram(renderer->program_id);
#ifdef HAVE_LIBPLACEBO
FREENULL(renderer->uloc.pl_vars);
@@ -373,26 +372,27 @@ opengl_deinit_program(vout_display_opengl_t *vgl)
free(renderer);
}
-static int
-opengl_init_program(vout_display_opengl_t *vgl, vlc_video_context *context,
- const video_format_t *fmt, bool b_dump_shaders)
+static struct vlc_gl_renderer *
+CreateRenderer(vlc_gl_t *gl, const opengl_vtable_t *vt,
+ vlc_video_context *context, const video_format_t *fmt,
+ bool b_dump_shaders)
{
struct vlc_gl_renderer *renderer = calloc(1, sizeof(*renderer));
if (!renderer)
- return VLC_ENOMEM;
+ return NULL;
struct vlc_gl_interop *interop =
- vlc_gl_interop_New(vgl->gl, &vgl->vt, context, fmt, false);
+ vlc_gl_interop_New(gl, vt, context, fmt, false);
if (!interop)
{
free(renderer);
- return VLC_ENOMEM;
+ return NULL;
}
renderer->interop = interop;
- renderer->gl = vgl->gl;
- renderer->vt = &vgl->vt;
+ renderer->gl = gl;
+ renderer->vt = vt;
renderer->b_dump_shaders = b_dump_shaders;
#if defined(USE_OPENGL_ES2)
renderer->glsl_version = 100;
@@ -404,7 +404,7 @@ opengl_init_program(vout_display_opengl_t *vgl, vlc_video_context *context,
#ifdef HAVE_LIBPLACEBO
// Create the main libplacebo context
- renderer->pl_ctx = vlc_placebo_Create(VLC_OBJECT(vgl->gl));
+ renderer->pl_ctx = vlc_placebo_Create(VLC_OBJECT(gl));
if (renderer->pl_ctx) {
# if PL_API_VER >= 20
renderer->pl_sh = pl_shader_alloc(renderer->pl_ctx, NULL);
@@ -416,20 +416,18 @@ opengl_init_program(vout_display_opengl_t *vgl, vlc_video_context *context,
}
#endif
- vgl->renderer = renderer;
-
int ret = opengl_link_program(renderer);
if (ret != VLC_SUCCESS)
{
- opengl_deinit_program(vgl);
- return VLC_EGENERIC;
+ DeleteRenderer(renderer);
+ return NULL;
}
getOrientationTransformMatrix(interop->fmt.orientation,
renderer->var.OrientationMatrix);
getViewpointMatrixes(renderer, interop->fmt.projection_mode);
- return VLC_SUCCESS;
+ return renderer;
}
static void
@@ -623,10 +621,11 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
}
GL_ASSERT_NOERROR();
- int ret = opengl_init_program(vgl, context, fmt, b_dump_shaders);
- if (ret != VLC_SUCCESS)
+ struct vlc_gl_renderer *renderer = vgl->renderer =
+ CreateRenderer(gl, &vgl->vt, context, fmt, b_dump_shaders);
+ if (!vgl->renderer)
{
- msg_Warn(gl, "could not init tex converter for %4.4s",
+ msg_Warn(gl, "Could not create renderer for %4.4s",
(const char *) &fmt->i_chroma);
vlc_gl_sub_renderer_Delete(vgl->sub_renderer);
free(vgl);
@@ -635,7 +634,6 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
GL_ASSERT_NOERROR();
- struct vlc_gl_renderer *renderer = vgl->renderer;
const struct vlc_gl_interop *interop = renderer->interop;
/* Update the fmt to main program one */
renderer->fmt = interop->fmt;
@@ -659,9 +657,9 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
if (!interop->handle_texs_gen)
{
- ret = vlc_gl_interop_GenerateTextures(interop, renderer->tex_width,
- renderer->tex_height,
- renderer->textures);
+ int ret = vlc_gl_interop_GenerateTextures(interop, renderer->tex_width,
+ renderer->tex_height,
+ renderer->textures);
if (ret != VLC_SUCCESS)
{
vout_display_opengl_Delete(vgl);
@@ -711,8 +709,7 @@ void vout_display_opengl_Delete(vout_display_opengl_t *vgl)
const bool main_del_texs = !interop->handle_texs_gen;
vlc_gl_sub_renderer_Delete(vgl->sub_renderer);
-
- opengl_deinit_program(vgl);
+ DeleteRenderer(vgl->renderer);
vgl->vt.DeleteBuffers(1, &renderer->vertex_buffer_object);
vgl->vt.DeleteBuffers(1, &renderer->index_buffer_object);
--
2.25.0
More information about the vlc-devel
mailing list