void *sharedContextPrivate)
{
bool success = false;
@@ -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 fae7631266..60584e2744 100644
--- a/src/mesa/drivers/dri/i965/brw_context.c
+++ b/src/mesa/drivers/dri/i965/brw_context.c
@@ -824,13 +824,9 @@ brw_process_driconf_options(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 gl_config *mesaVis,
+ __DRIcontext *driContextPriv,
+ 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 3bee3e99ed..a85ac3e5f8 100644
--- a/src/mesa/drivers/dri/i965/brw_context.h
+++ b/src/mesa/drivers/dri/i965/brw_context.h
@@ -1242,11 +1242,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 39620e1021..397e39603d 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 6ab865c7bd..dcb7bbb23a 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 bd4f8b62cd..edd433ae97 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 200e0a2431..f9ba6835e8 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 866dc80c98..04c76cdba1 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 4124f50db5..94917cf30b 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 6b71d806f0..f9bd1b9d56 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 );