[Mesa-dev] [PATCH 4/6] st/dri: add support for create_context_robustness GLX and EGL extensions
Marek Olšák
maraeo at gmail.com
Wed Apr 29 10:43:25 PDT 2015
From: Marek Olšák <marek.olsak at amd.com>
---
src/gallium/include/state_tracker/st_api.h | 1 +
src/gallium/state_trackers/dri/dri2.c | 22 +++++++++++++++++++++-
src/gallium/state_trackers/dri/dri_context.c | 27 +++++++++++++++++++--------
src/gallium/state_trackers/dri/dri_screen.h | 1 +
4 files changed, 42 insertions(+), 9 deletions(-)
diff --git a/src/gallium/include/state_tracker/st_api.h b/src/gallium/include/state_tracker/st_api.h
index 86fdc69..ecf1c07 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 f8f4ecf..fba0df1 100644
--- a/src/gallium/state_trackers/dri/dri2.c
+++ b/src/gallium/state_trackers/dri/dri2.c
@@ -1251,6 +1251,10 @@ static __DRIimageExtension dri2ImageExtension = {
.getCapabilities = dri2_get_capabilities,
};
+static const __DRIrobustnessExtension dri2Robustness = {
+ .base = { __DRI2_ROBUSTNESS, 1 }
+};
+
/*
* Backend function init_screen.
*/
@@ -1265,6 +1269,17 @@ 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,
+ &dri2Robustness.base,
+ NULL
+};
+
/**
* This is the driver specific part of the createNewScreen entry point.
*
@@ -1317,7 +1332,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 8ac81b7..9f11b15 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 e4a1a39..f708649 100644
--- a/src/gallium/state_trackers/dri/dri_screen.h
+++ b/src/gallium/state_trackers/dri/dri_screen.h
@@ -80,6 +80,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 */
--
2.1.0
More information about the mesa-dev
mailing list