nvk: Implement VkGetImageSubresourceLyout
authorFaith Ekstrand <faith.ekstrand@collabora.com>
Thu, 3 Aug 2023 21:10:59 +0000 (16:10 -0500)
committerMarge Bot <emma+marge@anholt.net>
Fri, 4 Aug 2023 21:31:55 +0000 (21:31 +0000)
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24326>

src/nouveau/nil/nil_image.c
src/nouveau/nil/nil_image.h
src/nouveau/vulkan/nvk_image.c

index 6956fa3..e350828 100644 (file)
@@ -197,3 +197,33 @@ nil_image_init(struct nouveau_ws_device *dev,
 
    return true;
 }
+
+uint64_t
+nil_image_level_size_B(const struct nil_image *image, uint32_t level)
+{
+   assert(level < image->num_levels);
+
+   /* See the nil_image::levels[] computations */
+   struct nil_extent4d lvl_ext_B = image_level_extent_B(image, level);
+   struct nil_extent4d lvl_tiling_ext_B =
+      nil_tiling_extent_B(image->levels[level].tiling);
+   lvl_ext_B = nil_extent4d_align(lvl_ext_B, lvl_tiling_ext_B);
+
+   return (uint64_t)lvl_ext_B.w *
+          (uint64_t)lvl_ext_B.h *
+          (uint64_t)lvl_ext_B.d;
+}
+
+uint64_t
+nil_image_level_depth_stride_B(const struct nil_image *image, uint32_t level)
+{
+   assert(level < image->num_levels);
+
+   /* See the nil_image::levels[] computations */
+   struct nil_extent4d lvl_ext_B = image_level_extent_B(image, level);
+   struct nil_extent4d lvl_tiling_ext_B =
+      nil_tiling_extent_B(image->levels[level].tiling);
+   lvl_ext_B = nil_extent4d_align(lvl_ext_B, lvl_tiling_ext_B);
+
+   return (uint64_t)lvl_ext_B.w * (uint64_t)lvl_ext_B.h;
+}
index 86ba16d..766ee94 100644 (file)
@@ -150,6 +150,10 @@ nil_image_level_layer_offset_B(const struct nil_image *image,
    return image->levels[level].offset_B + (layer * image->array_stride_B);
 }
 
+uint64_t nil_image_level_size_B(const struct nil_image *image,
+                                uint32_t level);
+uint64_t nil_image_level_depth_stride_B(const struct nil_image *image,
+                                        uint32_t level);
 
 void nil_image_fill_tic(struct nouveau_ws_device *dev,
                         const struct nil_image *image,
index 1deb88a..5423aa2 100644 (file)
@@ -115,6 +115,26 @@ nvk_GetImageMemoryRequirements2(VkDevice _device,
    }
 }
 
+VKAPI_ATTR void VKAPI_CALL
+nvk_GetImageSubresourceLayout(VkDevice device,
+                              VkImage _image,
+                              const VkImageSubresource *pSubresource,
+                              VkSubresourceLayout *pLayout)
+{
+   VK_FROM_HANDLE(nvk_image, image, _image);
+
+   *pLayout = (VkSubresourceLayout) {
+      .offset = nil_image_level_layer_offset_B(&image->nil,
+                                               pSubresource->mipLevel,
+                                               pSubresource->arrayLayer),
+      .size = nil_image_level_size_B(&image->nil, pSubresource->mipLevel),
+      .rowPitch = image->nil.levels[pSubresource->mipLevel].row_stride_B,
+      .arrayPitch = image->nil.array_stride_B,
+      .depthPitch = nil_image_level_depth_stride_B(&image->nil,
+                                                   pSubresource->mipLevel),
+   };
+}
+
 VKAPI_ATTR VkResult VKAPI_CALL
 nvk_BindImageMemory2(VkDevice _device,
                      uint32_t bindInfoCount,