From: Nicolai Hähnle Date: Fri, 30 Sep 2016 10:32:02 +0000 (+0200) Subject: gallium: add pipe_context::set_device_reset_callback X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=1a3c75e30ecb343a990823a838356c063652c237;p=mesa.git gallium: add pipe_context::set_device_reset_callback Reviewed-by: Edward O'Callaghan Reviewed-by: Marek Olšák --- diff --git a/src/gallium/docs/source/context.rst b/src/gallium/docs/source/context.rst index 13dd606173e..e190cefc851 100644 --- a/src/gallium/docs/source/context.rst +++ b/src/gallium/docs/source/context.rst @@ -692,3 +692,18 @@ last_level for layers range from first_layer through last_layer. It returns TRUE if mipmap generation succeeds, otherwise it returns FALSE. Mipmap generation may fail when it is not supported for particular texture types or formats. + +Device resets +^^^^^^^^^^^^^ + +The state tracker can query or request notifications of when the GPU +is reset for whatever reason (application error, driver error). When +a GPU reset happens, the context becomes unusable and all related state +should be considered lost and undefined. Despite that, context +notifications are single-shot, i.e. subsequent calls to +``get_device_reset_status`` will return PIPE_NO_RESET. + +* ``get_device_reset_status`` queries whether a device reset has happened + since the last call or since the last notification by callback. +* ``set_device_reset_callback`` sets a callback which will be called when + a device reset is detected. The callback is only called synchronously. diff --git a/src/gallium/include/pipe/p_context.h b/src/gallium/include/pipe/p_context.h index f5841d7c424..b97aad5e313 100644 --- a/src/gallium/include/pipe/p_context.h +++ b/src/gallium/include/pipe/p_context.h @@ -47,6 +47,7 @@ struct pipe_clip_state; struct pipe_constant_buffer; struct pipe_debug_callback; struct pipe_depth_stencil_alpha_state; +struct pipe_device_reset_callback; struct pipe_draw_info; struct pipe_grid_info; struct pipe_fence_handle; @@ -690,6 +691,13 @@ struct pipe_context { */ enum pipe_reset_status (*get_device_reset_status)(struct pipe_context *ctx); + /** + * Sets the reset status callback. If the pointer is null, then no callback + * is set, otherwise a copy of the data should be made. + */ + void (*set_device_reset_callback)(struct pipe_context *ctx, + const struct pipe_device_reset_callback *cb); + /** * Dump driver-specific debug information into a stream. This is * used by debugging tools. diff --git a/src/gallium/include/pipe/p_state.h b/src/gallium/include/pipe/p_state.h index 415ea85a2ad..46df196b6ed 100644 --- a/src/gallium/include/pipe/p_state.h +++ b/src/gallium/include/pipe/p_state.h @@ -830,6 +830,25 @@ struct pipe_debug_callback void *data; }; +/** + * Structure that contains a callback for device reset messages from the driver + * back to the state tracker. + * + * The callback must not be called from driver-created threads. + */ +struct pipe_device_reset_callback +{ + /** + * Callback for the driver to report when a device reset is detected. + * + * \param data user-supplied data pointer + * \param status PIPE_*_RESET + */ + void (*reset)(void *data, enum pipe_reset_status status); + + void *data; +}; + /** * Information about memory usage. All sizes are in kilobytes. */