Mesa (main): v3dv: implement VK_KHR_device_group

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon May 31 09:40:33 UTC 2021


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

Author: Iago Toral Quiroga <itoral at igalia.com>
Date:   Thu May 27 09:16:18 2021 +0200

v3dv: implement VK_KHR_device_group

We only support one device group with a single device, so the
implementation is trivial.

Reviewed-by: Alejandro Piñeiro <apinheiro at igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11037>

---

 docs/features.txt                     |  4 +--
 src/broadcom/vulkan/v3dv_cmd_buffer.c |  7 +++++
 src/broadcom/vulkan/v3dv_device.c     | 51 +++++++++++++++++++++++++++++++++++
 src/broadcom/vulkan/v3dv_pipeline.c   |  5 +++-
 4 files changed, 64 insertions(+), 3 deletions(-)

diff --git a/docs/features.txt b/docs/features.txt
index c86c059b472..f55d5f4aa15 100644
--- a/docs/features.txt
+++ b/docs/features.txt
@@ -425,8 +425,8 @@ Vulkan 1.1 -- all DONE: anv, lvp, radv, tu, vn
   VK_KHR_bind_memory2                                   DONE (anv, lvp, radv, tu, v3dv, vn)
   VK_KHR_dedicated_allocation                           DONE (anv, lvp, radv, tu, v3dv, vn)
   VK_KHR_descriptor_update_template                     DONE (anv, lvp, radv, tu, vn)
-  VK_KHR_device_group                                   DONE (lvp, tu, vn)
-  VK_KHR_device_group_creation                          DONE (lvp, tu, vn)
+  VK_KHR_device_group                                   DONE (lvp, tu, v3dv, vn)
+  VK_KHR_device_group_creation                          DONE (lvp, tu, v3dv, vn)
   VK_KHR_external_fence                                 DONE (anv, lvp, radv, tu, vn)
   VK_KHR_external_fence_capabilities                    DONE (anv, lvp, radv, tu, vn)
   VK_KHR_external_memory                                DONE (anv, lvp, radv, tu, v3dv, vn)
diff --git a/src/broadcom/vulkan/v3dv_cmd_buffer.c b/src/broadcom/vulkan/v3dv_cmd_buffer.c
index 8cc820b47c9..8cdab17da75 100644
--- a/src/broadcom/vulkan/v3dv_cmd_buffer.c
+++ b/src/broadcom/vulkan/v3dv_cmd_buffer.c
@@ -5488,3 +5488,10 @@ v3dv_CmdDispatchIndirect(VkCommandBuffer commandBuffer,
    cmd_buffer_emit_pre_dispatch(cmd_buffer);
    cmd_buffer_dispatch_indirect(cmd_buffer, buffer, offset);
 }
