From a1fa8b731fc5ae12b3f4961dd3a841b384177564 Mon Sep 17 00:00:00 2001 From: Nicolai Hähnle Date: Fri, 30 Sep 2016 14:06:04 +0200 Subject: st/mesa: set a device reset callback when available MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reviewed-by: Edward O'Callaghan Reviewed-by: Marek Olšák --- src/mesa/state_tracker/st_cb_flush.c | 31 ++++++++++++++++++++++++++++++- src/mesa/state_tracker/st_cb_flush.h | 3 +++ src/mesa/state_tracker/st_context.h | 2 ++ src/mesa/state_tracker/st_manager.c | 4 +++- 4 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/mesa/state_tracker/st_cb_flush.c b/src/mesa/state_tracker/st_cb_flush.c index 87c3d819a6..6442fc9225 100644 --- a/src/mesa/state_tracker/st_cb_flush.c +++ b/src/mesa/state_tracker/st_cb_flush.c @@ -171,12 +171,41 @@ st_get_graphics_reset_status(struct gl_context *ctx) struct st_context *st = st_context(ctx); enum pipe_reset_status status; - status = st->pipe->get_device_reset_status(st->pipe); + if (st->reset_status != PIPE_NO_RESET) { + status = st->reset_status; + st->reset_status = PIPE_NO_RESET; + } else { + status = st->pipe->get_device_reset_status(st->pipe); + } return gl_reset_status_from_pipe_reset_status(status); } +static void +st_device_reset_callback(void *data, enum pipe_reset_status status) +{ + struct st_context *st = data; + + assert(status != PIPE_NO_RESET); + + st->reset_status = status; + _mesa_set_context_lost_dispatch(st->ctx); +} + + +void +st_install_device_reset_callback(struct st_context *st) +{ + if (st->pipe->set_device_reset_callback) { + struct pipe_device_reset_callback cb; + cb.reset = st_device_reset_callback; + cb.data = st; + st->pipe->set_device_reset_callback(st->pipe, &cb); + } +} + + void st_init_flush_functions(struct pipe_screen *screen, struct dd_function_table *functions) { diff --git a/src/mesa/state_tracker/st_cb_flush.h b/src/mesa/state_tracker/st_cb_flush.h index f92dcd56b6..5be68c9b68 100644 --- a/src/mesa/state_tracker/st_cb_flush.h +++ b/src/mesa/state_tracker/st_cb_flush.h @@ -48,6 +48,9 @@ st_flush(struct st_context *st, extern void st_finish(struct st_context *st); +extern void +st_install_device_reset_callback(struct st_context *st); + #endif /* ST_CB_FLUSH_H */ diff --git a/src/mesa/state_tracker/st_context.h b/src/mesa/state_tracker/st_context.h index 2b783e0028..83d77fdf8f 100644 --- a/src/mesa/state_tracker/st_context.h +++ b/src/mesa/state_tracker/st_context.h @@ -253,6 +253,8 @@ struct st_context struct st_config_options options; struct st_perf_monitor_group *perfmon; + + enum pipe_reset_status reset_status; }; diff --git a/src/mesa/state_tracker/st_manager.c b/src/mesa/state_tracker/st_manager.c index fece5d5dff..6922454408 100644 --- a/src/mesa/state_tracker/st_manager.c +++ b/src/mesa/state_tracker/st_manager.c @@ -688,8 +688,10 @@ st_api_create_context(struct st_api *stapi, struct st_manager *smapi, st->ctx->Const.ContextFlags |= GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT; if (attribs->flags & ST_CONTEXT_FLAG_ROBUST_ACCESS) st->ctx->Const.ContextFlags |= GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB; - if (attribs->flags & ST_CONTEXT_FLAG_RESET_NOTIFICATION_ENABLED) + if (attribs->flags & ST_CONTEXT_FLAG_RESET_NOTIFICATION_ENABLED) { st->ctx->Const.ResetStrategy = GL_LOSE_CONTEXT_ON_RESET_ARB; + st_install_device_reset_callback(st); + } /* need to perform version check */ if (attribs->major > 1 || attribs->minor > 0) { -- cgit v1.2.3