From 7299e82fa444c86f4c5e22593424715454182e9a Mon Sep 17 00:00:00 2001 From: Grigori Goronzy Date: Thu, 29 Jun 2017 03:24:15 +0200 Subject: [PATCH] dri: Add KHR_no_error DRI extension MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 --- include/GL/internal/dri_interface.h | 19 +++++++++++++++++++ src/gallium/state_trackers/dri/dri2.c | 2 ++ src/gallium/state_trackers/dri/dri_context.c | 3 ++- src/gallium/state_trackers/dri/drisw.c | 1 + src/mesa/drivers/dri/common/dri_util.c | 12 ++++++++++-- src/mesa/drivers/dri/common/dri_util.h | 2 ++ src/mesa/drivers/dri/i915/intel_screen.c | 1 + src/mesa/drivers/dri/i965/intel_screen.c | 2 ++ src/mesa/drivers/dri/nouveau/nouveau_screen.c | 1 + src/mesa/drivers/dri/radeon/radeon_screen.c | 1 + src/mesa/drivers/dri/swrast/swrast.c | 1 + 11 files changed, 42 insertions(+), 3 deletions(-) diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h index 1893d4c4a5e..a8f5af145df 100644 --- a/include/GL/internal/dri_interface.h +++ b/include/GL/internal/dri_interface.h @@ -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. * diff --git a/src/gallium/state_trackers/dri/dri2.c b/src/gallium/state_trackers/dri/dri2.c index e20b2c07536..787949ec396 100644 --- a/src/gallium/state_trackers/dri/dri2.c +++ b/src/gallium/state_trackers/dri/dri2.c @@ -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 }; diff --git a/src/gallium/state_trackers/dri/dri_context.c b/src/gallium/state_trackers/dri/dri_context.c index ec555e44d74..e25f186deb8 100644 --- a/src/gallium/state_trackers/dri/dri_context.c +++ b/src/gallium/state_trackers/dri/dri_context.c @@ -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; diff --git a/src/gallium/state_trackers/dri/drisw.c b/src/gallium/state_trackers/dri/drisw.c index 189d61c4cb6..ac4095618c0 100644 --- a/src/gallium/state_trackers/dri/drisw.c +++ b/src/gallium/state_trackers/dri/drisw.c @@ -371,6 +371,7 @@ static const __DRIextension *drisw_screen_extensions[] = { &dri2RendererQueryExtension.base, &dri2ConfigQueryExtension.base, &dri2FenceExtension.base, + &dri2NoErrorExtension.base, NULL }; diff --git a/src/mesa/drivers/dri/common/dri_util.c b/src/mesa/drivers/dri/common/dri_util.c index f6df48802f3..bfae0209d18 100644 --- a/src/mesa/drivers/dri/common/dri_util.c +++ b/src/mesa/drivers/dri/common/dri_util.c @@ -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 }, +}; diff --git a/src/mesa/drivers/dri/common/dri_util.h b/src/mesa/drivers/dri/common/dri_util.h index 8fcd6322d04..3e1ce624c7b 100644 --- a/src/mesa/drivers/dri/common/dri_util.h +++ b/src/mesa/drivers/dri/common/dri_util.h @@ -293,4 +293,6 @@ driContextSetFlags(struct gl_context *ctx, uint32_t flags); extern const __DRIimageDriverExtension driImageDriverExtension; +extern const __DRInoErrorExtension dri2NoErrorExtension; + #endif /* _DRI_UTIL_H_ */ diff --git a/src/mesa/drivers/dri/i915/intel_screen.c b/src/mesa/drivers/dri/i915/intel_screen.c index 686cbf5ec12..9e23552b998 100644 --- a/src/mesa/drivers/dri/i915/intel_screen.c +++ b/src/mesa/drivers/dri/i915/intel_screen.c @@ -802,6 +802,7 @@ static const __DRIextension *intelScreenExtensions[] = { &intelImageExtension.base, &intelRendererQueryExtension.base, &dri2ConfigQueryExtension.base, + &dri2NoErrorExtension.base, NULL }; diff --git a/src/mesa/drivers/dri/i965/intel_screen.c b/src/mesa/drivers/dri/i965/intel_screen.c index 641edb7e72b..0f4fed515a0 100644 --- a/src/mesa/drivers/dri/i965/intel_screen.c +++ b/src/mesa/drivers/dri/i965/intel_screen.c @@ -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 }; diff --git a/src/mesa/drivers/dri/nouveau/nouveau_screen.c b/src/mesa/drivers/dri/nouveau/nouveau_screen.c index 375f640f3d0..65caec27eb3 100644 --- a/src/mesa/drivers/dri/nouveau/nouveau_screen.c +++ b/src/mesa/drivers/dri/nouveau/nouveau_screen.c @@ -324,6 +324,7 @@ static const __DRIextension *nouveau_screen_extensions[] = { &nouveau_texbuffer_extension.base, &nouveau_renderer_query_extension.base, &dri2ConfigQueryExtension.base, + &dri2NoErrorExtension.base, NULL }; diff --git a/src/mesa/drivers/dri/radeon/radeon_screen.c b/src/mesa/drivers/dri/radeon/radeon_screen.c index 79e388988a0..526d1974527 100644 --- a/src/mesa/drivers/dri/radeon/radeon_screen.c +++ b/src/mesa/drivers/dri/radeon/radeon_screen.c @@ -544,6 +544,7 @@ static const __DRIextension *radeon_screen_extensions[] = { &radeonFlushExtension.base, &radeonImageExtension.base, &radeonRendererQueryExtension.base, + &dri2NoErrorExtension.base, NULL }; diff --git a/src/mesa/drivers/dri/swrast/swrast.c b/src/mesa/drivers/dri/swrast/swrast.c index e66b2257de8..c2aa4da75a3 100644 --- a/src/mesa/drivers/dri/swrast/swrast.c +++ b/src/mesa/drivers/dri/swrast/swrast.c @@ -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 }; -- 2.30.2