From 38366c0c6e715314367b15680702e382d5c46a4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= Date: Sat, 7 Dec 2013 22:02:11 -0800 Subject: [PATCH] dri_util: Don't assume __DRIcontext->driverPrivate is a gl_context MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 i965 and classic swrast without regressions. Signed-off-by: Kristian Høgsberg Signed-off-by: Ian Romanick Reviewed-by: Ian Romanick [v1] Reviewed-by: Eric Anholt Tested-by: Ilia Mirkin [v1 on Gallium nouveau] Cc: "10.0" --- 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 fd2eca715c3..d648211123a 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 4cfa75dd3e4..a79a4ed7aea 100644 --- a/src/mesa/drivers/dri/common/dri_util.h +++ b/src/mesa/drivers/dri/common/dri_util.h @@ -292,6 +292,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 b7553d87fdc..87d1a496ecc 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 ab6222b56f0..4088480e644 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 5907e32b756..23890439ca5 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 f5c15960dd0..7789ac28ee4 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 36188934fca..ac5d4ff240b 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 e488ed1a677..c3dad9c291f 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 7f1fc6b89e2..d607f477d84 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 a1676fe39fd..688091fa49e 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 d44864ca9a9..18c6e776f2b 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 d4e9ca8caca..dadbd7778c6 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 76bfe55c0eb..c8b997bcf05 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 7eed5a418cb..cfa9316a2da 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;