Mesa (master): zink: use shader-read-only-optimal for samplers

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Dec 16 10:35:35 UTC 2020


Module: Mesa
Branch: master
Commit: 134df0069fbc5fb956865c7777ba16663333cb10
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=134df0069fbc5fb956865c7777ba16663333cb10

Author: Erik Faye-Lund <kusmabite at gmail.com>
Date:   Tue Nov 17 11:37:14 2020 +0100

zink: use shader-read-only-optimal for samplers

Using the general layout for samplers can have terrible performance, so
let's use shader-read-only-optimal instead.

This is fairly straight-forward if we use conservative bounds for the
barriers, and assume they are being used in all stages.

Reviewed-By: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7655>

---

 src/gallium/drivers/zink/zink_context.c | 13 +++++++++++--
 src/gallium/drivers/zink/zink_draw.c    | 10 +++-------
 2 files changed, 14 insertions(+), 9 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c
index f09babbc372..baaf1652394 100644
--- a/src/gallium/drivers/zink/zink_context.c
+++ b/src/gallium/drivers/zink/zink_context.c
@@ -806,7 +806,7 @@ access_src_flags(VkImageLayout layout)
       return 0;
 
    case VK_IMAGE_LAYOUT_GENERAL:
-      return VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT;
+      return VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT;
 
    case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL:
       return VK_ACCESS_COLOR_ATTACHMENT_READ_BIT;
@@ -838,13 +838,16 @@ access_dst_flags(VkImageLayout layout)
       return 0;
 
    case VK_IMAGE_LAYOUT_GENERAL:
-      return VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT;
+      return VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT;
 
    case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL:
       return VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
    case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL:
       return VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
 
+   case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:
+      return VK_ACCESS_SHADER_READ_BIT;
+
    case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL:
       return VK_ACCESS_TRANSFER_READ_BIT;
 
@@ -873,6 +876,9 @@ pipeline_dst_stage(VkImageLayout layout)
    case VK_IMAGE_LAYOUT_GENERAL:
       return VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
 
+   case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:
+      return VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;
+
    default:
       return VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
    }
@@ -895,6 +901,9 @@ pipeline_src_stage(VkImageLayout layout)
    case VK_IMAGE_LAYOUT_GENERAL:
       return VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
 
+   case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:
+      return VK_PIPELINE_STAGE_VERTEX_SHADER_BIT;
+
    default:
       return VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
    }
diff --git a/src/gallium/drivers/zink/zink_draw.c b/src/gallium/drivers/zink/zink_draw.c
index f359098cb24..a885b5987b4 100644
--- a/src/gallium/drivers/zink/zink_draw.c
+++ b/src/gallium/drivers/zink/zink_draw.c
@@ -354,13 +354,9 @@ zink_draw_vbo(struct pipe_context *pctx,
             } else if (res->base.target == PIPE_BUFFER)
                wds[num_wds].pTexelBufferView = &sampler_view->buffer_view;
             else {
-               VkImageLayout layout = res->layout;
-               if (layout != VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL &&
-                   layout != VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) {
+               if (res->layout != VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL)
                   transitions[num_transitions++] = res;
-                  layout = VK_IMAGE_LAYOUT_GENERAL;
-               }
-               image_infos[num_image_info].imageLayout = layout;
+               image_infos[num_image_info].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
                image_infos[num_image_info].imageView = sampler_view->image_view;
                image_infos[num_image_info].sampler = ctx->samplers[i][index];
                wds[num_wds].pImageInfo = image_infos + num_image_info;
@@ -385,7 +381,7 @@ zink_draw_vbo(struct pipe_context *pctx,
       for (int i = 0; i < num_transitions; ++i)
          zink_resource_barrier(batch->cmdbuf, transitions[i],
                                transitions[i]->aspect,
-                               VK_IMAGE_LAYOUT_GENERAL);
+                               VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
    }
 
    if (ctx->xfb_barrier)



More information about the mesa-commit mailing list