diff --git a/.pick_status.json b/.pick_status.json index 7b5dcf67148..940214c187b 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -194,7 +194,7 @@ "description": "zink: lock buffer age when chundering swapchain for readback", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "c123ab213797c1d0d2a34e57c503428261324cc6", "notes": null diff --git a/src/gallium/drivers/zink/zink_kopper.c b/src/gallium/drivers/zink/zink_kopper.c index bda4c206877..5fd6fd44369 100644 --- a/src/gallium/drivers/zink/zink_kopper.c +++ b/src/gallium/drivers/zink/zink_kopper.c @@ -812,11 +812,13 @@ zink_kopper_present_queue(struct zink_screen *screen, struct zink_resource *res) * * Any other color buffers' ages are incremented by 1 if * their age was previously greater than 0. */ - for (int i = 0; i < cdt->swapchain->num_images; i++) { - if (i == res->obj->dt_idx) - cdt->swapchain->images[i].age = 1; - else if (cdt->swapchain->images[i].age > 0) - cdt->swapchain->images[i].age += 1; + if (!cdt->age_locked) { + for (int i = 0; i < cdt->swapchain->num_images; i++) { + if (i == res->obj->dt_idx) + cdt->swapchain->images[i].age = 1; + else if (cdt->swapchain->images[i].age > 0) + cdt->swapchain->images[i].age += 1; + } } if (util_queue_is_initialized(&screen->flush_queue)) { p_atomic_inc(&cpi->swapchain->async_presents); @@ -873,14 +875,17 @@ zink_kopper_acquire_readback(struct zink_context *ctx, struct zink_resource *res if (++cdt->readback_counter >= ZINK_READBACK_THRESHOLD) kopper_ensure_readback(screen, 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; + cdt->age_locked = true; do { ret = kopper_acquire(screen, res, 0); } while (!is_swapchain_kill(ret) && (ret == VK_NOT_READY || ret == VK_TIMEOUT)); if (is_swapchain_kill(ret)) { kill_swapchain(ctx, res); *readback = NULL; + cdt->age_locked = false; return false; } } @@ -936,6 +941,10 @@ zink_kopper_present_readback(struct zink_context *ctx, struct zink_resource *res simple_mtx_lock(&screen->semaphores_lock); util_dynarray_append(&screen->semaphores, VkSemaphore, acquire); simple_mtx_unlock(&screen->semaphores_lock); + + struct kopper_displaytarget *cdt = res->obj->dt; + cdt->age_locked = false; + return zink_screen_handle_vkresult(screen, error); } diff --git a/src/gallium/drivers/zink/zink_kopper.h b/src/gallium/drivers/zink/zink_kopper.h index f930f282e2e..24614bbe376 100644 --- a/src/gallium/drivers/zink/zink_kopper.h +++ b/src/gallium/drivers/zink/zink_kopper.h @@ -95,6 +95,8 @@ struct kopper_displaytarget bool is_kill; VkPresentModeKHR present_mode; unsigned readback_counter; + + bool age_locked; //disables buffer age during readback }; struct zink_context;