Mesa (main): v3dv: handle formats with reverse flag

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Jan 14 10:30:12 UTC 2022


Module: Mesa
Branch: main
Commit: 25c46c465d5eca6ded6f541e70a1ac9c6ab179ed
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=25c46c465d5eca6ded6f541e70a1ac9c6ab179ed

Author: Iago Toral Quiroga <itoral at igalia.com>
Date:   Thu Jan 13 08:59:00 2022 +0100

v3dv: handle formats with reverse flag

Reviewed-by: Alejandro Piñeiro <apinheiro at igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14533>

---

 src/broadcom/vulkan/v3dv_image.c        |  4 +++-
 src/broadcom/vulkan/v3dv_private.h      |  1 +
 src/broadcom/vulkan/v3dvx_cmd_buffer.c  |  2 ++
 src/broadcom/vulkan/v3dvx_device.c      | 22 +++++++++++++++++++++-
 src/broadcom/vulkan/v3dvx_image.c       |  2 ++
 src/broadcom/vulkan/v3dvx_meta_common.c | 12 +++++++++++-
 6 files changed, 40 insertions(+), 3 deletions(-)

diff --git a/src/broadcom/vulkan/v3dv_image.c b/src/broadcom/vulkan/v3dv_image.c
index 395a7f467fa..4afc6437b45 100644
--- a/src/broadcom/vulkan/v3dv_image.c
+++ b/src/broadcom/vulkan/v3dv_image.c
@@ -551,7 +551,9 @@ v3dv_CreateImageView(VkDevice _device,
    const uint8_t *format_swizzle = v3dv_get_format_swizzle(device, format);
    util_format_compose_swizzles(format_swizzle, image_view_swizzle,
                                 iview->swizzle);
-   iview->swap_rb = iview->swizzle[0] == PIPE_SWIZZLE_Z;
+
+   iview->swap_rb = v3dv_format_swizzle_needs_rb_swap(iview->swizzle);
+   iview->channel_reverse = v3dv_format_swizzle_needs_reverse(iview->swizzle);
 
    v3dv_X(device, pack_texture_shader_state)(device, iview);
 
diff --git a/src/broadcom/vulkan/v3dv_private.h b/src/broadcom/vulkan/v3dv_private.h
index b11b66adad0..36b07de5a08 100644
--- a/src/broadcom/vulkan/v3dv_private.h
+++ b/src/broadcom/vulkan/v3dv_private.h
@@ -598,6 +598,7 @@ struct v3dv_image_view {
 
    const struct v3dv_format *format;
    bool swap_rb;
+   bool channel_reverse;
    uint32_t internal_bpp;
    uint32_t internal_type;
    uint32_t offset;
diff --git a/src/broadcom/vulkan/v3dvx_cmd_buffer.c b/src/broadcom/vulkan/v3dvx_cmd_buffer.c
index 02c24c338be..3ec0c4d0e65 100644
--- a/src/broadcom/vulkan/v3dvx_cmd_buffer.c
+++ b/src/broadcom/vulkan/v3dvx_cmd_buffer.c
@@ -116,6 +116,7 @@ cmd_buffer_render_pass_emit_load(struct v3dv_cmd_buffer *cmd_buffer,
 
       load.input_image_format = iview->format->rt_type;
       load.r_b_swap = iview->swap_rb;
+      load.channel_reverse = iview->channel_reverse;
       load.memory_format = slice->tiling;
 
       if (slice->tiling == V3D_TILING_UIF_NO_XOR ||
@@ -303,6 +304,7 @@ cmd_buffer_render_pass_emit_store(struct v3dv_cmd_buffer *cmd_buffer,
 
       store.output_image_format = iview->format->rt_type;
       store.r_b_swap = iview->swap_rb;
+      store.channel_reverse = iview->channel_reverse;
       store.memory_format = slice->tiling;
 
       if (slice->tiling == V3D_TILING_UIF_NO_XOR ||
diff --git a/src/broadcom/vulkan/v3dvx_device.c b/src/broadcom/vulkan/v3dvx_device.c
index 0d23688c4dd..0bea6211d76 100644
--- a/src/broadcom/vulkan/v3dvx_device.c
+++ b/src/broadcom/vulkan/v3dvx_device.c
@@ -58,10 +58,30 @@ static union pipe_color_union encode_border_color(
 
    const struct v3dv_format *format = v3dX(get_format)(bc_info->format);
 
+   /* We use the swizzle in our format table to determine swizzle configuration
+    * for sampling as well as to decide if we need to use the Swap R/B and
+    * Reverse Channels bits for Tile Load/Store operations. The order of the
+    * R/B swap and Reverse operations matters and gives different swizzles.
+    * Our format table assumes that Reverse happens first and R/B Swap second.
+    * This seems to match semantics for texture sampling and Tile load/store,
+    * however, it seems that the semantics are reversed for custom border
+    * colors so we need to fix up the swizzle manually for this case.
+    */
+   uint8_t swizzle[4];
+   if (v3dv_format_swizzle_needs_reverse(format->swizzle) &&
+       v3dv_format_swizzle_needs_rb_swap(format->swizzle)) {
+      swizzle[0] = PIPE_SWIZZLE_W;
+      swizzle[1] = PIPE_SWIZZLE_X;
+      swizzle[2] = PIPE_SWIZZLE_Y;
+      swizzle[3] = PIPE_SWIZZLE_Z;
+   } else {
+      memcpy(swizzle, format->swizzle, sizeof (swizzle));
+   }
+
    union pipe_color_union border;
    for (int i = 0; i < 4; i++) {
       if (format->swizzle[i] <= 3)
-         border.ui[i] = bc_info->customBorderColor.uint32[format->swizzle[i]];
+         border.ui[i] = bc_info->customBorderColor.uint32[swizzle[i]];
       else
          border.ui[i] = 0;
    }
diff --git a/src/broadcom/vulkan/v3dvx_image.c b/src/broadcom/vulkan/v3dvx_image.c
index 292ac7c9736..06deb25aba7 100644
--- a/src/broadcom/vulkan/v3dvx_image.c
+++ b/src/broadcom/vulkan/v3dvx_image.c
@@ -98,6 +98,8 @@ pack_texture_shader_state_helper(struct v3dv_device *device,
       tex.swizzle_b = translate_swizzle(image_view->swizzle[2]);
       tex.swizzle_a = translate_swizzle(image_view->swizzle[3]);
 
+      tex.reverse_standard_border_color = image_view->channel_reverse;
+
       tex.texture_type = image_view->format->tex_type;
 
       if (image->vk.image_type == VK_IMAGE_TYPE_3D) {
diff --git a/src/broadcom/vulkan/v3dvx_meta_common.c b/src/broadcom/vulkan/v3dvx_meta_common.c
index 5c775200234..93a6f0c609a 100644
--- a/src/broadcom/vulkan/v3dvx_meta_common.c
+++ b/src/broadcom/vulkan/v3dvx_meta_common.c
@@ -307,7 +307,15 @@ format_needs_rb_swap(struct v3dv_device *device,
                      VkFormat format)
 {
    const uint8_t *swizzle = v3dv_get_format_swizzle(device, format);
-   return swizzle[0] == PIPE_SWIZZLE_Z;
+   return v3dv_format_swizzle_needs_rb_swap(swizzle);
+}
+
+static inline bool
+format_needs_reverse(struct v3dv_device *device,
+                     VkFormat format)
+{
+   const uint8_t *swizzle = v3dv_get_format_swizzle(device, format);
+   return v3dv_format_swizzle_needs_reverse(swizzle);
 }
 
 static void
@@ -373,6 +381,7 @@ emit_image_load(struct v3dv_device *device,
           * so we need to make sure we respect the format swizzle.
           */
          needs_rb_swap = format_needs_rb_swap(device, framebuffer->vk_format);
+         needs_chan_reverse = format_needs_reverse(device, framebuffer->vk_format);
       }
 
       load.r_b_swap = needs_rb_swap;
@@ -430,6 +439,7 @@ emit_image_store(struct v3dv_device *device,
       } else if (!is_copy_from_buffer && !is_copy_to_buffer &&
                  (aspect & VK_IMAGE_ASPECT_COLOR_BIT)) {
          needs_rb_swap = format_needs_rb_swap(device, framebuffer->vk_format);
+         needs_chan_reverse = format_needs_reverse(device, framebuffer->vk_format);
       }
 
       store.r_b_swap = needs_rb_swap;



More information about the mesa-commit mailing list