Mesa (main): vulkan,radv: Steal some image offset/extent helpers from radv

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Jun 7 18:25:03 UTC 2022


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

Author: Jason Ekstrand <jason at jlekstrand.net>
Date:   Sat Jun  4 23:30:21 2022 -0500

vulkan,radv: Steal some image offset/extent helpers from radv

Reviewed-by: Dave Airlie <airlied at redhat.com>
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Reviewed-by: Boris Brezillon <boris.brezillon at collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16873>

---

 src/amd/vulkan/radv_meta_copy.c | 61 ++++++++---------------------------------
 src/vulkan/runtime/vk_image.c   | 33 ++++++++++++++++++++++
 src/vulkan/runtime/vk_image.h   |  6 ++++
 3 files changed, 50 insertions(+), 50 deletions(-)

diff --git a/src/amd/vulkan/radv_meta_copy.c b/src/amd/vulkan/radv_meta_copy.c
index 13486f34c77..7a4364b5a67 100644
--- a/src/amd/vulkan/radv_meta_copy.c
+++ b/src/amd/vulkan/radv_meta_copy.c
@@ -24,46 +24,6 @@
 #include "radv_meta.h"
 #include "vk_format.h"
 
-static VkExtent3D
-meta_image_block_size(const struct radv_image *image)
-{
-   const struct util_format_description *desc = vk_format_description(image->vk.format);
-   return (VkExtent3D){desc->block.width, desc->block.height, 1};
-}
-
-/* Returns the user-provided VkBufferImageCopy::imageExtent in units of
- * elements rather than texels. One element equals one texel or one block
- * if Image is uncompressed or compressed, respectively.
- */
-static struct VkExtent3D
-meta_region_extent_el(const struct radv_image *image, const VkImageType imageType,
-                      const struct VkExtent3D *extent)
-{
-   const VkExtent3D block = meta_image_block_size(image);
-   return vk_image_sanitize_extent(&image->vk,
-                                   (VkExtent3D){
-                                      .width = DIV_ROUND_UP(extent->width, block.width),
-                                      .height = DIV_ROUND_UP(extent->height, block.height),
-                                      .depth = DIV_ROUND_UP(extent->depth, block.depth),
-                                   });
-}
-
-/* Returns the user-provided VkBufferImageCopy::imageOffset in units of
- * elements rather than texels. One element equals one texel or one block
- * if Image is uncompressed or compressed, respectively.
- */
-static struct VkOffset3D
-meta_region_offset_el(const struct radv_image *image, const struct VkOffset3D *offset)
-{
-   const VkExtent3D block = meta_image_block_size(image);
-   return vk_image_sanitize_offset(&image->vk,
-                                   (VkOffset3D){
-                                      .x = offset->x / block.width,
-                                      .y = offset->y / block.height,
-                                      .z = offset->z / block.depth,
-                                   });
-}
-
 static VkFormat
 vk_format_for_size(int bs)
 {
@@ -161,15 +121,15 @@ copy_buffer_to_image(struct radv_cmd_buffer *cmd_buffer, struct radv_buffer *buf
     * Also, convert the offsets and extent from units of texels to units of
     * blocks - which is the highest resolution accessible in this command.
     */
-   const VkOffset3D img_offset_el = meta_region_offset_el(image, &region->imageOffset);
+   const VkOffset3D img_offset_el = vk_image_offset_to_elements(&image->vk, region->imageOffset);
    const VkExtent3D bufferExtent = {
       .width = region->bufferRowLength ? region->bufferRowLength : region->imageExtent.width,
       .height = region->bufferImageHeight ? region->bufferImageHeight : region->imageExtent.height,
    };
-   const VkExtent3D buf_extent_el = meta_region_extent_el(image, image->vk.image_type, &bufferExtent);
+   const VkExtent3D buf_extent_el = vk_image_extent_to_elements(&image->vk, bufferExtent);
 
    /* Start creating blit rect */
-   const VkExtent3D img_extent_el = meta_region_extent_el(image, image->vk.image_type, &region->imageExtent);
+   const VkExtent3D img_extent_el = vk_image_extent_to_elements(&image->vk, region->imageExtent);
    struct radv_meta_blit2d_rect rect = {
       .width = img_extent_el.width,
       .height = img_extent_el.height,
@@ -316,15 +276,15 @@ copy_image_to_buffer(struct radv_cmd_buffer *cmd_buffer, struct radv_buffer *buf
     * Also, convert the offsets and extent from units of texels to units of
     * blocks - which is the highest resolution accessible in this command.
     */
-   const VkOffset3D img_offset_el = meta_region_offset_el(image, &region->imageOffset);
+   const VkOffset3D img_offset_el = vk_image_offset_to_elements(&image->vk, region->imageOffset);
    const VkExtent3D bufferExtent = {
       .width = region->bufferRowLength ? region->bufferRowLength : region->imageExtent.width,
       .height = region->bufferImageHeight ? region->bufferImageHeight : region->imageExtent.height,
    };
-   const VkExtent3D buf_extent_el = meta_region_extent_el(image, image->vk.image_type, &bufferExtent);
+   const VkExtent3D buf_extent_el = vk_image_extent_to_elements(&image->vk, bufferExtent);
 
    /* Start creating blit rect */
-   const VkExtent3D img_extent_el = meta_region_extent_el(image, image->vk.image_type, &region->imageExtent);
+   const VkExtent3D img_extent_el = vk_image_extent_to_elements(&image->vk, region->imageExtent);
    struct radv_meta_blit2d_rect rect = {
       .width = img_extent_el.width,
       .height = img_extent_el.height,
@@ -530,8 +490,10 @@ copy_image(struct radv_cmd_buffer *cmd_buffer, struct radv_image *src_image,
        * Also, convert the offsets and extent from units of texels to units of
        * blocks - which is the highest resolution accessible in this command.
        */
-      const VkOffset3D dst_offset_el = meta_region_offset_el(dst_image, &region->dstOffset);
-      const VkOffset3D src_offset_el = meta_region_offset_el(src_image, &region->srcOffset);
+      const VkOffset3D dst_offset_el =
+         vk_image_offset_to_elements(&dst_image->vk, region->dstOffset);
+      const VkOffset3D src_offset_el =
+         vk_image_offset_to_elements(&src_image->vk, region->srcOffset);
 
       /*
        * From Vulkan 1.0.68, "Copying Data Between Images":
@@ -542,8 +504,7 @@ copy_image(struct radv_cmd_buffer *cmd_buffer, struct radv_image *src_image,
        * clamping depth when copying multiple layers of a 2D image to
        * a 3D image.
        */
-      const VkExtent3D img_extent_el =
-         meta_region_extent_el(src_image, dst_image->vk.image_type, &region->extent);
+      const VkExtent3D img_extent_el = vk_image_extent_to_elements(&src_image->vk, region->extent);
 
       /* Start creating blit rect */
       struct radv_meta_blit2d_rect rect = {
diff --git a/src/vulkan/runtime/vk_image.c b/src/vulkan/runtime/vk_image.c
index a16c2ecd169..f171e259f7f 100644
--- a/src/vulkan/runtime/vk_image.c
+++ b/src/vulkan/runtime/vk_image.c
@@ -250,6 +250,39 @@ vk_image_expand_aspect_mask(const struct vk_image *image,
    }
 }
 
+VkExtent3D
+vk_image_extent_to_elements(const struct vk_image *image, VkExtent3D extent)
+{
+   const struct util_format_description *fmt =
+      vk_format_description(image->format);
+
+   extent = vk_image_sanitize_extent(image, extent);
+   extent.width = DIV_ROUND_UP(extent.width, fmt->block.width);
+   extent.height = DIV_ROUND_UP(extent.height, fmt->block.height);
+   extent.depth = DIV_ROUND_UP(extent.depth, fmt->block.depth);
+
+   return extent;
+}
+
+VkOffset3D
+vk_image_offset_to_elements(const struct vk_image *image, VkOffset3D offset)
+{
+   const struct util_format_description *fmt =
+      vk_format_description(image->format);
+
+   offset = vk_image_sanitize_offset(image, offset);
+
+   assert(offset.x % fmt->block.width == 0);
+   assert(offset.y % fmt->block.height == 0);
+   assert(offset.z % fmt->block.depth == 0);
+
+   offset.x /= fmt->block.width;
+   offset.y /= fmt->block.height;
+   offset.z /= fmt->block.depth;
+
+   return offset;
+}
+
 struct vk_image_buffer_layout
 vk_image_buffer_copy_layout(const struct vk_image *image,
                             const VkBufferImageCopy2KHR* region)
diff --git a/src/vulkan/runtime/vk_image.h b/src/vulkan/runtime/vk_image.h
index f1d5a6f7a13..236c06937ac 100644
--- a/src/vulkan/runtime/vk_image.h
+++ b/src/vulkan/runtime/vk_image.h
@@ -141,6 +141,9 @@ vk_image_sanitize_extent(const struct vk_image *image,
    }
 }
 
+VkExtent3D
+vk_image_extent_to_elements(const struct vk_image *image, VkExtent3D extent);
+
 static inline VkOffset3D
 vk_image_sanitize_offset(const struct vk_image *image,
                          const VkOffset3D imageOffset)
@@ -157,6 +160,9 @@ vk_image_sanitize_offset(const struct vk_image *image,
    }
 }
 
+VkOffset3D
+vk_image_offset_to_elements(const struct vk_image *image, VkOffset3D offset);
+
 struct vk_image_buffer_layout {
    /**
     * VkBufferImageCopy2KHR::bufferRowLength or



More information about the mesa-commit mailing list