diff options
-rw-r--r-- | src/gallium/include/state_tracker/st_api.h | 1 | ||||
-rw-r--r-- | src/gallium/state_trackers/dri/dri2.c | 23 | ||||
-rw-r--r-- | src/gallium/state_trackers/dri/dri_context.c | 27 | ||||
-rw-r--r-- | src/gallium/state_trackers/dri/dri_screen.h | 1 |
4 files changed, 43 insertions, 9 deletions
diff --git a/src/gallium/include/state_tracker/st_api.h b/src/gallium/include/state_tracker/st_api.h index 86fdc6988a..ecf1c07fb9 100644 --- a/src/gallium/include/state_tracker/st_api.h +++ b/src/gallium/include/state_tracker/st_api.h @@ -89,6 +89,7 @@ enum st_api_feature #define ST_CONTEXT_FLAG_DEBUG (1 << 0) #define ST_CONTEXT_FLAG_FORWARD_COMPATIBLE (1 << 1) #define ST_CONTEXT_FLAG_ROBUST_ACCESS (1 << 2) +#define ST_CONTEXT_FLAG_RESET_NOTIFICATION_ENABLED (1 << 3) /** * Reasons that context creation might fail. diff --git a/src/gallium/state_trackers/dri/dri2.c b/src/gallium/state_trackers/dri/dri2.c index 8b6fe67dc9..792d565169 100644 --- a/src/gallium/state_trackers/dri/dri2.c +++ b/src/gallium/state_trackers/dri/dri2.c @@ -1399,6 +1399,10 @@ static __DRI2fenceExtension dri2FenceExtension = { .server_wait_sync = dri2_server_wait_sync }; +static const __DRIrobustnessExtension dri2Robustness = { + .base = { __DRI2_ROBUSTNESS, 1 } +}; + /* * Backend function init_screen. */ @@ -1414,6 +1418,18 @@ static const __DRIextension *dri_screen_extensions[] = { NULL }; +static const __DRIextension *dri_robust_screen_extensions[] = { + &driTexBufferExtension.base, + &dri2FlushExtension.base, + &dri2ImageExtension.base, + &dri2RendererQueryExtension.base, + &dri2ConfigQueryExtension.base, + &dri2ThrottleExtension.base, + &dri2FenceExtension.base, + &dri2Robustness.base, + NULL +}; + /** * This is the driver specific part of the createNewScreen entry point. * @@ -1467,7 +1483,12 @@ dri2_init_screen(__DRIscreen * sPriv) } } - sPriv->extensions = dri_screen_extensions; + if (pscreen->get_param(pscreen, PIPE_CAP_DEVICE_RESET_STATUS_QUERY)) { + sPriv->extensions = dri_robust_screen_extensions; + screen->has_reset_status_query = true; + } + else + sPriv->extensions = dri_screen_extensions; /* dri_init_screen_helper checks pscreen for us */ diff --git a/src/gallium/state_trackers/dri/dri_context.c b/src/gallium/state_trackers/dri/dri_context.c index 8ac81b7364..9f11b15596 100644 --- a/src/gallium/state_trackers/dri/dri_context.c +++ b/src/gallium/state_trackers/dri/dri_context.c @@ -56,6 +56,21 @@ dri_create_context(gl_api api, const struct gl_config * visual, struct st_context_iface *st_share = NULL; struct st_context_attribs attribs; enum st_context_error ctx_err = 0; + unsigned allowed_flags = __DRI_CTX_FLAG_DEBUG | + __DRI_CTX_FLAG_FORWARD_COMPATIBLE; + + if (screen->has_reset_status_query) + allowed_flags |= __DRI_CTX_FLAG_ROBUST_BUFFER_ACCESS; + + if (flags & ~allowed_flags) { + *error = __DRI_CTX_ERROR_UNKNOWN_FLAG; + goto fail; + } + + if (!screen->has_reset_status_query && notify_reset) { + *error = __DRI_CTX_ERROR_UNKNOWN_ATTRIBUTE; + goto fail; + } memset(&attribs, 0, sizeof(attribs)); switch (api) { @@ -83,15 +98,11 @@ dri_create_context(gl_api api, const struct gl_config * visual, if ((flags & __DRI_CTX_FLAG_DEBUG) != 0) attribs.flags |= ST_CONTEXT_FLAG_DEBUG; - if (flags & ~(__DRI_CTX_FLAG_DEBUG | __DRI_CTX_FLAG_FORWARD_COMPATIBLE)) { - *error = __DRI_CTX_ERROR_UNKNOWN_FLAG; - goto fail; - } + if (flags & __DRI_CTX_FLAG_ROBUST_BUFFER_ACCESS) + attribs.flags |= ST_CONTEXT_FLAG_ROBUST_ACCESS; - if (notify_reset) { - *error = __DRI_CTX_ERROR_UNKNOWN_ATTRIBUTE; - goto fail; - } + if (notify_reset) + attribs.flags |= ST_CONTEXT_FLAG_RESET_NOTIFICATION_ENABLED; if (sharedContextPrivate) { st_share = ((struct dri_context *)sharedContextPrivate)->st; diff --git a/src/gallium/state_trackers/dri/dri_screen.h b/src/gallium/state_trackers/dri/dri_screen.h index bdab74f280..173f4038cd 100644 --- a/src/gallium/state_trackers/dri/dri_screen.h +++ b/src/gallium/state_trackers/dri/dri_screen.h @@ -82,6 +82,7 @@ struct dri_screen boolean d_depth_bits_last; boolean sd_depth_bits_last; boolean auto_fake_front; + boolean has_reset_status_query; enum pipe_texture_target target; /* hooks filled in by dri2 & drisw */ |