diff options
Diffstat (limited to 'src/mesa/drivers/dri/common')
-rw-r--r-- | src/mesa/drivers/dri/common/dri_util.c | 57 | ||||
-rw-r--r-- | src/mesa/drivers/dri/common/dri_util.h | 37 |
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); |