OSDN Git Service

radv: expose the compute queue
authorDave Airlie <airlied@redhat.com>
Wed, 30 Nov 2016 04:08:10 +0000 (04:08 +0000)
committerBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Sun, 18 Dec 2016 19:52:55 +0000 (20:52 +0100)
v2: Don't expose the SDMA queue and use the CIK check also in the
    second if. (Bas)

Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
src/amd/vulkan/radv_device.c

index cfedff4..6362e9e 100644 (file)
@@ -553,20 +553,50 @@ void radv_GetPhysicalDeviceQueueFamilyProperties(
        uint32_t*                                   pCount,
        VkQueueFamilyProperties*                    pQueueFamilyProperties)
 {
+       RADV_FROM_HANDLE(radv_physical_device, pdevice, physicalDevice);
+       int num_queue_families = 1;
+       bool all_queues = env_var_as_boolean("RADV_SHOW_QUEUES", true);
+       int idx;
+       if (all_queues && pdevice->rad_info.chip_class >= CIK) {
+               if (pdevice->rad_info.compute_rings > 0)
+                       num_queue_families++;
+       }
+
        if (pQueueFamilyProperties == NULL) {
-               *pCount = 1;
+               *pCount = num_queue_families;
                return;
        }
-       assert(*pCount >= 1);
-
-       *pQueueFamilyProperties = (VkQueueFamilyProperties) {
-               .queueFlags = VK_QUEUE_GRAPHICS_BIT |
-               VK_QUEUE_COMPUTE_BIT |
-               VK_QUEUE_TRANSFER_BIT,
-               .queueCount = 1,
-               .timestampValidBits = 64,
-               .minImageTransferGranularity = (VkExtent3D) { 1, 1, 1 },
-       };
+
+       if (!*pCount)
+               return;
+
+       idx = 0;
+       if (*pCount >= 1) {
+               pQueueFamilyProperties[idx] = (VkQueueFamilyProperties) {
+                       .queueFlags = VK_QUEUE_GRAPHICS_BIT |
+                       VK_QUEUE_COMPUTE_BIT |
+                       VK_QUEUE_TRANSFER_BIT,
+                       .queueCount = 1,
+                       .timestampValidBits = 64,
+                       .minImageTransferGranularity = (VkExtent3D) { 1, 1, 1 },
+               };
+               idx++;
+       }
+
+       if (!all_queues)
+               return;
+
+       if (pdevice->rad_info.compute_rings > 0 && pdevice->rad_info.chip_class >= CIK) {
+               if (*pCount > idx) {
+                       pQueueFamilyProperties[idx] = (VkQueueFamilyProperties) {
+                               .queueFlags = VK_QUEUE_COMPUTE_BIT | VK_QUEUE_TRANSFER_BIT,
+                               .queueCount = pdevice->rad_info.compute_rings,
+                               .timestampValidBits = 64,
+                               .minImageTransferGranularity = (VkExtent3D) { 1, 1, 1 },
+                       };
+                       idx++;
+               }
+       }
 }
 
 void radv_GetPhysicalDeviceMemoryProperties(