[vlc-commits] opengl: check return values of vlc_gl_GetProcAddress
Thomas Guillem
git at videolan.org
Fri Mar 10 18:50:17 CET 2017
vlc | branch: master | Thomas Guillem <thomas at gllm.fr> | Thu Mar 9 15:57:23 2017 +0100| [3bb29cbd8c8d9c2c7e174e0c314a32e254ef4af6] | committer: Thomas Guillem
opengl: check return values of vlc_gl_GetProcAddress
Modify the GET_PROC_ADDR macro to do so and add a critical argument. If
critical is no, the function is not mandatory, this is the case for persistent
mapping functions (converters.c do check these functions pointer).
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=3bb29cbd8c8d9c2c7e174e0c314a32e254ef4af6
---
modules/video_output/opengl/vout_helper.c | 111 +++++++++++++++---------------
1 file changed, 57 insertions(+), 54 deletions(-)
diff --git a/modules/video_output/opengl/vout_helper.c b/modules/video_output/opengl/vout_helper.c
index 5fce910..d5de83f 100644
--- a/modules/video_output/opengl/vout_helper.c
+++ b/modules/video_output/opengl/vout_helper.c
@@ -565,76 +565,79 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
#if !defined(USE_OPENGL_ES2)
const unsigned char *ogl_version = glGetString(GL_VERSION);
bool supports_shaders = strverscmp((const char *)ogl_version, "2.0") >= 0;
-#else
- bool supports_shaders = true;
+ if (!supports_shaders)
+ {
+ msg_Err(gl, "shaders not supported, bailing out\n");
+ free(vgl);
+ return NULL;
+ }
#endif
opengl_shaders_api_t *api = &vgl->api;
#if defined(USE_OPENGL_ES2)
-#define GET_PROC_ADDR(name) name
+#define GET_PROC_ADDR(name, critical) api->name = gl##name
#else
-#define GET_PROC_ADDR(name) vlc_gl_GetProcAddress(gl, #name)
+#define GET_PROC_ADDR(name, critical) do { \
+ api->name = vlc_gl_GetProcAddress(gl, "gl"#name); \
+ if (api->name == NULL && critical) { \
+ msg_Err(gl, "gl"#name" symbol not found, bailing out\n"); \
+ free(vgl); \
+ return NULL; \
+ } \
+} while(0)
#endif
- api->CreateShader = GET_PROC_ADDR(glCreateShader);
- api->ShaderSource = GET_PROC_ADDR(glShaderSource);
- api->CompileShader = GET_PROC_ADDR(glCompileShader);
- api->AttachShader = GET_PROC_ADDR(glAttachShader);
-
- api->GetProgramiv = GET_PROC_ADDR(glGetProgramiv);
- api->GetShaderiv = GET_PROC_ADDR(glGetShaderiv);
- api->GetProgramInfoLog = GET_PROC_ADDR(glGetProgramInfoLog);
- api->GetShaderInfoLog = GET_PROC_ADDR(glGetShaderInfoLog);
-
- api->DeleteShader = GET_PROC_ADDR(glDeleteShader);
-
- api->GetUniformLocation = GET_PROC_ADDR(glGetUniformLocation);
- api->GetAttribLocation = GET_PROC_ADDR(glGetAttribLocation);
- api->VertexAttribPointer = GET_PROC_ADDR(glVertexAttribPointer);
- api->EnableVertexAttribArray = GET_PROC_ADDR(glEnableVertexAttribArray);
- api->UniformMatrix4fv = GET_PROC_ADDR(glUniformMatrix4fv);
- api->Uniform4fv = GET_PROC_ADDR(glUniform4fv);
- api->Uniform4f = GET_PROC_ADDR(glUniform4f);
- api->Uniform2f = GET_PROC_ADDR(glUniform2f);
- api->Uniform1i = GET_PROC_ADDR(glUniform1i);
-
- api->CreateProgram = GET_PROC_ADDR(glCreateProgram);
- api->LinkProgram = GET_PROC_ADDR(glLinkProgram);
- api->UseProgram = GET_PROC_ADDR(glUseProgram);
- api->DeleteProgram = GET_PROC_ADDR(glDeleteProgram);
-
- api->GenBuffers = GET_PROC_ADDR(glGenBuffers);
- api->BindBuffer = GET_PROC_ADDR(glBindBuffer);
- api->BufferData = GET_PROC_ADDR(glBufferData);
- api->DeleteBuffers = GET_PROC_ADDR(glDeleteBuffers);
+ GET_PROC_ADDR(CreateShader, true);
+ GET_PROC_ADDR(ShaderSource, true);
+ GET_PROC_ADDR(CompileShader, true);
+ GET_PROC_ADDR(AttachShader, true);
+
+ GET_PROC_ADDR(GetProgramiv, true);
+ GET_PROC_ADDR(GetShaderiv, true);
+ GET_PROC_ADDR(GetProgramInfoLog, true);
+ GET_PROC_ADDR(GetShaderInfoLog, true);
+
+ GET_PROC_ADDR(DeleteShader, true);
+
+ GET_PROC_ADDR(GetUniformLocation, true);
+ GET_PROC_ADDR(GetAttribLocation, true);
+ GET_PROC_ADDR(VertexAttribPointer, true);
+ GET_PROC_ADDR(EnableVertexAttribArray, true);
+ GET_PROC_ADDR(UniformMatrix4fv, true);
+ GET_PROC_ADDR(Uniform4fv, true);
+ GET_PROC_ADDR(Uniform4f, true);
+ GET_PROC_ADDR(Uniform2f, true);
+ GET_PROC_ADDR(Uniform1i, true);
+
+ GET_PROC_ADDR(CreateProgram, true);
+ GET_PROC_ADDR(LinkProgram, true);
+ GET_PROC_ADDR(UseProgram, true);
+ GET_PROC_ADDR(DeleteProgram, true);
+
+ GET_PROC_ADDR(GenBuffers, true);
+ GET_PROC_ADDR(BindBuffer, true);
+ GET_PROC_ADDR(BufferData, true);
+ GET_PROC_ADDR(DeleteBuffers, true);
+
#ifdef VLCGL_HAS_MAP_PERSISTENT
- api->BufferStorage = GET_PROC_ADDR(glBufferStorage);
- api->MapBufferRange = GET_PROC_ADDR(glMapBufferRange);
- api->FlushMappedBufferRange = GET_PROC_ADDR(glFlushMappedBufferRange);
- api->UnmapBuffer = GET_PROC_ADDR(glUnmapBuffer);
- api->FenceSync = GET_PROC_ADDR(glFenceSync);
- api->DeleteSync = GET_PROC_ADDR(glDeleteSync);
- api->ClientWaitSync = GET_PROC_ADDR(glClientWaitSync);
+ GET_PROC_ADDR(BufferStorage, false);
+ GET_PROC_ADDR(MapBufferRange, false);
+ GET_PROC_ADDR(FlushMappedBufferRange, false);
+ GET_PROC_ADDR(UnmapBuffer, false);
+ GET_PROC_ADDR(FenceSync, false);
+ GET_PROC_ADDR(DeleteSync, false);
+ GET_PROC_ADDR(ClientWaitSync, false);
#endif
-#undef GET_PROC_ADDR
-
- if (!vgl->api.CreateShader || !vgl->api.ShaderSource || !vgl->api.CreateProgram)
- supports_shaders = false;
- if (!supports_shaders)
- {
- msg_Err(gl, "shaders not supported");
- free(vgl);
- return NULL;
- }
#if defined(_WIN32)
- api->ActiveTexture = vlc_gl_GetProcAddress(gl, "glActiveTexture");
- api->ClientActiveTexture = vlc_gl_GetProcAddress(gl, "glClientActiveTexture");
+ GET_PROC_ADDR(ActiveTexture, true);
+ GET_PROC_ADDR(ClientActiveTexture, true);
# undef glActiveTexture
# undef glClientActiveTexture
# define glActiveTexture vgl->api.ActiveTexture
# define glClientActiveTexture vgl->api.ClientActiveTexture
#endif
+#undef GET_PROC_ADDR
#if defined(USE_OPENGL_ES2)
/* OpenGL ES 2 includes support for non-power of 2 textures by specification
More information about the vlc-commits
mailing list