st/dri: add support for create_context_robustness GLX and EGL extensions
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
@@ -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.
|
||||
|
@@ -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 */
|
||||
|
||||
|
@@ -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;
|
||||
|
@@ -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 */
|
||||
|
Reference in New Issue
Block a user