Hello community, here is the log from the commit of package xorg-x11-server for openSUSE:Factory checked in at 2012-05-29 11:37:34 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/xorg-x11-server (Old) and /work/SRC/openSUSE:Factory/.xorg-x11-server.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "xorg-x11-server", Maintainer is "[email protected]" Changes: -------- --- /work/SRC/openSUSE:Factory/xorg-x11-server/xorg-x11-server.changes 2012-05-21 08:05:00.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.xorg-x11-server.new/xorg-x11-server.changes 2012-05-29 11:37:36.000000000 +0200 @@ -1,0 +2,12 @@ +Fri May 25 14:44:36 UTC 2012 - [email protected] + +- no longer use obsolete %run_permissions; replaced it by + %set_permissions (bnc#764101) + +------------------------------------------------------------------- +Tue May 22 08:50:21 UTC 2012 - [email protected] + +- added patches to implement GLX_ARB_create_context extensions + required for OpenGL 3.0 support (not upstream yet) + +------------------------------------------------------------------- New: ---- u_0001-glx-Fix-mishandling-of-shared-contexts.patch u_0002-glx-Don-t-track-GLClientmajorVersion-or-GLClientmino.patch u_0003-glx-Extend-__GLXscreen-createContext-to-take-attribu.patch u_0004-glx-Add-tracking-for-GLX_ARB_create_context-and-GLX_.patch u_0005-glx-Optionally-call-DRI2-createContextAttribs-from-_.patch u_0006-glx-Implement-GLX-SetClientInfoARB-protocol.patch u_0007-glx-Initialize-all-context-fields-together.patch u_0008-glx-Initialize-remaining-context-fields.patch u_0009-glx-Use-one-function-to-add-a-context-to-all-global-.patch u_0010-glx-Make-several-functions-available-outside-the-glx.patch u_0011-glx-Implement-protocol-for-glXCreateContextAttribsAR.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ xorg-x11-server.spec ++++++ --- /var/tmp/diff_new_pack.WpGwii/_old 2012-05-29 11:37:40.000000000 +0200 +++ /var/tmp/diff_new_pack.WpGwii/_new 2012-05-29 11:37:40.000000000 +0200 @@ -185,6 +185,20 @@ Patch220: Use-external-tool-for-creating-backtraces-on-crashes.patch # PATCH-MISSING-TAG -- See http://wiki.opensuse.org/openSUSE:Packaging_Patches_guidelines Patch222: sync-fix.patch +# Patches to implement GLX_ARB_create_context extensions required for OpenGL 3.0 support +# http://lists.x.org/archives/xorg-devel/2012-April/030452.html +# git://people.freedesktop.org/~idr/xserver.git +Patch300: u_0001-glx-Fix-mishandling-of-shared-contexts.patch +Patch301: u_0002-glx-Don-t-track-GLClientmajorVersion-or-GLClientmino.patch +Patch302: u_0003-glx-Extend-__GLXscreen-createContext-to-take-attribu.patch +Patch303: u_0004-glx-Add-tracking-for-GLX_ARB_create_context-and-GLX_.patch +Patch304: u_0005-glx-Optionally-call-DRI2-createContextAttribs-from-_.patch +Patch305: u_0006-glx-Implement-GLX-SetClientInfoARB-protocol.patch +Patch306: u_0007-glx-Initialize-all-context-fields-together.patch +Patch307: u_0008-glx-Initialize-remaining-context-fields.patch +Patch308: u_0009-glx-Use-one-function-to-add-a-context-to-all-global-.patch +Patch309: u_0010-glx-Make-several-functions-available-outside-the-glx.patch +Patch310: u_0011-glx-Implement-protocol-for-glXCreateContextAttribsAR.patch %description This package contains the X.Org Server. @@ -307,6 +321,17 @@ ### Disable backtrace generation patch for now #%patch220 -p1 %patch222 -p1 +%patch300 -p1 +%patch301 -p1 +%patch302 -p1 +%patch303 -p1 +%patch304 -p1 +%patch305 -p1 +%patch306 -p1 +%patch307 -p1 +%patch308 -p1 +%patch309 -p1 +%patch310 -p1 %build autoreconf -fi @@ -423,7 +448,7 @@ %post %ifnarch s390 s390x %{fillup_only -an displaymanager} -%run_permissions +%set_permissions /usr/bin/Xorg if [ -f etc/X11/xorg.conf ]; then # Document how to restore previous input driver behaviour in xorg.conf files created # on openSUSE <= 11.1 ++++++ u_0001-glx-Fix-mishandling-of-shared-contexts.patch ++++++ >From 277985e545626c9a9bd82aafddac4f935d95a4e2 Mon Sep 17 00:00:00 2001 From: Ian Romanick <[email protected]> Date: Mon, 5 Dec 2011 10:55:20 -0800 Subject: [PATCH 01/11] glx: Fix mishandling of shared contexts Signed-off-by: Ian Romanick <[email protected]> Reviewed-by: Eric Anholt <[email protected]> Reviewed-by: Christopher James Halse Rogers <[email protected]> --- glx/glxcmds.c | 22 +++++++++++----------- 1 files changed, 11 insertions(+), 11 deletions(-) diff --git a/glx/glxcmds.c b/glx/glxcmds.c index 24fed8f..6fa10fe 100644 --- a/glx/glxcmds.c +++ b/glx/glxcmds.c @@ -251,20 +251,20 @@ DoCreateContext(__GLXclientState * cl, GLXContextID gcId, &shareglxc, &err)) return err; - if (shareglxc->isDirect) { - /* - ** NOTE: no support for sharing display lists between direct - ** contexts, even if they are in the same address space. - */ -#if 0 - /* Disabling this code seems to allow shared display lists - * and texture objects to work. We'll leave it disabled for now. - */ + /* Page 26 (page 32 of the PDF) of the GLX 1.4 spec says: + * + * "The server context state for all sharing contexts must exist + * in a single address space or a BadMatch error is generated." + * + * If the share context is indirect, force the new context to also be + * indirect. If the shard context is direct but the new context + * cannot be direct, generate BadMatch. + */ + if (shareglxc->isDirect && !isDirect) { client->errorValue = shareList; return BadMatch; -#endif } - else { + else if (!shareglxc->isDirect) { /* ** Create an indirect context regardless of what the client asked ** for; this way we can share display list space with shareList. -- 1.7.3.4 ++++++ u_0002-glx-Don-t-track-GLClientmajorVersion-or-GLClientmino.patch ++++++ >From 2bbacf1fb21b98e8b9481931f131c176a0f78dc5 Mon Sep 17 00:00:00 2001 From: Ian Romanick <[email protected]> Date: Fri, 2 Dec 2011 21:14:46 -0800 Subject: [PATCH 02/11] glx: Don't track GLClientmajorVersion or GLClientminorVersion Nothing uses these fields anywhere in the server. Signed-off-by: Ian Romanick <[email protected]> Reviewed-by: Jesse Barnes <[email protected]> Reviewed-by: Christopher James Halse Rogers <[email protected]> --- glx/glxcmds.c | 2 -- glx/glxext.c | 2 -- glx/glxserver.h | 2 -- 3 files changed, 0 insertions(+), 6 deletions(-) diff --git a/glx/glxcmds.c b/glx/glxcmds.c index 6fa10fe..5c70afa 100644 --- a/glx/glxcmds.c +++ b/glx/glxcmds.c @@ -2396,8 +2396,6 @@ __glXDisp_ClientInfo(__GLXclientState * cl, GLbyte * pc) if (!memchr(buf, 0, (client->req_len << 2) - sizeof(xGLXClientInfoReq))) return BadLength; - cl->GLClientmajorVersion = req->major; - cl->GLClientminorVersion = req->minor; free(cl->GLClientextensions); cl->GLClientextensions = strdup(buf); diff --git a/glx/glxext.c b/glx/glxext.c index acd696e..599f029 100644 --- a/glx/glxext.c +++ b/glx/glxext.c @@ -281,8 +281,6 @@ glxClientCallback(CallbackListPtr *list, pointer closure, pointer data) ** By default, assume that the client supports ** GLX major version 1 minor version 0 protocol. */ - cl->GLClientmajorVersion = 1; - cl->GLClientminorVersion = 0; cl->client = pClient; break; diff --git a/glx/glxserver.h b/glx/glxserver.h index 7076848..87c94d9 100644 --- a/glx/glxserver.h +++ b/glx/glxserver.h @@ -145,8 +145,6 @@ struct __GLXclientStateRec { /* Back pointer to X client record */ ClientPtr client; - int GLClientmajorVersion; - int GLClientminorVersion; char *GLClientextensions; }; -- 1.7.3.4 ++++++ u_0003-glx-Extend-__GLXscreen-createContext-to-take-attribu.patch ++++++ >From 71a819742edf386ace3cfaacc7dfe24b00f5ff7e Mon Sep 17 00:00:00 2001 From: Ian Romanick <[email protected]> Date: Mon, 5 Dec 2011 10:56:07 -0800 Subject: [PATCH 03/11] glx: Extend __GLXscreen::createContext to take attributes The attributes will be used for glXCreateContextAttribsARB additions in follow-on patches. v2: Add missing 'int *error' parameters noticed by Christopher James Halse Rogers. v3: Remove redundant 'int err;' declaration noticed by Christopher James Halse Rogers. This was supposed to be in v2, but I missed it. Signed-off-by: Ian Romanick <[email protected]> Reviewed-by: Jesse Barnes <[email protected]> Reviewed-by: Christopher James Halse Rogers <[email protected]> --- glx/glxcmds.c | 10 ++++++++-- glx/glxdri.c | 12 +++++++++++- glx/glxdri2.c | 5 ++++- glx/glxdriswrast.c | 12 +++++++++++- glx/glxscreens.h | 5 ++++- 5 files changed, 38 insertions(+), 6 deletions(-) diff --git a/glx/glxcmds.c b/glx/glxcmds.c index 5c70afa..308c14a 100644 --- a/glx/glxcmds.c +++ b/glx/glxcmds.c @@ -276,8 +276,14 @@ DoCreateContext(__GLXclientState * cl, GLXContextID gcId, /* ** Allocate memory for the new context */ - if (!isDirect) - glxc = pGlxScreen->createContext(pGlxScreen, config, shareglxc); + if (!isDirect) { + /* Without any attributes, the only error that the driver should be + * able to generate is BadAlloc. As result, just drop the error + * returned from the driver on the floor. + */ + glxc = pGlxScreen->createContext(pGlxScreen, config, shareglxc, + 0, NULL, &err); + } else glxc = __glXdirectContextCreate(pGlxScreen, config, shareglxc); if (!glxc) { diff --git a/glx/glxdri.c b/glx/glxdri.c index 9b8b66f..bc49f29 100644 --- a/glx/glxdri.c +++ b/glx/glxdri.c @@ -599,7 +599,10 @@ __glXDRIscreenDestroy(__GLXscreen * baseScreen) static __GLXcontext * __glXDRIscreenCreateContext(__GLXscreen * baseScreen, __GLXconfig * glxConfig, - __GLXcontext * baseShareContext) + __GLXcontext * baseShareContext, + unsigned num_attribs, + const uint32_t *attribs, + int *error) { __GLXDRIscreen *screen = (__GLXDRIscreen *) baseScreen; __GLXDRIcontext *context, *shareContext; @@ -611,6 +614,13 @@ __glXDRIscreenCreateContext(__GLXscreen * baseScreen, drm_context_t hwContext; ScreenPtr pScreen = baseScreen->pScreen; + /* DRI1 cannot support createContextAttribs, so these parameters will + * never be used. + */ + (void) num_attribs; + (void) attribs; + (void) error; + shareContext = (__GLXDRIcontext *) baseShareContext; if (shareContext) driShare = shareContext->driContext; diff --git a/glx/glxdri2.c b/glx/glxdri2.c index aa38295..656b577 100644 --- a/glx/glxdri2.c +++ b/glx/glxdri2.c @@ -380,7 +380,10 @@ __glXDRIscreenDestroy(__GLXscreen * baseScreen) static __GLXcontext * __glXDRIscreenCreateContext(__GLXscreen * baseScreen, __GLXconfig * glxConfig, - __GLXcontext * baseShareContext) + __GLXcontext * baseShareContext, + unsigned num_attribs, + const uint32_t *attribs, + int *error) { __GLXDRIscreen *screen = (__GLXDRIscreen *) baseScreen; __GLXDRIcontext *context, *shareContext; diff --git a/glx/glxdriswrast.c b/glx/glxdriswrast.c index c69b4d2..b478398 100644 --- a/glx/glxdriswrast.c +++ b/glx/glxdriswrast.c @@ -257,7 +257,10 @@ __glXDRIscreenDestroy(__GLXscreen * baseScreen) static __GLXcontext * __glXDRIscreenCreateContext(__GLXscreen * baseScreen, __GLXconfig * glxConfig, - __GLXcontext * baseShareContext) + __GLXcontext * baseShareContext, + unsigned num_attribs, + const uint32_t *attribs, + int *error) { __GLXDRIscreen *screen = (__GLXDRIscreen *) baseScreen; __GLXDRIcontext *context, *shareContext; @@ -265,6 +268,13 @@ __glXDRIscreenCreateContext(__GLXscreen * baseScreen, const __DRIcoreExtension *core = screen->core; __DRIcontext *driShare; + /* DRISWRAST won't support createContextAttribs, so these parameters will + * never be used. + */ + (void) num_attribs; + (void) attribs; + (void) error; + shareContext = (__GLXDRIcontext *) baseShareContext; if (shareContext) driShare = shareContext->driContext; diff --git a/glx/glxscreens.h b/glx/glxscreens.h index d5420ee..7ef4657 100644 --- a/glx/glxscreens.h +++ b/glx/glxscreens.h @@ -117,7 +117,10 @@ struct __GLXscreen { __GLXcontext *(*createContext) (__GLXscreen * screen, __GLXconfig * modes, - __GLXcontext * shareContext); + __GLXcontext * shareContext, + unsigned num_attribs, + const uint32_t *attribs, + int *error); __GLXdrawable *(*createDrawable) (ClientPtr client, __GLXscreen * context, -- 1.7.3.4 ++++++ u_0004-glx-Add-tracking-for-GLX_ARB_create_context-and-GLX_.patch ++++++ >From e453ac810a2020d0b8a21f67bd0e4712558fd57b Mon Sep 17 00:00:00 2001 From: Ian Romanick <[email protected]> Date: Mon, 5 Dec 2011 13:48:19 -0800 Subject: [PATCH 04/11] glx: Add tracking for GLX_ARB_create_context and GLX_ARB_create_context_profile The formatting of the extension data table was mangled by indent. This patch also undoes that and adds approripate control comments so that indent won't do it again. Signed-off-by: Ian Romanick <[email protected]> Reviewed-by: Dave Airlie <[email protected]> Reviewed-by: Christopher James Halse Rogers <[email protected]> --- glx/extension_string.c | 34 +++++++++++++++++++--------------- glx/extension_string.h | 4 +++- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/glx/extension_string.c b/glx/extension_string.c index 866f8bf..6a1a6c6 100644 --- a/glx/extension_string.c +++ b/glx/extension_string.c @@ -67,23 +67,27 @@ struct extension_info { static const struct extension_info known_glx_extensions[] = { /* GLX_ARB_get_proc_address is implemented on the client. */ - {GLX(ARB_multisample), VER(1, 4), Y,}, - - {GLX(EXT_import_context), VER(0, 0), Y,}, - {GLX(EXT_texture_from_pixmap), VER(0, 0), Y,}, - {GLX(EXT_visual_info), VER(0, 0), Y,}, - {GLX(EXT_visual_rating), VER(0, 0), Y,}, - - {GLX(MESA_copy_sub_buffer), VER(0, 0), N,}, - {GLX(OML_swap_method), VER(0, 0), Y,}, - {GLX(SGI_make_current_read), VER(1, 3), N,}, - {GLX(SGI_swap_control), VER(0, 0), N,}, - {GLX(SGIS_multisample), VER(0, 0), Y,}, - {GLX(SGIX_fbconfig), VER(1, 3), Y,}, - {GLX(SGIX_pbuffer), VER(1, 3), Y,}, - {GLX(SGIX_visual_select_group), VER(0, 0), Y,}, - {GLX(INTEL_swap_event), VER(1, 4), N,}, - {NULL} + /* *INDENT-OFF* */ + { GLX(ARB_create_context), VER(0,0), N, }, + { GLX(ARB_create_context_profile), VER(0,0), N, }, + { GLX(ARB_multisample), VER(1,4), Y, }, + + { GLX(EXT_import_context), VER(0,0), Y, }, + { GLX(EXT_texture_from_pixmap), VER(0,0), Y, }, + { GLX(EXT_visual_info), VER(0,0), Y, }, + { GLX(EXT_visual_rating), VER(0,0), Y, }, + + { GLX(MESA_copy_sub_buffer), VER(0,0), N, }, + { GLX(OML_swap_method), VER(0,0), Y, }, + { GLX(SGI_make_current_read), VER(1,3), N, }, + { GLX(SGI_swap_control), VER(0,0), N, }, + { GLX(SGIS_multisample), VER(0,0), Y, }, + { GLX(SGIX_fbconfig), VER(1,3), Y, }, + { GLX(SGIX_pbuffer), VER(1,3), Y, }, + { GLX(SGIX_visual_select_group), VER(0,0), Y, }, + { GLX(INTEL_swap_event), VER(1,4), N, }, + { NULL } + /* *INDENT-ON* */ }; /** diff --git a/glx/extension_string.h b/glx/extension_string.h index e02213f..947bf89 100644 --- a/glx/extension_string.h +++ b/glx/extension_string.h @@ -36,7 +36,9 @@ enum { /* GLX_ARB_get_proc_address is implemented on the client. */ - ARB_multisample_bit = 0, + ARB_create_context_bit = 0, + ARB_create_context_profile_bit, + ARB_multisample_bit, EXT_import_context_bit, EXT_texture_from_pixmap_bit, EXT_visual_info_bit, -- 1.7.3.4 ++++++ u_0005-glx-Optionally-call-DRI2-createContextAttribs-from-_.patch ++++++ >From 228d954789f97baf230c97c29a515abb8fd4b6d1 Mon Sep 17 00:00:00 2001 From: Ian Romanick <[email protected]> Date: Mon, 5 Dec 2011 13:52:01 -0800 Subject: [PATCH 05/11] glx: Optionally call DRI2 createContextAttribs from __glXDRIscreenCreateContext Signed-off-by: Ian Romanick <[email protected]> Reviewed-by: Christopher James Halse Rogers <[email protected]> --- glx/glxdri2.c | 156 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 151 insertions(+), 5 deletions(-) diff --git a/glx/glxdri2.c b/glx/glxdri2.c index 656b577..ba09cbd 100644 --- a/glx/glxdri2.c +++ b/glx/glxdri2.c @@ -47,6 +47,7 @@ #include "glxserver.h" #include "glxutil.h" #include "glxdricommon.h" +#include <GL/glxtokens.h> #include "glapitable.h" #include "glapi.h" @@ -377,6 +378,143 @@ __glXDRIscreenDestroy(__GLXscreen * baseScreen) free(screen); } +static Bool +dri2_convert_glx_attribs(unsigned num_attribs, const uint32_t *attribs, + unsigned *major_ver, unsigned *minor_ver, + uint32_t *flags, unsigned *error) +{ + unsigned i; + + if (num_attribs == 0) + return True; + + if (attribs == NULL) { + *error = BadImplementation; + return False; + } + + *major_ver = 1; + *minor_ver = 0; + + for (i = 0; i < num_attribs; i++) { + switch (attribs[i * 2]) { + case GLX_CONTEXT_MAJOR_VERSION_ARB: + *major_ver = attribs[i * 2 + 1]; + break; + case GLX_CONTEXT_MINOR_VERSION_ARB: + *minor_ver = attribs[i * 2 + 1]; + break; + case GLX_CONTEXT_FLAGS_ARB: + *flags = attribs[i * 2 + 1]; + break; + case GLX_RENDER_TYPE: + break; + default: + /* If an unknown attribute is received, fail. + */ + *error = BadValue; + return False; + } + } + + /* Unknown flag value. + */ + if (*flags & ~(__DRI_CTX_FLAG_DEBUG | __DRI_CTX_FLAG_FORWARD_COMPATIBLE)) { + *error = BadValue; + return False; + } + + *error = Success; + return True; +} + +static void +create_driver_context(__GLXDRIcontext * context, + __GLXDRIscreen * screen, + __GLXDRIconfig * config, + __DRIcontext * driShare, + unsigned num_attribs, + const uint32_t *attribs, + int *error) +{ + context->driContext = NULL; + +#if __DRI_DRI2_VERSION >= 3 + if (screen->dri2->base.version >= 3) { + uint32_t ctx_attribs[3 * 2]; + unsigned num_ctx_attribs = 0; + unsigned dri_err = 0; + unsigned major_ver; + unsigned minor_ver; + uint32_t flags; + + if (num_attribs != 0) { + if (!dri2_convert_glx_attribs(num_attribs, attribs, + &major_ver, &minor_ver, + &flags, (unsigned *) error)) + return NULL; + + ctx_attribs[num_ctx_attribs++] = __DRI_CTX_ATTRIB_MAJOR_VERSION; + ctx_attribs[num_ctx_attribs++] = major_ver; + ctx_attribs[num_ctx_attribs++] = __DRI_CTX_ATTRIB_MINOR_VERSION; + ctx_attribs[num_ctx_attribs++] = minor_ver; + + if (flags != 0) { + ctx_attribs[num_ctx_attribs++] = __DRI_CTX_ATTRIB_FLAGS; + + /* The current __DRI_CTX_FLAG_* values are identical to the + * GLX_CONTEXT_*_BIT values. + */ + ctx_attribs[num_ctx_attribs++] = flags; + } + } + + context->driContext = + (*screen->dri2->createContextAttribs)(screen->driScreen, + __DRI_API_OPENGL, + config->driConfig, + driShare, + num_ctx_attribs / 2, + ctx_attribs, + &dri_err, + context); + + switch (dri_err) { + case __DRI_CTX_ERROR_SUCCESS: + *error = Success; + break; + case __DRI_CTX_ERROR_NO_MEMORY: + *error = BadAlloc; + break; + case __DRI_CTX_ERROR_BAD_API: + *error = __glXError(GLXBadProfileARB); + break; + case __DRI_CTX_ERROR_BAD_VERSION: + case __DRI_CTX_ERROR_BAD_FLAG: + *error = __glXError(GLXBadFBConfig); + break; + case __DRI_CTX_ERROR_UNKNOWN_ATTRIBUTE: + case __DRI_CTX_ERROR_UNKNOWN_FLAG: + default: + *error = BadValue; + break; + } + + return; + } +#endif + + if (num_attribs != 0) { + *error = BadValue; + return; + } + + context->driContext = + (*screen->dri2->createNewContext) (screen->driScreen, + config->driConfig, + driShare, context); +} + static __GLXcontext * __glXDRIscreenCreateContext(__GLXscreen * baseScreen, __GLXconfig * glxConfig, @@ -397,8 +535,10 @@ __glXDRIscreenCreateContext(__GLXscreen * baseScreen, driShare = NULL; context = calloc(1, sizeof *context); - if (context == NULL) + if (context == NULL) { + *error = BadAlloc; return NULL; + } context->base.destroy = __glXDRIcontextDestroy; context->base.makeCurrent = __glXDRIcontextMakeCurrent; @@ -407,10 +547,8 @@ __glXDRIscreenCreateContext(__GLXscreen * baseScreen, context->base.textureFromPixmap = &__glXDRItextureFromPixmap; context->base.wait = __glXDRIcontextWait; - context->driContext = - (*screen->dri2->createNewContext) (screen->driScreen, - config->driConfig, - driShare, context); + create_driver_context(context, screen, config, driShare, num_attribs, + attribs, error); if (context->driContext == NULL) { free(context); return NULL; @@ -646,6 +784,14 @@ initializeExtensions(__GLXDRIscreen * screen) __glXEnableExtension(screen->glx_enable_bits, "GLX_INTEL_swap_event"); LogMessage(X_INFO, "AIGLX: enabled GLX_INTEL_swap_event\n"); +#if __DRI_DRI2_VERSION >= 3 + if (screen->dri2->base.version >= 3) { + __glXEnableExtension(screen->glx_enable_bits, + "GLX_ARB_create_context"); + LogMessage(X_INFO, "AIGLX: enabled GLX_ARB_create_context\n"); + } +#endif + if (DRI2HasSwapControl(pScreen)) { __glXEnableExtension(screen->glx_enable_bits, "GLX_SGI_swap_control"); __glXEnableExtension(screen->glx_enable_bits, "GLX_MESA_swap_control"); -- 1.7.3.4 ++++++ u_0006-glx-Implement-GLX-SetClientInfoARB-protocol.patch ++++++ >From 975f069a92f8bd85f9d0ce4916f2c1c4a3cea339 Mon Sep 17 00:00:00 2001 From: Ian Romanick <[email protected]> Date: Fri, 9 Dec 2011 17:28:21 -0800 Subject: [PATCH 06/11] glx: Implement GLX SetClientInfoARB protocol v2: Bump glproto version to 1.4.15. This patch uses structure names that only exist in that glproto version and later. Noticed by Christopher James Halse Rogers. Signed-off-by: Ian Romanick <[email protected]> Reviewed-by: Dave Airlie <[email protected]> Reviewed-by: Christopher James Halse Rogers <[email protected]> --- configure.ac | 2 +- glx/clientinfo.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 48 insertions(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index 6a41ea8..de7526f 100644 --- a/configure.ac +++ b/configure.ac @@ -777,7 +777,7 @@ DRI2PROTO="dri2proto >= 2.6" XINERAMAPROTO="xineramaproto" BIGFONTPROTO="xf86bigfontproto >= 1.2.0" DGAPROTO="xf86dgaproto >= 2.0.99.1" -GLPROTO="glproto >= 1.4.14" +GLPROTO="glproto >= 1.4.15" DMXPROTO="dmxproto >= 2.2.99.1" VIDMODEPROTO="xf86vidmodeproto >= 2.2.99.1" WINDOWSWMPROTO="windowswmproto" diff --git a/glx/clientinfo.c b/glx/clientinfo.c index 15bbf15..b26ac1a 100644 --- a/glx/clientinfo.c +++ b/glx/clientinfo.c @@ -26,17 +26,62 @@ #include "glxserver.h" #include "indirect_dispatch.h" +#include "glxbyteorder.h" +#include "unpack.h" int __glXDisp_SetClientInfoARB(__GLXclientState * cl, GLbyte * pc) { - return BadRequest; + xGLXSetClientInfoARBReq *req = (xGLXSetClientInfoARBReq *) pc; + char *gl_extensions; + char *glx_extensions; + + /* Verify that the size of the packet matches the size inferred from the + * sizes specified for the various fields. + */ + const unsigned expected_size = sz_xGLXSetClientInfoARBReq + + (req->numVersions * 8) + + __GLX_PAD(req->numGLExtensionBytes) + + __GLX_PAD(req->numGLXExtensionBytes); + + if (req->length != (expected_size / 4)) + return BadLength; + + /* Verify that the actual length of the GL extension string matches what's + * encoded in protocol packet. + */ + gl_extensions = (char *) (req + 1) + (req->numVersions * 8); + if (req->numGLExtensionBytes != 0 + && memchr(gl_extensions, 0, + __GLX_PAD(req->numGLExtensionBytes)) == NULL) + return BadLength; + + /* Verify that the actual length of the GLX extension string matches + * what's encoded in protocol packet. + */ + glx_extensions = gl_extensions + __GLX_PAD(req->numGLExtensionBytes); + if (req->numGLXExtensionBytes != 0 + && memchr(glx_extensions, 0, + __GLX_PAD(req->numGLXExtensionBytes)) == NULL) + return BadLength; + + free(cl->GLClientextensions); + cl->GLClientextensions = strdup(gl_extensions); + + return 0; } int __glXDispSwap_SetClientInfoARB(__GLXclientState * cl, GLbyte * pc) { - return BadRequest; + xGLXSetClientInfoARBReq *req = (xGLXSetClientInfoARBReq *) pc; + + req->length = bswap_16(req->length); + req->numVersions = bswap_32(req->numVersions); + req->numGLExtensionBytes = bswap_32(req->numGLExtensionBytes); + req->numGLXExtensionBytes = bswap_32(req->numGLXExtensionBytes); + + return __glXDisp_SetClientInfoARB(cl, pc); } int -- 1.7.3.4 ++++++ u_0007-glx-Initialize-all-context-fields-together.patch ++++++ >From 232ab8f5869905e7a8eb736b4625366c9f316e9c Mon Sep 17 00:00:00 2001 From: Ian Romanick <[email protected]> Date: Sat, 10 Dec 2011 15:09:57 -0800 Subject: [PATCH 07/11] glx: Initialize all context fields together v2: Fix whitespace error noticed by Christopher James Halse Rogers. Signed-off-by: Ian Romanick <[email protected]> Reviewed-by: Jesse Barnes <[email protected]> Reviewed-by: Christopher James Halse Rogers <[email protected]> --- glx/glxcmds.c | 26 +++++++++----------------- 1 files changed, 9 insertions(+), 17 deletions(-) diff --git a/glx/glxcmds.c b/glx/glxcmds.c index 308c14a..571ae50 100644 --- a/glx/glxcmds.c +++ b/glx/glxcmds.c @@ -290,26 +290,10 @@ DoCreateContext(__GLXclientState * cl, GLXContextID gcId, return BadAlloc; } - /* - ** Initially, setup the part of the context that could be used by - ** a GL core that needs windowing information (e.g., Mesa). + /* Initialize the GLXcontext structure. */ glxc->pGlxScreen = pGlxScreen; glxc->config = config; - - /* - ** Register this context as a resource. - */ - if (!AddResource(gcId, __glXContextRes, (pointer) glxc)) { - (*glxc->destroy) (glxc); - client->errorValue = gcId; - return BadAlloc; - } - - /* - ** Finally, now that everything is working, setup the rest of the - ** context. - */ glxc->id = gcId; glxc->share_id = shareList; glxc->idExists = GL_TRUE; @@ -317,6 +301,14 @@ DoCreateContext(__GLXclientState * cl, GLXContextID gcId, glxc->isDirect = isDirect; glxc->renderMode = GL_RENDER; + /* Register this context as a resource. + */ + if (!AddResource(gcId, __glXContextRes, (pointer)glxc)) { + (*glxc->destroy) (glxc); + client->errorValue = gcId; + return BadAlloc; + } + __glXAddToContextList(glxc); return Success; -- 1.7.3.4 ++++++ u_0008-glx-Initialize-remaining-context-fields.patch ++++++ >From e18884c868215b5dabc1f2fac73dd9c763074394 Mon Sep 17 00:00:00 2001 From: Ian Romanick <[email protected]> Date: Sat, 10 Dec 2011 15:11:57 -0800 Subject: [PATCH 08/11] glx: Initialize remaining context fields There is no reason to assume the screen's context allocated initialized these fields, so don't. Signed-off-by: Ian Romanick <[email protected]> Reviewed-by: Jesse Barnes <[email protected]> Reviewed-by: Christopher James Halse Rogers <[email protected]> --- glx/glxcmds.c | 7 +++++++ 1 files changed, 7 insertions(+), 0 deletions(-) diff --git a/glx/glxcmds.c b/glx/glxcmds.c index 571ae50..8a9a1d3 100644 --- a/glx/glxcmds.c +++ b/glx/glxcmds.c @@ -299,7 +299,14 @@ DoCreateContext(__GLXclientState * cl, GLXContextID gcId, glxc->idExists = GL_TRUE; glxc->isCurrent = GL_FALSE; glxc->isDirect = isDirect; + glxc->hasUnflushedCommands = GL_FALSE; glxc->renderMode = GL_RENDER; + glxc->feedbackBuf = NULL; + glxc->feedbackBufSize = 0; + glxc->selectBuf = NULL; + glxc->selectBufSize = 0; + glxc->drawPriv = NULL; + glxc->readPriv = NULL; /* Register this context as a resource. */ -- 1.7.3.4 ++++++ u_0009-glx-Use-one-function-to-add-a-context-to-all-global-.patch ++++++ >From 660e48e6c6a9df08655c286ac3a9ffa45eb44c26 Mon Sep 17 00:00:00 2001 From: Ian Romanick <[email protected]> Date: Sat, 10 Dec 2011 15:15:18 -0800 Subject: [PATCH 09/11] glx: Use one function to add a context to all global tables Instead of having separate __glXAddContextToList and AddResource functions, just have one function that does both steps. Signed-off-by: Ian Romanick <[email protected]> Reviewed-by: Jesse Barnes <[email protected]> Reviewed-by: Christopher James Halse Rogers <[email protected]> --- glx/glxcmds.c | 6 ++---- glx/glxext.c | 11 +++++++++-- glx/glxext.h | 2 +- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/glx/glxcmds.c b/glx/glxcmds.c index 8a9a1d3..d9d2201 100644 --- a/glx/glxcmds.c +++ b/glx/glxcmds.c @@ -308,16 +308,14 @@ DoCreateContext(__GLXclientState * cl, GLXContextID gcId, glxc->drawPriv = NULL; glxc->readPriv = NULL; - /* Register this context as a resource. + /* Add the new context to the various global tables of GLX contexts. */ - if (!AddResource(gcId, __glXContextRes, (pointer)glxc)) { + if (!__glXAddContext(glxc)) { (*glxc->destroy) (glxc); client->errorValue = gcId; return BadAlloc; } - __glXAddToContextList(glxc); - return Success; } diff --git a/glx/glxext.c b/glx/glxext.c index 599f029..8d168d8 100644 --- a/glx/glxext.c +++ b/glx/glxext.c @@ -157,11 +157,18 @@ DrawableGone(__GLXdrawable * glxPriv, XID xid) return True; } -void -__glXAddToContextList(__GLXcontext * cx) +Bool +__glXAddContext(__GLXcontext * cx) { + /* Register this context as a resource. + */ + if (!AddResource(cx->id, __glXContextRes, (pointer)cx)) { + return False; + } + cx->next = glxAllContexts; glxAllContexts = cx; + return True; } static void diff --git a/glx/glxext.h b/glx/glxext.h index 7cd5cb4..9b0978b 100644 --- a/glx/glxext.h +++ b/glx/glxext.h @@ -38,7 +38,7 @@ extern GLboolean __glXFreeContext(__GLXcontext * glxc); extern void __glXFlushContextCache(void); -extern void __glXAddToContextList(__GLXcontext * cx); +extern Bool __glXAddContext(__GLXcontext * cx); extern void __glXErrorCallBack(GLenum code); extern void __glXClearErrorOccured(void); extern GLboolean __glXErrorOccured(void); -- 1.7.3.4 ++++++ u_0010-glx-Make-several-functions-available-outside-the-glx.patch ++++++ >From ce0cf92a76cb220a89b10b8f6b0a57c5cf69a97f Mon Sep 17 00:00:00 2001 From: Ian Romanick <[email protected]> Date: Fri, 16 Dec 2011 14:42:51 -0800 Subject: [PATCH 10/11] glx: Make several functions available outside the glxcmds.c compilation unit validGlxScreen, validGlxFBConfig, validGlxContext, and __glXdirectContextCreate will soon be used by createcontext.c. Signed-off-by: Ian Romanick <[email protected]> Reviewed-by: Dave Airlie <[email protected]> Reviewed-by: Christopher James Halse Rogers <[email protected]> --- glx/glxcmds.c | 8 ++++---- glx/glxcontext.h | 13 +++++++++++++ 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/glx/glxcmds.c b/glx/glxcmds.c index d9d2201..d483bbf 100644 --- a/glx/glxcmds.c +++ b/glx/glxcmds.c @@ -50,7 +50,7 @@ #include "indirect_table.h" #include "indirect_util.h" -static int +_X_HIDDEN int validGlxScreen(ClientPtr client, int screen, __GLXscreen ** pGlxScreen, int *err) { @@ -67,7 +67,7 @@ validGlxScreen(ClientPtr client, int screen, __GLXscreen ** pGlxScreen, return TRUE; } -static int +_X_HIDDEN int validGlxFBConfig(ClientPtr client, __GLXscreen * pGlxScreen, XID id, __GLXconfig ** config, int *err) { @@ -131,7 +131,7 @@ validGlxFBConfigForWindow(ClientPtr client, __GLXconfig * config, return TRUE; } -static int +_X_HIDDEN int validGlxContext(ClientPtr client, XID id, int access_mode, __GLXcontext ** context, int *err) { @@ -200,7 +200,7 @@ __glXdirectContextDestroy(__GLXcontext * context) free(context); } -static __GLXcontext * +_X_HIDDEN __GLXcontext * __glXdirectContextCreate(__GLXscreen * screen, __GLXconfig * modes, __GLXcontext * shareContext) { diff --git a/glx/glxcontext.h b/glx/glxcontext.h index ef2c4db..b803a7f 100644 --- a/glx/glxcontext.h +++ b/glx/glxcontext.h @@ -121,4 +121,17 @@ struct __GLXcontext { void __glXContextDestroy(__GLXcontext * context); +extern int validGlxScreen(ClientPtr client, int screen, + __GLXscreen ** pGlxScreen, int *err); + +extern int validGlxFBConfig(ClientPtr client, __GLXscreen * pGlxScreen, + XID id, __GLXconfig ** config, int *err); + +extern int validGlxContext(ClientPtr client, XID id, int access_mode, + __GLXcontext ** context, int *err); + +extern __GLXcontext *__glXdirectContextCreate(__GLXscreen * screen, + __GLXconfig * modes, + __GLXcontext * shareContext); + #endif /* !__GLX_context_h__ */ -- 1.7.3.4 ++++++ u_0011-glx-Implement-protocol-for-glXCreateContextAttribsAR.patch ++++++ >From feae6434d2653bcfcaf617932c1b4893d51a1ef4 Mon Sep 17 00:00:00 2001 From: Ian Romanick <[email protected]> Date: Fri, 16 Dec 2011 14:44:55 -0800 Subject: [PATCH 11/11] glx: Implement protocol for glXCreateContextAttribsARB Signed-off-by: Ian Romanick <[email protected]> Reviewed-by: Dave Airlie <[email protected]> Reviewed-by: Christopher James Halse Rogers <[email protected]> --- glx/createcontext.c | 213 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 212 insertions(+), 1 deletions(-) diff --git a/glx/createcontext.c b/glx/createcontext.c index 9c1eab3..025c423 100644 --- a/glx/createcontext.c +++ b/glx/createcontext.c @@ -24,13 +24,224 @@ #include <dix-config.h> #endif +#include <GL/glxtokens.h> #include "glxserver.h" +#include "glxext.h" #include "indirect_dispatch.h" +#define ALL_VALID_FLAGS \ + (GLX_CONTEXT_DEBUG_BIT_ARB | GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB) + +static Bool +validate_GL_version(int major_version, int minor_version) +{ + if (major_version <= 0 || minor_version < 0) + return False; + + switch (major_version) { + case 1: + if (minor_version > 5) + return False; + break; + + case 2: + if (minor_version > 1) + return False; + break; + + case 3: + if (minor_version > 3) + return False; + break; + + default: + break; + } + + return True; +} + +static Bool +validate_render_type(uint32_t render_type) +{ + switch (render_type) { + case GLX_RGBA_TYPE: + case GLX_COLOR_INDEX_TYPE: + return True; + default: + return False; + } +} + int __glXDisp_CreateContextAttribsARB(__GLXclientState * cl, GLbyte * pc) { - return BadRequest; + ClientPtr client = cl->client; + xGLXCreateContextAttribsARBReq *req = (xGLXCreateContextAttribsARBReq *) pc; + int32_t *attribs = (req->numAttribs != 0) ? (int32_t *) (req + 1) : NULL; + unsigned i; + int major_version = 1; + int minor_version = 0; + uint32_t flags = 0; + uint32_t render_type = GLX_RGBA_TYPE; + __GLXcontext *ctx = NULL; + __GLXcontext *shareCtx = NULL; + __GLXscreen *glxScreen; + __GLXconfig *config; + int err; + + /* Verify that the size of the packet matches the size inferred from the + * sizes specified for the various fields. + */ + const unsigned expected_size = (sz_xGLXCreateContextAttribsARBReq + + (req->numAttribs * 8)) / 4; + + if (req->length != expected_size) + return BadLength; + + LEGAL_NEW_RESOURCE(req->context, client); + + /* The GLX_ARB_create_context spec says: + * + * "* If <config> is not a valid GLXFBConfig, GLXBadFBConfig is + * generated." + * + * On the client, the screen comes from the FBConfig, so GLXBadFBConfig + * should be issued if the screen is nonsense. + */ + if (!validGlxScreen(client, req->screen, &glxScreen, &err)) + return __glXError(GLXBadFBConfig); + + if (!validGlxFBConfig(client, glxScreen, req->fbconfig, &config, &err)) + return __glXError(GLXBadFBConfig); + + /* Validate the context with which the new context should share resources. + */ + if (req->shareList != None) { + if (!validGlxContext(client, req->shareList, DixReadAccess, + &shareCtx, &err)) + return err; + + /* The crazy condition is because C doesn't have a logical XOR + * operator. Comparing directly for equality may fail if one is 1 and + * the other is 2 even though both are logically true. + */ + if (!!req->isDirect != !!shareCtx->isDirect) { + client->errorValue = req->shareList; + return BadMatch; + } + + /* The GLX_ARB_create_context spec says: + * + * "* If the server context state for <share_context>...was + * created on a different screen than the one referenced by + * <config>...BadMatch is generated." + */ + if (glxScreen != shareCtx->pGlxScreen) { + client->errorValue = shareCtx->pGlxScreen->pScreen->myNum; + return BadMatch; + } + } + + for (i = 0; i < req->numAttribs; i++) { + switch (attribs[i * 2]) { + case GLX_CONTEXT_MAJOR_VERSION_ARB: + major_version = attribs[2 * i + 1]; + break; + + case GLX_CONTEXT_MINOR_VERSION_ARB: + minor_version = attribs[2 * i + 1]; + break; + + case GLX_CONTEXT_FLAGS_ARB: + flags = attribs[2 * i + 1]; + break; + + case GLX_RENDER_TYPE: + render_type = attribs[2 * i + 1]; + break; + + default: + return BadValue; + } + } + + /* The GLX_ARB_create_context spec says: + * + * "If attributes GLX_CONTEXT_MAJOR_VERSION_ARB and + * GLX_CONTEXT_MINOR_VERSION_ARB, when considered together + * with attributes GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB and + * GLX_RENDER_TYPE, specify an OpenGL version and feature set + * that are not defined, BadMatch is generated. + * + * ...Feature deprecation was introduced with OpenGL 3.0, so + * forward-compatible contexts may only be requested for + * OpenGL 3.0 and above. Thus, examples of invalid + * combinations of attributes include: + * + * - Major version < 1 or > 3 + * - Major version == 1 and minor version < 0 or > 5 + * - Major version == 2 and minor version < 0 or > 1 + * - Major version == 3 and minor version > 2 + * - Forward-compatible flag set and major version < 3 + * - Color index rendering and major version >= 3" + */ + if (!validate_GL_version(major_version, minor_version)) + return BadMatch; + + if (major_version < 3 + && ((flags & GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB) != 0)) + return BadMatch; + + if (major_version >= 3 && render_type == GLX_COLOR_INDEX_TYPE) + return BadMatch; + + if (!validate_render_type(render_type)) + return BadValue; + + if ((flags & ~ALL_VALID_FLAGS) != 0) + return BadValue; + + /* Allocate memory for the new context + */ + if (req->isDirect) { + ctx = __glXdirectContextCreate(glxScreen, config, shareCtx); + err = BadAlloc; + } + else { + ctx = glxScreen->createContext(glxScreen, config, shareCtx, + req->numAttribs, (uint32_t *) attribs, + &err); + } + + if (ctx == NULL) + return err; + + ctx->pGlxScreen = glxScreen; + ctx->config = config; + ctx->id = req->context; + ctx->share_id = req->shareList; + ctx->idExists = True; + ctx->isCurrent = False; + ctx->isDirect = req->isDirect; + ctx->hasUnflushedCommands = False; + ctx->renderMode = GL_RENDER; + ctx->feedbackBuf = NULL; + ctx->feedbackBufSize = 0; + ctx->selectBuf = NULL; + ctx->selectBufSize = 0; + ctx->drawPriv = NULL; + ctx->readPriv = NULL; + + /* Add the new context to the various global tables of GLX contexts. + */ + if (!__glXAddContext(ctx)) { + (*ctx->destroy) (ctx); + client->errorValue = req->context; + return BadAlloc; + } + + return Success; } int -- 1.7.3.4 -- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
