mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-25 04:20:08 +01:00
i965: Only enable __DRI2_ROBUSTNESS if kernel support is available
This is a squash of the following two cherry-picked patches:
i965: Only enable __DRI2_ROBUSTNESS if kernel support is available
Rather than always advertising the extension but failing to create a
context with reset notifiction, just don't advertise it. I don't know
why it didn't occur to me to do it this way in the first place.
NOTE: Kristian requested that I provide a follow-up for master that
dynamically generates the list of DRI extensions instead of selected
between two hardcoded lists.
Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Suggested-by: Kristian Høgsberg <krh@bitplanet.net>
Reviewed-by: Matt Turner <mattst88@gmail.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Kristian Høgsberg <krh@bitplanet.net>
Cc: "10.0" <mesa-stable@lists.freedesktop.org>
(cherry picked from commit 9b1c68638d)
and
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 <ian.d.romanick@intel.com>
Reported-by: Paul Berry <stereotype441@gmail.com>
Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
Cc: "10.0" <mesa-stable@lists.freedesktop.org>
(cherry picked from commit 53a65e547c)
This commit is contained in:
parent
9ec00c187c
commit
a5f78c4025
3 changed files with 40 additions and 19 deletions
|
|
@ -589,9 +589,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;
|
||||
}
|
||||
|
|
@ -713,21 +720,6 @@ brwCreateContext(gl_api api,
|
|||
}
|
||||
}
|
||||
|
||||
/* Notification of GPU resets requires hardware contexts and a kernel new
|
||||
* enough to support DRM_IOCTL_I915_GET_RESET_STATS.
|
||||
*/
|
||||
if (notify_reset &&
|
||||
(brw->hw_ctx == NULL
|
||||
|| drm_intel_get_reset_stats(brw->hw_ctx, &brw->reset_count, NULL,
|
||||
NULL))) {
|
||||
/* This is the wrong error code, but the correct error code (one that
|
||||
* will cause EGL to generate EGL_BAD_MATCH) doesn't seem to exist.
|
||||
*/
|
||||
*dri_ctx_error = __DRI_CTX_ERROR_UNKNOWN_ATTRIBUTE;
|
||||
intelDestroyContext(driContextPriv);
|
||||
return false;
|
||||
}
|
||||
|
||||
brw_init_surface_formats(brw);
|
||||
|
||||
if (brw->is_g4x || brw->gen >= 5) {
|
||||
|
|
|
|||
|
|
@ -894,6 +894,15 @@ static const struct __DRIrobustnessExtensionRec dri2Robustness = {
|
|||
};
|
||||
|
||||
static const __DRIextension *intelScreenExtensions[] = {
|
||||
&intelTexBufferExtension.base,
|
||||
&intelFlushExtension.base,
|
||||
&intelImageExtension.base,
|
||||
&intelRendererQueryExtension.base,
|
||||
&dri2ConfigQueryExtension.base,
|
||||
NULL
|
||||
};
|
||||
|
||||
static const __DRIextension *intelRobustScreenExtensions[] = {
|
||||
&intelTexBufferExtension.base,
|
||||
&intelFlushExtension.base,
|
||||
&intelImageExtension.base,
|
||||
|
|
@ -1302,7 +1311,22 @@ __DRIconfig **intelInitScreen2(__DRIscreen *psp)
|
|||
|
||||
set_max_gl_versions(intelScreen);
|
||||
|
||||
psp->extensions = intelScreenExtensions;
|
||||
/* Notification of GPU resets requires hardware contexts and a kernel new
|
||||
* enough to support DRM_IOCTL_I915_GET_RESET_STATS. If the ioctl is
|
||||
* supported, calling it with a context of 0 will either generate EPERM or
|
||||
* no error. If the ioctl is not supported, it always generate EINVAL.
|
||||
* Use this to determine whether to advertise the __DRI2_ROBUSTNESS
|
||||
* extension to the loader.
|
||||
*/
|
||||
struct drm_i915_reset_stats stats;
|
||||
memset(&stats, 0, sizeof(stats));
|
||||
|
||||
const int ret = drmIoctl(psp->fd, DRM_IOCTL_I915_GET_RESET_STATS, &stats);
|
||||
|
||||
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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
/**
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue