struct iris_screen *screen,
struct iris_vtable *vtbl,
struct pipe_debug_callback *dbg,
+ struct pipe_device_reset_callback *reset,
struct iris_batch *all_batches,
enum iris_batch_name name,
uint8_t engine,
batch->screen = screen;
batch->vtbl = vtbl;
batch->dbg = dbg;
+ batch->reset = reset;
batch->name = name;
/* engine should be one of I915_EXEC_RENDER, I915_EXEC_BLT, etc. */
* dubiously claim success...
*/
if (ret == -EIO && replace_hw_ctx(batch)) {
+ if (batch->reset->reset) {
+ /* Tell the state tracker the device is lost and it was our fault. */
+ batch->reset->reset(batch->reset->data, PIPE_GUILTY_CONTEXT_RESET);
+ }
+
ret = 0;
}
struct iris_screen *screen;
struct iris_vtable *vtbl;
struct pipe_debug_callback *dbg;
+ struct pipe_device_reset_callback *reset;
/** What batch is this? (e.g. IRIS_BATCH_RENDER/COMPUTE) */
enum iris_batch_name name;
struct iris_screen *screen,
struct iris_vtable *vtbl,
struct pipe_debug_callback *dbg,
+ struct pipe_device_reset_callback *reset,
struct iris_batch *all_batches,
enum iris_batch_name name,
uint8_t ring,
memset(ice->state.last_grid, 0, sizeof(ice->state.last_grid));
}
+static void
+iris_set_device_reset_callback(struct pipe_context *ctx,
+ const struct pipe_device_reset_callback *cb)
+{
+ struct iris_context *ice = (struct iris_context *)ctx;
+
+ if (cb)
+ ice->reset = *cb;
+ else
+ memset(&ice->reset, 0, sizeof(ice->reset));
+}
+
static void
iris_get_sample_position(struct pipe_context *ctx,
unsigned sample_count,
ctx->destroy = iris_destroy_context;
ctx->set_debug_callback = iris_set_debug_callback;
+ ctx->set_device_reset_callback = iris_set_device_reset_callback;
ctx->get_sample_position = iris_get_sample_position;
ice->shaders.urb_size = devinfo->urb.size;
for (int i = 0; i < IRIS_BATCH_COUNT; i++) {
iris_init_batch(&ice->batches[i], screen, &ice->vtbl, &ice->dbg,
- ice->batches, (enum iris_batch_name) i,
+ &ice->reset, ice->batches, (enum iris_batch_name) i,
I915_EXEC_RENDER, priority);
}
/** A debug callback for KHR_debug output. */
struct pipe_debug_callback dbg;
+ /** A device reset status callback for notifying that the GPU is hosed. */
+ struct pipe_device_reset_callback reset;
+
/** Slab allocator for iris_transfer_map objects. */
struct slab_child_pool transfer_pool;