summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErik Faye-Lund <erik.faye-lund@collabora.com>2021-04-14 15:44:16 +0200
committerMarge Bot <eric+marge@anholt.net>2021-04-14 15:04:35 +0000
commit9de05fd36bc7efcda35f6fc107a58b837bc0403b (patch)
treea0717f82acb74d6dd044a5a359e7a103dba98443
parentf3e004cb56af3c770e1ad1ee00a39f958314560f (diff)
zink: do not dereference NULL pointer
If first_frame_done isn't set, but fence is NULL, we end up dereferncing that NULL-pointer. This can happen in the case where the first submitted batch has no work, and pfence was passed as a NULL-pointer. While we're at it, simplify the check with the surrounding code, which also checks for a NULL-pointer here. Fixes: e93ca92d4ae ("zink: force explicit fence only on first frame flush") Reviewed-By: Mike Blumenkrantz <michael.blumenkrantz@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10235>
-rw-r--r--src/gallium/drivers/zink/zink_context.c24
1 files changed, 13 insertions, 11 deletions
diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c
index 36e93f43831..315619dc246 100644
--- a/src/gallium/drivers/zink/zink_context.c
+++ b/src/gallium/drivers/zink/zink_context.c
@@ -1885,17 +1885,19 @@ zink_flush(struct pipe_context *pctx,
util_queue_fence_signal(&mfence->ready);
}
}
- if (fence && !(flags & (PIPE_FLUSH_DEFERRED | PIPE_FLUSH_ASYNC)))
- sync_flush(ctx, zink_batch_state(fence));
-
- if (flags & PIPE_FLUSH_END_OF_FRAME && !(flags & TC_FLUSH_ASYNC) && !deferred) {
- /* if the first frame has not yet occurred, we need an explicit fence here
- * in some cases in order to correctly draw the first frame, though it's
- * unknown at this time why this is the case
- */
- if (!ctx->first_frame_done)
- zink_vkfence_wait(screen, fence, PIPE_TIMEOUT_INFINITE);
- ctx->first_frame_done = true;
+ if (fence) {
+ if (!(flags & (PIPE_FLUSH_DEFERRED | PIPE_FLUSH_ASYNC)))
+ sync_flush(ctx, zink_batch_state(fence));
+
+ if (flags & PIPE_FLUSH_END_OF_FRAME && !(flags & TC_FLUSH_ASYNC) && !deferred) {
+ /* if the first frame has not yet occurred, we need an explicit fence here
+ * in some cases in order to correctly draw the first frame, though it's
+ * unknown at this time why this is the case
+ */
+ if (!ctx->first_frame_done)
+ zink_vkfence_wait(screen, fence, PIPE_TIMEOUT_INFINITE);
+ ctx->first_frame_done = true;
+ }
}
}