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

Author: Samuel Pitoiset <[email protected]>
Date:   Fri Dec 15 09:29:05 2023 +0100

radv: move buffer view related code to radv_buffer_view.c

More code isolation.

Signed-off-by: Samuel Pitoiset <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26713>

---

 src/amd/vulkan/meson.build        |   1 +
 src/amd/vulkan/radv_buffer_view.c | 149 ++++++++++++++++++++++++++++++++++++++
 src/amd/vulkan/radv_image.c       | 123 +------------------------------
 src/amd/vulkan/radv_private.h     |   5 ++
 4 files changed, 157 insertions(+), 121 deletions(-)

diff --git a/src/amd/vulkan/meson.build b/src/amd/vulkan/meson.build
index 27f3277785f..b5febfd4423 100644
--- a/src/amd/vulkan/meson.build
+++ b/src/amd/vulkan/meson.build
@@ -97,6 +97,7 @@ libradv_files = files(
   'radv_acceleration_structure.c',
   'radv_android.c',
   'radv_buffer.c',
+  'radv_buffer_view.c',
   'radv_cmd_buffer.c',
   'radv_cp_reg_shadowing.c',
   'radv_cs.h',
diff --git a/src/amd/vulkan/radv_buffer_view.c 
b/src/amd/vulkan/radv_buffer_view.c
new file mode 100644
index 00000000000..f1e09d49dfe
--- /dev/null
+++ b/src/amd/vulkan/radv_buffer_view.c
@@ -0,0 +1,149 @@
+/*
+ * Copyright © 2016 Red Hat.
+ * Copyright © 2016 Bas Nieuwenhuizen
+ *
+ * based in part on anv driver which is:
+ * Copyright © 2015 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+
+#include "gfx10_format_table.h"
+
+#include "radv_private.h"
+
+void
+radv_make_texel_buffer_descriptor(struct radv_device *device, uint64_t va, 
VkFormat vk_format, unsigned offset,
+                                  unsigned range, uint32_t *state)
+{
+   const struct util_format_description *desc;
+   unsigned stride;
+   unsigned num_format, data_format;
+   int first_non_void;
+   enum pipe_swizzle swizzle[4];
+   unsigned rsrc_word3;
+
+   desc = vk_format_description(vk_format);
+   first_non_void = vk_format_get_first_non_void_channel(vk_format);
+   stride = desc->block.bits / 8;
+
+   radv_compose_swizzle(desc, NULL, swizzle);
+
+   va += offset;
+
+   if (device->physical_device->rad_info.gfx_level != GFX8 && stride) {
+      range /= stride;
+   }
+
+   rsrc_word3 = S_008F0C_DST_SEL_X(radv_map_swizzle(swizzle[0])) | 
S_008F0C_DST_SEL_Y(radv_map_swizzle(swizzle[1])) |
+                S_008F0C_DST_SEL_Z(radv_map_swizzle(swizzle[2])) | 
S_008F0C_DST_SEL_W(radv_map_swizzle(swizzle[3]));
+
+   if (device->physical_device->rad_info.gfx_level >= GFX10) {
+      const struct gfx10_format *fmt =
+         
&ac_get_gfx10_format_table(&device->physical_device->rad_info)[vk_format_to_pipe_format(vk_format)];
+
+      /* OOB_SELECT chooses the out-of-bounds check.
+       *
+       * GFX10:
+       *  - 0: (index >= NUM_RECORDS) || (offset >= STRIDE)
+       *  - 1: index >= NUM_RECORDS
+       *  - 2: NUM_RECORDS == 0
+       *  - 3: if SWIZZLE_ENABLE:
+       *          swizzle_address >= NUM_RECORDS
+       *       else:
+       *          offset >= NUM_RECORDS
+       *
+       * GFX11:
+       *  - 0: (index >= NUM_RECORDS) || (offset+payload > STRIDE)
+       *  - 1: index >= NUM_RECORDS
+       *  - 2: NUM_RECORDS == 0
+       *  - 3: if SWIZZLE_ENABLE && STRIDE:
+       *          (index >= NUM_RECORDS) || ( offset+payload > STRIDE)
+       *       else:
+       *          offset+payload > NUM_RECORDS
+       */
+      rsrc_word3 |= S_008F0C_FORMAT(fmt->img_format) | 
S_008F0C_OOB_SELECT(V_008F0C_OOB_SELECT_STRUCTURED_WITH_OFFSET) |
+                    
S_008F0C_RESOURCE_LEVEL(device->physical_device->rad_info.gfx_level < GFX11);
+   } else {
+      num_format = radv_translate_buffer_numformat(desc, first_non_void);
+      data_format = radv_translate_buffer_dataformat(desc, first_non_void);
+
+      assert(data_format != V_008F0C_BUF_DATA_FORMAT_INVALID);
+      assert(num_format != ~0);
+
+      rsrc_word3 |= S_008F0C_NUM_FORMAT(num_format) | 
S_008F0C_DATA_FORMAT(data_format);
+   }
+
+   state[0] = va;
+   state[1] = S_008F04_BASE_ADDRESS_HI(va >> 32) | S_008F04_STRIDE(stride);
+   state[2] = range;
+   state[3] = rsrc_word3;
+}
+
+void
+radv_buffer_view_init(struct radv_buffer_view *view, struct radv_device 
*device,
+                      const VkBufferViewCreateInfo *pCreateInfo)
+{
+   RADV_FROM_HANDLE(radv_buffer, buffer, pCreateInfo->buffer);
+   uint64_t va = radv_buffer_get_va(buffer->bo) + buffer->offset;
+
+   vk_buffer_view_init(&device->vk, &view->vk, pCreateInfo);
+
+   view->bo = buffer->bo;
+
+   radv_make_texel_buffer_descriptor(device, va, view->vk.format, 
view->vk.offset, view->vk.range, view->state);
+}
+
+void
+radv_buffer_view_finish(struct radv_buffer_view *view)
+{
+   vk_buffer_view_finish(&view->vk);
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL
+radv_CreateBufferView(VkDevice _device, const VkBufferViewCreateInfo 
*pCreateInfo,
+                      const VkAllocationCallbacks *pAllocator, VkBufferView 
*pView)
+{
+   RADV_FROM_HANDLE(radv_device, device, _device);
+   struct radv_buffer_view *view;
+
+   view = vk_alloc2(&device->vk.alloc, pAllocator, sizeof(*view), 8, 
VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
+   if (!view)
+      return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
+
+   radv_buffer_view_init(view, device, pCreateInfo);
+
+   *pView = radv_buffer_view_to_handle(view);
+
+   return VK_SUCCESS;
+}
+
+VKAPI_ATTR void VKAPI_CALL
+radv_DestroyBufferView(VkDevice _device, VkBufferView bufferView, const 
VkAllocationCallbacks *pAllocator)
+{
+   RADV_FROM_HANDLE(radv_device, device, _device);
+   RADV_FROM_HANDLE(radv_buffer_view, view, bufferView);
+
+   if (!view)
+      return;
+
+   radv_buffer_view_finish(view);
+   vk_free2(&device->vk.alloc, pAllocator, view);
+}
diff --git a/src/amd/vulkan/radv_image.c b/src/amd/vulkan/radv_image.c
index 675eabc90b4..917ede72d59 100644
--- a/src/amd/vulkan/radv_image.c
+++ b/src/amd/vulkan/radv_image.c
@@ -674,7 +674,7 @@ si_tile_mode_index(const struct radv_image_plane *plane, 
unsigned level, bool st
       return plane->surface.u.legacy.tiling_index[level];
 }
 
-static unsigned
+unsigned
 radv_map_swizzle(unsigned swizzle)
 {
    switch (swizzle) {
@@ -693,7 +693,7 @@ radv_map_swizzle(unsigned swizzle)
    }
 }
 
-static void
+void
 radv_compose_swizzle(const struct util_format_description *desc, const 
VkComponentMapping *mapping,
                      enum pipe_swizzle swizzle[4])
 {
@@ -722,74 +722,6 @@ radv_compose_swizzle(const struct util_format_description 
*desc, const VkCompone
    }
 }
 
-void
-radv_make_texel_buffer_descriptor(struct radv_device *device, uint64_t va, 
VkFormat vk_format, unsigned offset,
-                                  unsigned range, uint32_t *state)
-{
-   const struct util_format_description *desc;
-   unsigned stride;
-   unsigned num_format, data_format;
-   int first_non_void;
-   enum pipe_swizzle swizzle[4];
-   unsigned rsrc_word3;
-
-   desc = vk_format_description(vk_format);
-   first_non_void = vk_format_get_first_non_void_channel(vk_format);
-   stride = desc->block.bits / 8;
-
-   radv_compose_swizzle(desc, NULL, swizzle);
-
-   va += offset;
-
-   if (device->physical_device->rad_info.gfx_level != GFX8 && stride) {
-      range /= stride;
-   }
-
-   rsrc_word3 = S_008F0C_DST_SEL_X(radv_map_swizzle(swizzle[0])) | 
S_008F0C_DST_SEL_Y(radv_map_swizzle(swizzle[1])) |
-                S_008F0C_DST_SEL_Z(radv_map_swizzle(swizzle[2])) | 
S_008F0C_DST_SEL_W(radv_map_swizzle(swizzle[3]));
-
-   if (device->physical_device->rad_info.gfx_level >= GFX10) {
-      const struct gfx10_format *fmt =
-         
&ac_get_gfx10_format_table(&device->physical_device->rad_info)[vk_format_to_pipe_format(vk_format)];
-
-      /* OOB_SELECT chooses the out-of-bounds check.
-       *
-       * GFX10:
-       *  - 0: (index >= NUM_RECORDS) || (offset >= STRIDE)
-       *  - 1: index >= NUM_RECORDS
-       *  - 2: NUM_RECORDS == 0
-       *  - 3: if SWIZZLE_ENABLE:
-       *          swizzle_address >= NUM_RECORDS
-       *       else:
-       *          offset >= NUM_RECORDS
-       *
-       * GFX11:
-       *  - 0: (index >= NUM_RECORDS) || (offset+payload > STRIDE)
-       *  - 1: index >= NUM_RECORDS
-       *  - 2: NUM_RECORDS == 0
-       *  - 3: if SWIZZLE_ENABLE && STRIDE:
-       *          (index >= NUM_RECORDS) || ( offset+payload > STRIDE)
-       *       else:
-       *          offset+payload > NUM_RECORDS
-       */
-      rsrc_word3 |= S_008F0C_FORMAT(fmt->img_format) | 
S_008F0C_OOB_SELECT(V_008F0C_OOB_SELECT_STRUCTURED_WITH_OFFSET) |
-                    
S_008F0C_RESOURCE_LEVEL(device->physical_device->rad_info.gfx_level < GFX11);
-   } else {
-      num_format = radv_translate_buffer_numformat(desc, first_non_void);
-      data_format = radv_translate_buffer_dataformat(desc, first_non_void);
-
-      assert(data_format != V_008F0C_BUF_DATA_FORMAT_INVALID);
-      assert(num_format != ~0);
-
-      rsrc_word3 |= S_008F0C_NUM_FORMAT(num_format) | 
S_008F0C_DATA_FORMAT(data_format);
-   }
-
-   state[0] = va;
-   state[1] = S_008F04_BASE_ADDRESS_HI(va >> 32) | S_008F04_STRIDE(stride);
-   state[2] = range;
-   state[3] = rsrc_word3;
-}
-
 static void
 si_set_mutable_tex_desc_fields(struct radv_device *device, struct radv_image 
*image,
                                const struct legacy_surf_level 
*base_level_info, unsigned plane_id, unsigned base_level,
@@ -2662,54 +2594,3 @@ radv_DestroyImageView(VkDevice _device, VkImageView 
_iview, const VkAllocationCa
    radv_image_view_finish(iview);
    vk_free2(&device->vk.alloc, pAllocator, iview);
 }
-
-void
-radv_buffer_view_init(struct radv_buffer_view *view, struct radv_device 
*device,
-                      const VkBufferViewCreateInfo *pCreateInfo)
-{
-   RADV_FROM_HANDLE(radv_buffer, buffer, pCreateInfo->buffer);
-   uint64_t va = radv_buffer_get_va(buffer->bo) + buffer->offset;
-
-   vk_buffer_view_init(&device->vk, &view->vk, pCreateInfo);
-
-   view->bo = buffer->bo;
-
-   radv_make_texel_buffer_descriptor(device, va, view->vk.format, 
view->vk.offset, view->vk.range, view->state);
-}
-
-void
-radv_buffer_view_finish(struct radv_buffer_view *view)
-{
-   vk_buffer_view_finish(&view->vk);
-}
-
-VKAPI_ATTR VkResult VKAPI_CALL
-radv_CreateBufferView(VkDevice _device, const VkBufferViewCreateInfo 
*pCreateInfo,
-                      const VkAllocationCallbacks *pAllocator, VkBufferView 
*pView)
-{
-   RADV_FROM_HANDLE(radv_device, device, _device);
-   struct radv_buffer_view *view;
-
-   view = vk_alloc2(&device->vk.alloc, pAllocator, sizeof(*view), 8, 
VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
-   if (!view)
-      return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
-
-   radv_buffer_view_init(view, device, pCreateInfo);
-
-   *pView = radv_buffer_view_to_handle(view);
-
-   return VK_SUCCESS;
-}
-
-VKAPI_ATTR void VKAPI_CALL
-radv_DestroyBufferView(VkDevice _device, VkBufferView bufferView, const 
VkAllocationCallbacks *pAllocator)
-{
-   RADV_FROM_HANDLE(radv_device, device, _device);
-   RADV_FROM_HANDLE(radv_buffer_view, view, bufferView);
-
-   if (!view)
-      return;
-
-   radv_buffer_view_finish(view);
-   vk_free2(&device->vk.alloc, pAllocator, view);
-}
diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h
index b5a6feba0a2..94e460f7ac2 100644
--- a/src/amd/vulkan/radv_private.h
+++ b/src/amd/vulkan/radv_private.h
@@ -2699,6 +2699,11 @@ void radv_image_view_finish(struct radv_image_view 
*iview);
 
 VkFormat radv_get_aspect_format(struct radv_image *image, VkImageAspectFlags 
mask);
 
+void radv_compose_swizzle(const struct util_format_description *desc, const 
VkComponentMapping *mapping,
+                          enum pipe_swizzle swizzle[4]);
+
+unsigned radv_map_swizzle(unsigned swizzle);
+
 struct radv_buffer_view {
    struct vk_buffer_view vk;
    struct radeon_winsys_bo *bo;

Reply via email to