dri: Add KHR_no_error DRI extension

This basic extension allows usage of the __DRI_CTX_FLAG_NO_ERROR flag.
This includes support code for classic Mesa drivers to switch on the
no-error mode if the flag is set.

v2: Move to common DRI code.

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:
Grigori Goronzy 2017-06-29 03:24:15 +02:00
parent cfbf60b0c2
commit 7299e82fa4
11 changed files with 42 additions and 3 deletions

View File

@ -1049,6 +1049,12 @@ struct __DRIdri2LoaderExtensionRec {
*/
#define __DRI_CTX_FLAG_ROBUST_BUFFER_ACCESS 0x00000004
/**
* \requires __DRI2_NO_ERROR.
*
*/
#define __DRI_CTX_FLAG_NO_ERROR 0x00000008
/**
* \name Context reset strategies.
*/
@ -1611,6 +1617,19 @@ struct __DRIrobustnessExtensionRec {
__DRIextension base;
};
/**
* No-error context driver extension.
*
* Existence of this extension means the driver can accept the
* __DRI_CTX_FLAG_NO_ERROR flag.
*/
#define __DRI2_NO_ERROR "DRI_NoError"
#define __DRI2_NO_ERROR_VERSION 1
typedef struct __DRInoErrorExtensionRec {
__DRIextension base;
} __DRInoErrorExtension;
/**
* DRI config options extension.
*

View File

@ -1995,6 +1995,7 @@ static const __DRIextension *dri_screen_extensions[] = {
&dri2ThrottleExtension.base,
&dri2FenceExtension.base,
&dri2InteropExtension.base,
&dri2NoErrorExtension.base,
NULL
};
@ -2008,6 +2009,7 @@ static const __DRIextension *dri_robust_screen_extensions[] = {
&dri2FenceExtension.base,
&dri2InteropExtension.base,
&dri2Robustness.base,
&dri2NoErrorExtension.base,
NULL
};

View File

@ -57,7 +57,8 @@ dri_create_context(gl_api api, const struct gl_config * visual,
struct st_context_attribs attribs;
enum st_context_error ctx_err = 0;
unsigned allowed_flags = __DRI_CTX_FLAG_DEBUG |
__DRI_CTX_FLAG_FORWARD_COMPATIBLE;
__DRI_CTX_FLAG_FORWARD_COMPATIBLE |
__DRI_CTX_FLAG_NO_ERROR;
const __DRIbackgroundCallableExtension *backgroundCallable =
screen->sPriv->dri2.backgroundCallable;

View File

@ -371,6 +371,7 @@ static const __DRIextension *drisw_screen_extensions[] = {
&dri2RendererQueryExtension.base,
&dri2ConfigQueryExtension.base,
&dri2FenceExtension.base,
&dri2NoErrorExtension.base,
NULL
};

View File

@ -403,7 +403,8 @@ 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_ROBUST_BUFFER_ACCESS |
__DRI_CTX_FLAG_NO_ERROR))) {
*error = __DRI_CTX_ERROR_BAD_FLAG;
return NULL;
}
@ -425,7 +426,8 @@ driCreateContextAttribs(__DRIscreen *screen, int api,
const uint32_t allowed_flags = (__DRI_CTX_FLAG_DEBUG
| __DRI_CTX_FLAG_FORWARD_COMPATIBLE
| __DRI_CTX_FLAG_ROBUST_BUFFER_ACCESS);
| __DRI_CTX_FLAG_ROBUST_BUFFER_ACCESS
| __DRI_CTX_FLAG_NO_ERROR);
if (flags & ~allowed_flags) {
*error = __DRI_CTX_ERROR_UNKNOWN_FLAG;
return NULL;
@ -467,6 +469,8 @@ driContextSetFlags(struct gl_context *ctx, uint32_t flags)
_mesa_set_debug_state_int(ctx, GL_DEBUG_OUTPUT, GL_TRUE);
ctx->Const.ContextFlags |= GL_CONTEXT_FLAG_DEBUG_BIT;
}
if ((flags & __DRI_CTX_FLAG_NO_ERROR) != 0)
ctx->Const.ContextFlags |= GL_CONTEXT_FLAG_NO_ERROR_BIT_KHR;
}
static __DRIcontext *
@ -935,3 +939,7 @@ const __DRIcopySubBufferExtension driCopySubBufferExtension = {
.copySubBuffer = driCopySubBuffer,
};
const __DRInoErrorExtension dri2NoErrorExtension = {
.base = { __DRI2_NO_ERROR, 1 },
};

View File

@ -293,4 +293,6 @@ driContextSetFlags(struct gl_context *ctx, uint32_t flags);
extern const __DRIimageDriverExtension driImageDriverExtension;
extern const __DRInoErrorExtension dri2NoErrorExtension;
#endif /* _DRI_UTIL_H_ */

View File

@ -802,6 +802,7 @@ static const __DRIextension *intelScreenExtensions[] = {
&intelImageExtension.base,
&intelRendererQueryExtension.base,
&dri2ConfigQueryExtension.base,
&dri2NoErrorExtension.base,
NULL
};

View File

@ -1274,6 +1274,7 @@ static const __DRIextension *screenExtensions[] = {
&intelImageExtension.base,
&intelRendererQueryExtension.base,
&dri2ConfigQueryExtension.base,
&dri2NoErrorExtension.base,
NULL
};
@ -1285,6 +1286,7 @@ static const __DRIextension *intelRobustScreenExtensions[] = {
&intelRendererQueryExtension.base,
&dri2ConfigQueryExtension.base,
&dri2Robustness.base,
&dri2NoErrorExtension.base,
NULL
};

View File

@ -324,6 +324,7 @@ static const __DRIextension *nouveau_screen_extensions[] = {
&nouveau_texbuffer_extension.base,
&nouveau_renderer_query_extension.base,
&dri2ConfigQueryExtension.base,
&dri2NoErrorExtension.base,
NULL
};

View File

@ -544,6 +544,7 @@ static const __DRIextension *radeon_screen_extensions[] = {
&radeonFlushExtension.base,
&radeonImageExtension.base,
&radeonRendererQueryExtension.base,
&dri2NoErrorExtension.base,
NULL
};

View File

@ -208,6 +208,7 @@ static const __DRI2rendererQueryExtension swrast_query_renderer_extension = {
static const __DRIextension *dri_screen_extensions[] = {
&swrastTexBufferExtension.base,
&swrast_query_renderer_extension.base,
&dri2NoErrorExtension.base,
NULL
};