diff options
Diffstat (limited to 'src/mesa/drivers')
-rw-r--r-- | src/mesa/drivers/dri/common/dri_util.c | 57 | ||||
-rw-r--r-- | src/mesa/drivers/dri/common/dri_util.h | 37 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i915/intel_screen.c | 18 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_context.c | 41 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_context.h | 6 | ||||
-rw-r--r-- | src/mesa/drivers/dri/nouveau/nouveau_context.c | 15 | ||||
-rw-r--r-- | src/mesa/drivers/dri/nouveau/nouveau_context.h | 3 | ||||
-rw-r--r-- | src/mesa/drivers/dri/r200/r200_context.c | 12 | ||||
-rw-r--r-- | src/mesa/drivers/dri/r200/r200_context.h | 7 | ||||
-rw-r--r-- | src/mesa/drivers/dri/radeon/radeon_context.c | 12 | ||||
-rw-r--r-- | src/mesa/drivers/dri/radeon/radeon_context.h | 7 | ||||
-rw-r--r-- | src/mesa/drivers/dri/swrast/swrast.c | 16 |
12 files changed, 128 insertions, 103 deletions
diff --git a/src/mesa/drivers/dri/common/dri_util.c b/src/mesa/drivers/dri/common/dri_util.c index 1cff0ddb2de..dc5260ca5b9 100644 --- a/src/mesa/drivers/dri/common/dri_util.c +++ b/src/mesa/drivers/dri/common/dri_util.c @@ -302,11 +302,13 @@ driCreateContextAttribs(__DRIscreen *screen, int api, 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; - bool notify_reset = false; - unsigned priority = __DRI_CTX_PRIORITY_MEDIUM; + struct __DriverContextConfig ctx_config; + + ctx_config.major_version = 1; + ctx_config.minor_version = 0; + ctx_config.flags = 0; + ctx_config.attribute_mask = 0; + ctx_config.priority = __DRI_CTX_PRIORITY_MEDIUM; assert((num_attribs == 0) || (attribs != NULL)); @@ -337,20 +339,27 @@ driCreateContextAttribs(__DRIscreen *screen, int api, for (unsigned i = 0; i < num_attribs; i++) { switch (attribs[i * 2]) { case __DRI_CTX_ATTRIB_MAJOR_VERSION: - major_version = attribs[i * 2 + 1]; + ctx_config.major_version = attribs[i * 2 + 1]; break; case __DRI_CTX_ATTRIB_MINOR_VERSION: - minor_version = attribs[i * 2 + 1]; + ctx_config.minor_version = attribs[i * 2 + 1]; break; case __DRI_CTX_ATTRIB_FLAGS: - flags = attribs[i * 2 + 1]; + ctx_config.flags = attribs[i * 2 + 1]; break; case __DRI_CTX_ATTRIB_RESET_STRATEGY: - notify_reset = (attribs[i * 2 + 1] - != __DRI_CTX_RESET_NO_NOTIFICATION); + if (attribs[i * 2 + 1] != __DRI_CTX_RESET_NO_NOTIFICATION) { + ctx_config.attribute_mask |= + __DRIVER_CONTEXT_ATTRIB_RESET_STRATEGY; + ctx_config.reset_strategy = attribs[i * 2 + 1]; + } else { + ctx_config.attribute_mask &= + ~__DRIVER_CONTEXT_ATTRIB_RESET_STRATEGY; + } break; case __DRI_CTX_ATTRIB_PRIORITY: - priority = attribs[i * 2 + 1]; + ctx_config.attribute_mask |= __DRIVER_CONTEXT_ATTRIB_PRIORITY; + ctx_config.priority = attribs[i * 2 + 1]; break; default: /* We can't create a context that satisfies the requirements of an @@ -366,12 +375,14 @@ driCreateContextAttribs(__DRIscreen *screen, int api, * compatibility profile. This means that we treat a API_OPENGL_COMPAT 3.1 as * API_OPENGL_CORE and reject API_OPENGL_COMPAT 3.2+. */ - if (mesa_api == API_OPENGL_COMPAT && major_version == 3 && minor_version == 1) + if (mesa_api == API_OPENGL_COMPAT && + ctx_config.major_version == 3 && ctx_config.minor_version == 1) mesa_api = API_OPENGL_CORE; if (mesa_api == API_OPENGL_COMPAT - && ((major_version > 3) - || (major_version == 3 && minor_version >= 2))) { + && ((ctx_config.major_version > 3) + || (ctx_config.major_version == 3 && + ctx_config.minor_version >= 2))) { *error = __DRI_CTX_ERROR_BAD_API; return NULL; } @@ -406,9 +417,9 @@ driCreateContextAttribs(__DRIscreen *screen, int api, */ if (mesa_api != API_OPENGL_COMPAT && mesa_api != API_OPENGL_CORE - && (flags & ~(__DRI_CTX_FLAG_DEBUG | - __DRI_CTX_FLAG_ROBUST_BUFFER_ACCESS | - __DRI_CTX_FLAG_NO_ERROR))) { + && (ctx_config.flags & ~(__DRI_CTX_FLAG_DEBUG | + __DRI_CTX_FLAG_ROBUST_BUFFER_ACCESS | + __DRI_CTX_FLAG_NO_ERROR))) { *error = __DRI_CTX_ERROR_BAD_FLAG; return NULL; } @@ -424,7 +435,7 @@ driCreateContextAttribs(__DRIscreen *screen, int api, * * In Mesa, a debug context is the same as a regular context. */ - if ((flags & __DRI_CTX_FLAG_FORWARD_COMPATIBLE) != 0) { + if ((ctx_config.flags & __DRI_CTX_FLAG_FORWARD_COMPATIBLE) != 0) { mesa_api = API_OPENGL_CORE; } @@ -432,13 +443,15 @@ driCreateContextAttribs(__DRIscreen *screen, int api, | __DRI_CTX_FLAG_FORWARD_COMPATIBLE | __DRI_CTX_FLAG_ROBUST_BUFFER_ACCESS | __DRI_CTX_FLAG_NO_ERROR); - if (flags & ~allowed_flags) { + if (ctx_config.flags & ~allowed_flags) { *error = __DRI_CTX_ERROR_UNKNOWN_FLAG; return NULL; } if (!validate_context_version(screen, mesa_api, - major_version, minor_version, error)) + ctx_config.major_version, + ctx_config.minor_version, + error)) return NULL; context = calloc(1, sizeof *context); @@ -454,9 +467,7 @@ driCreateContextAttribs(__DRIscreen *screen, int api, context->driReadablePriv = NULL; if (!screen->driver->CreateContext(mesa_api, modes, context, - major_version, minor_version, - flags, notify_reset, priority, - error, shareCtx)) { + &ctx_config, error, shareCtx)) { free(context); return NULL; } diff --git a/src/mesa/drivers/dri/common/dri_util.h b/src/mesa/drivers/dri/common/dri_util.h index ecc2a475073..13d07dd5130 100644 --- a/src/mesa/drivers/dri/common/dri_util.h +++ b/src/mesa/drivers/dri/common/dri_util.h @@ -67,6 +67,37 @@ extern const __DRIswrastExtension driSWRastExtension; extern const __DRIdri2Extension driDRI2Extension; extern const __DRI2configQueryExtension dri2ConfigQueryExtension; extern const __DRIcopySubBufferExtension driCopySubBufferExtension; + +/** + * Description of the attributes used to create a config. + * + * This is passed as the context_config parameter to CreateContext. The idea + * with this struct is that it can be extended without having to modify all of + * the drivers. The first three members (major/minor_version and flags) are + * always valid, but the remaining members are only valid if the corresponding + * flag is set for the attribute. If the flag is not set then the default + * value should be assumed. That way the driver can quickly check if any + * attributes were set that it doesn't understand and report an error. + */ +struct __DriverContextConfig { + /* These members are always valid */ + unsigned major_version; + unsigned minor_version; + uint32_t flags; + + /* Flags describing which of the remaining members are valid */ + uint32_t attribute_mask; + + /* Only valid if __DRIVER_CONTEXT_ATTRIB_RESET_STRATEGY is set */ + int reset_strategy; + + /* Only valid if __DRIVER_CONTEXT_PRIORITY is set */ + unsigned priority; +}; + +#define __DRIVER_CONTEXT_ATTRIB_RESET_STRATEGY (1 << 0) +#define __DRIVER_CONTEXT_ATTRIB_PRIORITY (1 << 1) + /** * Driver callback functions. * @@ -85,11 +116,7 @@ struct __DriverAPIRec { GLboolean (*CreateContext)(gl_api api, const struct gl_config *glVis, __DRIcontext *driContextPriv, - unsigned major_version, - unsigned minor_version, - uint32_t flags, - bool notify_reset, - unsigned priority, + const struct __DriverContextConfig *ctx_config, unsigned *error, void *sharedContextPrivate); diff --git a/src/mesa/drivers/dri/i915/intel_screen.c b/src/mesa/drivers/dri/i915/intel_screen.c index 1621a6246ba..5024a69bd41 100644 --- a/src/mesa/drivers/dri/i915/intel_screen.c +++ b/src/mesa/drivers/dri/i915/intel_screen.c @@ -958,11 +958,7 @@ static GLboolean intelCreateContext(gl_api api, const struct gl_config * mesaVis, __DRIcontext * driContextPriv, - unsigned major_version, - unsigned minor_version, - uint32_t flags, - bool notify_reset, - unsigned priority, + const struct __DriverContextConfig *ctx_config, unsigned *error, void *sharedContextPrivate) { @@ -971,24 +967,28 @@ intelCreateContext(gl_api api, __DRIscreen *sPriv = driContextPriv->driScreenPriv; struct intel_screen *intelScreen = sPriv->driverPrivate; - if (flags & ~(__DRI_CTX_FLAG_DEBUG | __DRI_CTX_FLAG_NO_ERROR)) { + if (ctx_config->flags & ~(__DRI_CTX_FLAG_DEBUG | __DRI_CTX_FLAG_NO_ERROR)) { *error = __DRI_CTX_ERROR_UNKNOWN_FLAG; return false; } - if (notify_reset) { + if (ctx_config->attribute_mask) { *error = __DRI_CTX_ERROR_UNKNOWN_ATTRIBUTE; return false; } if (IS_GEN3(intelScreen->deviceID)) { success = i915CreateContext(api, mesaVis, driContextPriv, - major_version, minor_version, flags, + ctx_config->major_version, + ctx_config->minor_version, + ctx_config->flags, error, sharedContextPrivate); } else { intelScreen->no_vbo = true; success = i830CreateContext(api, mesaVis, driContextPriv, - major_version, minor_version, flags, + ctx_config->major_version, + ctx_config->minor_version, + ctx_config->flags, error, sharedContextPrivate); } diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c index fae76312661..bb8b755cb55 100644 --- a/src/mesa/drivers/dri/i965/brw_context.c +++ b/src/mesa/drivers/dri/i965/brw_context.c @@ -826,11 +826,7 @@ GLboolean brwCreateContext(gl_api api, const struct gl_config *mesaVis, __DRIcontext *driContextPriv, - unsigned major_version, - unsigned minor_version, - uint32_t flags, - bool notify_reset, - unsigned priority, + const struct __DriverContextConfig *ctx_config, unsigned *dri_ctx_error, void *sharedContextPrivate) { @@ -849,11 +845,20 @@ brwCreateContext(gl_api api, if (screen->has_context_reset_notification) allowed_flags |= __DRI_CTX_FLAG_ROBUST_BUFFER_ACCESS; - if (flags & ~allowed_flags) { + if (ctx_config->flags & ~allowed_flags) { *dri_ctx_error = __DRI_CTX_ERROR_UNKNOWN_FLAG; return false; } + if (ctx_config->attribute_mask & ~__DRIVER_CONTEXT_ATTRIB_RESET_STRATEGY) { + *dri_ctx_error = __DRI_CTX_ERROR_UNKNOWN_ATTRIBUTE; + return false; + } + + bool notify_reset = + ((ctx_config->attribute_mask & __DRIVER_CONTEXT_ATTRIB_RESET_STRATEGY) && + ctx_config->reset_strategy != __DRI_CTX_RESET_NO_NOTIFICATION); + struct brw_context *brw = rzalloc(NULL, struct brw_context); if (!brw) { fprintf(stderr, "%s: failed to alloc context\n", __func__); @@ -902,7 +907,7 @@ brwCreateContext(gl_api api, return false; } - driContextSetFlags(ctx, flags); + driContextSetFlags(ctx, ctx_config->flags); /* Initialize the software rasterizer and helper modules. * @@ -962,19 +967,21 @@ brwCreateContext(gl_api api, } int hw_priority = BRW_CONTEXT_MEDIUM_PRIORITY; - switch (priority) { - case __DRI_CTX_PRIORITY_LOW: - hw_priority = BRW_CONTEXT_LOW_PRIORITY; - break; - case __DRI_CTX_PRIORITY_HIGH: - hw_priority = BRW_CONTEXT_HIGH_PRIORITY; - break; + if (ctx_config->attribute_mask & __DRIVER_CONTEXT_ATTRIB_PRIORITY) { + switch (ctx_config->priority) { + case __DRI_CTX_PRIORITY_LOW: + hw_priority = BRW_CONTEXT_LOW_PRIORITY; + break; + case __DRI_CTX_PRIORITY_HIGH: + hw_priority = BRW_CONTEXT_HIGH_PRIORITY; + break; + } } if (hw_priority != I915_CONTEXT_DEFAULT_PRIORITY && brw_hw_context_set_priority(brw->bufmgr, brw->hw_ctx, hw_priority)) { fprintf(stderr, "Failed to set priority [%d:%d] for hardware context.\n", - priority, hw_priority); + ctx_config->priority, hw_priority); intelDestroyContext(driContextPriv); return false; } @@ -1013,12 +1020,12 @@ brwCreateContext(gl_api api, brw_draw_init( brw ); - if ((flags & __DRI_CTX_FLAG_DEBUG) != 0) { + if ((ctx_config->flags & __DRI_CTX_FLAG_DEBUG) != 0) { /* Turn on some extra GL_ARB_debug_output generation. */ brw->perf_debug = true; } - if ((flags & __DRI_CTX_FLAG_ROBUST_BUFFER_ACCESS) != 0) { + if ((ctx_config->flags & __DRI_CTX_FLAG_ROBUST_BUFFER_ACCESS) != 0) { ctx->Const.ContextFlags |= GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB; ctx->Const.RobustAccess = GL_TRUE; } diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h index 766b5bc0731..8aa0c5ff64c 100644 --- a/src/mesa/drivers/dri/i965/brw_context.h +++ b/src/mesa/drivers/dri/i965/brw_context.h @@ -1258,11 +1258,7 @@ void intel_resolve_for_dri2_flush(struct brw_context *brw, GLboolean brwCreateContext(gl_api api, const struct gl_config *mesaVis, __DRIcontext *driContextPriv, - unsigned major_version, - unsigned minor_version, - uint32_t flags, - bool notify_reset, - unsigned priority, + const struct __DriverContextConfig *ctx_config, unsigned *error, void *sharedContextPrivate); diff --git a/src/mesa/drivers/dri/nouveau/nouveau_context.c b/src/mesa/drivers/dri/nouveau/nouveau_context.c index 39620e10214..397e39603d2 100644 --- a/src/mesa/drivers/dri/nouveau/nouveau_context.c +++ b/src/mesa/drivers/dri/nouveau/nouveau_context.c @@ -51,11 +51,7 @@ GLboolean nouveau_context_create(gl_api api, const struct gl_config *visual, __DRIcontext *dri_ctx, - unsigned major_version, - unsigned minor_version, - uint32_t flags, - bool notify_reset, - unsigned priority, + const struct __DriverContextConfig *ctx_config, unsigned *error, void *share_ctx) { @@ -64,12 +60,12 @@ nouveau_context_create(gl_api api, struct nouveau_context *nctx; struct gl_context *ctx; - if (flags & ~(__DRI_CTX_FLAG_DEBUG | __DRI_CTX_FLAG_NO_ERROR)) { + if (ctx_config->flags & ~(__DRI_CTX_FLAG_DEBUG | __DRI_CTX_FLAG_NO_ERROR)) { *error = __DRI_CTX_ERROR_UNKNOWN_FLAG; return false; } - if (notify_reset) { + if (ctx_config->attribute_mask) { *error = __DRI_CTX_ERROR_UNKNOWN_ATTRIBUTE; return false; } @@ -80,14 +76,15 @@ nouveau_context_create(gl_api api, return GL_FALSE; } - driContextSetFlags(ctx, flags); + driContextSetFlags(ctx, ctx_config->flags); nctx = to_nouveau_context(ctx); nctx->dri_context = dri_ctx; dri_ctx->driverPrivate = ctx; _mesa_compute_version(ctx); - if (ctx->Version < major_version * 10 + minor_version) { + if (ctx->Version < (ctx_config->major_version * 10 + + ctx_config->minor_version)) { nouveau_context_destroy(dri_ctx); *error = __DRI_CTX_ERROR_BAD_VERSION; return GL_FALSE; diff --git a/src/mesa/drivers/dri/nouveau/nouveau_context.h b/src/mesa/drivers/dri/nouveau/nouveau_context.h index 6ab865c7bde..dcb7bbb23a1 100644 --- a/src/mesa/drivers/dri/nouveau/nouveau_context.h +++ b/src/mesa/drivers/dri/nouveau/nouveau_context.h @@ -110,8 +110,7 @@ struct nouveau_context { GLboolean nouveau_context_create(gl_api api, const struct gl_config *visual, __DRIcontext *dri_ctx, - unsigned major_version, unsigned minor_version, - uint32_t flags, bool notify_reset, unsigned priority, + const struct __DriverContextConfig *ctx_config, unsigned *error, void *share_ctx); GLboolean diff --git a/src/mesa/drivers/dri/r200/r200_context.c b/src/mesa/drivers/dri/r200/r200_context.c index bd4f8b62cd2..edd433ae97e 100644 --- a/src/mesa/drivers/dri/r200/r200_context.c +++ b/src/mesa/drivers/dri/r200/r200_context.c @@ -174,11 +174,7 @@ static void r200_init_vtbl(radeonContextPtr radeon) GLboolean r200CreateContext( gl_api api, const struct gl_config *glVisual, __DRIcontext *driContextPriv, - unsigned major_version, - unsigned minor_version, - uint32_t flags, - bool notify_reset, - unsigned priority, + const struct __DriverContextConfig *ctx_config, unsigned *error, void *sharedContextPrivate) { @@ -190,12 +186,12 @@ GLboolean r200CreateContext( gl_api api, int i; int tcl_mode; - if (flags & ~(__DRI_CTX_FLAG_DEBUG | __DRI_CTX_FLAG_NO_ERROR)) { + if (ctx_config->flags & ~(__DRI_CTX_FLAG_DEBUG | __DRI_CTX_FLAG_NO_ERROR)) { *error = __DRI_CTX_ERROR_UNKNOWN_FLAG; return false; } - if (notify_reset) { + if (ctx_config->attribute_mask) { *error = __DRI_CTX_ERROR_UNKNOWN_ATTRIBUTE; return false; } @@ -251,7 +247,7 @@ GLboolean r200CreateContext( gl_api api, ctx = &rmesa->radeon.glCtx; - driContextSetFlags(ctx, flags); + driContextSetFlags(ctx, ctx_config->flags); /* Initialize the software rasterizer and helper modules. */ diff --git a/src/mesa/drivers/dri/r200/r200_context.h b/src/mesa/drivers/dri/r200/r200_context.h index 200e0a24312..f9ba6835e80 100644 --- a/src/mesa/drivers/dri/r200/r200_context.h +++ b/src/mesa/drivers/dri/r200/r200_context.h @@ -628,11 +628,8 @@ extern void r200DestroyContext( __DRIcontext *driContextPriv ); extern GLboolean r200CreateContext( gl_api api, const struct gl_config *glVisual, __DRIcontext *driContextPriv, - unsigned major_version, - unsigned minor_version, - uint32_t flags, - bool notify_reset, - unsigned priority, + const struct __DriverContextConfig * + ctx_config, unsigned *error, void *sharedContextPrivate); extern GLboolean r200MakeCurrent( __DRIcontext *driContextPriv, diff --git a/src/mesa/drivers/dri/radeon/radeon_context.c b/src/mesa/drivers/dri/radeon/radeon_context.c index 866dc80c98f..04c76cdba1d 100644 --- a/src/mesa/drivers/dri/radeon/radeon_context.c +++ b/src/mesa/drivers/dri/radeon/radeon_context.c @@ -140,11 +140,7 @@ GLboolean r100CreateContext( gl_api api, const struct gl_config *glVisual, __DRIcontext *driContextPriv, - unsigned major_version, - unsigned minor_version, - uint32_t flags, - bool notify_reset, - unsigned priority, + const struct __DriverContextConfig *ctx_config, unsigned *error, void *sharedContextPrivate) { @@ -156,12 +152,12 @@ r100CreateContext( gl_api api, int i; int tcl_mode, fthrottle_mode; - if (flags & ~(__DRI_CTX_FLAG_DEBUG | __DRI_CTX_FLAG_NO_ERROR)) { + if (ctx_config->flags & ~(__DRI_CTX_FLAG_DEBUG | __DRI_CTX_FLAG_NO_ERROR)) { *error = __DRI_CTX_ERROR_UNKNOWN_FLAG; return false; } - if (notify_reset) { + if (ctx_config->attribute_mask) { *error = __DRI_CTX_ERROR_UNKNOWN_ATTRIBUTE; return false; } @@ -214,7 +210,7 @@ r100CreateContext( gl_api api, ctx = &rmesa->radeon.glCtx; - driContextSetFlags(ctx, flags); + driContextSetFlags(ctx, ctx_config->flags); /* Initialize the software rasterizer and helper modules. */ diff --git a/src/mesa/drivers/dri/radeon/radeon_context.h b/src/mesa/drivers/dri/radeon/radeon_context.h index 4124f50db5e..94917cf30b6 100644 --- a/src/mesa/drivers/dri/radeon/radeon_context.h +++ b/src/mesa/drivers/dri/radeon/radeon_context.h @@ -452,11 +452,8 @@ R100_CONTEXT(struct gl_context *ctx) extern GLboolean r100CreateContext( gl_api api, const struct gl_config *glVisual, __DRIcontext *driContextPriv, - unsigned major_version, - unsigned minor_version, - uint32_t flags, - bool notify_reset, - unsigned priority, + const struct __DriverContextConfig * + ctx_config, unsigned *error, void *sharedContextPrivate); diff --git a/src/mesa/drivers/dri/swrast/swrast.c b/src/mesa/drivers/dri/swrast/swrast.c index 6b71d806f09..f9bd1b9d560 100644 --- a/src/mesa/drivers/dri/swrast/swrast.c +++ b/src/mesa/drivers/dri/swrast/swrast.c @@ -752,11 +752,7 @@ static GLboolean dri_create_context(gl_api api, const struct gl_config * visual, __DRIcontext * cPriv, - unsigned major_version, - unsigned minor_version, - uint32_t flags, - bool notify_reset, - unsigned priority, + const struct __DriverContextConfig *ctx_config, unsigned *error, void *sharedContextPrivate) { @@ -770,7 +766,13 @@ dri_create_context(gl_api api, /* Flag filtering is handled in dri2CreateContextAttribs. */ - (void) flags; + (void) ctx_config->flags; + + /* The swrast driver doesn't understand any of the attributes */ + if (ctx_config->attribute_mask != 0) { + *error = __DRI_CTX_ERROR_UNKNOWN_ATTRIBUTE; + return false; + } ctx = CALLOC_STRUCT(dri_context); if (ctx == NULL) { @@ -797,7 +799,7 @@ dri_create_context(gl_api api, goto context_fail; } - driContextSetFlags(mesaCtx, flags); + driContextSetFlags(mesaCtx, ctx_config->flags); /* create module contexts */ _swrast_CreateContext( mesaCtx ); |