Skip shader compile on unsupported ycbcr tests
[platform/upstream/VK-GL-CTS.git] / external / vulkancts / modules / vulkan / vktTestCase.cpp
index cc1bc71..54ec64c 100644 (file)
@@ -222,20 +222,24 @@ static deUint32 findQueueFamilyIndexWithCaps (const InstanceInterface& vkInstanc
        TCU_THROW(NotSupportedError, "No matching queue found");
 }
 
-Move<VkDevice> createDefaultDevice (const InstanceInterface&                   vki,
+Move<VkDevice> createDefaultDevice (const PlatformInterface&                   vkp,
+                                                                       VkInstance                                                      instance,
+                                                                       const InstanceInterface&                        vki,
                                                                        VkPhysicalDevice                                        physicalDevice,
                                                                        const deUint32                                          apiVersion,
                                                                        deUint32                                                        queueIndex,
+                                                                       deUint32                                                        sparseQueueIndex,
                                                                        const VkPhysicalDeviceFeatures2&        enabledFeatures,
                                                                        const vector<string>&                           enabledExtensions,
                                                                        const tcu::CommandLine&                         cmdLine)
 {
-       VkDeviceQueueCreateInfo         queueInfo;
+       VkDeviceQueueCreateInfo         queueInfo[2];
        VkDeviceCreateInfo                      deviceInfo;
        vector<string>                          enabledLayers;
        vector<const char*>                     layerPtrs;
        vector<const char*>                     extensionPtrs;
        const float                                     queuePriority   = 1.0f;
+       const deUint32                          numQueues = (enabledFeatures.features.sparseBinding && (queueIndex != sparseQueueIndex)) ? 2 : 1;
 
        deMemset(&queueInfo,    0, sizeof(queueInfo));
        deMemset(&deviceInfo,   0, sizeof(deviceInfo));
@@ -263,26 +267,35 @@ Move<VkDevice> createDefaultDevice (const InstanceInterface&                      vki,
        for (size_t ndx = 0; ndx < nonCoreExtensions.size(); ++ndx)
                extensionPtrs[ndx] = nonCoreExtensions[ndx].c_str();
 
-       // VK_KHR_get_physical_device_propeties2 is used if enabledFeatures.pNext != 0
+       queueInfo[0].sType                                              = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
+       queueInfo[0].pNext                                              = DE_NULL;
+       queueInfo[0].flags                                              = (VkDeviceQueueCreateFlags)0u;
+       queueInfo[0].queueFamilyIndex                   = queueIndex;
+       queueInfo[0].queueCount                                 = 1u;
+       queueInfo[0].pQueuePriorities                   = &queuePriority;
 
-       queueInfo.sType                                                 = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
-       queueInfo.pNext                                                 = DE_NULL;
-       queueInfo.flags                                                 = (VkDeviceQueueCreateFlags)0u;
-       queueInfo.queueFamilyIndex                              = queueIndex;
-       queueInfo.queueCount                                    = 1u;
-       queueInfo.pQueuePriorities                              = &queuePriority;
+       if (numQueues > 1)
+       {
+               queueInfo[1].sType                                              = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
+               queueInfo[1].pNext                                              = DE_NULL;
+               queueInfo[1].flags                                              = (VkDeviceQueueCreateFlags)0u;
+               queueInfo[1].queueFamilyIndex                   = sparseQueueIndex;
+               queueInfo[1].queueCount                                 = 1u;
+               queueInfo[1].pQueuePriorities                   = &queuePriority;
+       }
 
+       // VK_KHR_get_physical_device_properties2 is used if enabledFeatures.pNext != 0
        deviceInfo.sType                                                = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
        deviceInfo.pNext                                                = enabledFeatures.pNext ? &enabledFeatures : DE_NULL;
-       deviceInfo.queueCreateInfoCount                 = 1u;
-       deviceInfo.pQueueCreateInfos                    = &queueInfo;
+       deviceInfo.queueCreateInfoCount                 = numQueues;
+       deviceInfo.pQueueCreateInfos                    = queueInfo;
        deviceInfo.enabledExtensionCount                = (deUint32)extensionPtrs.size();
        deviceInfo.ppEnabledExtensionNames              = (extensionPtrs.empty() ? DE_NULL : &extensionPtrs[0]);
        deviceInfo.enabledLayerCount                    = (deUint32)layerPtrs.size();
        deviceInfo.ppEnabledLayerNames                  = (layerPtrs.empty() ? DE_NULL : &layerPtrs[0]);
        deviceInfo.pEnabledFeatures                             = enabledFeatures.pNext ? DE_NULL : &enabledFeatures.features;
 
-       return createDevice(vki, physicalDevice, &deviceInfo);
+       return createDevice(vkp, instance, vki, physicalDevice, &deviceInfo);
 };
 
 bool isPhysicalDeviceFeatures2Supported (const deUint32 version, const vector<string>& instanceExtensions)
@@ -295,6 +308,8 @@ class DeviceFeatures
 public:
        VkPhysicalDeviceFeatures2                                               coreFeatures;
        VkPhysicalDeviceSamplerYcbcrConversionFeatures  samplerYCbCrConversionFeatures;
+       VkPhysicalDevice16BitStorageFeatures                    sixteenBitStorageFeatures;
+       VkPhysicalDeviceVariablePointerFeatures                 variablePointerFeatures;
 
        DeviceFeatures (const InstanceInterface&        vki,
                                        const deUint32                          apiVersion,
@@ -304,14 +319,33 @@ public:
        {
                deMemset(&coreFeatures, 0, sizeof(coreFeatures));
                deMemset(&samplerYCbCrConversionFeatures, 0, sizeof(samplerYCbCrConversionFeatures));
+               deMemset(&sixteenBitStorageFeatures, 0, sizeof(sixteenBitStorageFeatures));
+               deMemset(&variablePointerFeatures, 0, sizeof(variablePointerFeatures));
 
                coreFeatures.sType                                              = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
                samplerYCbCrConversionFeatures.sType    = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES;
+               sixteenBitStorageFeatures.sType                 = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES_KHR;
+               variablePointerFeatures.sType                   = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES_KHR;
 
                if (isPhysicalDeviceFeatures2Supported(apiVersion, instanceExtensions))
                {
+                       void** nextPtr = &coreFeatures.pNext;
+
                        if (de::contains(deviceExtensions.begin(), deviceExtensions.end(), "VK_KHR_sampler_ycbcr_conversion"))
-                               coreFeatures.pNext = &samplerYCbCrConversionFeatures;
+                       {
+                               *nextPtr        = &samplerYCbCrConversionFeatures;
+                               nextPtr         = &samplerYCbCrConversionFeatures.pNext;
+                       }
+                       if (de::contains(deviceExtensions.begin(), deviceExtensions.end(), "VK_KHR_16bit_storage"))
+                       {
+                               *nextPtr        = &sixteenBitStorageFeatures;
+                               nextPtr         = &sixteenBitStorageFeatures.pNext;
+                       }
+                       if (de::contains(deviceExtensions.begin(), deviceExtensions.end(), "VK_KHR_variable_pointers"))
+                       {
+                               *nextPtr        = &variablePointerFeatures;
+                               nextPtr         = &variablePointerFeatures.pNext;
+                       }
 
                        vki.getPhysicalDeviceFeatures2(physicalDevice, &coreFeatures);
                }
@@ -341,6 +375,8 @@ public:
        const VkPhysicalDeviceFeatures&                                                 getDeviceFeatures                                       (void) const    { return m_deviceFeatures.coreFeatures.features;                        }
        const VkPhysicalDeviceFeatures2&                                                getDeviceFeatures2                                      (void) const    { return m_deviceFeatures.coreFeatures; }
        const VkPhysicalDeviceSamplerYcbcrConversionFeatures&   getSamplerYCbCrConversionFeatures       (void) const    { return m_deviceFeatures.samplerYCbCrConversionFeatures;       }
+       const VkPhysicalDevice16BitStorageFeatures&                             get16BitStorageFeatures                         (void) const    { return m_deviceFeatures.sixteenBitStorageFeatures;            }
+       const VkPhysicalDeviceVariablePointerFeatures&                  getVariablePointerFeatures                      (void) const    { return m_deviceFeatures.variablePointerFeatures;                      }
        VkDevice                                                                                                getDevice                                                       (void) const    { return *m_device;                                                                                     }
        const DeviceInterface&                                                                  getDeviceInterface                                      (void) const    { return m_deviceInterface;                                                                     }
        const VkPhysicalDeviceProperties&                                               getDeviceProperties                                     (void) const    { return m_deviceProperties;                                                            }
@@ -350,6 +386,8 @@ public:
 
        deUint32                                                                                                getUniversalQueueFamilyIndex            (void) const    { return m_universalQueueFamilyIndex;                                           }
        VkQueue                                                                                                 getUniversalQueue                                       (void) const;
+       deUint32                                                                                                getSparseQueueFamilyIndex               (void) const    { return m_sparseQueueFamilyIndex;                                      }
+       VkQueue                                                                                                 getSparseQueue                                  (void) const;
 
 private:
 
@@ -365,12 +403,13 @@ private:
        const VkPhysicalDevice                          m_physicalDevice;
        const deUint32                                          m_deviceVersion;
 
-       const deUint32                                          m_universalQueueFamilyIndex;
-       const VkPhysicalDeviceProperties        m_deviceProperties;
-
        const vector<string>                            m_deviceExtensions;
        const DeviceFeatures                            m_deviceFeatures;
 
+       const deUint32                                          m_universalQueueFamilyIndex;
+       const deUint32                                          m_sparseQueueFamilyIndex;
+       const VkPhysicalDeviceProperties        m_deviceProperties;
+
        const Unique<VkDevice>                          m_device;
        const DeviceDriver                                      m_deviceInterface;
 
@@ -388,12 +427,13 @@ DefaultDevice::DefaultDevice (const PlatformInterface& vkPlatform, const tcu::Co
        , m_physicalDevice                              (chooseDevice(m_instanceInterface, *m_instance, cmdLine))
        , m_deviceVersion                               (getPhysicalDeviceProperties(m_instanceInterface, m_physicalDevice).apiVersion)
 
-       , m_universalQueueFamilyIndex   (findQueueFamilyIndexWithCaps(m_instanceInterface, m_physicalDevice, VK_QUEUE_GRAPHICS_BIT|VK_QUEUE_COMPUTE_BIT))
-       , m_deviceProperties                    (getPhysicalDeviceProperties(m_instanceInterface, m_physicalDevice))
        , m_deviceExtensions                    (addCoreDeviceExtensions(filterExtensions(enumerateDeviceExtensionProperties(m_instanceInterface, m_physicalDevice, DE_NULL)), m_usedApiVersion))
        , m_deviceFeatures                              (m_instanceInterface, m_usedApiVersion, m_physicalDevice, m_instanceExtensions, m_deviceExtensions)
-       , m_device                                              (createDefaultDevice(m_instanceInterface, m_physicalDevice, m_usedApiVersion, m_universalQueueFamilyIndex, m_deviceFeatures.coreFeatures, m_deviceExtensions, cmdLine))
-       , m_deviceInterface                             (m_instanceInterface, *m_device)
+       , m_universalQueueFamilyIndex   (findQueueFamilyIndexWithCaps(m_instanceInterface, m_physicalDevice, VK_QUEUE_GRAPHICS_BIT|VK_QUEUE_COMPUTE_BIT))
+       , m_sparseQueueFamilyIndex              (m_deviceFeatures.coreFeatures.features.sparseBinding ? findQueueFamilyIndexWithCaps(m_instanceInterface, m_physicalDevice, VK_QUEUE_SPARSE_BINDING_BIT) : 0)
+       , m_deviceProperties                    (getPhysicalDeviceProperties(m_instanceInterface, m_physicalDevice))
+       , m_device                                              (createDefaultDevice(vkPlatform, *m_instance, m_instanceInterface, m_physicalDevice, m_usedApiVersion, m_universalQueueFamilyIndex, m_sparseQueueFamilyIndex, m_deviceFeatures.coreFeatures, m_deviceExtensions, cmdLine))
+       , m_deviceInterface                             (vkPlatform, *m_instance, *m_device)
 {
        DE_ASSERT(m_deviceVersions.first == m_deviceVersion);
 }
@@ -407,6 +447,16 @@ VkQueue DefaultDevice::getUniversalQueue (void) const
        return getDeviceQueue(m_deviceInterface, *m_device, m_universalQueueFamilyIndex, 0);
 }
 
+VkQueue DefaultDevice::getSparseQueue (void) const
+{
+       if (!m_deviceFeatures.coreFeatures.features.sparseBinding)
+               TCU_THROW(NotSupportedError, "Sparse binding not supported.");
+
+       return getDeviceQueue(m_deviceInterface, *m_device, m_sparseQueueFamilyIndex, 0);
+}
+
+namespace
+{
 // Allocator utilities
 
 vk::Allocator* createAllocator (DefaultDevice* device)
@@ -417,6 +467,8 @@ vk::Allocator* createAllocator (DefaultDevice* device)
        return new SimpleAllocator(device->getDeviceInterface(), device->getDevice(), memoryProperties);
 }
 
+} // anonymous
+
 // Context
 
 Context::Context (tcu::TestContext&                            testCtx,
@@ -445,12 +497,18 @@ const vk::VkPhysicalDeviceFeatures2&      Context::getDeviceFeatures2                             (void) const
 const vk::VkPhysicalDeviceSamplerYcbcrConversionFeatures&
                                                                                Context::getSamplerYCbCrConversionFeatures
                                                                                                                                                                (void) const { return m_device->getSamplerYCbCrConversionFeatures();    }
+const vk::VkPhysicalDevice16BitStorageFeatures&
+                                                                               Context::get16BitStorageFeatures                (void) const { return m_device->get16BitStorageFeatures();              }
+const vk::VkPhysicalDeviceVariablePointerFeatures&
+                                                                               Context::getVariablePointerFeatures             (void) const { return m_device->getVariablePointerFeatures();   }
 const vk::VkPhysicalDeviceProperties&  Context::getDeviceProperties                    (void) const { return m_device->getDeviceProperties();                  }
 const vector<string>&                                  Context::getDeviceExtensions                    (void) const { return m_device->getDeviceExtensions();                  }
 vk::VkDevice                                                   Context::getDevice                                              (void) const { return m_device->getDevice();                                    }
 const vk::DeviceInterface&                             Context::getDeviceInterface                             (void) const { return m_device->getDeviceInterface();                   }
 deUint32                                                               Context::getUniversalQueueFamilyIndex   (void) const { return m_device->getUniversalQueueFamilyIndex(); }
 vk::VkQueue                                                            Context::getUniversalQueue                              (void) const { return m_device->getUniversalQueue();                    }
+deUint32                                                               Context::getSparseQueueFamilyIndex              (void) const { return m_device->getSparseQueueFamilyIndex();    }
+vk::VkQueue                                                            Context::getSparseQueue                                 (void) const { return m_device->getSparseQueue();                               }
 vk::Allocator&                                                 Context::getDefaultAllocator                    (void) const { return *m_allocator;                                                             }
 deUint32                                                               Context::getUsedApiVersion                              (void) const { return m_device->getUsedApiVersion();                    }
 bool                                                                   Context::contextSupports                                (const deUint32 majorNum, const deUint32 minorNum, const deUint32 patchNum) const
@@ -466,4 +524,8 @@ void TestCase::initPrograms (SourceCollections&) const
 {
 }
 
+void TestCase::checkSupport (Context&) const
+{
+}
+
 } // vkt