zink: add a function for applying u_blitter barriers

this handles transitions for a sampler_view src -> framebuffer dst
operation

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21906>
This commit is contained in:
Mike Blumenkrantz 2023-03-18 10:14:41 -04:00 committed by Marge Bot
parent 22fb4578a0
commit e1621d3e6d
2 changed files with 50 additions and 0 deletions

View file

@ -437,6 +437,54 @@ zink_blit_begin(struct zink_context *ctx, enum zink_blit_flags flags)
zink_stop_conditional_render(ctx);
}
void
zink_blit_barriers(struct zink_context *ctx, struct zink_resource *src, struct zink_resource *dst, bool whole_dst)
{
struct zink_screen *screen = zink_screen(ctx->base.screen);
if (src && zink_is_swapchain(src)) {
if (!zink_kopper_acquire(ctx, src, UINT64_MAX))
return;
} else if (dst && zink_is_swapchain(dst)) {
if (!zink_kopper_acquire(ctx, dst, UINT64_MAX))
return;
}
VkAccessFlagBits flags;
VkPipelineStageFlagBits pipeline;
if (util_format_is_depth_or_stencil(dst->base.b.format)) {
flags = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
if (!whole_dst)
flags |= VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
pipeline = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT;
} else {
flags = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
if (!whole_dst)
flags |= VK_ACCESS_COLOR_ATTACHMENT_READ_BIT;
pipeline = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
}
if (src == dst) {
VkImageLayout layout = zink_screen(ctx->base.screen)->info.have_EXT_attachment_feedback_loop_layout ?
VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT :
VK_IMAGE_LAYOUT_GENERAL;
screen->image_barrier(ctx, src, layout, VK_ACCESS_SHADER_READ_BIT | flags, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | pipeline);
} else {
if (src) {
VkImageLayout layout = util_format_is_depth_or_stencil(src->base.b.format) &&
src->obj->vkusage & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT ?
VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL :
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
screen->image_barrier(ctx, src, layout,
VK_ACCESS_SHADER_READ_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT);
src->obj->unordered_read = false;
}
VkImageLayout layout = util_format_is_depth_or_stencil(dst->base.b.format) ?
VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL :
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
screen->image_barrier(ctx, dst, layout, flags, pipeline);
}
dst->obj->unordered_read = dst->obj->unordered_write = false;
}
bool
zink_blit_region_fills(struct u_rect region, unsigned width, unsigned height)
{

View file

@ -199,6 +199,8 @@ zink_context_query_init(struct pipe_context *ctx);
void
zink_blit_begin(struct zink_context *ctx, enum zink_blit_flags flags);
void
zink_blit_barriers(struct zink_context *ctx, struct zink_resource *src, struct zink_resource *dst, bool whole_dst);
void
zink_blit(struct pipe_context *pctx,