[Cogl] [PATCH] Query glX* functions before getting the context to fix GL3 driver
Robert Bragg
robert at sixbynine.org
Wed Jan 16 05:57:26 PST 2013
This looks good to land to me:
Reviewed-by: Robert Bragg <robert at linux.intel.com>
thanks,
- Robert
On Wed, Dec 12, 2012 at 8:15 PM, Neil Roberts <neil at linux.intel.com> wrote:
> The GL3 context is created using the glXCreateContextAttribs function
> which is part of the GLX_ARB_create_context extension. However
> previously the function pointers from GLX extensions were only
> retrieved once the GL context is created. That meant that the GL3
> context creation function would always assume that the extension is
> not supported so it would always fail.
>
> This patch changes it to query the functions when the renderer is set
> up instead. The base winsys feature flags that are determined while
> querying the functions are stored in a member of CoglGLXRenderer.
> These are then copied to the CoglContext when it is initialised.
>
> The spec for glXGetProcAddress says that the functions returned are
> context-independent. That implies that it is safe to call it without
> binding a context although that is not explicitly stated as far as I
> can tell. A big of googling finds this DRI documentation which says it
> can be used without a context:
>
> http://dri.freedesktop.org/wiki/glXGetProcAddressNeverReturnsNULL
>
> And also this code sample:
>
> http://www.opengl.org/wiki/Tutorial:_OpenGL_3.0_Context_Creation_%28GLX%29
>
> One point that makes me concerned that this might not always work in
> practice is that the code in SDL2 to create a GL3 context first
> creates a dummy GL2 context in order to have something bound before it
> calls glXGetProcAddress. I think this may just be a misunderstanding
> based on how wglGetProcAddress works however.
> ---
> cogl/cogl-glx-renderer-private.h | 52 ++----
> cogl/winsys/cogl-winsys-glx-feature-functions.h | 72 ++++++--
> cogl/winsys/cogl-winsys-glx.c | 222 +++++++++++-------------
> 3 files changed, 174 insertions(+), 172 deletions(-)
>
> diff --git a/cogl/cogl-glx-renderer-private.h b/cogl/cogl-glx-renderer-private.h
> index 41cdc6f..1be4d98 100644
> --- a/cogl/cogl-glx-renderer-private.h
> +++ b/cogl/cogl-glx-renderer-private.h
> @@ -45,61 +45,33 @@ typedef struct _CoglGLXRenderer
> /* GModule pointing to libGL which we use to get glX functions out of */
> GModule *libgl_module;
>
> + /* Copy of the winsys features that are based purely on the
> + * information we can get without using a GL context. We want to
> + * determine this before we have a context so that we can use the
> + * function pointers from the extensions earlier. This is necessary
> + * to use the glXCreateContextAttribs function. */
> + unsigned long base_winsys_features
> + [COGL_FLAGS_N_LONGS_FOR_SIZE (COGL_WINSYS_FEATURE_N_FEATURES)];
> +
> /* Function pointers for core GLX functionality. We can't just link
> against these directly because we need to conditionally load
> libGL when we are using GLX so that it won't conflict with a GLES
> - library if we are using EGL + GLES */
> - void
> - (* glXDestroyContext) (Display *dpy, GLXContext ctx);
> - void
> - (* glXSwapBuffers) (Display *dpy, GLXDrawable drawable);
> + library if we are using EGL + GLES. These are just the functions
> + that we want to use before calling glXGetProcAddress */
> Bool
> (* glXQueryExtension) (Display *dpy, int *errorb, int *event);
> const char *
> (* glXQueryExtensionsString) (Display *dpy, int screen);
> Bool
> (* glXQueryVersion) (Display *dpy, int *maj, int *min);
> - Bool
> - (* glXIsDirect) (Display *dpy, GLXContext ctx);
> - int
> - (* glXGetFBConfigAttrib) (Display *dpy, GLXFBConfig config,
> - int attribute, int *value);
> - GLXWindow
> - (* glXCreateWindow) (Display *dpy, GLXFBConfig config,
> - Window win, const int *attribList);
> - void
> - (* glXDestroyWindow) (Display *dpy, GLXWindow window);
> - GLXPixmap
> - (* glXCreatePixmap) (Display *dpy, GLXFBConfig config,
> - Pixmap pixmap, const int *attribList);
> - void
> - (* glXDestroyPixmap) (Display *dpy, GLXPixmap pixmap);
> - GLXContext
> - (* glXCreateNewContext) (Display *dpy, GLXFBConfig config,
> - int renderType, GLXContext shareList,
> - Bool direct);
> - Bool
> - (* glXMakeContextCurrent) (Display *dpy, GLXDrawable draw,
> - GLXDrawable read, GLXContext ctx);
> - void
> - (* glXSelectEvent) (Display *dpy, GLXDrawable drawable,
> - unsigned long mask);
> - GLXFBConfig *
> - (* glXGetFBConfigs) (Display *dpy, int screen, int *nelements);
> - GLXFBConfig *
> - (* glXChooseFBConfig) (Display *dpy, int screen,
> - const int *attrib_list, int *nelements);
> - XVisualInfo *
> - (* glXGetVisualFromFBConfig) (Display *dpy, GLXFBConfig config);
> -
> void *
> (* glXGetProcAddress) (const GLubyte *procName);
>
> /* Function pointers for GLX specific extensions */
> -#define COGL_WINSYS_FEATURE_BEGIN(a, b, c, d, e)
> +#define COGL_WINSYS_FEATURE_BEGIN(a, b, c, d, e, f)
>
> #define COGL_WINSYS_FEATURE_FUNCTION(ret, name, args) \
> - ret (APIENTRY * pf_ ## name) args;
> + ret (APIENTRY * name) args;
>
> #define COGL_WINSYS_FEATURE_END()
>
> diff --git a/cogl/winsys/cogl-winsys-glx-feature-functions.h b/cogl/winsys/cogl-winsys-glx-feature-functions.h
> index 0450728..a265757 100644
> --- a/cogl/winsys/cogl-winsys-glx-feature-functions.h
> +++ b/cogl/winsys/cogl-winsys-glx-feature-functions.h
> @@ -27,8 +27,8 @@
> */
>
> /* Macro prototypes:
> - * COGL_WINSYS_FEATURE_BEGIN (name, namespaces, extension_names,
> - * implied_private_feature_flags,
> + * COGL_WINSYS_FEATURE_BEGIN (major_glx_version, minor_glx_version,
> + * name, namespaces, extension_names,
> * implied_winsys_feature)
> * COGL_WINSYS_FEATURE_FUNCTION (return_type, function_name,
> * (arguments))
> @@ -42,10 +42,54 @@
> * XXX: NB: Don't add a trailing semicolon when using these macros
> */
>
> -COGL_WINSYS_FEATURE_BEGIN (texture_from_pixmap,
> +/* Base functions that we assume are always available */
> +COGL_WINSYS_FEATURE_BEGIN (0, 0, /* always available */
> + base_glx_functions,
> + "\0",
> + "\0",
> + 0 /* no winsys feature */)
> +COGL_WINSYS_FEATURE_FUNCTION (void, glXDestroyContext,
> + (Display *dpy, GLXContext ctx))
> +COGL_WINSYS_FEATURE_FUNCTION (void, glXSwapBuffers,
> + (Display *dpy, GLXDrawable drawable))
> +COGL_WINSYS_FEATURE_FUNCTION (Bool, glXIsDirect,
> + (Display *dpy, GLXContext ctx))
> +COGL_WINSYS_FEATURE_FUNCTION (int, glXGetFBConfigAttrib,
> + (Display *dpy, GLXFBConfig config,
> + int attribute, int *value))
> +COGL_WINSYS_FEATURE_FUNCTION (GLXWindow, glXCreateWindow,
> + (Display *dpy, GLXFBConfig config,
> + Window win, const int *attribList))
> +COGL_WINSYS_FEATURE_FUNCTION (void, glXDestroyWindow,
> + (Display *dpy, GLXWindow window))
> +COGL_WINSYS_FEATURE_FUNCTION (GLXPixmap, glXCreatePixmap,
> + (Display *dpy, GLXFBConfig config,
> + Pixmap pixmap, const int *attribList))
> +COGL_WINSYS_FEATURE_FUNCTION (void, glXDestroyPixmap,
> + (Display *dpy, GLXPixmap pixmap))
> +COGL_WINSYS_FEATURE_FUNCTION (GLXContext, glXCreateNewContext,
> + (Display *dpy, GLXFBConfig config,
> + int renderType, GLXContext shareList,
> + Bool direct))
> +COGL_WINSYS_FEATURE_FUNCTION (Bool, glXMakeContextCurrent,
> + (Display *dpy, GLXDrawable draw,
> + GLXDrawable read, GLXContext ctx))
> +COGL_WINSYS_FEATURE_FUNCTION (void, glXSelectEvent,
> + (Display *dpy, GLXDrawable drawable,
> + unsigned long mask))
> +COGL_WINSYS_FEATURE_FUNCTION (GLXFBConfig *, glXGetFBConfigs,
> + (Display *dpy, int screen, int *nelements))
> +COGL_WINSYS_FEATURE_FUNCTION (GLXFBConfig *, glXChooseFBConfig,
> + (Display *dpy, int screen,
> + const int *attrib_list, int *nelements))
> +COGL_WINSYS_FEATURE_FUNCTION (XVisualInfo *, glXGetVisualFromFBConfig,
> + (Display *dpy, GLXFBConfig config))
> +COGL_WINSYS_FEATURE_END ()
> +
> +COGL_WINSYS_FEATURE_BEGIN (255, 255,
> + texture_from_pixmap,
> "EXT\0",
> "texture_from_pixmap\0",
> - 0,
> COGL_WINSYS_FEATURE_TEXTURE_FROM_PIXMAP)
> COGL_WINSYS_FEATURE_FUNCTION (void, glXBindTexImage,
> (Display *display,
> @@ -58,10 +102,10 @@ COGL_WINSYS_FEATURE_FUNCTION (void, glXReleaseTexImage,
> int buffer))
> COGL_WINSYS_FEATURE_END ()
>
> -COGL_WINSYS_FEATURE_BEGIN (video_sync,
> +COGL_WINSYS_FEATURE_BEGIN (255, 255,
> + video_sync,
> "SGI\0",
> "video_sync\0",
> - 0,
> COGL_WINSYS_FEATURE_VBLANK_COUNTER)
> COGL_WINSYS_FEATURE_FUNCTION (int, glXGetVideoSync,
> (unsigned int *count))
> @@ -71,19 +115,19 @@ COGL_WINSYS_FEATURE_FUNCTION (int, glXWaitVideoSync,
> unsigned int *count))
> COGL_WINSYS_FEATURE_END ()
>
> -COGL_WINSYS_FEATURE_BEGIN (swap_control,
> +COGL_WINSYS_FEATURE_BEGIN (255, 255,
> + swap_control,
> "SGI\0",
> "swap_control\0",
> - 0,
> COGL_WINSYS_FEATURE_SWAP_THROTTLE)
> COGL_WINSYS_FEATURE_FUNCTION (int, glXSwapInterval,
> (int interval))
> COGL_WINSYS_FEATURE_END ()
>
> -COGL_WINSYS_FEATURE_BEGIN (copy_sub_buffer,
> +COGL_WINSYS_FEATURE_BEGIN (255, 255,
> + copy_sub_buffer,
> "MESA\0",
> "copy_sub_buffer\0",
> - 0,
> /* We initially assumed that copy_sub_buffer is synchronized on
> * which is only the case for a subset of GPUs for example it is not
> * synchronized on INTEL gen6 and gen7, so we remove this assumption
> @@ -99,17 +143,17 @@ COGL_WINSYS_FEATURE_FUNCTION (void, glXCopySubBuffer,
> int x, int y, int width, int height))
> COGL_WINSYS_FEATURE_END ()
>
> -COGL_WINSYS_FEATURE_BEGIN (swap_event,
> +COGL_WINSYS_FEATURE_BEGIN (255, 255,
> + swap_event,
> "INTEL\0",
> "swap_event\0",
> - 0,
> COGL_WINSYS_FEATURE_SWAP_BUFFERS_EVENT)
> COGL_WINSYS_FEATURE_END ()
>
> -COGL_WINSYS_FEATURE_BEGIN (create_context,
> +COGL_WINSYS_FEATURE_BEGIN (255, 255,
> + create_context,
> "ARB\0",
> "create_context",
> - 0,
> 0)
> COGL_WINSYS_FEATURE_FUNCTION (GLXContext, glXCreateContextAttribs,
> (Display *dpy,
> diff --git a/cogl/winsys/cogl-winsys-glx.c b/cogl/winsys/cogl-winsys-glx.c
> index 2750200..9838a3f 100644
> --- a/cogl/winsys/cogl-winsys-glx.c
> +++ b/cogl/winsys/cogl-winsys-glx.c
> @@ -98,13 +98,13 @@ typedef struct _CoglTexturePixmapGLX
>
> /* Define a set of arrays containing the functions required from GL
> for each winsys feature */
> -#define COGL_WINSYS_FEATURE_BEGIN(name, namespaces, extension_names, \
> - feature_flags_private, \
> +#define COGL_WINSYS_FEATURE_BEGIN(major_version, minor_version, \
> + name, namespaces, extension_names, \
> winsys_feature) \
> static const CoglFeatureFunction \
> cogl_glx_feature_ ## name ## _funcs[] = {
> #define COGL_WINSYS_FEATURE_FUNCTION(ret, name, args) \
> - { G_STRINGIFY (name), G_STRUCT_OFFSET (CoglGLXRenderer, pf_ ## name) },
> + { G_STRINGIFY (name), G_STRUCT_OFFSET (CoglGLXRenderer, name) },
> #define COGL_WINSYS_FEATURE_END() \
> { NULL, 0 }, \
> };
> @@ -112,11 +112,12 @@ typedef struct _CoglTexturePixmapGLX
>
> /* Define an array of features */
> #undef COGL_WINSYS_FEATURE_BEGIN
> -#define COGL_WINSYS_FEATURE_BEGIN(name, namespaces, extension_names, \
> - feature_flags_private, \
> +#define COGL_WINSYS_FEATURE_BEGIN(major_version, minor_version, \
> + name, namespaces, extension_names, \
> winsys_feature) \
> - { 255, 255, 0, namespaces, extension_names, \
> - feature_flags_private, \
> + { major_version, minor_version, \
> + 0, namespaces, extension_names, \
> + 0, \
> winsys_feature, \
> cogl_glx_feature_ ## name ## _funcs },
> #undef COGL_WINSYS_FEATURE_FUNCTION
> @@ -268,38 +269,10 @@ resolve_core_glx_functions (CoglRenderer *renderer,
>
> glx_renderer = renderer->winsys;
>
> - if (!g_module_symbol (glx_renderer->libgl_module, "glXCreatePixmap",
> - (void **) &glx_renderer->glXCreatePixmap) ||
> - !g_module_symbol (glx_renderer->libgl_module, "glXDestroyPixmap",
> - (void **) &glx_renderer->glXDestroyPixmap) ||
> - !g_module_symbol (glx_renderer->libgl_module, "glXChooseFBConfig",
> - (void **) &glx_renderer->glXChooseFBConfig) ||
> - !g_module_symbol (glx_renderer->libgl_module, "glXCreateNewContext",
> - (void **) &glx_renderer->glXCreateNewContext) ||
> - !g_module_symbol (glx_renderer->libgl_module, "glXGetFBConfigAttrib",
> - (void **) &glx_renderer->glXGetFBConfigAttrib) ||
> + if (!g_module_symbol (glx_renderer->libgl_module, "glXQueryExtension",
> + (void **) &glx_renderer->glXQueryExtension) ||
> !g_module_symbol (glx_renderer->libgl_module, "glXQueryVersion",
> (void **) &glx_renderer->glXQueryVersion) ||
> - !g_module_symbol (glx_renderer->libgl_module, "glXDestroyContext",
> - (void **) &glx_renderer->glXDestroyContext) ||
> - !g_module_symbol (glx_renderer->libgl_module, "glXMakeContextCurrent",
> - (void **) &glx_renderer->glXMakeContextCurrent) ||
> - !g_module_symbol (glx_renderer->libgl_module, "glXSwapBuffers",
> - (void **) &glx_renderer->glXSwapBuffers) ||
> - !g_module_symbol (glx_renderer->libgl_module, "glXQueryExtension",
> - (void **) &glx_renderer->glXQueryExtension) ||
> - !g_module_symbol (glx_renderer->libgl_module, "glXIsDirect",
> - (void **) &glx_renderer->glXIsDirect) ||
> - !g_module_symbol (glx_renderer->libgl_module, "glXGetVisualFromFBConfig",
> - (void **) &glx_renderer->glXGetVisualFromFBConfig) ||
> - !g_module_symbol (glx_renderer->libgl_module, "glXSelectEvent",
> - (void **) &glx_renderer->glXSelectEvent) ||
> - !g_module_symbol (glx_renderer->libgl_module, "glXCreateWindow",
> - (void **) &glx_renderer->glXCreateWindow) ||
> - !g_module_symbol (glx_renderer->libgl_module, "glXGetFBConfigs",
> - (void **) &glx_renderer->glXGetFBConfigs) ||
> - !g_module_symbol (glx_renderer->libgl_module, "glXDestroyWindow",
> - (void **) &glx_renderer->glXDestroyWindow) ||
> !g_module_symbol (glx_renderer->libgl_module, "glXQueryExtensionsString",
> (void **) &glx_renderer->glXQueryExtensionsString) ||
> (!g_module_symbol (glx_renderer->libgl_module, "glXGetProcAddress",
> @@ -316,6 +289,64 @@ resolve_core_glx_functions (CoglRenderer *renderer,
> return TRUE;
> }
>
> +static void
> +update_base_winsys_features (CoglRenderer *renderer)
> +{
> + CoglGLXRenderer *glx_renderer = renderer->winsys;
> + CoglXlibRenderer *xlib_renderer =
> + _cogl_xlib_renderer_get_data (renderer);
> + const char *glx_extensions;
> + int default_screen;
> + char **split_extensions;
> + int i;
> +
> + default_screen = DefaultScreen (xlib_renderer->xdpy);
> + glx_extensions =
> + glx_renderer->glXQueryExtensionsString (xlib_renderer->xdpy,
> + default_screen);
> +
> + COGL_NOTE (WINSYS, " GLX Extensions: %s", glx_extensions);
> +
> + split_extensions = g_strsplit (glx_extensions, " ", 0 /* max_tokens */);
> +
> + for (i = 0; i < G_N_ELEMENTS (winsys_feature_data); i++)
> + if (_cogl_feature_check (renderer,
> + "GLX", winsys_feature_data + i,
> + glx_renderer->glx_major,
> + glx_renderer->glx_minor,
> + COGL_DRIVER_GL, /* the driver isn't used */
> + split_extensions,
> + glx_renderer))
> + {
> + if (winsys_feature_data[i].winsys_feature)
> + COGL_FLAGS_SET (glx_renderer->base_winsys_features,
> + winsys_feature_data[i].winsys_feature,
> + TRUE);
> + }
> +
> + g_strfreev (split_extensions);
> +
> + /* Note: the GLX_SGI_video_sync spec explicitly states this extension
> + * only works for direct contexts. */
> + if (!glx_renderer->is_direct)
> + {
> + glx_renderer->glXGetVideoSync = NULL;
> + glx_renderer->glXWaitVideoSync = NULL;
> + COGL_FLAGS_SET (glx_renderer->base_winsys_features,
> + COGL_WINSYS_FEATURE_VBLANK_COUNTER,
> + FALSE);
> + }
> +
> + COGL_FLAGS_SET (glx_renderer->base_winsys_features,
> + COGL_WINSYS_FEATURE_MULTIPLE_ONSCREEN,
> + TRUE);
> +
> + if (glx_renderer->glXWaitVideoSync)
> + COGL_FLAGS_SET (glx_renderer->base_winsys_features,
> + COGL_WINSYS_FEATURE_VBLANK_WAIT,
> + TRUE);
> +}
> +
> static CoglBool
> _cogl_winsys_renderer_connect (CoglRenderer *renderer,
> CoglError **error)
> @@ -378,6 +409,8 @@ _cogl_winsys_renderer_connect (CoglRenderer *renderer,
> goto error;
> }
>
> + update_base_winsys_features (renderer);
> +
> glx_renderer->dri_fd = -1;
>
> return TRUE;
> @@ -391,68 +424,21 @@ static CoglBool
> update_winsys_features (CoglContext *context, CoglError **error)
> {
> CoglGLXDisplay *glx_display = context->display->winsys;
> - CoglXlibRenderer *xlib_renderer =
> - _cogl_xlib_renderer_get_data (context->display->renderer);
> CoglGLXRenderer *glx_renderer = context->display->renderer->winsys;
> - const char *glx_extensions;
> - char **split_extensions;
> - int default_screen;
> - int i;
>
> _COGL_RETURN_VAL_IF_FAIL (glx_display->glx_context, FALSE);
>
> if (!_cogl_context_update_features (context, error))
> return FALSE;
>
> - memset (context->winsys_features, 0, sizeof (context->winsys_features));
> -
> - default_screen = DefaultScreen (xlib_renderer->xdpy);
> - glx_extensions =
> - glx_renderer->glXQueryExtensionsString (xlib_renderer->xdpy,
> - default_screen);
> -
> - COGL_NOTE (WINSYS, " GLX Extensions: %s", glx_extensions);
> + memcpy (context->winsys_features,
> + glx_renderer->base_winsys_features,
> + sizeof (context->winsys_features));
>
> COGL_FLAGS_SET (context->features,
> COGL_FEATURE_ID_ONSCREEN_MULTIPLE, TRUE);
> - COGL_FLAGS_SET (context->winsys_features,
> - COGL_WINSYS_FEATURE_MULTIPLE_ONSCREEN,
> - TRUE);
> -
> - split_extensions = g_strsplit (glx_extensions, " ", 0 /* max_tokens */);
> -
> - for (i = 0; i < G_N_ELEMENTS (winsys_feature_data); i++)
> - if (_cogl_feature_check (context->display->renderer,
> - "GLX", winsys_feature_data + i, 0, 0,
> - COGL_DRIVER_GL, /* the driver isn't used */
> - split_extensions,
> - glx_renderer))
> - {
> - if (winsys_feature_data[i].winsys_feature)
> - COGL_FLAGS_SET (context->winsys_features,
> - winsys_feature_data[i].winsys_feature,
> - TRUE);
> - }
> -
> - g_strfreev (split_extensions);
> -
> - /* Note: the GLX_SGI_video_sync spec explicitly states this extension
> - * only works for direct contexts. */
> - if (!glx_renderer->is_direct)
> - {
> - glx_renderer->pf_glXGetVideoSync = NULL;
> - glx_renderer->pf_glXWaitVideoSync = NULL;
> - COGL_FLAGS_SET (context->winsys_features,
> - COGL_WINSYS_FEATURE_VBLANK_COUNTER,
> - FALSE);
> - }
> -
> - if (glx_renderer->pf_glXWaitVideoSync)
> - COGL_FLAGS_SET (context->winsys_features,
> - COGL_WINSYS_FEATURE_VBLANK_WAIT,
> - TRUE);
>
> - if (glx_renderer->pf_glXCopySubBuffer || context->glBlitFramebuffer)
> + if (glx_renderer->glXCopySubBuffer || context->glBlitFramebuffer)
> {
> CoglGpuInfoArchitecture arch;
>
> @@ -631,14 +617,14 @@ create_gl3_context (CoglDisplay *display,
>
> /* Make sure that the display supports the GLX_ARB_create_context
> extension */
> - if (glx_renderer->pf_glXCreateContextAttribs == NULL)
> + if (glx_renderer->glXCreateContextAttribs == NULL)
> return NULL;
>
> - return glx_renderer->pf_glXCreateContextAttribs (xlib_renderer->xdpy,
> - fb_config,
> - NULL /* share_context */,
> - True, /* direct */
> - attrib_list);
> + return glx_renderer->glXCreateContextAttribs (xlib_renderer->xdpy,
> + fb_config,
> + NULL /* share_context */,
> + True, /* direct */
> + attrib_list);
> }
>
> static CoglBool
> @@ -1141,13 +1127,13 @@ _cogl_winsys_onscreen_bind (CoglOnscreen *onscreen)
> * MESA and SGI extensions which should technically be mutually
> * exclusive.
> */
> - if (glx_renderer->pf_glXSwapInterval)
> + if (glx_renderer->glXSwapInterval)
> {
> CoglFramebuffer *fb = COGL_FRAMEBUFFER (onscreen);
> if (fb->config.swap_throttled)
> - glx_renderer->pf_glXSwapInterval (1);
> + glx_renderer->glXSwapInterval (1);
> else
> - glx_renderer->pf_glXSwapInterval (0);
> + glx_renderer->glXSwapInterval (0);
> }
>
> XSync (xlib_renderer->xdpy, False);
> @@ -1172,14 +1158,14 @@ _cogl_winsys_wait_for_vblank (CoglContext *ctx)
>
> glx_renderer = ctx->display->renderer->winsys;
>
> - if (glx_renderer->pf_glXGetVideoSync)
> + if (glx_renderer->glXGetVideoSync)
> {
> uint32_t current_count;
>
> - glx_renderer->pf_glXGetVideoSync (¤t_count);
> - glx_renderer->pf_glXWaitVideoSync (2,
> - (current_count + 1) % 2,
> - ¤t_count);
> + glx_renderer->glXGetVideoSync (¤t_count);
> + glx_renderer->glXWaitVideoSync (2,
> + (current_count + 1) % 2,
> + ¤t_count);
> }
> }
>
> @@ -1191,7 +1177,7 @@ _cogl_winsys_get_vsync_counter (CoglContext *ctx)
>
> glx_renderer = ctx->display->renderer->winsys;
>
> - glx_renderer->pf_glXGetVideoSync (&video_sync_count);
> + glx_renderer->glXGetVideoSync (&video_sync_count);
>
> return video_sync_count;
> }
> @@ -1304,15 +1290,15 @@ _cogl_winsys_onscreen_swap_region (CoglOnscreen *onscreen,
> else if (can_wait)
> _cogl_winsys_wait_for_vblank (context);
>
> - if (glx_renderer->pf_glXCopySubBuffer)
> + if (glx_renderer->glXCopySubBuffer)
> {
> Display *xdpy = xlib_renderer->xdpy;
> int i;
> for (i = 0; i < n_rectangles; i++)
> {
> int *rect = &rectangles[4 * i];
> - glx_renderer->pf_glXCopySubBuffer (xdpy, drawable,
> - rect[0], rect[1], rect[2], rect[3]);
> + glx_renderer->glXCopySubBuffer (xdpy, drawable,
> + rect[0], rect[1], rect[2], rect[3]);
> }
> }
> else if (context->glBlitFramebuffer)
> @@ -1389,7 +1375,7 @@ _cogl_winsys_onscreen_swap_buffers (CoglOnscreen *onscreen)
> if (have_counter)
> end_frame_vsync_counter = _cogl_winsys_get_vsync_counter (context);
>
> - if (!glx_renderer->pf_glXSwapInterval)
> + if (!glx_renderer->glXSwapInterval)
> {
> CoglBool can_wait =
> _cogl_winsys_has_feature (COGL_WINSYS_FEATURE_VBLANK_WAIT);
> @@ -1867,9 +1853,9 @@ free_glx_pixmap (CoglContext *context,
> glx_renderer = renderer->winsys;
>
> if (glx_tex_pixmap->pixmap_bound)
> - glx_renderer->pf_glXReleaseTexImage (xlib_renderer->xdpy,
> - glx_tex_pixmap->glx_pixmap,
> - GLX_FRONT_LEFT_EXT);
> + glx_renderer->glXReleaseTexImage (xlib_renderer->xdpy,
> + glx_tex_pixmap->glx_pixmap,
> + GLX_FRONT_LEFT_EXT);
>
> /* FIXME - we need to trap errors and synchronize here because
> * of ordering issues between the XPixmap destruction and the
> @@ -2031,14 +2017,14 @@ _cogl_winsys_texture_pixmap_x11_update (CoglTexturePixmapX11 *tex_pixmap,
> _cogl_bind_gl_texture_transient (gl_target, gl_handle, FALSE);
>
> if (glx_tex_pixmap->pixmap_bound)
> - glx_renderer->pf_glXReleaseTexImage (xlib_renderer->xdpy,
> - glx_tex_pixmap->glx_pixmap,
> - GLX_FRONT_LEFT_EXT);
> -
> - glx_renderer->pf_glXBindTexImage (xlib_renderer->xdpy,
> - glx_tex_pixmap->glx_pixmap,
> - GLX_FRONT_LEFT_EXT,
> - NULL);
> + glx_renderer->glXReleaseTexImage (xlib_renderer->xdpy,
> + glx_tex_pixmap->glx_pixmap,
> + GLX_FRONT_LEFT_EXT);
> +
> + glx_renderer->glXBindTexImage (xlib_renderer->xdpy,
> + glx_tex_pixmap->glx_pixmap,
> + GLX_FRONT_LEFT_EXT,
> + NULL);
>
> /* According to the recommended usage in the spec for
> * GLX_EXT_texture_pixmap we should release the texture after
> --
> 1.7.11.3.g3c3efa5
>
> _______________________________________________
> Cogl mailing list
> Cogl at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/cogl
More information about the Cogl
mailing list