radv: align buffer descriptor sizes to dword
authorRhys Perry <pendingchaos02@gmail.com>
Fri, 10 Apr 2020 13:25:46 +0000 (14:25 +0100)
committerMarge Bot <eric+marge@anholt.net>
Fri, 24 Apr 2020 18:52:54 +0000 (18:52 +0000)
This is needed to prevent bounds checking issues when load 8/16-bit values
with dword loads.

Signed-off-by: Rhys Perry <pendingchaos02@gmail.com>
Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4639>

src/amd/vulkan/radv_constants.h
src/amd/vulkan/radv_descriptor_set.c

index a42984e83c659955daef9065ffaaf073cc7ade1a..b494e5c71e75624d4428d9e75e83aafad4c8d22a 100644 (file)
  */
 #define RADV_MAX_PER_SET_DESCRIPTORS ((1ull << 31 ) / 96)
 
-/* Our buffer size fields allow only this much */
-#define RADV_MAX_MEMORY_ALLOCATION_SIZE 0xFFFFFFFFull
+/* Our buffer size fields allow only 2**32 - 1. We round that down to a multiple
+ * of 4 bytes so we can align buffer sizes up.
+ */
+#define RADV_MAX_MEMORY_ALLOCATION_SIZE 0xFFFFFFFCull
 
 /* Number of invocations in each subgroup. */
 #define RADV_SUBGROUP_SIZE 64
index ea3d733ba6139b6f6d995038d8bf82e14be3bf96..dff774ace69c4a16f1d902457e30d7ec23e2fb68 100644 (file)
@@ -851,6 +851,12 @@ static void write_buffer_descriptor(struct radv_device *device,
        if (buffer_info->range == VK_WHOLE_SIZE)
                range = buffer->size - buffer_info->offset;
 
+       /* robustBufferAccess is relaxed enough to allow this (in combination
+        * with the alignment/size we return from vkGetBufferMemoryRequirements)
+        * and this allows the shader compiler to create more efficient 8/16-bit
+        * buffer accesses. */
+       range = align(range, 4);
+
        va += buffer_info->offset + buffer->offset;
        dst[0] = va;
        dst[1] = S_008F04_BASE_ADDRESS_HI(va >> 32);
@@ -898,6 +904,12 @@ static void write_dynamic_buffer_descriptor(struct radv_device *device,
        if (buffer_info->range == VK_WHOLE_SIZE)
                size = buffer->size - buffer_info->offset;
 
+       /* robustBufferAccess is relaxed enough to allow this (in combination
+        * with the alignment/size we return from vkGetBufferMemoryRequirements)
+        * and this allows the shader compiler to create more efficient 8/16-bit
+        * buffer accesses. */
+       size = align(size, 4);
+
        va += buffer_info->offset + buffer->offset;
        range->va = va;
        range->size = size;