diff options
Diffstat (limited to 'src/gallium/drivers/iris/iris_batch.c')
-rw-r--r-- | src/gallium/drivers/iris/iris_batch.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/src/gallium/drivers/iris/iris_batch.c b/src/gallium/drivers/iris/iris_batch.c index d2b4fc88fe6..f3d2e569aa7 100644 --- a/src/gallium/drivers/iris/iris_batch.c +++ b/src/gallium/drivers/iris/iris_batch.c @@ -452,6 +452,28 @@ iris_finish_batch(struct iris_batch *batch) } /** + * Replace our current GEM context with a new one (in case it got banned). + */ +static bool +replace_hw_ctx(struct iris_batch *batch) +{ + struct iris_screen *screen = batch->screen; + struct iris_bufmgr *bufmgr = screen->bufmgr; + + uint32_t new_ctx = iris_clone_hw_context(bufmgr, batch->hw_ctx_id); + if (!new_ctx) + return false; + + iris_destroy_hw_context(bufmgr, batch->hw_ctx_id); + batch->hw_ctx_id = new_ctx; + + /* Notify the context that state must be re-initialized. */ + iris_lost_context_state(batch); + + return true; +} + +/** * Submit the batch to the GPU via execbuffer2. */ static int @@ -583,6 +605,15 @@ _iris_batch_flush(struct iris_batch *batch, const char *file, int line) /* Start a new batch buffer. */ iris_batch_reset(batch); + /* EIO means our context is banned. In this case, try and replace it + * with a new logical context, and inform iris_context that all state + * has been lost and needs to be re-initialized. If this succeeds, + * dubiously claim success... + */ + if (ret == -EIO && replace_hw_ctx(batch)) { + ret = 0; + } + if (ret >= 0) { //if (iris->ctx.Const.ResetStrategy == GL_LOSE_CONTEXT_ON_RESET_ARB) //iris_check_for_reset(ice); |