vlc | branch: master | Romain Vimont <[email protected]> | Thu Jan 30 15:02:52 2020 +0100| [1166c41a3c5720f45349929611ccd4fa9c6eb017] | committer: Jean-Baptiste Kempf
opengl: move vtable to vlc_gl_api Use a separate component for storing OpenGL API-specific utils (for now, only the vtable). Signed-off-by: Jean-Baptiste Kempf <[email protected]> > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=1166c41a3c5720f45349929611ccd4fa9c6eb017 --- modules/video_output/Makefile.am | 2 + modules/video_output/opengl/gl_api.c | 135 +++++++++++++++++++++++++++ modules/video_output/opengl/gl_api.h | 41 ++++++++ modules/video_output/opengl/vout_helper.c | 149 +++++++----------------------- 4 files changed, 209 insertions(+), 118 deletions(-) diff --git a/modules/video_output/Makefile.am b/modules/video_output/Makefile.am index cee3d447a9..a61d15f20f 100644 --- a/modules/video_output/Makefile.am +++ b/modules/video_output/Makefile.am @@ -4,6 +4,8 @@ vout_LTLIBRARIES = EXTRA_DIST += video_output/README OPENGL_COMMONSOURCES = video_output/opengl/vout_helper.c \ + video_output/opengl/gl_api.c \ + video_output/opengl/gl_api.h \ video_output/opengl/gl_common.h \ video_output/opengl/gl_util.c \ video_output/opengl/gl_util.h \ diff --git a/modules/video_output/opengl/gl_api.c b/modules/video_output/opengl/gl_api.c new file mode 100644 index 0000000000..69859a815e --- /dev/null +++ b/modules/video_output/opengl/gl_api.c @@ -0,0 +1,135 @@ +/***************************************************************************** + * gl_api.h + ***************************************************************************** + * Copyright (C) 2020 VLC authors and VideoLAN + * Copyright (C) 2020 Videolabs + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "gl_api.h" + +#include <vlc_common.h> +#include <vlc_opengl.h> + +#include "gl_common.h" + +int +vlc_gl_api_Init(struct vlc_gl_api *api, vlc_gl_t *gl) +{ +#if defined(USE_OPENGL_ES2) || defined(HAVE_GL_CORE_SYMBOLS) +#define GET_PROC_ADDR_CORE(name) api->vt.name = gl##name +#else +#define GET_PROC_ADDR_CORE(name) GET_PROC_ADDR_EXT(name, true) +#endif +#define GET_PROC_ADDR_EXT(name, critical) do { \ + api->vt.name = vlc_gl_GetProcAddress(gl, "gl"#name); \ + if (api->vt.name == NULL && critical) { \ + msg_Err(gl, "gl"#name" symbol not found, bailing out"); \ + return VLC_EGENERIC; \ + } \ +} while(0) +#if defined(USE_OPENGL_ES2) +#define GET_PROC_ADDR(name) GET_PROC_ADDR_CORE(name) +#define GET_PROC_ADDR_CORE_GL(name) GET_PROC_ADDR_EXT(name, false) /* optional for GLES */ +#else +#define GET_PROC_ADDR(name) GET_PROC_ADDR_EXT(name, true) +#define GET_PROC_ADDR_CORE_GL(name) GET_PROC_ADDR_CORE(name) +#endif +#define GET_PROC_ADDR_OPTIONAL(name) GET_PROC_ADDR_EXT(name, false) /* GL 3 or more */ + + GET_PROC_ADDR_CORE(BindTexture); + GET_PROC_ADDR_CORE(BlendFunc); + GET_PROC_ADDR_CORE(Clear); + GET_PROC_ADDR_CORE(ClearColor); + GET_PROC_ADDR_CORE(DeleteTextures); + GET_PROC_ADDR_CORE(DepthMask); + GET_PROC_ADDR_CORE(Disable); + GET_PROC_ADDR_CORE(DrawArrays); + GET_PROC_ADDR_CORE(DrawElements); + GET_PROC_ADDR_CORE(Enable); + GET_PROC_ADDR_CORE(Finish); + GET_PROC_ADDR_CORE(Flush); + GET_PROC_ADDR_CORE(GenTextures); + GET_PROC_ADDR_CORE(GetError); + GET_PROC_ADDR_CORE(GetIntegerv); + GET_PROC_ADDR_CORE(GetString); + GET_PROC_ADDR_CORE(PixelStorei); + GET_PROC_ADDR_CORE(TexImage2D); + GET_PROC_ADDR_CORE(TexParameterf); + GET_PROC_ADDR_CORE(TexParameteri); + GET_PROC_ADDR_CORE(TexSubImage2D); + GET_PROC_ADDR_CORE(Viewport); + + GET_PROC_ADDR_CORE_GL(GetTexLevelParameteriv); + GET_PROC_ADDR_CORE_GL(TexEnvf); + + GET_PROC_ADDR(CreateShader); + GET_PROC_ADDR(ShaderSource); + GET_PROC_ADDR(CompileShader); + GET_PROC_ADDR(AttachShader); + GET_PROC_ADDR(DeleteShader); + + GET_PROC_ADDR(GetProgramiv); + GET_PROC_ADDR(GetShaderiv); + GET_PROC_ADDR(GetProgramInfoLog); + GET_PROC_ADDR(GetShaderInfoLog); + + GET_PROC_ADDR(GetUniformLocation); + GET_PROC_ADDR(GetAttribLocation); + GET_PROC_ADDR(VertexAttribPointer); + GET_PROC_ADDR(EnableVertexAttribArray); + GET_PROC_ADDR(UniformMatrix4fv); + GET_PROC_ADDR(UniformMatrix3fv); + GET_PROC_ADDR(UniformMatrix2fv); + GET_PROC_ADDR(Uniform4fv); + GET_PROC_ADDR(Uniform4f); + GET_PROC_ADDR(Uniform3f); + GET_PROC_ADDR(Uniform2f); + GET_PROC_ADDR(Uniform1f); + GET_PROC_ADDR(Uniform1i); + + GET_PROC_ADDR(CreateProgram); + GET_PROC_ADDR(LinkProgram); + GET_PROC_ADDR(UseProgram); + GET_PROC_ADDR(DeleteProgram); + + GET_PROC_ADDR(ActiveTexture); + + GET_PROC_ADDR(GenBuffers); + GET_PROC_ADDR(BindBuffer); + GET_PROC_ADDR(BufferData); + GET_PROC_ADDR(DeleteBuffers); + + GET_PROC_ADDR_OPTIONAL(GetFramebufferAttachmentParameteriv); + + GET_PROC_ADDR_OPTIONAL(BufferSubData); + GET_PROC_ADDR_OPTIONAL(BufferStorage); + GET_PROC_ADDR_OPTIONAL(MapBufferRange); + GET_PROC_ADDR_OPTIONAL(FlushMappedBufferRange); + GET_PROC_ADDR_OPTIONAL(UnmapBuffer); + GET_PROC_ADDR_OPTIONAL(FenceSync); + GET_PROC_ADDR_OPTIONAL(DeleteSync); + GET_PROC_ADDR_OPTIONAL(ClientWaitSync); +#undef GET_PROC_ADDR + + GL_ASSERT_NOERROR(&api->vt); + + return VLC_SUCCESS; +} diff --git a/modules/video_output/opengl/gl_api.h b/modules/video_output/opengl/gl_api.h new file mode 100644 index 0000000000..86add17ce3 --- /dev/null +++ b/modules/video_output/opengl/gl_api.h @@ -0,0 +1,41 @@ +/***************************************************************************** + * gl_api.h + ***************************************************************************** + * Copyright (C) 2020 VLC authors and VideoLAN + * Copyright (C) 2020 Videolabs + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_GL_API_H +#define VLC_GL_API_H + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include <vlc_common.h> +#include <vlc_opengl.h> + +#include "gl_common.h" + +struct vlc_gl_api { + opengl_vtable_t vt; +}; + +int +vlc_gl_api_Init(struct vlc_gl_api *api, vlc_gl_t *gl); + +#endif diff --git a/modules/video_output/opengl/vout_helper.c b/modules/video_output/opengl/vout_helper.c index 61f1321f69..b29de3534d 100644 --- a/modules/video_output/opengl/vout_helper.c +++ b/modules/video_output/opengl/vout_helper.c @@ -39,6 +39,7 @@ #include <vlc_vout.h> #include <vlc_viewpoint.h> +#include "gl_api.h" #include "gl_util.h" #include "vout_helper.h" #include "internal.h" @@ -48,7 +49,7 @@ struct vout_display_opengl_t { vlc_gl_t *gl; - opengl_vtable_t vt; + struct vlc_gl_api api; struct vlc_gl_renderer *renderer; struct vlc_gl_sub_renderer *sub_renderer; @@ -100,106 +101,16 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt, vgl->gl = gl; -#if defined(USE_OPENGL_ES2) || defined(HAVE_GL_CORE_SYMBOLS) -#define GET_PROC_ADDR_CORE(name) vgl->vt.name = gl##name -#else -#define GET_PROC_ADDR_CORE(name) GET_PROC_ADDR_EXT(name, true) -#endif -#define GET_PROC_ADDR_EXT(name, critical) do { \ - vgl->vt.name = vlc_gl_GetProcAddress(gl, "gl"#name); \ - if (vgl->vt.name == NULL && critical) { \ - msg_Err(gl, "gl"#name" symbol not found, bailing out"); \ - free(vgl); \ - return NULL; \ - } \ -} while(0) -#if defined(USE_OPENGL_ES2) -#define GET_PROC_ADDR(name) GET_PROC_ADDR_CORE(name) -#define GET_PROC_ADDR_CORE_GL(name) GET_PROC_ADDR_EXT(name, false) /* optional for GLES */ -#else -#define GET_PROC_ADDR(name) GET_PROC_ADDR_EXT(name, true) -#define GET_PROC_ADDR_CORE_GL(name) GET_PROC_ADDR_CORE(name) -#endif -#define GET_PROC_ADDR_OPTIONAL(name) GET_PROC_ADDR_EXT(name, false) /* GL 3 or more */ - - GET_PROC_ADDR_CORE(BindTexture); - GET_PROC_ADDR_CORE(BlendFunc); - GET_PROC_ADDR_CORE(Clear); - GET_PROC_ADDR_CORE(ClearColor); - GET_PROC_ADDR_CORE(DeleteTextures); - GET_PROC_ADDR_CORE(DepthMask); - GET_PROC_ADDR_CORE(Disable); - GET_PROC_ADDR_CORE(DrawArrays); - GET_PROC_ADDR_CORE(DrawElements); - GET_PROC_ADDR_CORE(Enable); - GET_PROC_ADDR_CORE(Finish); - GET_PROC_ADDR_CORE(Flush); - GET_PROC_ADDR_CORE(GenTextures); - GET_PROC_ADDR_CORE(GetError); - GET_PROC_ADDR_CORE(GetIntegerv); - GET_PROC_ADDR_CORE(GetString); - GET_PROC_ADDR_CORE(PixelStorei); - GET_PROC_ADDR_CORE(TexImage2D); - GET_PROC_ADDR_CORE(TexParameterf); - GET_PROC_ADDR_CORE(TexParameteri); - GET_PROC_ADDR_CORE(TexSubImage2D); - GET_PROC_ADDR_CORE(Viewport); - - GET_PROC_ADDR_CORE_GL(GetTexLevelParameteriv); - GET_PROC_ADDR_CORE_GL(TexEnvf); - - GET_PROC_ADDR(CreateShader); - GET_PROC_ADDR(ShaderSource); - GET_PROC_ADDR(CompileShader); - GET_PROC_ADDR(AttachShader); - GET_PROC_ADDR(DeleteShader); - - GET_PROC_ADDR(GetProgramiv); - GET_PROC_ADDR(GetShaderiv); - GET_PROC_ADDR(GetProgramInfoLog); - GET_PROC_ADDR(GetShaderInfoLog); - - GET_PROC_ADDR(GetUniformLocation); - GET_PROC_ADDR(GetAttribLocation); - GET_PROC_ADDR(VertexAttribPointer); - GET_PROC_ADDR(EnableVertexAttribArray); - GET_PROC_ADDR(UniformMatrix4fv); - GET_PROC_ADDR(UniformMatrix3fv); - GET_PROC_ADDR(UniformMatrix2fv); - GET_PROC_ADDR(Uniform4fv); - GET_PROC_ADDR(Uniform4f); - GET_PROC_ADDR(Uniform3f); - GET_PROC_ADDR(Uniform2f); - GET_PROC_ADDR(Uniform1f); - GET_PROC_ADDR(Uniform1i); - - GET_PROC_ADDR(CreateProgram); - GET_PROC_ADDR(LinkProgram); - GET_PROC_ADDR(UseProgram); - GET_PROC_ADDR(DeleteProgram); - - GET_PROC_ADDR(ActiveTexture); - - GET_PROC_ADDR(GenBuffers); - GET_PROC_ADDR(BindBuffer); - GET_PROC_ADDR(BufferData); - GET_PROC_ADDR(DeleteBuffers); - - GET_PROC_ADDR_OPTIONAL(GetFramebufferAttachmentParameteriv); - - GET_PROC_ADDR_OPTIONAL(BufferSubData); - GET_PROC_ADDR_OPTIONAL(BufferStorage); - GET_PROC_ADDR_OPTIONAL(MapBufferRange); - GET_PROC_ADDR_OPTIONAL(FlushMappedBufferRange); - GET_PROC_ADDR_OPTIONAL(UnmapBuffer); - GET_PROC_ADDR_OPTIONAL(FenceSync); - GET_PROC_ADDR_OPTIONAL(DeleteSync); - GET_PROC_ADDR_OPTIONAL(ClientWaitSync); -#undef GET_PROC_ADDR - - GL_ASSERT_NOERROR(&vgl->vt); - - const char *extensions = (const char *)vgl->vt.GetString(GL_EXTENSIONS); + int ret = vlc_gl_api_Init(&vgl->api, gl); + if (ret != VLC_SUCCESS) + { + free(vgl); + return NULL; + } + + const opengl_vtable_t *vt = &vgl->api.vt; + + const char *extensions = (const char *) vt->GetString(GL_EXTENSIONS); assert(extensions); if (!extensions) { @@ -208,7 +119,7 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt, return NULL; } #if !defined(USE_OPENGL_ES2) - const unsigned char *ogl_version = vgl->vt.GetString(GL_VERSION); + const unsigned char *ogl_version = vt->GetString(GL_VERSION); bool supports_shaders = strverscmp((const char *)ogl_version, "2.0") >= 0; if (!supports_shaders) { @@ -221,7 +132,7 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt, /* Resize the format if it is greater than the maximum texture size * supported by the hardware */ GLint max_tex_size; - vgl->vt.GetIntegerv(GL_MAX_TEXTURE_SIZE, &max_tex_size); + vt->GetIntegerv(GL_MAX_TEXTURE_SIZE, &max_tex_size); if ((GLint)fmt->i_width > max_tex_size || (GLint)fmt->i_height > max_tex_size) @@ -241,7 +152,7 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt, bool b_dump_shaders = var_InheritInteger(gl, "verbose") >= 4; struct vlc_gl_renderer *renderer = vgl->renderer = - vlc_gl_renderer_New(gl, &vgl->vt, context, fmt, supports_npot, + vlc_gl_renderer_New(gl, vt, context, fmt, supports_npot, b_dump_shaders); if (!vgl->renderer) { @@ -251,10 +162,9 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt, return NULL; } - GL_ASSERT_NOERROR(&vgl->vt); + GL_ASSERT_NOERROR(vt); - vgl->sub_renderer = - vlc_gl_sub_renderer_New(gl, &vgl->vt, supports_npot); + vgl->sub_renderer = vlc_gl_sub_renderer_New(gl, vt, supports_npot); if (!vgl->sub_renderer) { msg_Err(gl, "Could not create sub renderer"); @@ -263,7 +173,7 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt, return NULL; } - GL_ASSERT_NOERROR(&vgl->vt); + GL_ASSERT_NOERROR(vt); if (renderer->fmt.projection_mode != PROJECTION_MODE_RECTANGULAR && vout_display_opengl_SetViewpoint(vgl, viewpoint) != VLC_SUCCESS) @@ -277,22 +187,24 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt, *subpicture_chromas = gl_subpicture_chromas; } - GL_ASSERT_NOERROR(&vgl->vt); + GL_ASSERT_NOERROR(vt); return vgl; } void vout_display_opengl_Delete(vout_display_opengl_t *vgl) { - GL_ASSERT_NOERROR(&vgl->vt); + const opengl_vtable_t *vt = &vgl->api.vt; + + GL_ASSERT_NOERROR(vt); /* */ - vgl->vt.Finish(); - vgl->vt.Flush(); + vt->Finish(); + vt->Flush(); vlc_gl_sub_renderer_Delete(vgl->sub_renderer); vlc_gl_renderer_Delete(vgl->renderer); - GL_ASSERT_NOERROR(&vgl->vt); + GL_ASSERT_NOERROR(vt); free(vgl); } @@ -312,26 +224,27 @@ void vout_display_opengl_SetWindowAspectRatio(vout_display_opengl_t *vgl, void vout_display_opengl_Viewport(vout_display_opengl_t *vgl, int x, int y, unsigned width, unsigned height) { - vgl->vt.Viewport(x, y, width, height); + const opengl_vtable_t *vt = &vgl->api.vt; + vt->Viewport(x, y, width, height); } int vout_display_opengl_Prepare(vout_display_opengl_t *vgl, picture_t *picture, subpicture_t *subpicture) { - GL_ASSERT_NOERROR(&vgl->vt); + GL_ASSERT_NOERROR(&vgl->api.vt); int ret = vlc_gl_renderer_Prepare(vgl->renderer, picture); if (ret != VLC_SUCCESS) return ret; ret = vlc_gl_sub_renderer_Prepare(vgl->sub_renderer, subpicture); - GL_ASSERT_NOERROR(&vgl->vt); + GL_ASSERT_NOERROR(&vgl->api.vt); return ret; } int vout_display_opengl_Display(vout_display_opengl_t *vgl, const video_format_t *source) { - GL_ASSERT_NOERROR(&vgl->vt); + GL_ASSERT_NOERROR(&vgl->api.vt); /* Why drawing here and not in Render()? Because this way, the OpenGL providers can call vout_display_opengl_Display to force redraw. @@ -348,7 +261,7 @@ int vout_display_opengl_Display(vout_display_opengl_t *vgl, /* Display */ vlc_gl_Swap(vgl->gl); - GL_ASSERT_NOERROR(&vgl->vt); + GL_ASSERT_NOERROR(&vgl->api.vt); return VLC_SUCCESS; } _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
