[Mesa-dev] [RFC 10/12] i965/sync: Fail sync creation with batchbuffer flush fails
Chad Versace
chadversary at chromium.org
Mon Oct 10 17:43:57 UTC 2016
Pre-patch, brw_sync.c ignored the return value of
intel_batchbuffer_flush().
When intel_batchbuffer_flush() fails during eglCreateSync
(brw_dri_create_fence), we now give up, cleanup, and return NULL.
When it fails during glFenceSync, however, we blindly continue and hope
for the best because there does not exist yet a way to tell core GL that
sync creation failed.
---
src/mesa/drivers/dri/i965/brw_sync.c | 25 +++++++++++++++++++++----
1 file changed, 21 insertions(+), 4 deletions(-)
diff --git a/src/mesa/drivers/dri/i965/brw_sync.c b/src/mesa/drivers/dri/i965/brw_sync.c
index 2dc929c..c105625 100644
--- a/src/mesa/drivers/dri/i965/brw_sync.c
+++ b/src/mesa/drivers/dri/i965/brw_sync.c
@@ -90,7 +90,7 @@ brw_fence_finish(struct brw_fence *fence)
mtx_destroy(&fence->mutex);
}
-static void
+static bool MUST_CHECK
brw_fence_insert(struct brw_context *brw, struct brw_fence *fence)
{
brw_emit_mi_flush(brw);
@@ -102,9 +102,16 @@ brw_fence_insert(struct brw_context *brw, struct brw_fence *fence)
fence->batch_bo = brw->batch.bo;
drm_intel_bo_reference(fence->batch_bo);
- intel_batchbuffer_flush(brw);
+
+ if (intel_batchbuffer_flush(brw) < 0) {
+ drm_intel_bo_unreference(fence->batch_bo);
+ fence->batch_bo = NULL;
+ return false;
+ }
break;
}
+
+ return true;
}
static bool
@@ -236,7 +243,12 @@ brw_gl_fence_sync(struct gl_context *ctx, struct gl_sync_object *_sync,
struct brw_gl_sync *sync = (struct brw_gl_sync *) _sync;
brw_fence_init(brw, &sync->fence, BRW_FENCE_TYPE_BO_WAIT);
- brw_fence_insert(brw, &sync->fence);
+
+ if (!brw_fence_insert(brw, &sync->fence)) {
+ /* FIXME: There exists no way to report a GL error here. If an error
+ * occurs, continue silently and hope for the best.
+ */
+ }
}
static void
@@ -291,7 +303,12 @@ brw_dri_create_fence(__DRIcontext *ctx)
return NULL;
brw_fence_init(brw, fence, BRW_FENCE_TYPE_BO_WAIT);
- brw_fence_insert(brw, fence);
+
+ if (!brw_fence_insert(brw, fence)) {
+ brw_fence_finish(fence);
+ free(fence);
+ return NULL;
+ }
return fence;
}
--
2.10.0
More information about the mesa-dev
mailing list