Vulkan: Add physical device extension listing
This commit is contained in:
parent
07fa581525
commit
42d58bd77c
|
|
@ -34,6 +34,7 @@ namespace Nz
|
|||
|
||||
inline PFN_vkVoidFunction GetDeviceProcAddr(VkDevice device, const char* name);
|
||||
|
||||
bool GetPhysicalDeviceExtensions(VkPhysicalDevice device, std::vector<VkExtensionProperties>* extensionProperties);
|
||||
inline VkPhysicalDeviceFeatures GetPhysicalDeviceFeatures(VkPhysicalDevice device);
|
||||
inline VkFormatProperties GetPhysicalDeviceFormatProperties(VkPhysicalDevice device, VkFormat format);
|
||||
inline bool GetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags, VkImageFormatProperties* imageFormatProperties);
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@
|
|||
// Vulkan core
|
||||
NAZARA_VULKANRENDERER_INSTANCE_FUNCTION(vkCreateDevice)
|
||||
NAZARA_VULKANRENDERER_INSTANCE_FUNCTION(vkDestroyInstance)
|
||||
NAZARA_VULKANRENDERER_INSTANCE_FUNCTION(vkEnumerateDeviceExtensionProperties)
|
||||
NAZARA_VULKANRENDERER_INSTANCE_FUNCTION(vkEnumeratePhysicalDevices)
|
||||
NAZARA_VULKANRENDERER_INSTANCE_FUNCTION(vkGetDeviceProcAddr)
|
||||
NAZARA_VULKANRENDERER_INSTANCE_FUNCTION(vkGetPhysicalDeviceFeatures)
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@ namespace Nz
|
|||
VkPhysicalDeviceFeatures features;
|
||||
VkPhysicalDeviceMemoryProperties memoryProperties;
|
||||
VkPhysicalDeviceProperties properties;
|
||||
std::unordered_set<std::string> extensions;
|
||||
std::vector<VkQueueFamilyProperties> queueFamilies;
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -202,6 +202,15 @@ namespace Nz
|
|||
deviceInfo.memoryProperties = s_instance.GetPhysicalDeviceMemoryProperties(physDevice);
|
||||
deviceInfo.properties = s_instance.GetPhysicalDeviceProperties(physDevice);
|
||||
|
||||
std::vector<VkExtensionProperties> extensions;
|
||||
if (s_instance.GetPhysicalDeviceExtensions(physDevice, &extensions))
|
||||
{
|
||||
for (auto& extProperty : extensions)
|
||||
deviceInfo.extensions.emplace(extProperty.extensionName);
|
||||
}
|
||||
else
|
||||
NazaraWarning("Failed to query physical device extensions for " + String(deviceInfo.properties.deviceName) + " (0x" + String::Number(deviceInfo.properties.deviceID, 16) + ')');
|
||||
|
||||
s_physDevices.emplace_back(std::move(deviceInfo));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -83,9 +83,37 @@ namespace Nz
|
|||
return true;
|
||||
}
|
||||
|
||||
bool Instance::GetPhysicalDeviceExtensions(VkPhysicalDevice device, std::vector<VkExtensionProperties>* extensionProperties)
|
||||
{
|
||||
NazaraAssert(extensionProperties, "Invalid extension properties vector");
|
||||
|
||||
// First, query physical device count
|
||||
UInt32 extensionPropertyCount = 0; // Remember, Nz::UInt32 is a typedef on uint32_t
|
||||
m_lastErrorCode = vkEnumerateDeviceExtensionProperties(device, nullptr, &extensionPropertyCount, nullptr);
|
||||
if (m_lastErrorCode != VkResult::VK_SUCCESS)
|
||||
{
|
||||
NazaraError("Failed to query extension properties count: " + TranslateVulkanError(m_lastErrorCode));
|
||||
return false;
|
||||
}
|
||||
|
||||
if (extensionPropertyCount == 0)
|
||||
return true; //< No extension available
|
||||
|
||||
// Now we can get the list of the available physical device
|
||||
extensionProperties->resize(extensionPropertyCount);
|
||||
m_lastErrorCode = vkEnumerateDeviceExtensionProperties(device, nullptr, &extensionPropertyCount, extensionProperties->data());
|
||||
if (m_lastErrorCode != VkResult::VK_SUCCESS)
|
||||
{
|
||||
NazaraError("Failed to query extension properties count: " + TranslateVulkanError(m_lastErrorCode));
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Instance::GetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice device, std::vector<VkQueueFamilyProperties>* queueFamilyProperties)
|
||||
{
|
||||
NazaraAssert(queueFamilyProperties, "Invalid device vector");
|
||||
NazaraAssert(queueFamilyProperties, "Invalid family properties vector");
|
||||
|
||||
// First, query physical device count
|
||||
UInt32 queueFamiliesCount = 0; // Remember, Nz::UInt32 is a typedef on uint32_t
|
||||
|
|
|
|||
Loading…
Reference in New Issue