From: Chad Versace Date: Fri, 13 Jan 2017 18:46:49 +0000 (-0800) Subject: i965/sync: Fail sync creation when batchbuffer flush fails X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=a5c17f5c29c14e7fc989f2555f1f7e32f07d6bf3;p=mesa.git i965/sync: Fail sync creation when batchbuffer flush fails 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. Reviewed-by: Rafael Antognolli Tested-by: Rafael Antognolli Acked-by: Kenneth Graunke --- diff --git a/src/mesa/drivers/dri/i965/brw_sync.c b/src/mesa/drivers/dri/i965/brw_sync.c index f9127a41ea1..24c8cbd3b07 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 @@ -115,8 +122,10 @@ brw_fence_has_completed_locked(struct brw_fence *fence) switch (fence->type) { case BRW_FENCE_TYPE_BO_WAIT: - if (!fence->batch_bo) + if (!fence->batch_bo) { + /* There may be no batch if intel_batchbuffer_flush() failed. */ return false; + } if (drm_intel_bo_busy(fence->batch_bo)) return false; @@ -152,7 +161,10 @@ brw_fence_client_wait_locked(struct brw_context *brw, struct brw_fence *fence, switch (fence->type) { case BRW_FENCE_TYPE_BO_WAIT: - assert(fence->batch_bo); + if (!fence->batch_bo) { + /* There may be no batch if intel_batchbuffer_flush() failed. */ + return false; + } /* DRM_IOCTL_I915_GEM_WAIT uses a signed 64 bit timeout and returns * immediately for timeouts <= 0. The best we can do is to clamp the @@ -236,7 +248,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 +308,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; }