[PATCH 12/20] dri_util: Mostly stub implementation of dri2CreateContextAttribs

Ian Romanick idr at freedesktop.org
Tue Dec 20 12:31:15 PST 2011


From: Ian Romanick <ian.d.romanick at intel.com>

This adds the function and modifies dri2CreateNewContextForAPI to call
it.  At this point only version 2 of the DRI2 API is advertised to the
loader.

Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
---
 src/mesa/drivers/dri/common/dri_util.c |   97 +++++++++++++++++++++++++++----
 1 files changed, 84 insertions(+), 13 deletions(-)

diff --git a/src/mesa/drivers/dri/common/dri_util.c b/src/mesa/drivers/dri/common/dri_util.c
index 1640c14..7751167 100644
--- a/src/mesa/drivers/dri/common/dri_util.c
+++ b/src/mesa/drivers/dri/common/dri_util.c
@@ -134,35 +134,91 @@ static const __DRIextension **driGetExtensions(__DRIscreen *psp)
 /*@{*/
 
 static __DRIcontext *
-dri2CreateNewContextForAPI(__DRIscreen *screen, int api,
-			   const __DRIconfig *config,
-			   __DRIcontext *shared, void *data)
+dri2CreateContextAttribs(__DRIscreen *screen, int api,
+			 const __DRIconfig *config,
+			 __DRIcontext *shared,
+			 unsigned num_attribs,
+			 const uint32_t *attribs,
+			 unsigned *error,
+			 void *data)
 {
     __DRIcontext *context;
     const struct gl_config *modes = (config != NULL) ? &config->modes : NULL;
     void *shareCtx = (shared != NULL) ? shared->driverPrivate : NULL;
     gl_api mesa_api;
+    unsigned major_version = 1;
+    unsigned minor_version = 0;
+    uint32_t flags = 0;
+
+    assert((num_attribs == 0) || (attribs != NULL));
 
-    if (!(screen->api_mask & (1 << api)))
+    if (!(screen->api_mask & (1 << api))) {
+	*error = __DRI_CTX_ERROR_BAD_API;
 	return NULL;
+    }
 
     switch (api) {
     case __DRI_API_OPENGL:
-	    mesa_api = API_OPENGL;
-	    break;
+	mesa_api = API_OPENGL;
+	break;
     case __DRI_API_GLES:
-	    mesa_api = API_OPENGLES;
-	    break;
+	mesa_api = API_OPENGLES;
+	break;
     case __DRI_API_GLES2:
-	    mesa_api = API_OPENGLES2;
-	    break;
+	mesa_api = API_OPENGLES2;
+	break;
+    case __DRI_API_OPENGL_CORE:
     default:
+	*error = __DRI_CTX_ERROR_BAD_API;
+	return NULL;
+    }
+
+    if (mesa_api != API_OPENGL && num_attribs != 0) {
+	*error = __DRI_CTX_ERROR_UNKNOWN_ATTRIBUTE;
+	assert(!"Should not get here.");
+	return NULL;
+    }
+
+    for (unsigned i = 0; i < num_attribs; i++) {
+	switch (attribs[i * 2]) {
+	case __DRI_CTX_ATTRIB_MAJOR_VERSION:
+	    major_version = attribs[i * 2 + 1];
+	    break;
+	case __DRI_CTX_ATTRIB_MINOR_VERSION:
+	    minor_version = attribs[i * 2 + 1];
+	    break;
+	case __DRI_CTX_ATTRIB_FLAGS:
+	    flags = attribs[i * 2 + 1];
+	    break;
+	default:
+	    /* We can't create a context that satisfies the requirements of an
+	     * attribute that we don't understand.  Return failure.
+	     */
+	    return NULL;
+	}
+    }
+
+    /* There are no forward-compatible contexts before OpenGL 3.0.  The
+     * GLX_ARB_create_context spec says:
+     *
+     *     "Forward-compatible contexts are defined only for OpenGL versions
+     *     3.0 and later."
+     *
+     * Moreover, Mesa can't fulfill the requirements of a forward-looking
+     * context.  Return failure if a forward-looking context is requested.
+     *
+     * In Mesa, a debug context is the same as a regular context.
+     */
+    if (major_version >= 3) {
+	if ((flags & ~__DRI_CTX_FLAG_DEBUG) != 0)
 	    return NULL;
     }
 
     context = malloc(sizeof *context);
-    if (!context)
+    if (!context) {
+	*error = __DRI_CTX_ERROR_NO_MEMORY;
 	return NULL;
+    }
 
     context->loaderPrivate = data;
 
@@ -175,9 +231,20 @@ dri2CreateNewContextForAPI(__DRIscreen *screen, int api,
         return NULL;
     }
 
+    *error = __DRI_CTX_ERROR_SUCCESS;
     return context;
 }
 
+static __DRIcontext *
+dri2CreateNewContextForAPI(__DRIscreen *screen, int api,
+			   const __DRIconfig *config,
+			   __DRIcontext *shared, void *data)
+{
+    unsigned error;
+
+    return dri2CreateContextAttribs(screen, api, config, shared, 0, NULL,
+				    data, &error);
+}
 
 static __DRIcontext *
 dri2CreateNewContext(__DRIscreen *screen, const __DRIconfig *config,
@@ -454,14 +521,18 @@ const __DRIcoreExtension driCoreExtension = {
 
 /** DRI2 interface */
 const __DRIdri2Extension driDRI2Extension = {
-    { __DRI_DRI2, __DRI_DRI2_VERSION },
+    /* Force the version to 2 because the underlying drivers don't (can't!)
+     * support the extra requirements of CreateContextAttribs.
+     */
+    { __DRI_DRI2, 2 },
     dri2CreateNewScreen,
     dri2CreateNewDrawable,
     dri2CreateNewContext,
     dri2GetAPIMask,
     dri2CreateNewContextForAPI,
     dri2AllocateBuffer,
-    dri2ReleaseBuffer
+    dri2ReleaseBuffer,
+    dri2CreateContextAttribs
 };
 
 const __DRI2configQueryExtension dri2ConfigQueryExtension = {
-- 
1.7.6.4



More information about the xorg-devel mailing list