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);
|
inline PFN_vkVoidFunction GetDeviceProcAddr(VkDevice device, const char* name);
|
||||||
|
|
||||||
|
bool GetPhysicalDeviceExtensions(VkPhysicalDevice device, std::vector<VkExtensionProperties>* extensionProperties);
|
||||||
inline VkPhysicalDeviceFeatures GetPhysicalDeviceFeatures(VkPhysicalDevice device);
|
inline VkPhysicalDeviceFeatures GetPhysicalDeviceFeatures(VkPhysicalDevice device);
|
||||||
inline VkFormatProperties GetPhysicalDeviceFormatProperties(VkPhysicalDevice device, VkFormat format);
|
inline VkFormatProperties GetPhysicalDeviceFormatProperties(VkPhysicalDevice device, VkFormat format);
|
||||||
inline bool GetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags, VkImageFormatProperties* imageFormatProperties);
|
inline bool GetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags, VkImageFormatProperties* imageFormatProperties);
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@
|
||||||
// Vulkan core
|
// Vulkan core
|
||||||
NAZARA_VULKANRENDERER_INSTANCE_FUNCTION(vkCreateDevice)
|
NAZARA_VULKANRENDERER_INSTANCE_FUNCTION(vkCreateDevice)
|
||||||
NAZARA_VULKANRENDERER_INSTANCE_FUNCTION(vkDestroyInstance)
|
NAZARA_VULKANRENDERER_INSTANCE_FUNCTION(vkDestroyInstance)
|
||||||
|
NAZARA_VULKANRENDERER_INSTANCE_FUNCTION(vkEnumerateDeviceExtensionProperties)
|
||||||
NAZARA_VULKANRENDERER_INSTANCE_FUNCTION(vkEnumeratePhysicalDevices)
|
NAZARA_VULKANRENDERER_INSTANCE_FUNCTION(vkEnumeratePhysicalDevices)
|
||||||
NAZARA_VULKANRENDERER_INSTANCE_FUNCTION(vkGetDeviceProcAddr)
|
NAZARA_VULKANRENDERER_INSTANCE_FUNCTION(vkGetDeviceProcAddr)
|
||||||
NAZARA_VULKANRENDERER_INSTANCE_FUNCTION(vkGetPhysicalDeviceFeatures)
|
NAZARA_VULKANRENDERER_INSTANCE_FUNCTION(vkGetPhysicalDeviceFeatures)
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,7 @@ namespace Nz
|
||||||
VkPhysicalDeviceFeatures features;
|
VkPhysicalDeviceFeatures features;
|
||||||
VkPhysicalDeviceMemoryProperties memoryProperties;
|
VkPhysicalDeviceMemoryProperties memoryProperties;
|
||||||
VkPhysicalDeviceProperties properties;
|
VkPhysicalDeviceProperties properties;
|
||||||
|
std::unordered_set<std::string> extensions;
|
||||||
std::vector<VkQueueFamilyProperties> queueFamilies;
|
std::vector<VkQueueFamilyProperties> queueFamilies;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -202,6 +202,15 @@ namespace Nz
|
||||||
deviceInfo.memoryProperties = s_instance.GetPhysicalDeviceMemoryProperties(physDevice);
|
deviceInfo.memoryProperties = s_instance.GetPhysicalDeviceMemoryProperties(physDevice);
|
||||||
deviceInfo.properties = s_instance.GetPhysicalDeviceProperties(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));
|
s_physDevices.emplace_back(std::move(deviceInfo));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -83,9 +83,37 @@ namespace Nz
|
||||||
return true;
|
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)
|
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
|
// First, query physical device count
|
||||||
UInt32 queueFamiliesCount = 0; // Remember, Nz::UInt32 is a typedef on uint32_t
|
UInt32 queueFamiliesCount = 0; // Remember, Nz::UInt32 is a typedef on uint32_t
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue