vkjson: Include instance layers and extensions
authorJesse Hall <jessehall@google.com>
Sun, 12 Jun 2016 06:40:43 +0000 (23:40 -0700)
committerJon Ashburn <jon@lunarg.com>
Tue, 14 Jun 2016 14:45:38 +0000 (08:45 -0600)
libs/vkjson/vkjson.cc
libs/vkjson/vkjson.h
libs/vkjson/vkjson_instance.cc

index 361b487..aa3719d 100644 (file)
@@ -327,6 +327,12 @@ inline bool Iterate(Visitor* visitor, VkFormatProperties* properties) {
 }
 
 template <typename Visitor>
+inline bool Iterate(Visitor* visitor, VkJsonLayer* layer) {
+  return visitor->Visit("properties", &layer->properties) &&
+         visitor->Visit("extensions", &layer->extensions);
+}
+
+template <typename Visitor>
 inline bool Iterate(Visitor* visitor, VkJsonDevice* device) {
   return visitor->Visit("properties", &device->properties) &&
          visitor->Visit("features", &device->features) &&
@@ -339,7 +345,9 @@ inline bool Iterate(Visitor* visitor, VkJsonDevice* device) {
 
 template <typename Visitor>
 inline bool Iterate(Visitor* visitor, VkJsonInstance* instance) {
-  return visitor->Visit("devices", &instance->devices);
+  return visitor->Visit("layers", &instance->layers) &&
+         visitor->Visit("extensions", &instance->extensions) &&
+         visitor->Visit("devices", &instance->devices);
 }
 
 template <typename T>
index 5b7bf5e..b703750 100644 (file)
 #undef max
 #endif
 
+struct VkJsonLayer {
+  VkLayerProperties properties;
+  std::vector<VkExtensionProperties> extensions;
+};
+
 struct VkJsonDevice {
   VkJsonDevice() {
           memset(&properties, 0, sizeof(VkPhysicalDeviceProperties));
@@ -49,6 +54,8 @@ struct VkJsonDevice {
 };
 
 struct VkJsonInstance {
+  std::vector<VkJsonLayer> layers;
+  std::vector<VkExtensionProperties> extensions;
   std::vector<VkJsonDevice> devices;
 };
 
index a023db4..eea945a 100644 (file)
 
 #include <utility>
 
+namespace {
+bool EnumerateExtensions(const char* layer_name,
+                         std::vector<VkExtensionProperties>* extensions) {
+  VkResult result;
+  uint32_t count = 0;
+  result = vkEnumerateInstanceExtensionProperties(layer_name, &count, nullptr);
+  if (result != VK_SUCCESS)
+    return false;
+  extensions->resize(count);
+  result = vkEnumerateInstanceExtensionProperties(layer_name, &count,
+                                                  extensions->data());
+  if (result != VK_SUCCESS)
+    return false;
+  return true;
+}
+
+}  // anonymous namespace
+
 VkJsonDevice VkJsonGetDevice(VkPhysicalDevice physical_device) {
   VkJsonDevice device;
   vkGetPhysicalDeviceProperties(physical_device, &device.properties);
@@ -74,8 +92,35 @@ VkJsonDevice VkJsonGetDevice(VkPhysicalDevice physical_device) {
 
 VkJsonInstance VkJsonGetInstance() {
   VkJsonInstance instance;
+  VkResult result;
   uint32_t count;
 
+  count = 0;
+  result = vkEnumerateInstanceLayerProperties(&count, nullptr);
+  if (result != VK_SUCCESS)
+    return VkJsonInstance();
+  if (count > 0) {
+    std::vector<VkLayerProperties> layers(count);
+    result = vkEnumerateInstanceLayerProperties(&count, layers.data());
+    if (result != VK_SUCCESS)
+      return VkJsonInstance();
+    instance.layers.reserve(count);
+    for (auto& layer : layers) {
+      instance.layers.push_back(VkJsonLayer{layer, std::vector<VkExtensionProperties>()});
+      if (!EnumerateExtensions(layer.layerName,
+                               &instance.layers.back().extensions))
+        return VkJsonInstance();
+    }
+  }
+
+  if (!EnumerateExtensions(nullptr, &instance.extensions))
+    return VkJsonInstance();
+
+  std::vector<const char*> layer_names;
+  layer_names.reserve(instance.layers.size());
+  for (auto& layer : instance.layers)
+    layer_names.push_back(layer.properties.layerName);
+
   const VkApplicationInfo app_info = {VK_STRUCTURE_TYPE_APPLICATION_INFO,
                                       nullptr,
                                       "vkjson_info",
@@ -83,16 +128,17 @@ VkJsonInstance VkJsonGetInstance() {
                                       "",
                                       0,
                                       VK_API_VERSION_1_0};
-  VkInstanceCreateInfo instance_info = {VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,
-                                        nullptr,
-                                        0,
-                                        &app_info,
-                                        0,
-                                        nullptr,
-                                        0,
-                                        nullptr};
+  VkInstanceCreateInfo instance_info = {
+      VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,
+      nullptr,
+      0,
+      &app_info,
+      static_cast<uint32_t>(layer_names.size()),
+      layer_names.data(),
+      0,
+      nullptr};
   VkInstance vkinstance;
-  VkResult result = vkCreateInstance(&instance_info, nullptr, &vkinstance);
+  result = vkCreateInstance(&instance_info, nullptr, &vkinstance);
   if (result != VK_SUCCESS)
     return VkJsonInstance();