[Mesa-dev] [PATCH v2] dri_util: Don't assume __DRIcontext->driverPrivate is a gl_context

Ian Romanick idr at freedesktop.org
Mon Dec 9 16:39:38 PST 2013


From: Kristian Høgsberg <krh at bitplanet.net>

The driverPrivate pointer is opaque to the driver and we can't assume
it's a struct gl_context in dri_util.c.  Instead provide a helper function
to set the struct gl_context flags from the incoming DRI context flags.

v2 (idr): Modify the other classic drivers to also use
driContextSetFlags.  I ran all the piglit GLX_ARB_create_context tests
with classic swrast without regressions.

Signed-off-by: Kristian Høgsberg <krh at bitplanet.net>
Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
Reviewed-by: Ian Romanick <ian.d.romanick at intel.com> [v1]
Tested-by: Ilia Mirkin <imirkin at alum.mit.edu> [v1]
Cc: "10.0" <mesa-stable at lists.freedesktop.org>
---
 src/mesa/drivers/dri/common/dri_util.c         | 11 +++++++----
 src/mesa/drivers/dri/common/dri_util.h         |  3 +++
 src/mesa/drivers/dri/i915/i830_context.c       |  3 ++-
 src/mesa/drivers/dri/i915/i830_context.h       |  1 +
 src/mesa/drivers/dri/i915/i915_context.c       |  3 ++-
 src/mesa/drivers/dri/i915/i915_context.h       |  1 +
 src/mesa/drivers/dri/i915/intel_context.c      |  1 +
 src/mesa/drivers/dri/i915/intel_context.h      |  1 +
 src/mesa/drivers/dri/i915/intel_screen.c       | 10 ++++++----
 src/mesa/drivers/dri/i965/brw_context.c        |  2 ++
 src/mesa/drivers/dri/nouveau/nouveau_context.c |  2 ++
 src/mesa/drivers/dri/r200/r200_context.c       |  2 ++
 src/mesa/drivers/dri/radeon/radeon_context.c   |  2 ++
 src/mesa/drivers/dri/swrast/swrast.c           |  2 ++
 14 files changed, 34 insertions(+), 10 deletions(-)

diff --git a/src/mesa/drivers/dri/common/dri_util.c b/src/mesa/drivers/dri/common/dri_util.c
index 0bce77e..9134a94 100644
--- a/src/mesa/drivers/dri/common/dri_util.c
+++ b/src/mesa/drivers/dri/common/dri_util.c
@@ -438,16 +438,19 @@ driCreateContextAttribs(__DRIscreen *screen, int api,
         return NULL;
     }
 
-    struct gl_context *ctx = context->driverPrivate;
+    *error = __DRI_CTX_ERROR_SUCCESS;
+    return context;
+}
+
+void
+driContextSetFlags(struct gl_context *ctx, uint32_t flags)
+{
     if ((flags & __DRI_CTX_FLAG_FORWARD_COMPATIBLE) != 0)
         ctx->Const.ContextFlags |= GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT;
     if ((flags & __DRI_CTX_FLAG_DEBUG) != 0) {
         ctx->Const.ContextFlags |= GL_CONTEXT_FLAG_DEBUG_BIT;
         ctx->Debug.DebugOutput = GL_TRUE;
     }
-
-    *error = __DRI_CTX_ERROR_SUCCESS;
-    return context;
 }
 
 static __DRIcontext *
diff --git a/src/mesa/drivers/dri/common/dri_util.h b/src/mesa/drivers/dri/common/dri_util.h
index 79a8564..35f674e 100644
--- a/src/mesa/drivers/dri/common/dri_util.h
+++ b/src/mesa/drivers/dri/common/dri_util.h
@@ -289,6 +289,9 @@ dri2InvalidateDrawable(__DRIdrawable *drawable);
 extern void
 driUpdateFramebufferSize(struct gl_context *ctx, const __DRIdrawable *dPriv);
 
+extern void
+driContextSetFlags(struct gl_context *ctx, uint32_t flags);
+
 extern const __DRIimageDriverExtension driImageDriverExtension;
 
 #endif /* _DRI_UTIL_H_ */