+
+void
+v3dv_CmdSetDeviceMask(VkCommandBuffer commandBuffer, uint32_t deviceMask)
+{
+   /* Nothing to do here since we only support a single device */
+   assert(deviceMask = 0x1);
+}
diff --git a/src/broadcom/vulkan/v3dv_device.c b/src/broadcom/vulkan/v3dv_device.c
index 2e447e1c6cb..79893bc734b 100644
--- a/src/broadcom/vulkan/v3dv_device.c
+++ b/src/broadcom/vulkan/v3dv_device.c
@@ -104,6 +104,7 @@ v3dv_EnumerateInstanceVersion(uint32_t *pApiVersion)
                           VK_USE_PLATFORM_DISPLAY_KHR)
 
 static const struct vk_instance_extension_table instance_extensions = {
+   .KHR_device_group_creation           = true,
 #ifdef VK_USE_PLATFORM_DISPLAY_KHR
    .KHR_display                         = true,
 #endif
@@ -132,6 +133,7 @@ get_device_extensions(const struct v3dv_physical_device *device,
    *ext = (struct vk_device_extension_table) {
       .KHR_bind_memory2                    = true,
       .KHR_dedicated_allocation            = true,
+      .KHR_device_group                    = true,
       .KHR_external_memory                 = true,
       .KHR_external_memory_fd              = true,
       .KHR_get_memory_requirements2        = true,
@@ -915,6 +917,36 @@ v3dv_EnumeratePhysicalDevices(VkInstance _instance,
    return vk_outarray_status(&out);
 }
 
+VkResult
+v3dv_EnumeratePhysicalDeviceGroups(
+    VkInstance _instance,
+    uint32_t *pPhysicalDeviceGroupCount,
+    VkPhysicalDeviceGroupProperties *pPhysicalDeviceGroupProperties)
+{
+   V3DV_FROM_HANDLE(v3dv_instance, instance, _instance);
+   VK_OUTARRAY_MAKE(out, pPhysicalDeviceGroupProperties,
+                         pPhysicalDeviceGroupCount);
+
+   VkResult result = instance_ensure_physical_device(instance);
+   if (result != VK_SUCCESS)
+      return result;
+
+   assert(instance->physicalDeviceCount == 1);
+
+   vk_outarray_append(&out, p) {
+      p->physicalDeviceCount = 1;
+      memset(p->physicalDevices, 0, sizeof(p->physicalDevices));
+      p->physicalDevices[0] =
+         v3dv_physical_device_to_handle(&instance->physicalDevice);
+      p->subsetAllocation = false;
+
+      vk_foreach_struct(ext, p->pNext)
+         v3dv_debug_ignored_stype(ext->sType);
+   }
+
+   return vk_outarray_status(&out);
+}
+
 void
 v3dv_GetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice,
                                VkPhysicalDeviceFeatures *pFeatures)
@@ -1006,6 +1038,20 @@ v3dv_GetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice,
    }
 }
 
+void
+v3dv_GetDeviceGroupPeerMemoryFeatures(VkDevice device,
+                                      uint32_t heapIndex,
+                                      uint32_t localDeviceIndex,
+                                      uint32_t remoteDeviceIndex,
+                                      VkPeerMemoryFeatureFlags *pPeerMemoryFeatures)
+{
+   assert(localDeviceIndex == 0 && remoteDeviceIndex == 0);
+   *pPeerMemoryFeatures = VK_PEER_MEMORY_FEATURE_COPY_SRC_BIT |
+                          VK_PEER_MEMORY_FEATURE_COPY_DST_BIT |
+                          VK_PEER_MEMORY_FEATURE_GENERIC_SRC_BIT |
+                          VK_PEER_MEMORY_FEATURE_GENERIC_DST_BIT;
+}
+
 uint32_t
 v3dv_physical_device_vendor_id(struct v3dv_physical_device *dev)
 {
@@ -1847,6 +1893,11 @@ v3dv_AllocateMemory(VkDevice _device,
       case VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR:
          fd_info = (void *)ext;
          break;
+      case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO:
+         /* We don't support VK_KHR_buffer_device_address or multiple
+          * devices per device group, so we can ignore this.
+          */
+         break;
       case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO_KHR:
          /* We don't have particular optimizations associated with memory
           * allocations that won't be suballocated to multiple resources.
diff --git a/src/broadcom/vulkan/v3dv_pipeline.c b/src/broadcom/vulkan/v3dv_pipeline.c
index 25c33a5ed68..430a58c842d 100644
--- a/src/broadcom/vulkan/v3dv_pipeline.c
+++ b/src/broadcom/vulkan/v3dv_pipeline.c
@@ -172,7 +172,9 @@ v3dv_DestroyPipeline(VkDevice _device,
 }
 
 static const struct spirv_to_nir_options default_spirv_options =  {
-   .caps = { false },
+   .caps = {
+      .device_group = true,
+    },
    .ubo_addr_format = nir_address_format_32bit_index_offset,
    .ssbo_addr_format = nir_address_format_32bit_index_offset,
    .phys_ssbo_addr_format = nir_address_format_64bit_global,
@@ -228,6 +230,7 @@ const nir_shader_compiler_options v3dv_nir_options = {
    .lower_wpos_pntc = true,
    .lower_rotate = true,
    .lower_to_scalar = true,
+   .lower_device_index_to_zero = true,
    .has_fsub = true,
    .has_isub = true,
    .vertex_id_zero_based = false, /* FIXME: to set this to true, the intrinsic



More information about the mesa-commit mailing list