From f00600e1a368df3d0b786850fd175ff6cdf873eb Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Wed, 20 Apr 2022 11:46:36 -0400 Subject: [PATCH] zink: fix xfb counter buffer barriers a read barrier is needed for resume, yes, but the counter buffer is always being written to, so write access must always be set cc: mesa-stable fixes (nv): KHR-GL46.transform_feedback.draw_xfb_test Reviewed-by: Dave Airlie Part-of: (cherry picked from commit fc5edf9b68159288baa22c055e471de958812312) Conflicts: src/gallium/drivers/zink/ci/zink-nv-fails.txt --- .pick_status.json | 2 +- src/gallium/drivers/zink/ci/zink-nv-fails.txt | 1 - src/gallium/drivers/zink/zink_draw.cpp | 29 ++++++++++--------- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index b6d80ab7023..f3e99aff20d 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -13,7 +13,7 @@ "description": "zink: fix xfb counter buffer barriers", "nominated": true, "nomination_type": 0, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null }, diff --git a/src/gallium/drivers/zink/ci/zink-nv-fails.txt b/src/gallium/drivers/zink/ci/zink-nv-fails.txt index 604b170e585..8893e4bc8c0 100644 --- a/src/gallium/drivers/zink/ci/zink-nv-fails.txt +++ b/src/gallium/drivers/zink/ci/zink-nv-fails.txt @@ -149,7 +149,6 @@ KHR-GL46.texture_view.view_sampling,Fail KHR-GL46.transform_feedback.capture_geometry_interleaved_test,Fail KHR-GL46.transform_feedback.capture_geometry_separate_test,Fail KHR-GL46.transform_feedback.capture_vertex_separate_test,Fail -KHR-GL46.transform_feedback.draw_xfb_test,Fail KHR-GL46.transform_feedback.query_geometry_interleaved_test,Fail KHR-GL46.transform_feedback.query_geometry_separate_test,Fail KHR-GL46.transform_feedback.query_vertex_interleaved_test,Fail diff --git a/src/gallium/drivers/zink/zink_draw.cpp b/src/gallium/drivers/zink/zink_draw.cpp index fb385a6d390..1144ee5c790 100644 --- a/src/gallium/drivers/zink/zink_draw.cpp +++ b/src/gallium/drivers/zink/zink_draw.cpp @@ -20,25 +20,26 @@ static void zink_emit_xfb_counter_barrier(struct zink_context *ctx) { - /* Between the pause and resume there needs to be a memory barrier for the counter buffers - * with a source access of VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT - * at pipeline stage VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT - * to a destination access of VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT - * at pipeline stage VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT. - * - * - from VK_EXT_transform_feedback spec - */ for (unsigned i = 0; i < ctx->num_so_targets; i++) { struct zink_so_target *t = zink_so_target(ctx->so_targets[i]); if (!t) continue; struct zink_resource *res = zink_resource(t->counter_buffer); - if (t->counter_buffer_valid) - zink_resource_buffer_barrier(ctx, res, VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT, - VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT); - else - zink_resource_buffer_barrier(ctx, res, VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT, - VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT); + VkAccessFlags access = VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT; + VkPipelineStageFlags stage = VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT; + if (t->counter_buffer_valid) { + /* Between the pause and resume there needs to be a memory barrier for the counter buffers + * with a source access of VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT + * at pipeline stage VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT + * to a destination access of VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT + * at pipeline stage VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT. + * + * - from VK_EXT_transform_feedback spec + */ + access |= VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT; + stage |= VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT; + } + zink_resource_buffer_barrier(ctx, res, access, stage); } ctx->xfb_barrier = false; }