From e83513832bbace910f605d25c05b0eae4e31e2d8 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Wed, 15 Mar 2023 13:26:16 -0400 Subject: [PATCH] zink: always set sampler layouts when unbinding fb images while rp optimizing this may or may not always be accurate, but in the cases where it is, it should avoid some renderpass splitting, and in the cases where it isn't, there may already be issues Part-of: --- src/gallium/drivers/zink/zink_context.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index 9d41de86fc7..12e86fd21ca 100644 --- a/src/gallium/drivers/zink/zink_context.c +++ b/src/gallium/drivers/zink/zink_context.c @@ -3268,6 +3268,14 @@ unbind_fb_surface(struct zink_context *ctx, struct pipe_surface *surf, unsigned res->fb_binds &= ~BITFIELD_BIT(idx); /* this is called just before the resource loses a reference, so a refcount==1 means the resource will be destroyed */ if (!res->fb_bind_count && res->base.b.reference.count > 1) { + if (ctx->tc && zink_screen(ctx->base.screen)->driver_workarounds.track_renderpasses && !ctx->blitting) { + if (!(res->base.b.bind & PIPE_BIND_DISPLAY_TARGET) && util_format_is_depth_or_stencil(surf->format)) + /* assume that all depth buffers which are not swapchain images will be used for sampling to avoid splitting renderpasses */ + zink_screen(ctx->base.screen)->image_barrier(ctx, res, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VK_ACCESS_SHADER_READ_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT); + if (!zink_is_swapchain(res) && !util_format_is_depth_or_stencil(surf->format)) + /* assume that all color buffers which are not swapchain images will be used for sampling to avoid splitting renderpasses */ + zink_screen(ctx->base.screen)->image_barrier(ctx, res, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_ACCESS_SHADER_READ_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT); + } if (res->sampler_bind_count[0]) { update_res_sampler_layouts(ctx, res); if (res->layout != VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL && !ctx->blitting)