aboutsummaryrefslogtreecommitdiff
path: root/libs/vkjson/vkjson_instance.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libs/vkjson/vkjson_instance.cc')
-rw-r--r--libs/vkjson/vkjson_instance.cc87
1 files changed, 73 insertions, 14 deletions
diff --git a/libs/vkjson/vkjson_instance.cc b/libs/vkjson/vkjson_instance.cc
index 7784d5392..c3b9e47d4 100644
--- a/libs/vkjson/vkjson_instance.cc
+++ b/libs/vkjson/vkjson_instance.cc
@@ -24,6 +24,9 @@
#include <utility>
namespace {
+const char* kSupportedInstanceExtensions[] = {
+ "VK_KHR_get_physical_device_properties2"};
+
bool EnumerateExtensions(const char* layer_name,
std::vector<VkExtensionProperties>* extensions) {
VkResult result;
@@ -39,21 +42,39 @@ bool EnumerateExtensions(const char* layer_name,
return true;
}
+bool HasExtension(const char* extension_name,
+ uint32_t count,
+ const char* const* extensions) {
+ return std::find_if(extensions, extensions + count,
+ [extension_name](const char* extension) {
+ return strcmp(extension, extension_name) == 0;
+ }) != extensions + count;
+}
+
+bool HasExtension(const char* extension_name,
+ const std::vector<VkExtensionProperties>& extensions) {
+ return std::find_if(extensions.cbegin(), extensions.cend(),
+ [extension_name](const VkExtensionProperties& extension) {
+ return strcmp(extension.extensionName,
+ extension_name) == 0;
+ }) != extensions.cend();
+}
} // anonymous namespace
-VkJsonDevice VkJsonGetDevice(VkPhysicalDevice physical_device) {
+VkJsonDevice VkJsonGetDevice(VkInstance instance,
+ VkPhysicalDevice physical_device,
+ uint32_t instance_extension_count,
+ const char* const* instance_extensions) {
VkJsonDevice device;
- vkGetPhysicalDeviceProperties(physical_device, &device.properties);
- vkGetPhysicalDeviceFeatures(physical_device, &device.features);
- vkGetPhysicalDeviceMemoryProperties(physical_device, &device.memory);
- uint32_t queue_family_count = 0;
- vkGetPhysicalDeviceQueueFamilyProperties(physical_device, &queue_family_count,
- nullptr);
- if (queue_family_count > 0) {
- device.queues.resize(queue_family_count);
- vkGetPhysicalDeviceQueueFamilyProperties(
- physical_device, &queue_family_count, device.queues.data());
+ PFN_vkGetPhysicalDeviceFeatures2KHR vkpGetPhysicalDeviceFeatures2KHR =
+ nullptr;
+ if (instance != VK_NULL_HANDLE &&
+ HasExtension("VK_KHR_get_physical_device_properties2",
+ instance_extension_count, instance_extensions)) {
+ vkpGetPhysicalDeviceFeatures2KHR =
+ reinterpret_cast<PFN_vkGetPhysicalDeviceFeatures2KHR>(
+ vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceFeatures2KHR"));
}
// Only device extensions.
@@ -75,6 +96,36 @@ VkJsonDevice VkJsonGetDevice(VkPhysicalDevice physical_device) {
device.layers.data());
}
+ vkGetPhysicalDeviceProperties(physical_device, &device.properties);
+ if (HasExtension("VK_KHR_get_physical_device_properties2",
+ instance_extension_count, instance_extensions)) {
+ VkPhysicalDeviceFeatures2KHR features = {
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR,
+ nullptr,
+ {} // features
+ };
+ if (HasExtension("VK_KHR_variable_pointers", device.extensions)) {
+ device.variable_pointer_features.sType =
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES_KHR;
+ device.variable_pointer_features.pNext = features.pNext;
+ features.pNext = &device.variable_pointer_features;
+ }
+ vkpGetPhysicalDeviceFeatures2KHR(physical_device, &features);
+ device.features = features.features;
+ } else {
+ vkGetPhysicalDeviceFeatures(physical_device, &device.features);
+ }
+ vkGetPhysicalDeviceMemoryProperties(physical_device, &device.memory);
+
+ uint32_t queue_family_count = 0;
+ vkGetPhysicalDeviceQueueFamilyProperties(physical_device, &queue_family_count,
+ nullptr);
+ if (queue_family_count > 0) {
+ device.queues.resize(queue_family_count);
+ vkGetPhysicalDeviceQueueFamilyProperties(
+ physical_device, &queue_family_count, device.queues.data());
+ }
+
VkFormatProperties format_properties = {};
for (VkFormat format = VK_FORMAT_R4G4_UNORM_PACK8;
format <= VK_FORMAT_END_RANGE;
@@ -116,6 +167,12 @@ VkJsonInstance VkJsonGetInstance() {
if (!EnumerateExtensions(nullptr, &instance.extensions))
return VkJsonInstance();
+ std::vector<const char*> instance_extensions;
+ for (const auto extension : kSupportedInstanceExtensions) {
+ if (HasExtension(extension, instance.extensions))
+ instance_extensions.push_back(extension);
+ }
+
const VkApplicationInfo app_info = {VK_STRUCTURE_TYPE_APPLICATION_INFO,
nullptr,
"vkjson_info",
@@ -130,8 +187,8 @@ VkJsonInstance VkJsonGetInstance() {
&app_info,
0,
nullptr,
- 0,
- nullptr};
+ static_cast<uint32_t>(instance_extensions.size()),
+ instance_extensions.data()};
VkInstance vkinstance;
result = vkCreateInstance(&instance_info, nullptr, &vkinstance);
if (result != VK_SUCCESS)
@@ -152,7 +209,9 @@ VkJsonInstance VkJsonGetInstance() {
instance.devices.reserve(devices.size());
for (auto device : devices)
- instance.devices.emplace_back(VkJsonGetDevice(device));
+ instance.devices.emplace_back(VkJsonGetDevice(vkinstance, device,
+ instance_extensions.size(),
+ instance_extensions.data()));
vkDestroyInstance(vkinstance, nullptr);
return instance;