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));
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)
public:
VkPhysicalDeviceFeatures2 coreFeatures;
VkPhysicalDeviceSamplerYcbcrConversionFeatures samplerYCbCrConversionFeatures;
+ VkPhysicalDevice16BitStorageFeatures sixteenBitStorageFeatures;
+ VkPhysicalDeviceVariablePointerFeatures variablePointerFeatures;
DeviceFeatures (const InstanceInterface& vki,
const deUint32 apiVersion,
{
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);
}
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; }
deUint32 getUniversalQueueFamilyIndex (void) const { return m_universalQueueFamilyIndex; }
VkQueue getUniversalQueue (void) const;
+ deUint32 getSparseQueueFamilyIndex (void) const { return m_sparseQueueFamilyIndex; }
+ VkQueue getSparseQueue (void) const;
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;
, 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);
}
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)
return new SimpleAllocator(device->getDeviceInterface(), device->getDevice(), memoryProperties);
}
+} // anonymous
+
// Context
Context::Context (tcu::TestContext& testCtx,
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
{
}
+void TestCase::checkSupport (Context&) const
+{
+}
+
} // vkt