From 69ae1716ff4cf99cc6bc0de27cfaa2ae95740d97 Mon Sep 17 00:00:00 2001 From: Adam Jackson Date: Thu, 9 Nov 2017 09:50:53 -0500 Subject: [PATCH] GLX_EXT_no_config_context {EGL_KHR,GLX_ARB}_context_flush_control --- 0001-context_flush_control-squash.patch | 1332 +++++++++++++++++ ...-GLX_EXT_no_config_context-v2-squash.patch | 250 ++++ mesa.spec | 8 +- 3 files changed, 1589 insertions(+), 1 deletion(-) create mode 100644 0001-context_flush_control-squash.patch create mode 100644 0001-glx-Implement-GLX_EXT_no_config_context-v2-squash.patch diff --git a/0001-context_flush_control-squash.patch b/0001-context_flush_control-squash.patch new file mode 100644 index 0000000..3da82de --- /dev/null +++ b/0001-context_flush_control-squash.patch @@ -0,0 +1,1332 @@ +From 1b7402f3ceaaf6493735f38096008fa1e2767b3c Mon Sep 17 00:00:00 2001 +From: Adam Jackson +Date: Thu, 22 Sep 2016 03:38:01 -0400 +Subject: [PATCH] context_flush_control squash + +--- + include/GL/internal/dri_interface.h | 25 +++++++++ + src/egl/drivers/dri2/egl_dri2.c | 42 ++++++--------- + src/egl/drivers/dri2/egl_dri2.h | 1 + + src/egl/main/eglapi.c | 1 + + src/egl/main/eglcontext.c | 10 ++++ + src/egl/main/eglcontext.h | 1 + + src/egl/main/egldisplay.h | 1 + + src/gallium/include/state_tracker/st_api.h | 1 + + src/gallium/state_trackers/dri/dri_context.c | 42 ++++++++------- + src/gallium/state_trackers/dri/dri_context.h | 14 ++--- + src/gallium/state_trackers/dri/drisw.c | 1 + + src/glx/dri2_glx.c | 18 ++++++- + src/glx/dri3_glx.c | 14 ++++- + src/glx/dri_common.c | 16 +++++- + src/glx/dri_common.h | 2 +- + src/glx/drisw_glx.c | 17 +++++- + src/glx/glxextensions.c | 1 + + src/glx/glxextensions.h | 3 +- + src/mesa/drivers/dri/common/dri_util.c | 71 +++++++++++++++++--------- + src/mesa/drivers/dri/common/dri_util.h | 42 +++++++++++++-- + src/mesa/drivers/dri/i915/intel_context.c | 9 ---- + src/mesa/drivers/dri/i915/intel_screen.c | 18 +++---- + src/mesa/drivers/dri/i965/brw_context.c | 68 ++++++++++++++---------- + src/mesa/drivers/dri/i965/brw_context.h | 6 +-- + src/mesa/drivers/dri/i965/intel_screen.c | 2 + + src/mesa/drivers/dri/nouveau/nouveau_context.c | 15 +++--- + src/mesa/drivers/dri/nouveau/nouveau_context.h | 3 +- + src/mesa/drivers/dri/r200/r200_context.c | 12 ++--- + src/mesa/drivers/dri/r200/r200_context.h | 7 +-- + src/mesa/drivers/dri/radeon/radeon_context.c | 12 ++--- + src/mesa/drivers/dri/radeon/radeon_context.h | 7 +-- + src/mesa/drivers/dri/swrast/swrast.c | 16 +++--- + src/mesa/state_tracker/st_manager.c | 3 ++ + 33 files changed, 318 insertions(+), 183 deletions(-) + +diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h +index 98402eae05..b47947380c 100644 +--- a/include/GL/internal/dri_interface.h ++++ b/include/GL/internal/dri_interface.h +@@ -1106,6 +1106,16 @@ struct __DRIdri2LoaderExtensionRec { + #define __DRI_CTX_PRIORITY_MEDIUM 1 + #define __DRI_CTX_PRIORITY_HIGH 2 + ++/** ++ * \name Context release behaviors. ++ */ ++/*@{*/ ++#define __DRI_CTX_ATTRIB_RELEASE_BEHAVIOR 5 ++ ++#define __DRI_CTX_RELEASE_BEHAVIOR_NONE 0 ++#define __DRI_CTX_RELEASE_BEHAVIOR_FLUSH 1 ++/*@}*/ ++ + /** + * \name Reasons that __DRIdri2Extension::createContextAttribs might fail + */ +@@ -1715,6 +1725,21 @@ typedef struct __DRInoErrorExtensionRec { + __DRIextension base; + } __DRInoErrorExtension; + ++/* ++ * Flush control driver extension. ++ * ++ * Existence of this extension means the driver can accept the ++ * \c __DRI_CTX_ATTRIB_RELEASE_BEHAVIOR attribute in ++ * \c __DRIdri2ExtensionRec::createContextAttribs. ++ */ ++#define __DRI2_FLUSH_CONTROL "DRI_FlushControl" ++#define __DRI2_FLUSH_CONTROL_VERSION 1 ++ ++typedef struct __DRI2flushControlExtensionRec __DRI2flushControlExtension; ++struct __DRI2flushControlExtensionRec { ++ __DRIextension base; ++}; ++ + /** + * DRI config options extension. + * +diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c +index 503450542e..b486be7487 100644 +--- a/src/egl/drivers/dri2/egl_dri2.c ++++ b/src/egl/drivers/dri2/egl_dri2.c +@@ -92,7 +92,7 @@ + #define DRM_FORMAT_MOD_INVALID ((1ULL<<56) - 1) + #endif + +-#define NUM_ATTRIBS 10 ++#define NUM_ATTRIBS 12 + + static void + dri_set_background_context(void *loaderPrivate) +@@ -457,6 +457,7 @@ static const struct dri2_extension_match optional_core_extensions[] = { + { __DRI2_RENDERER_QUERY, 1, offsetof(struct dri2_egl_display, rendererQuery) }, + { __DRI2_INTEROP, 1, offsetof(struct dri2_egl_display, interop) }, + { __DRI_IMAGE, 1, offsetof(struct dri2_egl_display, image) }, ++ { __DRI2_FLUSH_CONTROL, 1, offsetof(struct dri2_egl_display, flush_control) }, + { NULL, 0, 0 } + }; + +@@ -766,6 +767,9 @@ dri2_setup_screen(_EGLDisplay *disp) + } + #endif + } ++ ++ if (dri2_dpy->flush_control) ++ disp->Extensions.KHR_context_flush_control = EGL_TRUE; + } + + void +@@ -1227,6 +1231,11 @@ dri2_fill_context_attribs(struct dri2_egl_context *dri2_ctx, + ctx_attribs[pos++] = val; + } + ++ if (dri2_ctx->base.ReleaseBehavior == EGL_CONTEXT_RELEASE_BEHAVIOR_NONE_KHR) { ++ ctx_attribs[pos++] = __DRI_CTX_ATTRIB_RELEASE_BEHAVIOR; ++ ctx_attribs[pos++] = __DRI_CTX_RELEASE_BEHAVIOR_NONE; ++ } ++ + *num_attribs = pos; + + return true; +@@ -1247,6 +1256,9 @@ dri2_create_context(_EGLDriver *drv, _EGLDisplay *disp, _EGLConfig *conf, + struct dri2_egl_config *dri2_config = dri2_egl_config(conf); + const __DRIconfig *dri_config; + int api; ++ unsigned error; ++ unsigned num_attribs = NUM_ATTRIBS; ++ uint32_t ctx_attribs[NUM_ATTRIBS]; + + (void) drv; + +@@ -1339,15 +1351,11 @@ dri2_create_context(_EGLDriver *drv, _EGLDisplay *disp, _EGLConfig *conf, + else + dri_config = NULL; + ++ if (!dri2_fill_context_attribs(dri2_ctx, dri2_dpy, ctx_attribs, ++ &num_attribs)) ++ goto cleanup; ++ + if (dri2_dpy->image_driver) { +- unsigned error; +- unsigned num_attribs = NUM_ATTRIBS; +- uint32_t ctx_attribs[NUM_ATTRIBS]; +- +- if (!dri2_fill_context_attribs(dri2_ctx, dri2_dpy, ctx_attribs, +- &num_attribs)) +- goto cleanup; +- + dri2_ctx->dri_context = + dri2_dpy->image_driver->createContextAttribs(dri2_dpy->dri_screen, + api, +@@ -1360,14 +1368,6 @@ dri2_create_context(_EGLDriver *drv, _EGLDisplay *disp, _EGLConfig *conf, + dri2_create_context_attribs_error(error); + } else if (dri2_dpy->dri2) { + if (dri2_dpy->dri2->base.version >= 3) { +- unsigned error; +- unsigned num_attribs = NUM_ATTRIBS; +- uint32_t ctx_attribs[NUM_ATTRIBS]; +- +- if (!dri2_fill_context_attribs(dri2_ctx, dri2_dpy, ctx_attribs, +- &num_attribs)) +- goto cleanup; +- + dri2_ctx->dri_context = + dri2_dpy->dri2->createContextAttribs(dri2_dpy->dri_screen, + api, +@@ -1389,14 +1389,6 @@ dri2_create_context(_EGLDriver *drv, _EGLDisplay *disp, _EGLConfig *conf, + } else { + assert(dri2_dpy->swrast); + if (dri2_dpy->swrast->base.version >= 3) { +- unsigned error; +- unsigned num_attribs = NUM_ATTRIBS; +- uint32_t ctx_attribs[NUM_ATTRIBS]; +- +- if (!dri2_fill_context_attribs(dri2_ctx, dri2_dpy, ctx_attribs, +- &num_attribs)) +- goto cleanup; +- + dri2_ctx->dri_context = + dri2_dpy->swrast->createContextAttribs(dri2_dpy->dri_screen, + api, +diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h +index cd2487ab22..0ec8f44dce 100644 +--- a/src/egl/drivers/dri2/egl_dri2.h ++++ b/src/egl/drivers/dri2/egl_dri2.h +@@ -164,6 +164,7 @@ struct dri2_egl_display + const __DRIdri2Extension *dri2; + const __DRIswrastExtension *swrast; + const __DRI2flushExtension *flush; ++ const __DRI2flushControlExtension *flush_control; + const __DRItexBufferExtension *tex_buffer; + const __DRIimageExtension *image; + const __DRIrobustnessExtension *robustness; +diff --git a/src/egl/main/eglapi.c b/src/egl/main/eglapi.c +index 215332f99c..76dabba2eb 100644 +--- a/src/egl/main/eglapi.c ++++ b/src/egl/main/eglapi.c +@@ -494,6 +494,7 @@ _eglCreateExtensionsString(_EGLDisplay *dpy) + + _EGL_CHECK_EXTENSION(KHR_cl_event2); + _EGL_CHECK_EXTENSION(KHR_config_attribs); ++ _EGL_CHECK_EXTENSION(KHR_context_flush_control); + _EGL_CHECK_EXTENSION(KHR_create_context); + _EGL_CHECK_EXTENSION(KHR_create_context_no_error); + _EGL_CHECK_EXTENSION(KHR_fence_sync); +diff --git a/src/egl/main/eglcontext.c b/src/egl/main/eglcontext.c +index 8c64f9ab82..18c1bc59ac 100644 +--- a/src/egl/main/eglcontext.c ++++ b/src/egl/main/eglcontext.c +@@ -386,6 +386,15 @@ _eglParseContextAttribList(_EGLContext *ctx, _EGLDisplay *dpy, + break; + } + ++ case EGL_CONTEXT_RELEASE_BEHAVIOR_KHR: ++ if (val == EGL_CONTEXT_RELEASE_BEHAVIOR_NONE_KHR || ++ val == EGL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_KHR) { ++ ctx->ReleaseBehavior = val; ++ } else { ++ err = EGL_BAD_ATTRIBUTE; ++ } ++ break; ++ + default: + err = EGL_BAD_ATTRIBUTE; + break; +@@ -588,6 +597,7 @@ _eglInitContext(_EGLContext *ctx, _EGLDisplay *dpy, _EGLConfig *conf, + ctx->Profile = EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR; + ctx->ResetNotificationStrategy = EGL_NO_RESET_NOTIFICATION_KHR; + ctx->ContextPriority = EGL_CONTEXT_PRIORITY_MEDIUM_IMG; ++ ctx->ReleaseBehavior = EGL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_KHR; + + err = _eglParseContextAttribList(ctx, dpy, attrib_list); + if (err == EGL_SUCCESS && ctx->Config) { +diff --git a/src/egl/main/eglcontext.h b/src/egl/main/eglcontext.h +index a752368313..8d97ef9eab 100644 +--- a/src/egl/main/eglcontext.h ++++ b/src/egl/main/eglcontext.h +@@ -64,6 +64,7 @@ struct _egl_context + EGLint ResetNotificationStrategy; + EGLint ContextPriority; + EGLBoolean NoError; ++ EGLint ReleaseBehavior; + + /* The real render buffer when a window surface is bound */ + EGLint WindowRenderBuffer; +diff --git a/src/egl/main/egldisplay.h b/src/egl/main/egldisplay.h +index 952bfe53f0..981cbf4ca0 100644 +--- a/src/egl/main/egldisplay.h ++++ b/src/egl/main/egldisplay.h +@@ -112,6 +112,7 @@ struct _egl_extensions + + EGLBoolean KHR_cl_event2; + EGLBoolean KHR_config_attribs; ++ EGLBoolean KHR_context_flush_control; + EGLBoolean KHR_create_context; + EGLBoolean KHR_fence_sync; + EGLBoolean KHR_get_all_proc_addresses; +diff --git a/src/gallium/include/state_tracker/st_api.h b/src/gallium/include/state_tracker/st_api.h +index 2232c3efa1..11a9878cf6 100644 +--- a/src/gallium/include/state_tracker/st_api.h ++++ b/src/gallium/include/state_tracker/st_api.h +@@ -91,6 +91,7 @@ enum st_api_feature + #define ST_CONTEXT_FLAG_ROBUST_ACCESS (1 << 2) + #define ST_CONTEXT_FLAG_RESET_NOTIFICATION_ENABLED (1 << 3) + #define ST_CONTEXT_FLAG_NO_ERROR (1 << 4) ++#define ST_CONTEXT_FLAG_RELEASE_NONE (1 << 5) + + /** + * Reasons that context creation might fail. +diff --git a/src/gallium/state_trackers/dri/dri_context.c b/src/gallium/state_trackers/dri/dri_context.c +index 8776aacc09..18bbfa046c 100644 +--- a/src/gallium/state_trackers/dri/dri_context.c ++++ b/src/gallium/state_trackers/dri/dri_context.c +@@ -42,14 +42,10 @@ + + GLboolean + dri_create_context(gl_api api, const struct gl_config * visual, +- __DRIcontext * cPriv, +- unsigned major_version, +- unsigned minor_version, +- uint32_t flags, +- bool notify_reset, +- unsigned priority, +- unsigned *error, +- void *sharedContextPrivate) ++ __DRIcontext * cPriv, ++ const struct __DriverContextConfig *ctx_config, ++ unsigned *error, ++ void *sharedContextPrivate) + { + __DRIscreen *sPriv = cPriv->driScreenPriv; + struct dri_screen *screen = dri_screen(sPriv); +@@ -61,18 +57,21 @@ dri_create_context(gl_api api, const struct gl_config * visual, + unsigned allowed_flags = __DRI_CTX_FLAG_DEBUG | + __DRI_CTX_FLAG_FORWARD_COMPATIBLE | + __DRI_CTX_FLAG_NO_ERROR; ++ unsigned allowed_attribs = __DRIVER_CONTEXT_ATTRIB_RELEASE_BEHAVIOR; + const __DRIbackgroundCallableExtension *backgroundCallable = + screen->sPriv->dri2.backgroundCallable; + +- if (screen->has_reset_status_query) ++ if (screen->has_reset_status_query) { + allowed_flags |= __DRI_CTX_FLAG_ROBUST_BUFFER_ACCESS; ++ allowed_attribs |= __DRIVER_CONTEXT_ATTRIB_RESET_STRATEGY; ++ } + +- if (flags & ~allowed_flags) { ++ if (ctx_config->flags & ~allowed_flags) { + *error = __DRI_CTX_ERROR_UNKNOWN_FLAG; + goto fail; + } + +- if (!screen->has_reset_status_query && notify_reset) { ++ if (ctx_config->attribute_mask & ~allowed_attribs) { + *error = __DRI_CTX_ERROR_UNKNOWN_ATTRIBUTE; + goto fail; + } +@@ -89,10 +88,10 @@ dri_create_context(gl_api api, const struct gl_config * visual, + case API_OPENGL_CORE: + attribs.profile = api == API_OPENGL_COMPAT ? ST_PROFILE_DEFAULT + : ST_PROFILE_OPENGL_CORE; +- attribs.major = major_version; +- attribs.minor = minor_version; ++ attribs.major = ctx_config->major_version; ++ attribs.minor = ctx_config->minor_version; + +- if ((flags & __DRI_CTX_FLAG_FORWARD_COMPATIBLE) != 0) ++ if ((ctx_config->flags & __DRI_CTX_FLAG_FORWARD_COMPATIBLE) != 0) + attribs.flags |= ST_CONTEXT_FLAG_FORWARD_COMPATIBLE; + break; + default: +@@ -100,18 +99,23 @@ dri_create_context(gl_api api, const struct gl_config * visual, + goto fail; + } + +- if ((flags & __DRI_CTX_FLAG_DEBUG) != 0) ++ if ((ctx_config->flags & __DRI_CTX_FLAG_DEBUG) != 0) + attribs.flags |= ST_CONTEXT_FLAG_DEBUG; + +- if (flags & __DRI_CTX_FLAG_ROBUST_BUFFER_ACCESS) ++ if (ctx_config->flags & __DRI_CTX_FLAG_ROBUST_BUFFER_ACCESS) + attribs.flags |= ST_CONTEXT_FLAG_ROBUST_ACCESS; + +- if (notify_reset) +- attribs.flags |= ST_CONTEXT_FLAG_RESET_NOTIFICATION_ENABLED; ++ if (ctx_config->attribute_mask & __DRIVER_CONTEXT_ATTRIB_RESET_STRATEGY) ++ if (ctx_config->reset_strategy != __DRI_CTX_RESET_NO_NOTIFICATION) ++ attribs.flags |= ST_CONTEXT_FLAG_RESET_NOTIFICATION_ENABLED; + +- if (flags & __DRI_CTX_FLAG_NO_ERROR) ++ if (ctx_config->flags & __DRI_CTX_FLAG_NO_ERROR) + attribs.flags |= ST_CONTEXT_FLAG_NO_ERROR; + ++ if ((ctx_config->attribute_mask & __DRIVER_CONTEXT_ATTRIB_RELEASE_BEHAVIOR) ++ && (ctx_config->release_behavior == __DRI_CTX_RELEASE_BEHAVIOR_NONE)) ++ attribs.flags |= ST_CONTEXT_FLAG_RELEASE_NONE; ++ + if (sharedContextPrivate) { + st_share = ((struct dri_context *)sharedContextPrivate)->st; + } +diff --git a/src/gallium/state_trackers/dri/dri_context.h b/src/gallium/state_trackers/dri/dri_context.h +index afa9c49ff3..96e21e0695 100644 +--- a/src/gallium/state_trackers/dri/dri_context.h ++++ b/src/gallium/state_trackers/dri/dri_context.h +@@ -84,15 +84,11 @@ dri_get_current(__DRIscreen * driScreenPriv); + + boolean + dri_create_context(gl_api api, +- const struct gl_config * visual, +- __DRIcontext * driContextPriv, +- unsigned major_version, +- unsigned minor_version, +- uint32_t flags, +- bool notify_reset, +- unsigned priority, +- unsigned *error, +- void *sharedContextPrivate); ++ const struct gl_config * visual, ++ __DRIcontext * driContextPriv, ++ const struct __DriverContextConfig *ctx_config, ++ unsigned *error, ++ void *sharedContextPrivate); + + #endif + +diff --git a/src/gallium/state_trackers/dri/drisw.c b/src/gallium/state_trackers/dri/drisw.c +index 9466cfdb20..eb5752386d 100644 +--- a/src/gallium/state_trackers/dri/drisw.c ++++ b/src/gallium/state_trackers/dri/drisw.c +@@ -381,6 +381,7 @@ static const __DRIextension *drisw_screen_extensions[] = { + &dri2FenceExtension.base, + &dri2NoErrorExtension.base, + &driSWImageExtension.base, ++ &dri2FlushControlExtension.base, + NULL + }; + +diff --git a/src/glx/dri2_glx.c b/src/glx/dri2_glx.c +index ae8cb11ef8..e67a15f9da 100644 +--- a/src/glx/dri2_glx.c ++++ b/src/glx/dri2_glx.c +@@ -247,7 +247,8 @@ dri2_create_context_attribs(struct glx_screen *base, + uint32_t flags; + unsigned api; + int reset; +- uint32_t ctx_attribs[2 * 5]; ++ int release; ++ uint32_t ctx_attribs[2 * 6]; + unsigned num_ctx_attribs = 0; + + if (psc->dri2->base.version < 3) { +@@ -259,7 +260,7 @@ dri2_create_context_attribs(struct glx_screen *base, + */ + if (!dri2_convert_glx_attribs(num_attribs, attribs, + &major_ver, &minor_ver, &renderType, &flags, +- &api, &reset, error)) ++ &api, &reset, &release, error)) + goto error_exit; + + /* Check the renderType value */ +@@ -294,6 +295,11 @@ dri2_create_context_attribs(struct glx_screen *base, + ctx_attribs[num_ctx_attribs++] = reset; + } + ++ if (release != __DRI_CTX_RELEASE_BEHAVIOR_FLUSH) { ++ ctx_attribs[num_ctx_attribs++] = __DRI_CTX_ATTRIB_RELEASE_BEHAVIOR; ++ ctx_attribs[num_ctx_attribs++] = release; ++ } ++ + if (flags != 0) { + ctx_attribs[num_ctx_attribs++] = __DRI_CTX_ATTRIB_FLAGS; + +@@ -1170,6 +1176,14 @@ dri2BindExtensions(struct dri2_screen *psc, struct glx_display * priv, + + if (strcmp(extensions[i]->name, __DRI2_INTEROP) == 0) + psc->interop = (__DRI2interopExtension*)extensions[i]; ++ ++ /* DRI2 version 3 is also required because ++ * GLX_ARB_control_flush_control requires GLX_ARB_create_context. ++ */ ++ if (psc->dri2->base.version >= 3 ++ && strcmp(extensions[i]->name, __DRI2_FLUSH_CONTROL) == 0) ++ __glXEnableDirectExtension(&psc->base, ++ "GLX_ARB_context_flush_control"); + } + } + +diff --git a/src/glx/dri3_glx.c b/src/glx/dri3_glx.c +index b79fec7335..d613073994 100644 +--- a/src/glx/dri3_glx.c ++++ b/src/glx/dri3_glx.c +@@ -235,7 +235,8 @@ dri3_create_context_attribs(struct glx_screen *base, + uint32_t flags = 0; + unsigned api; + int reset = __DRI_CTX_RESET_NO_NOTIFICATION; +- uint32_t ctx_attribs[2 * 5]; ++ int release = __DRI_CTX_RELEASE_BEHAVIOR_FLUSH; ++ uint32_t ctx_attribs[2 * 6]; + unsigned num_ctx_attribs = 0; + uint32_t render_type; + +@@ -244,7 +245,7 @@ dri3_create_context_attribs(struct glx_screen *base, + if (!dri2_convert_glx_attribs(num_attribs, attribs, + &major_ver, &minor_ver, + &render_type, &flags, &api, +- &reset, error)) ++ &reset, &release, error)) + goto error_exit; + + /* Check the renderType value */ +@@ -279,6 +280,11 @@ dri3_create_context_attribs(struct glx_screen *base, + ctx_attribs[num_ctx_attribs++] = reset; + } + ++ if (release != __DRI_CTX_RELEASE_BEHAVIOR_FLUSH) { ++ ctx_attribs[num_ctx_attribs++] = __DRI_CTX_ATTRIB_RELEASE_BEHAVIOR; ++ ctx_attribs[num_ctx_attribs++] = release; ++ } ++ + if (flags != 0) { + ctx_attribs[num_ctx_attribs++] = __DRI_CTX_ATTRIB_FLAGS; + +@@ -755,6 +761,10 @@ dri3_bind_extensions(struct dri3_screen *psc, struct glx_display * priv, + + if (strcmp(extensions[i]->name, __DRI2_INTEROP) == 0) + psc->interop = (__DRI2interopExtension*)extensions[i]; ++ ++ if (strcmp(extensions[i]->name, __DRI2_FLUSH_CONTROL) == 0) ++ __glXEnableDirectExtension(&psc->base, ++ "GLX_ARB_context_flush_control"); + } + } + +diff --git a/src/glx/dri_common.c b/src/glx/dri_common.c +index e2bbd48d3a..3b82309fa2 100644 +--- a/src/glx/dri_common.c ++++ b/src/glx/dri_common.c +@@ -475,7 +475,7 @@ _X_HIDDEN bool + dri2_convert_glx_attribs(unsigned num_attribs, const uint32_t *attribs, + unsigned *major_ver, unsigned *minor_ver, + uint32_t *render_type, uint32_t *flags, unsigned *api, +- int *reset, unsigned *error) ++ int *reset, int *release, unsigned *error) + { + unsigned i; + bool got_profile = false; +@@ -485,6 +485,7 @@ dri2_convert_glx_attribs(unsigned num_attribs, const uint32_t *attribs, + *minor_ver = 0; + *render_type = GLX_RGBA_TYPE; + *reset = __DRI_CTX_RESET_NO_NOTIFICATION; ++ *release = __DRI_CTX_RELEASE_BEHAVIOR_FLUSH; + *flags = 0; + *api = __DRI_API_OPENGL; + +@@ -530,6 +531,19 @@ dri2_convert_glx_attribs(unsigned num_attribs, const uint32_t *attribs, + return false; + } + break; ++ case GLX_CONTEXT_RELEASE_BEHAVIOR_ARB: ++ switch (attribs[i * 2 + 1]) { ++ case GLX_CONTEXT_RELEASE_BEHAVIOR_NONE_ARB: ++ *release = __DRI_CTX_RELEASE_BEHAVIOR_NONE; ++ break; ++ case GLX_CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB: ++ *release = __DRI_CTX_RELEASE_BEHAVIOR_FLUSH; ++ break; ++ default: ++ *error = __DRI_CTX_ERROR_UNKNOWN_ATTRIBUTE; ++ return false; ++ } ++ break; + default: + /* If an unknown attribute is received, fail. + */ +diff --git a/src/glx/dri_common.h b/src/glx/dri_common.h +index 947d331772..4d97ff82b4 100644 +--- a/src/glx/dri_common.h ++++ b/src/glx/dri_common.h +@@ -78,6 +78,6 @@ extern bool + dri2_convert_glx_attribs(unsigned num_attribs, const uint32_t *attribs, + unsigned *major_ver, unsigned *minor_ver, + uint32_t *render_type, uint32_t *flags, unsigned *api, +- int *reset, unsigned *error); ++ int *reset, int *release, unsigned *error); + + #endif /* _DRI_COMMON_H */ +diff --git a/src/glx/drisw_glx.c b/src/glx/drisw_glx.c +index 110b7f8d92..a471856634 100644 +--- a/src/glx/drisw_glx.c ++++ b/src/glx/drisw_glx.c +@@ -417,7 +417,8 @@ drisw_create_context_attribs(struct glx_screen *base, + uint32_t flags; + unsigned api; + int reset; +- uint32_t ctx_attribs[2 * 4]; ++ int release; ++ uint32_t ctx_attribs[2 * 5]; + unsigned num_ctx_attribs = 0; + + if (!psc->base.driScreen) +@@ -430,7 +431,7 @@ drisw_create_context_attribs(struct glx_screen *base, + */ + if (!dri2_convert_glx_attribs(num_attribs, attribs, + &major_ver, &minor_ver, &renderType, &flags, +- &api, &reset, error)) ++ &api, &reset, &release, error)) + return NULL; + + /* Check the renderType value */ +@@ -441,6 +442,10 @@ drisw_create_context_attribs(struct glx_screen *base, + if (reset != __DRI_CTX_RESET_NO_NOTIFICATION) + return NULL; + ++ if (release != __DRI_CTX_RELEASE_BEHAVIOR_FLUSH && ++ release != __DRI_CTX_RELEASE_BEHAVIOR_NONE) ++ return NULL; ++ + if (shareList) { + pcp_shared = (struct drisw_context *) shareList; + shared = pcp_shared->driContext; +@@ -459,6 +464,10 @@ drisw_create_context_attribs(struct glx_screen *base, + ctx_attribs[num_ctx_attribs++] = major_ver; + ctx_attribs[num_ctx_attribs++] = __DRI_CTX_ATTRIB_MINOR_VERSION; + ctx_attribs[num_ctx_attribs++] = minor_ver; ++ if (release != __DRI_CTX_RELEASE_BEHAVIOR_FLUSH) { ++ ctx_attribs[num_ctx_attribs++] = __DRI_CTX_ATTRIB_RELEASE_BEHAVIOR; ++ ctx_attribs[num_ctx_attribs++] = release; ++ } + + if (flags != 0) { + ctx_attribs[num_ctx_attribs++] = __DRI_CTX_ATTRIB_FLAGS; +@@ -647,6 +656,10 @@ driswBindExtensions(struct drisw_screen *psc, const __DRIextension **extensions) + psc->rendererQuery = (__DRI2rendererQueryExtension *) extensions[i]; + __glXEnableDirectExtension(&psc->base, "GLX_MESA_query_renderer"); + } ++ if (strcmp(extensions[i]->name, __DRI2_FLUSH_CONTROL) == 0) { ++ __glXEnableDirectExtension(&psc->base, ++ "GLX_ARB_context_flush_control"); ++ } + } + } + +diff --git a/src/glx/glxextensions.c b/src/glx/glxextensions.c +index 6882e442fe..af6ffbf660 100644 +--- a/src/glx/glxextensions.c ++++ b/src/glx/glxextensions.c +@@ -132,6 +132,7 @@ struct extension_info + + /* *INDENT-OFF* */ + static const struct extension_info known_glx_extensions[] = { ++ { GLX(ARB_context_flush_control), VER(0,0), Y, N, N, N }, + { GLX(ARB_create_context), VER(0,0), Y, N, N, N }, + { GLX(ARB_create_context_profile), VER(0,0), Y, N, N, N }, + { GLX(ARB_create_context_robustness), VER(0,0), Y, N, N, N }, +diff --git a/src/glx/glxextensions.h b/src/glx/glxextensions.h +index 6225742da5..d73128bd0e 100644 +--- a/src/glx/glxextensions.h ++++ b/src/glx/glxextensions.h +@@ -37,7 +37,8 @@ extern "C" { + + enum + { +- ARB_create_context_bit = 0, ++ ARB_context_flush_control_bit = 0, ++ ARB_create_context_bit, + ARB_create_context_profile_bit, + ARB_create_context_robustness_bit, + ARB_fbconfig_float_bit, +diff --git a/src/mesa/drivers/dri/common/dri_util.c b/src/mesa/drivers/dri/common/dri_util.c +index 1cff0ddb2d..d504751c39 100644 +--- a/src/mesa/drivers/dri/common/dri_util.c ++++ b/src/mesa/drivers/dri/common/dri_util.c +@@ -302,11 +302,13 @@ driCreateContextAttribs(__DRIscreen *screen, int api, + const struct gl_config *modes = (config != NULL) ? &config->modes : NULL; + void *shareCtx = (shared != NULL) ? shared->driverPrivate : NULL; + gl_api mesa_api; +- unsigned major_version = 1; +- unsigned minor_version = 0; +- uint32_t flags = 0; +- bool notify_reset = false; +- unsigned priority = __DRI_CTX_PRIORITY_MEDIUM; ++ struct __DriverContextConfig ctx_config; ++ ++ ctx_config.major_version = 1; ++ ctx_config.minor_version = 0; ++ ctx_config.flags = 0; ++ ctx_config.attribute_mask = 0; ++ ctx_config.priority = __DRI_CTX_PRIORITY_MEDIUM; + + assert((num_attribs == 0) || (attribs != NULL)); + +@@ -337,21 +339,38 @@ driCreateContextAttribs(__DRIscreen *screen, int api, + for (unsigned i = 0; i < num_attribs; i++) { + switch (attribs[i * 2]) { + case __DRI_CTX_ATTRIB_MAJOR_VERSION: +- major_version = attribs[i * 2 + 1]; ++ ctx_config.major_version = attribs[i * 2 + 1]; + break; + case __DRI_CTX_ATTRIB_MINOR_VERSION: +- minor_version = attribs[i * 2 + 1]; ++ ctx_config.minor_version = attribs[i * 2 + 1]; + break; + case __DRI_CTX_ATTRIB_FLAGS: +- flags = attribs[i * 2 + 1]; ++ ctx_config.flags = attribs[i * 2 + 1]; + break; + case __DRI_CTX_ATTRIB_RESET_STRATEGY: +- notify_reset = (attribs[i * 2 + 1] +- != __DRI_CTX_RESET_NO_NOTIFICATION); ++ if (attribs[i * 2 + 1] != __DRI_CTX_RESET_NO_NOTIFICATION) { ++ ctx_config.attribute_mask |= ++ __DRIVER_CONTEXT_ATTRIB_RESET_STRATEGY; ++ ctx_config.reset_strategy = attribs[i * 2 + 1]; ++ } else { ++ ctx_config.attribute_mask &= ++ ~__DRIVER_CONTEXT_ATTRIB_RESET_STRATEGY; ++ } + break; + case __DRI_CTX_ATTRIB_PRIORITY: +- priority = attribs[i * 2 + 1]; ++ ctx_config.attribute_mask |= __DRIVER_CONTEXT_ATTRIB_PRIORITY; ++ ctx_config.priority = attribs[i * 2 + 1]; + break; ++ case __DRI_CTX_ATTRIB_RELEASE_BEHAVIOR: ++ if (attribs[i * 2 + 1] != __DRI_CTX_RELEASE_BEHAVIOR_FLUSH) { ++ ctx_config.attribute_mask |= ++ __DRIVER_CONTEXT_ATTRIB_RELEASE_BEHAVIOR; ++ ctx_config.release_behavior = attribs[i * 2 + 1]; ++ } else { ++ ctx_config.attribute_mask &= ++ ~__DRIVER_CONTEXT_ATTRIB_RELEASE_BEHAVIOR; ++ } ++ break; + default: + /* We can't create a context that satisfies the requirements of an + * attribute that we don't understand. Return failure. +@@ -366,12 +385,14 @@ driCreateContextAttribs(__DRIscreen *screen, int api, + * compatibility profile. This means that we treat a API_OPENGL_COMPAT 3.1 as + * API_OPENGL_CORE and reject API_OPENGL_COMPAT 3.2+. + */ +- if (mesa_api == API_OPENGL_COMPAT && major_version == 3 && minor_version == 1) ++ if (mesa_api == API_OPENGL_COMPAT && ++ ctx_config.major_version == 3 && ctx_config.minor_version == 1) + mesa_api = API_OPENGL_CORE; + + if (mesa_api == API_OPENGL_COMPAT +- && ((major_version > 3) +- || (major_version == 3 && minor_version >= 2))) { ++ && ((ctx_config.major_version > 3) ++ || (ctx_config.major_version == 3 && ++ ctx_config.minor_version >= 2))) { + *error = __DRI_CTX_ERROR_BAD_API; + return NULL; + } +@@ -406,9 +427,9 @@ 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_NO_ERROR))) { ++ && (ctx_config.flags & ~(__DRI_CTX_FLAG_DEBUG | ++ __DRI_CTX_FLAG_ROBUST_BUFFER_ACCESS | ++ __DRI_CTX_FLAG_NO_ERROR))) { + *error = __DRI_CTX_ERROR_BAD_FLAG; + return NULL; + } +@@ -424,7 +445,7 @@ driCreateContextAttribs(__DRIscreen *screen, int api, + * + * In Mesa, a debug context is the same as a regular context. + */ +- if ((flags & __DRI_CTX_FLAG_FORWARD_COMPATIBLE) != 0) { ++ if ((ctx_config.flags & __DRI_CTX_FLAG_FORWARD_COMPATIBLE) != 0) { + mesa_api = API_OPENGL_CORE; + } + +@@ -432,13 +453,15 @@ driCreateContextAttribs(__DRIscreen *screen, int api, + | __DRI_CTX_FLAG_FORWARD_COMPATIBLE + | __DRI_CTX_FLAG_ROBUST_BUFFER_ACCESS + | __DRI_CTX_FLAG_NO_ERROR); +- if (flags & ~allowed_flags) { ++ if (ctx_config.flags & ~allowed_flags) { + *error = __DRI_CTX_ERROR_UNKNOWN_FLAG; + return NULL; + } + + if (!validate_context_version(screen, mesa_api, +- major_version, minor_version, error)) ++ ctx_config.major_version, ++ ctx_config.minor_version, ++ error)) + return NULL; + + context = calloc(1, sizeof *context); +@@ -454,9 +477,7 @@ driCreateContextAttribs(__DRIscreen *screen, int api, + context->driReadablePriv = NULL; + + if (!screen->driver->CreateContext(mesa_api, modes, context, +- major_version, minor_version, +- flags, notify_reset, priority, +- error, shareCtx)) { ++ &ctx_config, error, shareCtx)) { + free(context); + return NULL; + } +@@ -822,6 +843,10 @@ const __DRI2configQueryExtension dri2ConfigQueryExtension = { + .configQueryf = dri2ConfigQueryf, + }; + ++const __DRI2flushControlExtension dri2FlushControlExtension = { ++ .base = { __DRI2_FLUSH_CONTROL, 1 } ++}; ++ + void + dri2InvalidateDrawable(__DRIdrawable *drawable) + { +diff --git a/src/mesa/drivers/dri/common/dri_util.h b/src/mesa/drivers/dri/common/dri_util.h +index ecc2a47507..5018f2fbf6 100644 +--- a/src/mesa/drivers/dri/common/dri_util.h ++++ b/src/mesa/drivers/dri/common/dri_util.h +@@ -67,6 +67,42 @@ extern const __DRIswrastExtension driSWRastExtension; + extern const __DRIdri2Extension driDRI2Extension; + extern const __DRI2configQueryExtension dri2ConfigQueryExtension; + extern const __DRIcopySubBufferExtension driCopySubBufferExtension; ++extern const __DRI2flushControlExtension dri2FlushControlExtension; ++ ++/** ++ * Description of the attributes used to create a config. ++ * ++ * This is passed as the context_config parameter to CreateContext. The idea ++ * with this struct is that it can be extended without having to modify all of ++ * the drivers. The first three members (major/minor_version and flags) are ++ * always valid, but the remaining members are only valid if the corresponding ++ * flag is set for the attribute. If the flag is not set then the default ++ * value should be assumed. That way the driver can quickly check if any ++ * attributes were set that it doesn't understand and report an error. ++ */ ++struct __DriverContextConfig { ++ /* These members are always valid */ ++ unsigned major_version; ++ unsigned minor_version; ++ uint32_t flags; ++ ++ /* Flags describing which of the remaining members are valid */ ++ uint32_t attribute_mask; ++ ++ /* Only valid if __DRIVER_CONTEXT_ATTRIB_RESET_STRATEGY is set */ ++ int reset_strategy; ++ ++ /* Only valid if __DRIVER_CONTEXT_PRIORITY is set */ ++ unsigned priority; ++ ++ /* Only valid if __DRIVER_CONTEXT_ATTRIB_RELEASE_BEHAVIOR is set */ ++ int release_behavior; ++}; ++ ++#define __DRIVER_CONTEXT_ATTRIB_RESET_STRATEGY (1 << 0) ++#define __DRIVER_CONTEXT_ATTRIB_PRIORITY (1 << 1) ++#define __DRIVER_CONTEXT_ATTRIB_RELEASE_BEHAVIOR (1 << 2) ++ + /** + * Driver callback functions. + * +@@ -85,11 +121,7 @@ struct __DriverAPIRec { + GLboolean (*CreateContext)(gl_api api, + const struct gl_config *glVis, + __DRIcontext *driContextPriv, +- unsigned major_version, +- unsigned minor_version, +- uint32_t flags, +- bool notify_reset, +- unsigned priority, ++ const struct __DriverContextConfig *ctx_config, + unsigned *error, + void *sharedContextPrivate); + +diff --git a/src/mesa/drivers/dri/i915/intel_context.c b/src/mesa/drivers/dri/i915/intel_context.c +index e0766a0e3f..96d09ca947 100644 +--- a/src/mesa/drivers/dri/i915/intel_context.c ++++ b/src/mesa/drivers/dri/i915/intel_context.c +@@ -626,21 +626,12 @@ intelMakeCurrent(__DRIcontext * driContextPriv, + __DRIdrawable * driReadPriv) + { + struct intel_context *intel; +- GET_CURRENT_CONTEXT(curCtx); + + if (driContextPriv) + intel = (struct intel_context *) driContextPriv->driverPrivate; + else + intel = NULL; + +- /* According to the glXMakeCurrent() man page: "Pending commands to +- * the previous context, if any, are flushed before it is released." +- * But only flush if we're actually changing contexts. +- */ +- if (intel_context(curCtx) && intel_context(curCtx) != intel) { +- _mesa_flush(curCtx); +- } +- + if (driContextPriv) { + struct gl_context *ctx = &intel->ctx; + struct gl_framebuffer *fb, *readFb; +diff --git a/src/mesa/drivers/dri/i915/intel_screen.c b/src/mesa/drivers/dri/i915/intel_screen.c +index 1621a6246b..5024a69bd4 100644 +--- a/src/mesa/drivers/dri/i915/intel_screen.c ++++ b/src/mesa/drivers/dri/i915/intel_screen.c +@@ -958,11 +958,7 @@ static GLboolean + intelCreateContext(gl_api api, + const struct gl_config * mesaVis, + __DRIcontext * driContextPriv, +- unsigned major_version, +- unsigned minor_version, +- uint32_t flags, +- bool notify_reset, +- unsigned priority, ++ const struct __DriverContextConfig *ctx_config, + unsigned *error, + void *sharedContextPrivate) + { +@@ -971,24 +967,28 @@ intelCreateContext(gl_api api, + __DRIscreen *sPriv = driContextPriv->driScreenPriv; + struct intel_screen *intelScreen = sPriv->driverPrivate; + +- if (flags & ~(__DRI_CTX_FLAG_DEBUG | __DRI_CTX_FLAG_NO_ERROR)) { ++ if (ctx_config->flags & ~(__DRI_CTX_FLAG_DEBUG | __DRI_CTX_FLAG_NO_ERROR)) { + *error = __DRI_CTX_ERROR_UNKNOWN_FLAG; + return false; + } + +- if (notify_reset) { ++ if (ctx_config->attribute_mask) { + *error = __DRI_CTX_ERROR_UNKNOWN_ATTRIBUTE; + return false; + } + + if (IS_GEN3(intelScreen->deviceID)) { + success = i915CreateContext(api, mesaVis, driContextPriv, +- major_version, minor_version, flags, ++ ctx_config->major_version, ++ ctx_config->minor_version, ++ ctx_config->flags, + error, sharedContextPrivate); + } else { + intelScreen->no_vbo = true; + success = i830CreateContext(api, mesaVis, driContextPriv, +- major_version, minor_version, flags, ++ ctx_config->major_version, ++ ctx_config->minor_version, ++ ctx_config->flags, + error, sharedContextPrivate); + } + +diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c +index 037e349fdb..879daae774 100644 +--- a/src/mesa/drivers/dri/i965/brw_context.c ++++ b/src/mesa/drivers/dri/i965/brw_context.c +@@ -826,11 +826,7 @@ GLboolean + brwCreateContext(gl_api api, + const struct gl_config *mesaVis, + __DRIcontext *driContextPriv, +- unsigned major_version, +- unsigned minor_version, +- uint32_t flags, +- bool notify_reset, +- unsigned priority, ++ const struct __DriverContextConfig *ctx_config, + unsigned *dri_ctx_error, + void *sharedContextPrivate) + { +@@ -849,11 +845,36 @@ brwCreateContext(gl_api api, + if (screen->has_context_reset_notification) + allowed_flags |= __DRI_CTX_FLAG_ROBUST_BUFFER_ACCESS; + +- if (flags & ~allowed_flags) { ++ if (ctx_config->flags & ~allowed_flags) { + *dri_ctx_error = __DRI_CTX_ERROR_UNKNOWN_FLAG; + return false; + } + ++ if (ctx_config->attribute_mask & ++ ~(__DRIVER_CONTEXT_ATTRIB_RESET_STRATEGY | ++ __DRIVER_CONTEXT_ATTRIB_RELEASE_BEHAVIOR)) { ++ *dri_ctx_error = __DRI_CTX_ERROR_UNKNOWN_ATTRIBUTE; ++ return false; ++ } ++ ++ bool notify_reset = ++ ((ctx_config->attribute_mask & __DRIVER_CONTEXT_ATTRIB_RESET_STRATEGY) && ++ ctx_config->reset_strategy != __DRI_CTX_RESET_NO_NOTIFICATION); ++ ++ GLenum release_behavior = GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH; ++ if (ctx_config->attribute_mask & __DRIVER_CONTEXT_ATTRIB_RELEASE_BEHAVIOR) { ++ switch (ctx_config->release_behavior) { ++ case __DRI_CTX_RELEASE_BEHAVIOR_NONE: ++ release_behavior = GL_NONE; ++ break; ++ case __DRI_CTX_RELEASE_BEHAVIOR_FLUSH: ++ break; ++ default: ++ *dri_ctx_error = __DRI_CTX_ERROR_UNKNOWN_ATTRIBUTE; ++ return false; ++ } ++ } ++ + struct brw_context *brw = rzalloc(NULL, struct brw_context); + if (!brw) { + fprintf(stderr, "%s: failed to alloc context\n", __func__); +@@ -902,7 +923,7 @@ brwCreateContext(gl_api api, + return false; + } + +- driContextSetFlags(ctx, flags); ++ driContextSetFlags(ctx, ctx_config->flags); + + /* Initialize the software rasterizer and helper modules. + * +@@ -962,19 +983,21 @@ brwCreateContext(gl_api api, + } + + int hw_priority = BRW_CONTEXT_MEDIUM_PRIORITY; +- switch (priority) { +- case __DRI_CTX_PRIORITY_LOW: +- hw_priority = BRW_CONTEXT_LOW_PRIORITY; +- break; +- case __DRI_CTX_PRIORITY_HIGH: +- hw_priority = BRW_CONTEXT_HIGH_PRIORITY; +- break; ++ if (ctx_config->attribute_mask & __DRIVER_CONTEXT_ATTRIB_PRIORITY) { ++ switch (ctx_config->priority) { ++ case __DRI_CTX_PRIORITY_LOW: ++ hw_priority = BRW_CONTEXT_LOW_PRIORITY; ++ break; ++ case __DRI_CTX_PRIORITY_HIGH: ++ hw_priority = BRW_CONTEXT_HIGH_PRIORITY; ++ break; ++ } + } + if (hw_priority != I915_CONTEXT_DEFAULT_PRIORITY && + brw_hw_context_set_priority(brw->bufmgr, brw->hw_ctx, hw_priority)) { + fprintf(stderr, + "Failed to set priority [%d:%d] for hardware context.\n", +- priority, hw_priority); ++ ctx_config->priority, hw_priority); + intelDestroyContext(driContextPriv); + return false; + } +@@ -1013,16 +1036,18 @@ brwCreateContext(gl_api api, + + brw_draw_init( brw ); + +- if ((flags & __DRI_CTX_FLAG_DEBUG) != 0) { ++ if ((ctx_config->flags & __DRI_CTX_FLAG_DEBUG) != 0) { + /* Turn on some extra GL_ARB_debug_output generation. */ + brw->perf_debug = true; + } + +- if ((flags & __DRI_CTX_FLAG_ROBUST_BUFFER_ACCESS) != 0) { ++ if ((ctx_config->flags & __DRI_CTX_FLAG_ROBUST_BUFFER_ACCESS) != 0) { + ctx->Const.ContextFlags |= GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB; + ctx->Const.RobustAccess = GL_TRUE; + } + ++ ctx->Const.ContextReleaseBehavior = release_behavior; ++ + if (INTEL_DEBUG & DEBUG_SHADER_TIME) + brw_init_shader_time(brw); + +@@ -1171,21 +1196,12 @@ intelMakeCurrent(__DRIcontext * driContextPriv, + __DRIdrawable * driReadPriv) + { + struct brw_context *brw; +- GET_CURRENT_CONTEXT(curCtx); + + if (driContextPriv) + brw = (struct brw_context *) driContextPriv->driverPrivate; + else + brw = NULL; + +- /* According to the glXMakeCurrent() man page: "Pending commands to +- * the previous context, if any, are flushed before it is released." +- * But only flush if we're actually changing contexts. +- */ +- if (brw_context(curCtx) && brw_context(curCtx) != brw) { +- _mesa_flush(curCtx); +- } +- + if (driContextPriv) { + struct gl_context *ctx = &brw->ctx; + struct gl_framebuffer *fb, *readFb; +diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h +index 766b5bc073..8aa0c5ff64 100644 +--- a/src/mesa/drivers/dri/i965/brw_context.h ++++ b/src/mesa/drivers/dri/i965/brw_context.h +@@ -1258,11 +1258,7 @@ void intel_resolve_for_dri2_flush(struct brw_context *brw, + GLboolean brwCreateContext(gl_api api, + const struct gl_config *mesaVis, + __DRIcontext *driContextPriv, +- unsigned major_version, +- unsigned minor_version, +- uint32_t flags, +- bool notify_reset, +- unsigned priority, ++ const struct __DriverContextConfig *ctx_config, + unsigned *error, + void *sharedContextPrivate); + +diff --git a/src/mesa/drivers/dri/i965/intel_screen.c b/src/mesa/drivers/dri/i965/intel_screen.c +index cdc36adc78..4bfb6636c3 100644 +--- a/src/mesa/drivers/dri/i965/intel_screen.c ++++ b/src/mesa/drivers/dri/i965/intel_screen.c +@@ -1431,6 +1431,7 @@ static const __DRIextension *screenExtensions[] = { + &intelRendererQueryExtension.base, + &dri2ConfigQueryExtension.base, + &dri2NoErrorExtension.base, ++ &dri2FlushControlExtension.base, + NULL + }; + +@@ -1441,6 +1442,7 @@ static const __DRIextension *intelRobustScreenExtensions[] = { + &intelImageExtension.base, + &intelRendererQueryExtension.base, + &dri2ConfigQueryExtension.base, ++ &dri2FlushControlExtension.base, + &dri2Robustness.base, + &dri2NoErrorExtension.base, + NULL +diff --git a/src/mesa/drivers/dri/nouveau/nouveau_context.c b/src/mesa/drivers/dri/nouveau/nouveau_context.c +index 39620e1021..397e39603d 100644 +--- a/src/mesa/drivers/dri/nouveau/nouveau_context.c ++++ b/src/mesa/drivers/dri/nouveau/nouveau_context.c +@@ -51,11 +51,7 @@ + GLboolean + nouveau_context_create(gl_api api, + const struct gl_config *visual, __DRIcontext *dri_ctx, +- unsigned major_version, +- unsigned minor_version, +- uint32_t flags, +- bool notify_reset, +- unsigned priority, ++ const struct __DriverContextConfig *ctx_config, + unsigned *error, + void *share_ctx) + { +@@ -64,12 +60,12 @@ nouveau_context_create(gl_api api, + struct nouveau_context *nctx; + struct gl_context *ctx; + +- if (flags & ~(__DRI_CTX_FLAG_DEBUG | __DRI_CTX_FLAG_NO_ERROR)) { ++ if (ctx_config->flags & ~(__DRI_CTX_FLAG_DEBUG | __DRI_CTX_FLAG_NO_ERROR)) { + *error = __DRI_CTX_ERROR_UNKNOWN_FLAG; + return false; + } + +- if (notify_reset) { ++ if (ctx_config->attribute_mask) { + *error = __DRI_CTX_ERROR_UNKNOWN_ATTRIBUTE; + return false; + } +@@ -80,14 +76,15 @@ nouveau_context_create(gl_api api, + return GL_FALSE; + } + +- driContextSetFlags(ctx, flags); ++ driContextSetFlags(ctx, ctx_config->flags); + + nctx = to_nouveau_context(ctx); + nctx->dri_context = dri_ctx; + dri_ctx->driverPrivate = ctx; + + _mesa_compute_version(ctx); +- if (ctx->Version < major_version * 10 + minor_version) { ++ if (ctx->Version < (ctx_config->major_version * 10 + ++ ctx_config->minor_version)) { + nouveau_context_destroy(dri_ctx); + *error = __DRI_CTX_ERROR_BAD_VERSION; + return GL_FALSE; +diff --git a/src/mesa/drivers/dri/nouveau/nouveau_context.h b/src/mesa/drivers/dri/nouveau/nouveau_context.h +index 6ab865c7bd..dcb7bbb23a 100644 +--- a/src/mesa/drivers/dri/nouveau/nouveau_context.h ++++ b/src/mesa/drivers/dri/nouveau/nouveau_context.h +@@ -110,8 +110,7 @@ struct nouveau_context { + GLboolean + nouveau_context_create(gl_api api, + const struct gl_config *visual, __DRIcontext *dri_ctx, +- unsigned major_version, unsigned minor_version, +- uint32_t flags, bool notify_reset, unsigned priority, ++ const struct __DriverContextConfig *ctx_config, + unsigned *error, void *share_ctx); + + GLboolean +diff --git a/src/mesa/drivers/dri/r200/r200_context.c b/src/mesa/drivers/dri/r200/r200_context.c +index bd4f8b62cd..edd433ae97 100644 +--- a/src/mesa/drivers/dri/r200/r200_context.c ++++ b/src/mesa/drivers/dri/r200/r200_context.c +@@ -174,11 +174,7 @@ static void r200_init_vtbl(radeonContextPtr radeon) + GLboolean r200CreateContext( gl_api api, + const struct gl_config *glVisual, + __DRIcontext *driContextPriv, +- unsigned major_version, +- unsigned minor_version, +- uint32_t flags, +- bool notify_reset, +- unsigned priority, ++ const struct __DriverContextConfig *ctx_config, + unsigned *error, + void *sharedContextPrivate) + { +@@ -190,12 +186,12 @@ GLboolean r200CreateContext( gl_api api, + int i; + int tcl_mode; + +- if (flags & ~(__DRI_CTX_FLAG_DEBUG | __DRI_CTX_FLAG_NO_ERROR)) { ++ if (ctx_config->flags & ~(__DRI_CTX_FLAG_DEBUG | __DRI_CTX_FLAG_NO_ERROR)) { + *error = __DRI_CTX_ERROR_UNKNOWN_FLAG; + return false; + } + +- if (notify_reset) { ++ if (ctx_config->attribute_mask) { + *error = __DRI_CTX_ERROR_UNKNOWN_ATTRIBUTE; + return false; + } +@@ -251,7 +247,7 @@ GLboolean r200CreateContext( gl_api api, + + ctx = &rmesa->radeon.glCtx; + +- driContextSetFlags(ctx, flags); ++ driContextSetFlags(ctx, ctx_config->flags); + + /* Initialize the software rasterizer and helper modules. + */ +diff --git a/src/mesa/drivers/dri/r200/r200_context.h b/src/mesa/drivers/dri/r200/r200_context.h +index 200e0a2431..f9ba6835e8 100644 +--- a/src/mesa/drivers/dri/r200/r200_context.h ++++ b/src/mesa/drivers/dri/r200/r200_context.h +@@ -628,11 +628,8 @@ extern void r200DestroyContext( __DRIcontext *driContextPriv ); + extern GLboolean r200CreateContext( gl_api api, + const struct gl_config *glVisual, + __DRIcontext *driContextPriv, +- unsigned major_version, +- unsigned minor_version, +- uint32_t flags, +- bool notify_reset, +- unsigned priority, ++ const struct __DriverContextConfig * ++ ctx_config, + unsigned *error, + void *sharedContextPrivate); + extern GLboolean r200MakeCurrent( __DRIcontext *driContextPriv, +diff --git a/src/mesa/drivers/dri/radeon/radeon_context.c b/src/mesa/drivers/dri/radeon/radeon_context.c +index 866dc80c98..04c76cdba1 100644 +--- a/src/mesa/drivers/dri/radeon/radeon_context.c ++++ b/src/mesa/drivers/dri/radeon/radeon_context.c +@@ -140,11 +140,7 @@ GLboolean + r100CreateContext( gl_api api, + const struct gl_config *glVisual, + __DRIcontext *driContextPriv, +- unsigned major_version, +- unsigned minor_version, +- uint32_t flags, +- bool notify_reset, +- unsigned priority, ++ const struct __DriverContextConfig *ctx_config, + unsigned *error, + void *sharedContextPrivate) + { +@@ -156,12 +152,12 @@ r100CreateContext( gl_api api, + int i; + int tcl_mode, fthrottle_mode; + +- if (flags & ~(__DRI_CTX_FLAG_DEBUG | __DRI_CTX_FLAG_NO_ERROR)) { ++ if (ctx_config->flags & ~(__DRI_CTX_FLAG_DEBUG | __DRI_CTX_FLAG_NO_ERROR)) { + *error = __DRI_CTX_ERROR_UNKNOWN_FLAG; + return false; + } + +- if (notify_reset) { ++ if (ctx_config->attribute_mask) { + *error = __DRI_CTX_ERROR_UNKNOWN_ATTRIBUTE; + return false; + } +@@ -214,7 +210,7 @@ r100CreateContext( gl_api api, + + ctx = &rmesa->radeon.glCtx; + +- driContextSetFlags(ctx, flags); ++ driContextSetFlags(ctx, ctx_config->flags); + + /* Initialize the software rasterizer and helper modules. + */ +diff --git a/src/mesa/drivers/dri/radeon/radeon_context.h b/src/mesa/drivers/dri/radeon/radeon_context.h +index 4124f50db5..94917cf30b 100644 +--- a/src/mesa/drivers/dri/radeon/radeon_context.h ++++ b/src/mesa/drivers/dri/radeon/radeon_context.h +@@ -452,11 +452,8 @@ R100_CONTEXT(struct gl_context *ctx) + extern GLboolean r100CreateContext( gl_api api, + const struct gl_config *glVisual, + __DRIcontext *driContextPriv, +- unsigned major_version, +- unsigned minor_version, +- uint32_t flags, +- bool notify_reset, +- unsigned priority, ++ const struct __DriverContextConfig * ++ ctx_config, + unsigned *error, + void *sharedContextPrivate); + +diff --git a/src/mesa/drivers/dri/swrast/swrast.c b/src/mesa/drivers/dri/swrast/swrast.c +index 6b71d806f0..f9bd1b9d56 100644 +--- a/src/mesa/drivers/dri/swrast/swrast.c ++++ b/src/mesa/drivers/dri/swrast/swrast.c +@@ -752,11 +752,7 @@ static GLboolean + dri_create_context(gl_api api, + const struct gl_config * visual, + __DRIcontext * cPriv, +- unsigned major_version, +- unsigned minor_version, +- uint32_t flags, +- bool notify_reset, +- unsigned priority, ++ const struct __DriverContextConfig *ctx_config, + unsigned *error, + void *sharedContextPrivate) + { +@@ -770,7 +766,13 @@ dri_create_context(gl_api api, + + /* Flag filtering is handled in dri2CreateContextAttribs. + */ +- (void) flags; ++ (void) ctx_config->flags; ++ ++ /* The swrast driver doesn't understand any of the attributes */ ++ if (ctx_config->attribute_mask != 0) { ++ *error = __DRI_CTX_ERROR_UNKNOWN_ATTRIBUTE; ++ return false; ++ } + + ctx = CALLOC_STRUCT(dri_context); + if (ctx == NULL) { +@@ -797,7 +799,7 @@ dri_create_context(gl_api api, + goto context_fail; + } + +- driContextSetFlags(mesaCtx, flags); ++ driContextSetFlags(mesaCtx, ctx_config->flags); + + /* create module contexts */ + _swrast_CreateContext( mesaCtx ); +diff --git a/src/mesa/state_tracker/st_manager.c b/src/mesa/state_tracker/st_manager.c +index eebde62183..48260df0c3 100644 +--- a/src/mesa/state_tracker/st_manager.c ++++ b/src/mesa/state_tracker/st_manager.c +@@ -882,6 +882,9 @@ st_api_create_context(struct st_api *stapi, struct st_manager *smapi, + st_install_device_reset_callback(st); + } + ++ if (attribs->flags & ST_CONTEXT_FLAG_RELEASE_NONE) ++ st->ctx->Const.ContextReleaseBehavior = GL_NONE; ++ + /* need to perform version check */ + if (attribs->major > 1 || attribs->minor > 0) { + /* Is the actual version less than the requested version? +-- +2.14.3 + diff --git a/0001-glx-Implement-GLX_EXT_no_config_context-v2-squash.patch b/0001-glx-Implement-GLX_EXT_no_config_context-v2-squash.patch new file mode 100644 index 0000000..9b0eff2 --- /dev/null +++ b/0001-glx-Implement-GLX_EXT_no_config_context-v2-squash.patch @@ -0,0 +1,250 @@ +From 0d9f80a538a1d39206ac82c97f10253481595150 Mon Sep 17 00:00:00 2001 +From: Adam Jackson +Date: Tue, 7 Nov 2017 10:42:08 -0500 +Subject: [PATCH] glx: Implement GLX_EXT_no_config_context (v2 squash) + +This more or less ports EGL_KHR_no_config_context to GLX. + +v2: Enable the extension only for those backends that support it. + +Khronos: https://github.com/KhronosGroup/OpenGL-Registry/pull/102 +Reviewed-by: Kenneth Graunke +Signed-off-by: Adam Jackson +--- + src/glx/create_context.c | 41 +++++++++++++++++++++++++++-------------- + src/glx/dri2_glx.c | 5 +++-- + src/glx/dri3_glx.c | 6 ++++-- + src/glx/drisw_glx.c | 5 +++-- + src/glx/glxcmds.c | 30 +++++++++++++++++------------- + src/glx/glxextensions.c | 1 + + src/glx/glxextensions.h | 1 + + 7 files changed, 56 insertions(+), 33 deletions(-) + +diff --git a/src/glx/create_context.c b/src/glx/create_context.c +index 38e949ab4c..eab6511ad8 100644 +--- a/src/glx/create_context.c ++++ b/src/glx/create_context.c +@@ -47,21 +47,11 @@ glXCreateContextAttribsARB(Display *dpy, GLXFBConfig config, + xcb_generic_error_t *err; + xcb_void_cookie_t cookie; + unsigned dummy_err = 0; ++ int screen = -1; + +- +- if (dpy == NULL || cfg == NULL) +- return NULL; +- +- /* This means that either the caller passed the wrong display pointer or +- * one of the internal GLX data structures (probably the fbconfig) has an +- * error. There is nothing sensible to do, so return an error. +- */ +- psc = GetGLXScreenConfigs(dpy, cfg->screen); +- if (psc == NULL) ++ if (dpy == NULL) + return NULL; + +- assert(cfg->screen == psc->scr); +- + /* Count the number of attributes specified by the application. All + * attributes appear in pairs, except the terminating None. + */ +@@ -70,6 +60,29 @@ glXCreateContextAttribsARB(Display *dpy, GLXFBConfig config, + /* empty */ ; + } + ++ if (cfg) { ++ screen = cfg->screen; ++ } else { ++ int i; ++ for (i = 0; i < num_attribs; i++) { ++ if (attrib_list[i * 2] == GLX_SCREEN) ++ screen = attrib_list[i * 2 + 1]; ++ } ++ } ++ ++ /* This means that either the caller passed the wrong display pointer or ++ * one of the internal GLX data structures (probably the fbconfig) has an ++ * error. There is nothing sensible to do, so return an error. ++ */ ++ psc = GetGLXScreenConfigs(dpy, screen); ++ if (psc == NULL) ++ return NULL; ++ ++ assert(screen == psc->scr); ++ ++ if (!cfg && !__glXExtensionBitIsEnabled(psc, EXT_no_config_context_bit)) ++ return NULL; ++ + if (direct && psc->vtable->create_context_attribs) { + /* GLX drops the error returned by the driver. The expectation is that + * an error will also be returned by the server. The server's error +@@ -104,8 +117,8 @@ glXCreateContextAttribsARB(Display *dpy, GLXFBConfig config, + cookie = + xcb_glx_create_context_attribs_arb_checked(c, + gc->xid, +- cfg->fbconfigID, +- cfg->screen, ++ cfg ? cfg->fbconfigID : 0, ++ screen, + gc->share_xid, + gc->isDirect, + num_attribs, +diff --git a/src/glx/dri2_glx.c b/src/glx/dri2_glx.c +index e67a15f9da..eeec4f0d60 100644 +--- a/src/glx/dri2_glx.c ++++ b/src/glx/dri2_glx.c +@@ -278,7 +278,7 @@ dri2_create_context_attribs(struct glx_screen *base, + goto error_exit; + } + +- if (!glx_context_init(&pcp->base, &psc->base, &config->base)) ++ if (!glx_context_init(&pcp->base, &psc->base, config_base)) + goto error_exit; + + ctx_attribs[num_ctx_attribs++] = __DRI_CTX_ATTRIB_MAJOR_VERSION; +@@ -317,7 +317,7 @@ dri2_create_context_attribs(struct glx_screen *base, + pcp->driContext = + (*psc->dri2->createContextAttribs) (psc->driScreen, + api, +- config->driConfig, ++ config ? config->driConfig : NULL, + shared, + num_ctx_attribs / 2, + ctx_attribs, +@@ -1129,6 +1129,7 @@ dri2BindExtensions(struct dri2_screen *psc, struct glx_display * priv, + + __glXEnableDirectExtension(&psc->base, "GLX_ARB_create_context"); + __glXEnableDirectExtension(&psc->base, "GLX_ARB_create_context_profile"); ++ __glXEnableDirectExtension(&psc->base, "GLX_EXT_no_config_context"); + + if ((mask & ((1 << __DRI_API_GLES) | + (1 << __DRI_API_GLES2) | +diff --git a/src/glx/dri3_glx.c b/src/glx/dri3_glx.c +index d613073994..4470d1ef68 100644 +--- a/src/glx/dri3_glx.c ++++ b/src/glx/dri3_glx.c +@@ -263,7 +263,7 @@ dri3_create_context_attribs(struct glx_screen *base, + goto error_exit; + } + +- if (!glx_context_init(&pcp->base, &psc->base, &config->base)) ++ if (!glx_context_init(&pcp->base, &psc->base, config_base)) + goto error_exit; + + ctx_attribs[num_ctx_attribs++] = __DRI_CTX_ATTRIB_MAJOR_VERSION; +@@ -297,7 +297,8 @@ dri3_create_context_attribs(struct glx_screen *base, + pcp->driContext = + (*psc->image_driver->createContextAttribs) (psc->driScreen, + api, +- config->driConfig, ++ config ? config->driConfig ++ : NULL, + shared, + num_ctx_attribs / 2, + ctx_attribs, +@@ -718,6 +719,7 @@ dri3_bind_extensions(struct dri3_screen *psc, struct glx_display * priv, + + __glXEnableDirectExtension(&psc->base, "GLX_ARB_create_context"); + __glXEnableDirectExtension(&psc->base, "GLX_ARB_create_context_profile"); ++ __glXEnableDirectExtension(&psc->base, "GLX_EXT_no_config_context"); + + if ((mask & ((1 << __DRI_API_GLES) | + (1 << __DRI_API_GLES2) | +diff --git a/src/glx/drisw_glx.c b/src/glx/drisw_glx.c +index a471856634..1f86ac2d4c 100644 +--- a/src/glx/drisw_glx.c ++++ b/src/glx/drisw_glx.c +@@ -455,7 +455,7 @@ drisw_create_context_attribs(struct glx_screen *base, + if (pcp == NULL) + return NULL; + +- if (!glx_context_init(&pcp->base, &psc->base, &config->base)) { ++ if (!glx_context_init(&pcp->base, &psc->base, config_base)) { + free(pcp); + return NULL; + } +@@ -483,7 +483,7 @@ drisw_create_context_attribs(struct glx_screen *base, + pcp->driContext = + (*psc->swrast->createContextAttribs) (psc->driScreen, + api, +- config->driConfig, ++ config ? config->driConfig : 0, + shared, + num_ctx_attribs / 2, + ctx_attribs, +@@ -630,6 +630,7 @@ driswBindExtensions(struct drisw_screen *psc, const __DRIextension **extensions) + if (psc->swrast->base.version >= 3) { + __glXEnableDirectExtension(&psc->base, "GLX_ARB_create_context"); + __glXEnableDirectExtension(&psc->base, "GLX_ARB_create_context_profile"); ++ __glXEnableDirectExtension(&psc->base, "GLX_EXT_no_config_context"); + + /* DRISW version >= 2 implies support for OpenGL ES. + */ +diff --git a/src/glx/glxcmds.c b/src/glx/glxcmds.c +index 10c7c2c3eb..c707d0cedf 100644 +--- a/src/glx/glxcmds.c ++++ b/src/glx/glxcmds.c +@@ -235,19 +235,23 @@ Bool + validate_renderType_against_config(const struct glx_config *config, + int renderType) + { +- switch (renderType) { +- case GLX_RGBA_TYPE: +- return (config->renderType & GLX_RGBA_BIT) != 0; +- case GLX_COLOR_INDEX_TYPE: +- return (config->renderType & GLX_COLOR_INDEX_BIT) != 0; +- case GLX_RGBA_FLOAT_TYPE_ARB: +- return (config->renderType & GLX_RGBA_FLOAT_BIT_ARB) != 0; +- case GLX_RGBA_UNSIGNED_FLOAT_TYPE_EXT: +- return (config->renderType & GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT) != 0; +- default: +- break; +- } +- return 0; ++ /* GLX_EXT_no_config_context supports any render type */ ++ if (!config) ++ return True; ++ ++ switch (renderType) { ++ case GLX_RGBA_TYPE: ++ return (config->renderType & GLX_RGBA_BIT) != 0; ++ case GLX_COLOR_INDEX_TYPE: ++ return (config->renderType & GLX_COLOR_INDEX_BIT) != 0; ++ case GLX_RGBA_FLOAT_TYPE_ARB: ++ return (config->renderType & GLX_RGBA_FLOAT_BIT_ARB) != 0; ++ case GLX_RGBA_UNSIGNED_FLOAT_TYPE_EXT: ++ return (config->renderType & GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT) != 0; ++ default: ++ break; ++ } ++ return 0; + } + + _X_HIDDEN Bool +diff --git a/src/glx/glxextensions.c b/src/glx/glxextensions.c +index af6ffbf660..4853ad534e 100644 +--- a/src/glx/glxextensions.c ++++ b/src/glx/glxextensions.c +@@ -146,6 +146,7 @@ static const struct extension_info known_glx_extensions[] = { + { GLX(EXT_fbconfig_packed_float), VER(0,0), Y, Y, N, N }, + { GLX(EXT_framebuffer_sRGB), VER(0,0), Y, Y, N, N }, + { GLX(EXT_import_context), VER(0,0), Y, Y, N, N }, ++ { GLX(EXT_no_config_context), VER(0,0), Y, N, N, N }, + { GLX(EXT_texture_from_pixmap), VER(0,0), Y, N, N, N }, + { GLX(EXT_visual_info), VER(0,0), Y, Y, N, N }, + { GLX(EXT_visual_rating), VER(0,0), Y, Y, N, N }, +diff --git a/src/glx/glxextensions.h b/src/glx/glxextensions.h +index d73128bd0e..07cd3af0ff 100644 +--- a/src/glx/glxextensions.h ++++ b/src/glx/glxextensions.h +@@ -50,6 +50,7 @@ enum + EXT_fbconfig_packed_float_bit, + EXT_framebuffer_sRGB_bit, + EXT_import_context_bit, ++ EXT_no_config_context_bit, + EXT_texture_from_pixmap_bit, + EXT_visual_info_bit, + EXT_visual_rating_bit, +-- +2.14.3 + diff --git a/mesa.spec b/mesa.spec index a204e5e..3ba5625 100644 --- a/mesa.spec +++ b/mesa.spec @@ -59,7 +59,7 @@ Name: mesa Summary: Mesa graphics libraries Version: 17.3.99.0 -Release: 0.1%{?rctag:.%{rctag}}%{?dist} +Release: 0.2%{?rctag:.%{rctag}}%{?dist} License: MIT URL: http://www.mesa3d.org @@ -77,6 +77,8 @@ Patch1: 0001-llvm-SONAME-without-version.patch Patch2: 0002-hardware-gloat.patch Patch3: 0003-evergreen-big-endian.patch Patch4: 0004-bigendian-assert.patch +Patch5: 0001-context_flush_control-squash.patch +Patch6: 0001-glx-Implement-GLX_EXT_no_config_context-v2-squash.patch # glvnd support patches # non-upstreamed ones @@ -680,6 +682,10 @@ popd %endif %changelog +* Thu Nov 09 2017 Adam Jackson - 17.3.99.0-0.2 +- GLX_EXT_no_config_context +- {EGL_KHR,GLX_ARB}_context_flush_control + * Mon Nov 06 2017 Adam Jackson - 17.3.99.0-0.1 - today's git snapshot