diff options
author | Erik Faye-Lund <erik.faye-lund@collabora.com> | 2021-04-14 15:44:16 +0200 |
---|---|---|
committer | Marge Bot <eric+marge@anholt.net> | 2021-04-14 15:04:35 +0000 |
commit | 9de05fd36bc7efcda35f6fc107a58b837bc0403b (patch) | |
tree | a0717f82acb74d6dd044a5a359e7a103dba98443 | |
parent | f3e004cb56af3c770e1ad1ee00a39f958314560f (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.c | 24 |
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; + } } } |