radv: Require 32bit memory for indirect buffers.
authorBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Mon, 7 Feb 2022 01:08:51 +0000 (02:08 +0100)
committerMarge Bot <emma+marge@anholt.net>
Fri, 15 Jul 2022 14:45:13 +0000 (14:45 +0000)
Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17269>

src/amd/vulkan/radv_device.c
src/amd/vulkan/radv_private.h

index c7966ea..38c4cb7 100644 (file)
@@ -3247,6 +3247,7 @@ radv_CreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCr
    bool image_2d_view_of_3d = false;
    bool primitives_generated_query = false;
    bool use_perf_counters = false;
+   bool use_dgc = false;
 
    /* Check enabled features */
    if (pCreateInfo->pEnabledFeatures) {
@@ -3333,6 +3334,12 @@ radv_CreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCr
             use_perf_counters = true;
          break;
       }
+      case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV: {
+         const VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV *features = (const void *)ext;
+         if (features->deviceGeneratedCommands)
+            use_dgc = true;
+         break;
+      }
       default:
          break;
       }
@@ -3398,6 +3405,7 @@ radv_CreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCr
    device->image_2d_view_of_3d = image_2d_view_of_3d;
 
    device->primitives_generated_query = primitives_generated_query;
+   device->uses_device_generated_commands = use_dgc;
 
    radv_init_shader_arenas(device);
 
@@ -5477,6 +5485,19 @@ radv_get_buffer_memory_requirements(struct radv_device *device, VkDeviceSize siz
    pMemoryRequirements->memoryRequirements.memoryTypeBits =
       ((1u << device->physical_device->memory_properties.memoryTypeCount) - 1u) &
       ~device->physical_device->memory_types_32bit;
+   
+   /* Allow 32-bit address-space for DGC usage, as this buffer will contain
+    * cmd buffer upload buffers, and those get passed to shaders through 32-bit
+    * pointers.
+    *
+    * We only allow it with this usage set, to "protect" the 32-bit address space
+    * from being overused. The actual requirement is done as part of
+    * vkGetGeneratedCommandsMemoryRequirementsNV. (we have to make sure their
+    * intersection is non-zero at least)
+    */
+   if ((usage & VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT) && device->uses_device_generated_commands)
+      pMemoryRequirements->memoryRequirements.memoryTypeBits |=
+         device->physical_device->memory_types_32bit;
 
    if (flags & VK_BUFFER_CREATE_SPARSE_BINDING_BIT)
       pMemoryRequirements->memoryRequirements.alignment = 4096;
index 31937ca..a72f306 100644 (file)
@@ -928,6 +928,8 @@ struct radv_device {
 
    /* Interleaved lock/unlock commandbuffers for perfcounter passes. */
    struct radeon_cmdbuf **perf_counter_lock_cs;
+
+   bool uses_device_generated_commands;
 };
 
 bool radv_device_acquire_performance_counters(struct radv_device *device);