mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-02-02 17:30:29 +01:00
zink/kopper: Wait for last QueuePresentKHR to finish before acquiring for readback
When a job is submitted to the flush_queue the resource dt_idx is reset,
and if a readback is requested then we have to make sure that the
corresponding kopper_preset has finished before we can acquire the image
for readback, so wait for the according fence in this case.
This fixes the validation error UNASSIGNED-Threading-MultipleThreads-Write
triggered by piglit "read-front" lavapipe.
Fixes: 8ade5588e3
zink: add kopper api
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/28127>
(cherry picked from commit 811ed62865)
This commit is contained in:
parent
00b2aaf260
commit
80af43b9be
2 changed files with 16 additions and 3 deletions
|
|
@ -124,7 +124,7 @@
|
|||
"description": "zink/kopper: Wait for last QueuePresentKHR to finish before acquiring for readback",
|
||||
"nominated": true,
|
||||
"nomination_type": 1,
|
||||
"resolution": 0,
|
||||
"resolution": 1,
|
||||
"main_sha": null,
|
||||
"because_sha": "8ade5588e39d736bdeab9bdd8ffa7cbfb6a5191e",
|
||||
"notes": null
|
||||
|
|
|
|||
|
|
@ -944,8 +944,21 @@ zink_kopper_acquire_readback(struct zink_context *ctx, struct zink_resource *res
|
|||
}
|
||||
while (res->obj->dt_idx != last_dt_idx) {
|
||||
cdt->age_locked = true;
|
||||
if (res->obj->dt_idx != UINT32_MAX && !zink_kopper_present_readback(ctx, res))
|
||||
break;
|
||||
if (res->obj->dt_idx != UINT32_MAX) {
|
||||
if (!zink_kopper_present_readback(ctx, res))
|
||||
break;
|
||||
} else if (util_queue_is_initialized(&screen->flush_queue)) {
|
||||
/* AcquireNextImageKHR and QueuePresentKHR both access the swapchain, and
|
||||
* if res->obj->dt_idx == UINT32_MAX then zink_kopper_present_readback is
|
||||
* not called and we don't wait for the cdt->swapchain->present_fence.
|
||||
* Still, a kopper_present might have been called in another thread, like
|
||||
* e.g. with spec@!opengl 1.1@read-front, so we have to wait until the
|
||||
* last call to QueuePresentKHR is finished to avoid an
|
||||
* UNASSIGNED-Threading-MultipleThreads-Write
|
||||
* validation error that indicats a race condition when accessing the swapchain.
|
||||
*/
|
||||
util_queue_fence_wait(&cdt->swapchain->present_fence);
|
||||
}
|
||||
cdt->age_locked = true;
|
||||
do {
|
||||
ret = kopper_acquire(screen, res, 0);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue