OSDN Git Service

glx: check OpenGL 3.1 extensions
authorCyril Drouet <cyril.drouet@immerex.com>
Wed, 2 Mar 2016 10:21:51 +0000 (11:21 +0100)
committerXiang, Haihao <haihao.xiang@intel.com>
Thu, 3 Mar 2016 03:56:42 +0000 (11:56 +0800)
I successfully implemented hardware decoding with VAAPI via FFmpeg
by copying the data back to the CPU's memory; however, when I tried
to use the data directly from the GPU (instead of copying them back)
by using VA/GLX to convert the decoded VASurfaces to OpenGL textures,
I ran into some issues.

With the latest version of libva, vaCreateSurfaceGLX fails all the time
when I set OpenGL to 3.1 or above. If I set it to 3.0, then it doesn't
fail, and everything works correctly. I downloaded the sources of libva
and it fails when checking for GL extensions because of the use of
glGetString(GL_EXTENSIONS) which is deprecated. I have implemented a fix
on my end (which I've attached for convenience) which works well for me
but I haven't done a lot of testing, and I would rather use the official
version of libva.

Signed-off-by: Cyril Drouet <cyril.drouet@immerex.com>
Signed-off-by: Víctor Jáquez <vjaquez@igalia.com>
va/glx/va_glx_impl.c

index c066582..621f6c1 100644 (file)
@@ -191,18 +191,40 @@ static int check_extension(const char *name, const char *ext)
     return 0;
 }
 
+static int check_extension3(const char *name)
+{
+    int nbExtensions, i;
+    PFNGLGETSTRINGIPROC glGetStringi = 0;
+
+    glGetStringi = (PFNGLGETSTRINGIPROC) get_proc_address("glGetStringi");
+    if(!glGetStringi)
+        return 0;
+
+
+    glGetIntegerv(GL_NUM_EXTENSIONS, &nbExtensions);
+    for(i = 0; i < nbExtensions; i++)
+    {
+        const GLubyte *strExtension = glGetStringi(GL_EXTENSIONS, i);
+        if(strcmp(strExtension, (const GLubyte *)name) == 0)
+            return 1;
+    }
+
+    return 0;
+}
+
 static int check_tfp_extensions(VADriverContextP ctx)
 {
     const char *gl_extensions;
     const char *glx_extensions;
 
     gl_extensions = (const char *)glGetString(GL_EXTENSIONS);
-    if (!check_extension("GL_ARB_texture_non_power_of_two", gl_extensions))
+    if (!check_extension("GL_ARB_texture_non_power_of_two", gl_extensions) && !check_extension3("GL_ARB_texture_non_power_of_two"))
         return 0;
 
     glx_extensions = glXQueryExtensionsString(ctx->native_dpy, ctx->x11_screen);
     if (!check_extension("GLX_EXT_texture_from_pixmap", glx_extensions))
         return 0;
+
     return 1;
 }
 
@@ -211,10 +233,11 @@ static int check_fbo_extensions(VADriverContextP ctx)
     const char *gl_extensions;
 
     gl_extensions = (const char *)glGetString(GL_EXTENSIONS);
-    if (check_extension("GL_ARB_framebuffer_object", gl_extensions))
+    if (check_extension("GL_ARB_framebuffer_object", gl_extensions) || check_extension3("GL_ARB_framebuffer_object"))
         return 1;
-    if (check_extension("GL_EXT_framebuffer_object", gl_extensions))
+    if (check_extension("GL_EXT_framebuffer_object", gl_extensions) || check_extension3("GL_EXT_framebuffer_object"))
         return 1;
+
     return 0;
 }