mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 00:58:05 +02:00
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 <rafael.antognolli@intel.com> Tested-by: Rafael Antognolli <rafael.antognolli@intel.com> Acked-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
parent
014d0e0f88
commit
a5c17f5c29
1 changed files with 28 additions and 6 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue