diff options
author | Chris Wilson <[email protected]> | 2019-03-25 22:32:12 +0000 |
---|---|---|
committer | Kenneth Graunke <[email protected]> | 2019-05-08 17:21:07 -0700 |
commit | 8b8125646991fb7e923821bafea9bec3ba355b42 (patch) | |
tree | 7df88eee778692c8541600519ec0ed9966c6824d /src/gallium/drivers/iris | |
parent | 8b7e19dbc556789ffa1ef364c2ce5b7a3f73b3e9 (diff) |
iris: Reorganise execbuf to have a single point of failure
Propagate the failure from GEM_EXECBUFFER2, cleanup then report failure
if need be. We retain the current behaviour to abort() at the first sign
of trouble -- for a non-robustness context, arguably this is the right
thing to do as the client cannot recover, and the system state is lost.
How to properly integrate with KHR_robustness and reset-strategy is
left as a future exercise.
Reviewed-by: Kenneth Graunke <[email protected]>
Diffstat (limited to 'src/gallium/drivers/iris')
-rw-r--r-- | src/gallium/drivers/iris/iris_batch.c | 47 |
1 files changed, 20 insertions, 27 deletions
diff --git a/src/gallium/drivers/iris/iris_batch.c b/src/gallium/drivers/iris/iris_batch.c index 2e349891fbd..d2b4fc88fe6 100644 --- a/src/gallium/drivers/iris/iris_batch.c +++ b/src/gallium/drivers/iris/iris_batch.c @@ -491,17 +491,10 @@ submit_batch(struct iris_batch *batch) (uintptr_t)util_dynarray_begin(&batch->exec_fences); } - int ret = batch->screen->no_hw ? 0 : drm_ioctl(batch->screen->fd, - DRM_IOCTL_I915_GEM_EXECBUFFER2, - &execbuf); - if (ret != 0) { + int ret = 0; + if (!batch->screen->no_hw && + drm_ioctl(batch->screen->fd, DRM_IOCTL_I915_GEM_EXECBUFFER2, &execbuf)) ret = -errno; - DBG("execbuf FAILED: errno = %d\n", -ret); - fprintf(stderr, "execbuf FAILED: errno = %d\n", -ret); - abort(); - } else { - DBG("execbuf succeeded\n"); - } for (int i = 0; i < batch->exec_count; i++) { struct iris_bo *bo = batch->exec_bos[i]; @@ -569,23 +562,6 @@ _iris_batch_flush(struct iris_batch *batch, const char *file, int line) int ret = submit_batch(batch); - if (ret >= 0) { - //if (iris->ctx.Const.ResetStrategy == GL_LOSE_CONTEXT_ON_RESET_ARB) - //iris_check_for_reset(ice); - - if (unlikely(INTEL_DEBUG & DEBUG_SYNC)) { - dbg_printf("waiting for idle\n"); - iris_bo_wait_rendering(batch->bo); - } - } else { -#ifdef DEBUG - const bool color = INTEL_DEBUG & DEBUG_COLOR; - fprintf(stderr, "%siris: Failed to submit batchbuffer: %-80s%s\n", - color ? "\e[1;41m" : "", strerror(-ret), color ? "\e[0m" : ""); - abort(); -#endif - } - batch->exec_count = 0; batch->aperture_space = 0; @@ -599,8 +575,25 @@ _iris_batch_flush(struct iris_batch *batch, const char *file, int line) util_dynarray_clear(&batch->exec_fences); + if (unlikely(INTEL_DEBUG & DEBUG_SYNC)) { + dbg_printf("waiting for idle\n"); + iris_bo_wait_rendering(batch->bo); /* if execbuf failed; this is a nop */ + } + /* Start a new batch buffer. */ iris_batch_reset(batch); + + if (ret >= 0) { + //if (iris->ctx.Const.ResetStrategy == GL_LOSE_CONTEXT_ON_RESET_ARB) + //iris_check_for_reset(ice); + } else { +#ifdef DEBUG + const bool color = INTEL_DEBUG & DEBUG_COLOR; + fprintf(stderr, "%siris: Failed to submit batchbuffer: %-80s%s\n", + color ? "\e[1;41m" : "", strerror(-ret), color ? "\e[0m" : ""); +#endif + abort(); + } } /** |