diff options
author | Ian Romanick <[email protected]> | 2013-11-26 16:27:57 -0800 |
---|---|---|
committer | Ian Romanick <[email protected]> | 2013-11-27 15:09:01 -0800 |
commit | 53a65e547c0bf769fff48b4ccb41d1477daa70de (patch) | |
tree | b85f962b33eccf67b8537d63e966d523bc748245 | |
parent | 0822b2dfbd37b2d82a9671efb555ca036cdc802e (diff) |
i965: Properly reject __DRI_CTX_FLAG_ROBUST_BUFFER_ACCESS when __DRI2_ROBUSTNESS is not enabled
Only allow __DRI_CTX_FLAG_ROBUST_BUFFER_ACCESS in brwCreateContext if
intelInitScreen2 also enabled __DRI2_ROBUSTNESS (thereby enabling
GLX_ARB_create_context).
This fixes a regression in the piglit test
"glx/GLX_ARB_create_context/invalid flag"
v2: Remove commented debug code. Noticed by Jordan.
Signed-off-by: Ian Romanick <[email protected]>
Reported-by: Paul Berry <[email protected]>
Reviewed-by: Jordan Justen <[email protected]>
Reviewed-by: Matt Turner <[email protected]>
Cc: "10.0" <[email protected]>
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_context.c | 13 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/intel_screen.c | 4 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/intel_screen.h | 5 |
3 files changed, 18 insertions, 4 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c index 67ac01c23db..6de67598899 100644 --- a/src/mesa/drivers/dri/i965/brw_context.c +++ b/src/mesa/drivers/dri/i965/brw_context.c @@ -558,9 +558,16 @@ brwCreateContext(gl_api api, struct dd_function_table functions; struct gl_config visual; - if (flags & ~(__DRI_CTX_FLAG_DEBUG - | __DRI_CTX_FLAG_FORWARD_COMPATIBLE - | __DRI_CTX_FLAG_ROBUST_BUFFER_ACCESS)) { + /* Only allow the __DRI_CTX_FLAG_ROBUST_BUFFER_ACCESS flag if the kernel + * provides us with context reset notifications. + */ + uint32_t allowed_flags = __DRI_CTX_FLAG_DEBUG + | __DRI_CTX_FLAG_FORWARD_COMPATIBLE; + + if (screen->has_context_reset_notification) + allowed_flags |= __DRI_CTX_FLAG_ROBUST_BUFFER_ACCESS; + + if (flags & ~allowed_flags) { *dri_ctx_error = __DRI_CTX_ERROR_UNKNOWN_FLAG; return false; } diff --git a/src/mesa/drivers/dri/i965/intel_screen.c b/src/mesa/drivers/dri/i965/intel_screen.c index 051c000ef44..39c2f35e1a8 100644 --- a/src/mesa/drivers/dri/i965/intel_screen.c +++ b/src/mesa/drivers/dri/i965/intel_screen.c @@ -1344,7 +1344,9 @@ __DRIconfig **intelInitScreen2(__DRIscreen *psp) const int ret = drmIoctl(psp->fd, DRM_IOCTL_I915_GET_RESET_STATS, &stats); - psp->extensions = (ret == -1 && errno == EINVAL) + intelScreen->has_context_reset_notification = (ret != -1 || errno != EINVAL); + + psp->extensions = !intelScreen->has_context_reset_notification ? intelScreenExtensions : intelRobustScreenExtensions; return (const __DRIconfig**) intel_screen_make_configs(psp); diff --git a/src/mesa/drivers/dri/i965/intel_screen.h b/src/mesa/drivers/dri/i965/intel_screen.h index 2e3043e27bf..924e1f2bbd3 100644 --- a/src/mesa/drivers/dri/i965/intel_screen.h +++ b/src/mesa/drivers/dri/i965/intel_screen.h @@ -50,6 +50,11 @@ struct intel_screen bool hw_has_swizzling; + /** + * Does the kernel support context reset notifications? + */ + bool has_context_reset_notification; + dri_bufmgr *bufmgr; /** |