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

Author: Jesse Natalie <[email protected]>
Date:   Thu Mar 30 13:38:37 2023 -0700

dzn: Ensure buffer offsets are aligned

If the app passes us unaligned buffer offsets, we need to align them
down to the nearest aligned offset, and then put the difference into
the descriptor set buffer.

Fixes: 8bd5fbf8 ("dzn: Bind buffers for bindless descriptor sets")
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22225>

---

 src/microsoft/vulkan/dzn_cmd_buffer.c     |  4 +++-
 src/microsoft/vulkan/dzn_descriptor_set.c | 14 ++++++++++++--
 2 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/src/microsoft/vulkan/dzn_cmd_buffer.c 
b/src/microsoft/vulkan/dzn_cmd_buffer.c
index ed471a17bf5..01b24dd7b66 100644
--- a/src/microsoft/vulkan/dzn_cmd_buffer.c
+++ b/src/microsoft/vulkan/dzn_cmd_buffer.c
@@ -3216,8 +3216,10 @@ dzn_cmd_buffer_update_heaps(struct dzn_cmd_buffer 
*cmdbuf, uint32_t bindpoint)
                const struct dzn_buffer_desc *bdesc = &set->dynamic_buffers[o];
                struct dxil_spirv_bindless_entry *map_entry = 
&map[pipeline->sets[s].dynamic_buffer_heap_offsets[o].primary];
                if (*bdesc->bindless_descriptor_slot >= 0) {
+                  uint32_t embedded_offset = (bdesc->offset / 
D3D12_RAW_UAV_SRV_BYTE_ALIGNMENT) * D3D12_RAW_UAV_SRV_BYTE_ALIGNMENT;
+                  uint32_t additional_offset = bdesc->offset - embedded_offset;
                   map_entry->buffer_idx = *bdesc->bindless_descriptor_slot;
-                  map_entry->buffer_offset = 
desc_state->sets[s].dynamic_offsets[o];
+                  map_entry->buffer_offset = additional_offset + 
desc_state->sets[s].dynamic_offsets[o];
                } else {
                   map_entry->buffer_idx = bdesc->type == 
VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC ?
                      bdesc->buffer->uav_bindless_slot : 
bdesc->buffer->cbv_bindless_slot;
diff --git a/src/microsoft/vulkan/dzn_descriptor_set.c 
b/src/microsoft/vulkan/dzn_descriptor_set.c
index 7a83d77146e..7995ccfb01f 100644
--- a/src/microsoft/vulkan/dzn_descriptor_set.c
+++ b/src/microsoft/vulkan/dzn_descriptor_set.c
@@ -1182,10 +1182,16 @@ dzn_bindless_descriptor_set_write_buffer_desc(struct 
dzn_device *device,
       if (*info->bindless_descriptor_slot < 0)
          *info->bindless_descriptor_slot =
             dzn_device_descriptor_heap_alloc_slot(device, 
D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);
+      uint32_t offset = (info->offset / D3D12_RAW_UAV_SRV_BYTE_ALIGNMENT) * 
D3D12_RAW_UAV_SRV_BYTE_ALIGNMENT;
+
+      struct dzn_buffer_desc local_info = *info;
+      local_info.offset = offset;
+      info = &local_info;
+
       dzn_descriptor_heap_write_buffer_desc(device, 
&device->device_heaps[D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV].heap,
                                             *info->bindless_descriptor_slot, 
info->type == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, info);
       map[desc_offset].buffer_idx = *info->bindless_descriptor_slot;
-      map[desc_offset].buffer_offset = 0;
+      map[desc_offset].buffer_offset = info->offset - offset;
    }
 }
 
@@ -1372,8 +1378,12 @@ dzn_descriptor_set_write_dynamic_buffer_desc(struct 
dzn_device *device,
          if (*info->bindless_descriptor_slot < 0)
             *info->bindless_descriptor_slot =
             dzn_device_descriptor_heap_alloc_slot(device, 
D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);
+         uint32_t offset = (info->offset / D3D12_RAW_UAV_SRV_BYTE_ALIGNMENT) * 
D3D12_RAW_UAV_SRV_BYTE_ALIGNMENT;
+
+         struct dzn_buffer_desc local_info = *info;
+         local_info.offset = offset;
          dzn_descriptor_heap_write_buffer_desc(device, 
&device->device_heaps[D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV].heap,
-                                               
*info->bindless_descriptor_slot, info->type == 
VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, info);
+                                               
*info->bindless_descriptor_slot, info->type == 
VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, &local_info);
       }
    }
 

Reply via email to