From: Ian Romanick <ian.d.roman...@intel.com> If the application requests reset notifiction, connect up the reset status query method and set gl_context::ResetStrategy.
v2: Update based on kernel interface / libdrm changes. Signed-off-by: Ian Romanick <ian.d.roman...@intel.com> --- src/mesa/drivers/dri/i965/brw_context.c | 26 +++++++++++++++++++++----- src/mesa/drivers/dri/i965/brw_context.h | 8 ++++++++ 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c index 9d5f348..b648c37 100644 --- a/src/mesa/drivers/dri/i965/brw_context.c +++ b/src/mesa/drivers/dri/i965/brw_context.c @@ -523,11 +523,6 @@ brwCreateContext(gl_api api, return NULL; } - if (notify_reset) { - *dri_ctx_error = __DRI_CTX_ERROR_UNKNOWN_ATTRIBUTE; - return false; - } - struct brw_context *brw = rzalloc(NULL, struct brw_context); if (!brw) { printf("%s: failed to alloc context\n", __FUNCTION__); @@ -570,6 +565,9 @@ brwCreateContext(gl_api api, brw_init_driver_functions(brw, &functions); + if (notify_reset) + functions.GetGraphicsResetStatus = brw_get_graphics_reset_status; + struct gl_context *ctx = &brw->ctx; if (mesaVis == NULL) { @@ -611,6 +609,9 @@ brwCreateContext(gl_api api, brw_process_intel_debug_variable(brw); brw_initialize_context_constants(brw); + ctx->Const.ResetStrategy = notify_reset + ? GL_LOSE_CONTEXT_ON_RESET_ARB : GL_NO_RESET_NOTIFICATION_ARB; + /* Reinitialize the context point state. It depends on ctx->Const values. */ _mesa_init_point(ctx); @@ -637,6 +638,21 @@ 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) { diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h index 8b37995..6d12923 100644 --- a/src/mesa/drivers/dri/i965/brw_context.h +++ b/src/mesa/drivers/dri/i965/brw_context.h @@ -986,6 +986,14 @@ struct brw_context drm_intel_context *hw_ctx; + /** + * Number of resets observed in the system at context creation. + * + * This is tracked in the context so that we can determine that another + * reset has occured. + */ + uint32_t reset_count; + struct intel_batchbuffer batch; bool no_batch_wrap; -- 1.8.1.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev