aboutsummaryrefslogtreecommitdiffstats
path: root/src/mesa/drivers/dri/common
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/drivers/dri/common')
-rw-r--r--src/mesa/drivers/dri/common/dri_util.c57
-rw-r--r--src/mesa/drivers/dri/common/dri_util.h37
2 files changed, 66 insertions, 28 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);