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

Author: Jesse Natalie <[email protected]>
Date:   Fri Apr 21 08:43:52 2023 -0700

dzn: Use unrestricted copy alignments when available

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22639>

---

 src/microsoft/vulkan/dzn_cmd_buffer.c | 8 ++++++--
 src/microsoft/vulkan/dzn_device.c     | 5 ++++-
 src/microsoft/vulkan/dzn_private.h    | 3 ++-
 3 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/src/microsoft/vulkan/dzn_cmd_buffer.c 
b/src/microsoft/vulkan/dzn_cmd_buffer.c
index 283cb28b372..794f2111bf6 100644
--- a/src/microsoft/vulkan/dzn_cmd_buffer.c
+++ b/src/microsoft/vulkan/dzn_cmd_buffer.c
@@ -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.
        */
diff --git a/src/microsoft/vulkan/dzn_device.c 
b/src/microsoft/vulkan/dzn_device.c
index a22385845c3..d988d50d220 100644
--- a/src/microsoft/vulkan/dzn_device.c
+++ b/src/microsoft/vulkan/dzn_device.c
@@ -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));
 }
diff --git a/src/microsoft/vulkan/dzn_private.h 
b/src/microsoft/vulkan/dzn_private.h
index 56f09709845..946bf2735ac 100644
--- a/src/microsoft/vulkan/dzn_private.h
+++ b/src/microsoft/vulkan/dzn_private.h
@@ -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;

Reply via email to