dzn: Use unrestricted copy alignments when available
authorJesse Natalie <jenatali@microsoft.com>
Fri, 21 Apr 2023 15:43:52 +0000 (08:43 -0700)
committerMarge Bot <emma+marge@anholt.net>
Tue, 25 Apr 2023 15:36:00 +0000 (15:36 +0000)
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22639>

src/microsoft/vulkan/dzn_cmd_buffer.c
src/microsoft/vulkan/dzn_device.c
src/microsoft/vulkan/dzn_private.h

index 283cb28..794f211 100644 (file)
@@ -2390,6 +2390,8 @@ dzn_cmd_buffer_copy_buf2img_region(struct dzn_cmd_buffer *cmdbuf,
 {
    VK_FROM_HANDLE(dzn_buffer, src_buffer, info->srcBuffer);
    VK_FROM_HANDLE(dzn_image, dst_image, info->dstImage);
+   struct dzn_physical_device *pdev =
+      container_of(cmdbuf->vk.base.device->physical, struct dzn_physical_device, vk);
 
    ID3D12GraphicsCommandList1 *cmdlist = cmdbuf->cmdlist;
 
@@ -2409,7 +2411,7 @@ dzn_cmd_buffer_copy_buf2img_region(struct dzn_cmd_buffer *cmdbuf,
    D3D12_TEXTURE_COPY_LOCATION src_buf_loc =
       dzn_buffer_get_copy_loc(src_buffer, dst_image->vk.format, &region, aspect, l);
 
-   if (dzn_buffer_supports_region_copy(&src_buf_loc)) {
+   if (dzn_buffer_supports_region_copy(pdev, &src_buf_loc)) {
       /* RowPitch and Offset are properly aligned, we can copy
        * the whole thing in one call.
        */
@@ -2469,6 +2471,8 @@ dzn_cmd_buffer_copy_img2buf_region(struct dzn_cmd_buffer *cmdbuf,
 {
    VK_FROM_HANDLE(dzn_image, src_image, info->srcImage);
    VK_FROM_HANDLE(dzn_buffer, dst_buffer, info->dstBuffer);
+   struct dzn_physical_device *pdev =
+      container_of(cmdbuf->vk.base.device->physical, struct dzn_physical_device, vk);
 
    ID3D12GraphicsCommandList1 *cmdlist = cmdbuf->cmdlist;
 
@@ -2488,7 +2492,7 @@ dzn_cmd_buffer_copy_img2buf_region(struct dzn_cmd_buffer *cmdbuf,
    D3D12_TEXTURE_COPY_LOCATION dst_buf_loc =
       dzn_buffer_get_copy_loc(dst_buffer, src_image->vk.format, &region, aspect, l);
 
-   if (dzn_buffer_supports_region_copy(&dst_buf_loc)) {
+   if (dzn_buffer_supports_region_copy(pdev, &dst_buf_loc)) {
       /* RowPitch and Offset are properly aligned on 256 bytes, we can copy
        * the whole thing in one call.
        */
index a223858..d988d50 100644 (file)
@@ -2954,8 +2954,11 @@ dzn_buffer_get_line_copy_loc(const struct dzn_buffer *buf, VkFormat format,
 }
 
 bool
-dzn_buffer_supports_region_copy(const D3D12_TEXTURE_COPY_LOCATION *loc)
+dzn_buffer_supports_region_copy(struct dzn_physical_device *pdev,
+                                const D3D12_TEXTURE_COPY_LOCATION *loc)
 {
+   if (pdev->options13.UnrestrictedBufferTextureCopyPitchSupported)
+      return true;
    return !(loc->PlacedFootprint.Offset & (D3D12_TEXTURE_DATA_PLACEMENT_ALIGNMENT - 1)) &&
           !(loc->PlacedFootprint.Footprint.RowPitch & (D3D12_TEXTURE_DATA_PITCH_ALIGNMENT - 1));
 }
index 56f0970..946bf27 100644 (file)
@@ -1164,7 +1164,8 @@ dzn_buffer_get_line_copy_loc(const struct dzn_buffer *buf, VkFormat format,
                              uint32_t y, uint32_t z, uint32_t *start_x);
 
 bool
-dzn_buffer_supports_region_copy(const D3D12_TEXTURE_COPY_LOCATION *loc);
+dzn_buffer_supports_region_copy(struct dzn_physical_device *pdev,
+                                const D3D12_TEXTURE_COPY_LOCATION *loc);
 
 struct dzn_buffer_view {
    struct vk_object_base base;