diff --git a/src/mesa/drivers/dri/i915/i830_context.c b/src/mesa/drivers/dri/i915/i830_context.c
index b7553d8..87d1a49 100644
--- a/src/mesa/drivers/dri/i915/i830_context.c
+++ b/src/mesa/drivers/dri/i915/i830_context.c
@@ -56,6 +56,7 @@ i830CreateContext(int api,
                   __DRIcontext * driContextPriv,
                   unsigned major_version,
                   unsigned minor_version,
+                  uint32_t flags,
                   unsigned *error,
                   void *sharedContextPrivate)
 {
@@ -73,7 +74,7 @@ i830CreateContext(int api,
    i830InitDriverFunctions(&functions);
 
    if (!intelInitContext(intel, __DRI_API_OPENGL,
-                         major_version, minor_version,
+                         major_version, minor_version, flags,
                          mesaVis, driContextPriv,
                          sharedContextPrivate, &functions,
                          error)) {
diff --git a/src/mesa/drivers/dri/i915/i830_context.h b/src/mesa/drivers/dri/i915/i830_context.h
index ab6222b..4088480 100644
--- a/src/mesa/drivers/dri/i915/i830_context.h
+++ b/src/mesa/drivers/dri/i915/i830_context.h
@@ -183,6 +183,7 @@ i830CreateContext(int api,
                   __DRIcontext * driContextPriv,
                   unsigned major_version,
                   unsigned minor_version,
+                  uint32_t flags,
                   unsigned *error,
                   void *sharedContextPrivate);
 
diff --git a/src/mesa/drivers/dri/i915/i915_context.c b/src/mesa/drivers/dri/i915/i915_context.c
index 5907e32..2389043 100644
--- a/src/mesa/drivers/dri/i915/i915_context.c
+++ b/src/mesa/drivers/dri/i915/i915_context.c
@@ -151,6 +151,7 @@ i915CreateContext(int api,
                   __DRIcontext * driContextPriv,
                   unsigned major_version,
                   unsigned minor_version,
+                  uint32_t flags,
                   unsigned *error,
                   void *sharedContextPrivate)
 {
@@ -168,7 +169,7 @@ i915CreateContext(int api,
 
    i915InitDriverFunctions(&functions);
 
-   if (!intelInitContext(intel, api, major_version, minor_version,
+   if (!intelInitContext(intel, api, major_version, minor_version, flags,
                          mesaVis, driContextPriv,
                          sharedContextPrivate, &functions,
                          error)) {
diff --git a/src/mesa/drivers/dri/i915/i915_context.h b/src/mesa/drivers/dri/i915/i915_context.h
index f5c1596..7789ac2 100644
--- a/src/mesa/drivers/dri/i915/i915_context.h
+++ b/src/mesa/drivers/dri/i915/i915_context.h
@@ -324,6 +324,7 @@ extern bool i915CreateContext(int api,
 			      __DRIcontext * driContextPriv,
                               unsigned major_version,
                               unsigned minor_version,
+                              uint32_t flags,
                               unsigned *error,
 			      void *sharedContextPrivate);
 
diff --git a/src/mesa/drivers/dri/i915/intel_context.c b/src/mesa/drivers/dri/i915/intel_context.c
index 3618893..ac5d4ff 100644
--- a/src/mesa/drivers/dri/i915/intel_context.c
+++ b/src/mesa/drivers/dri/i915/intel_context.c
@@ -409,6 +409,7 @@ intelInitContext(struct intel_context *intel,
                  int api,
                  unsigned major_version,
                  unsigned minor_version,
+                 uint32_t flags,
                  const struct gl_config * mesaVis,
                  __DRIcontext * driContextPriv,
                  void *sharedContextPrivate,
diff --git a/src/mesa/drivers/dri/i915/intel_context.h b/src/mesa/drivers/dri/i915/intel_context.h
index e488ed1..c3dad9c 100644
--- a/src/mesa/drivers/dri/i915/intel_context.h
+++ b/src/mesa/drivers/dri/i915/intel_context.h
@@ -401,6 +401,7 @@ extern bool intelInitContext(struct intel_context *intel,
                              int api,
                              unsigned major_version,
                              unsigned minor_version,
+                             uint32_t flags,
                              const struct gl_config * mesaVis,
                              __DRIcontext * driContextPriv,
                              void *sharedContextPrivate,
diff --git a/src/mesa/drivers/dri/i915/intel_screen.c b/src/mesa/drivers/dri/i915/intel_screen.c
index 7f1fc6b..d607f47 100644
--- a/src/mesa/drivers/dri/i915/intel_screen.c
+++ b/src/mesa/drivers/dri/i915/intel_screen.c
@@ -931,6 +931,7 @@ i830CreateContext(int api,
 		  __DRIcontext *driContextPriv,
 		  unsigned major_version,
 		  unsigned minor_version,
+                  uint32_t flags,
 		  unsigned *error,
 		  void *sharedContextPrivate);
 
@@ -940,6 +941,7 @@ i915CreateContext(int api,
 		  __DRIcontext *driContextPriv,
                   unsigned major_version,
                   unsigned minor_version,
+                  uint32_t flags,
                   unsigned *error,
 		  void *sharedContextPrivate);
 
@@ -971,13 +973,13 @@ intelCreateContext(gl_api api,
 
    if (IS_9XX(intelScreen->deviceID)) {
       success = i915CreateContext(api, mesaVis, driContextPriv,
-                                  major_version, minor_version, error,
-                                  sharedContextPrivate);
+                                  major_version, minor_version, flags,
+                                  error, sharedContextPrivate);
    } else {
       intelScreen->no_vbo = true;
       success = i830CreateContext(api, mesaVis, driContextPriv,
-                                  major_version, minor_version, error,
-                                  sharedContextPrivate);
+                                  major_version, minor_version, flags,
+                                  error, sharedContextPrivate);
    }
 
    if (success)
diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c
index a1676fe..688091f 100644
--- a/src/mesa/drivers/dri/i965/brw_context.c
+++ b/src/mesa/drivers/dri/i965/brw_context.c
@@ -631,6 +631,8 @@ brwCreateContext(gl_api api,
       return false;
    }
 
+   driContextSetFlags(ctx, flags);
+
    /* Initialize the software rasterizer and helper modules.
     *
     * As of GL 3.1 core, the gen4+ driver doesn't need the swrast context for
diff --git a/src/mesa/drivers/dri/nouveau/nouveau_context.c b/src/mesa/drivers/dri/nouveau/nouveau_context.c
index d44864c..18c6e77 100644
--- a/src/mesa/drivers/dri/nouveau/nouveau_context.c
+++ b/src/mesa/drivers/dri/nouveau/nouveau_context.c
@@ -78,6 +78,8 @@ nouveau_context_create(gl_api api,
 		return GL_FALSE;
 	}
 
+	driContextSetFlags(ctx, flags);
+
 	nctx = to_nouveau_context(ctx);
 	nctx->dri_context = dri_ctx;
 	dri_ctx->driverPrivate = ctx;
diff --git a/src/mesa/drivers/dri/r200/r200_context.c b/src/mesa/drivers/dri/r200/r200_context.c
index d4e9ca8..dadbd77 100644
--- a/src/mesa/drivers/dri/r200/r200_context.c
+++ b/src/mesa/drivers/dri/r200/r200_context.c
@@ -279,6 +279,8 @@ GLboolean r200CreateContext( gl_api api,
      return GL_FALSE;
    }
 
+   driContextSetFlags(ctx, flags);
+
    rmesa->radeon.swtcl.RenderIndex = ~0;
    rmesa->radeon.hw.all_dirty = 1;
 
diff --git a/src/mesa/drivers/dri/radeon/radeon_context.c b/src/mesa/drivers/dri/radeon/radeon_context.c
index 76bfe55..c8b997b 100644
--- a/src/mesa/drivers/dri/radeon/radeon_context.c
+++ b/src/mesa/drivers/dri/radeon/radeon_context.c
@@ -242,6 +242,8 @@ r100CreateContext( gl_api api,
      return GL_FALSE;
    }
 
+   driContextSetFlags(ctx, flags);
+
    rmesa->radeon.swtcl.RenderIndex = ~0;
    rmesa->radeon.hw.all_dirty = GL_TRUE;
 
diff --git a/src/mesa/drivers/dri/swrast/swrast.c b/src/mesa/drivers/dri/swrast/swrast.c
index 73dc5c4..0dd31c9 100644
--- a/src/mesa/drivers/dri/swrast/swrast.c
+++ b/src/mesa/drivers/dri/swrast/swrast.c
@@ -705,6 +705,8 @@ dri_create_context(gl_api api,
 	goto context_fail;
     }
 
+    driContextSetFlags(ctx, flags);
+
     /* do bounds checking to prevent segfaults and server crashes! */
     mesaCtx->Const.CheckArrayBounds = GL_TRUE;
 
-- 
1.8.1.4



More information about the mesa-dev mailing list