vkjson: Add ability to dump an entire instance
authorJesse Hall <jessehall@google.com>
Sun, 12 Jun 2016 06:09:56 +0000 (23:09 -0700)
committerJon Ashburn <jon@lunarg.com>
Tue, 14 Jun 2016 14:45:29 +0000 (08:45 -0600)
libs/vkjson/vkjson.cc
libs/vkjson/vkjson.h
libs/vkjson/vkjson_info.cc
libs/vkjson/vkjson_unittest.cc

index 4a49457..361b487 100644 (file)
@@ -337,6 +337,10 @@ inline bool Iterate(Visitor* visitor, VkJsonDevice* device) {
          visitor->Visit("formats", &device->formats);
 }
 
+template <typename Visitor>
+inline bool Iterate(Visitor* visitor, VkJsonInstance* instance) {
+  return visitor->Visit("devices", &instance->devices);
+}
 
 template <typename T>
 using EnableForArithmetic =
@@ -662,6 +666,16 @@ template <typename T> bool VkTypeFromJson(const std::string& json,
 
 }  // anonymous namespace
 
+std::string VkJsonInstanceToJson(const VkJsonInstance& instance) {
+  return VkTypeToJson(instance);
+}
+
+bool VkJsonInstanceFromJson(const std::string& json,
+                            VkJsonInstance* instance,
+                            std::string* errors) {
+  return VkTypeFromJson(json, instance, errors);
+}
+
 std::string VkJsonDeviceToJson(const VkJsonDevice& device) {
   return VkTypeToJson(device);
 }
index 1b6c1cf..5b7bf5e 100644 (file)
@@ -53,6 +53,10 @@ struct VkJsonInstance {
 };
 
 VkJsonInstance VkJsonGetInstance();
+std::string VkJsonInstanceToJson(const VkJsonInstance& instance);
+bool VkJsonInstanceFromJson(const std::string& json,
+                            VkJsonInstance* instance,
+                            std::string* errors);
 
 VkJsonDevice VkJsonGetDevice(VkPhysicalDevice device);
 std::string VkJsonDeviceToJson(const VkJsonDevice& device);
index e9cf649..98165de 100644 (file)
@@ -31,6 +31,7 @@
 const uint32_t unsignedNegOne = (uint32_t)(-1);
 
 struct Options {
+  bool instance = false;
   uint32_t device_index = unsignedNegOne;
   std::string device_name;
   std::string output_file;
@@ -39,7 +40,9 @@ struct Options {
 bool ParseOptions(int argc, char* argv[], Options* options) {
   for (int i = 1; i < argc; ++i) {
     std::string arg(argv[i]);
-    if (arg == "--first" || arg == "-f") {
+    if (arg == "--instance" || arg == "-i") {
+      options->instance = true;
+    } else if (arg == "--first" || arg == "-f") {
       options->device_index = 0;
     } else {
       ++i;
@@ -65,18 +68,29 @@ bool ParseOptions(int argc, char* argv[], Options* options) {
       }
     }
   }
+  if (options->instance && (options->device_index != unsignedNegOne ||
+                            !options->device_name.empty())) {
+    std::cerr << "Specifying a specific device is incompatible with dumping "
+                 "the whole instance." << std::endl;
+    return false;
+  }
   if (options->device_index != unsignedNegOne && !options->device_name.empty()) {
     std::cerr << "Must specify only one of device index and device name."
               << std::endl;
     return false;
   }
-  if (!options->output_file.empty() && options->device_index == unsignedNegOne &&
-      options->device_name.empty()) {
-    std::cerr << "Must specify device index or device name when specifying "
-                 "output file"
+  if (options->instance && options->output_file.empty()) {
+    std::cerr << "Must specify an output file when dumping the whole instance."
               << std::endl;
     return false;
   }
+  if (!options->output_file.empty() && !options->instance &&
+      options->device_index == unsignedNegOne && options->device_name.empty()) {
+    std::cerr << "Must specify instance, device index, or device name when "
+                 "specifying "
+                 "output file." << std::endl;
+    return false;
+  }
   return true;
 }
 
@@ -123,13 +137,17 @@ bool Dump(const VkJsonInstance& instance, const Options& options) {
     }
   }
 
-  std::string json = VkJsonDeviceToJson(*out_device) + '\n';
+  std::string json = out_device ? VkJsonDeviceToJson(*out_device)
+                                : VkJsonInstanceToJson(instance);
   fwrite(json.data(), 1, json.size(), file);
+  fputc('\n', file);
 
   if (output_file != "-") {
     fclose(file);
-    std::cout << "Wrote file " << output_file << " for device "
-              << out_device->properties.deviceName << "." << std::endl;
+    std::cout << "Wrote file " << output_file;
+    if (out_device)
+      std::cout << " for device " << out_device->properties.deviceName;
+    std::cout << "." << std::endl;
   }
   return true;
 }
@@ -140,7 +158,8 @@ int main(int argc, char* argv[]) {
     return 1;
 
   VkJsonInstance instance = VkJsonGetInstance();
-  if (options.device_index != unsignedNegOne || !options.device_name.empty()) {
+  if (options.instance || options.device_index != unsignedNegOne ||
+      !options.device_name.empty()) {
     Dump(instance, options);
   } else {
     for (uint32_t i = 0, n = instance.devices.size(); i < n; i++) {
index cdd677b..5c6839a 100644 (file)
@@ -45,8 +45,11 @@ int main(int argc, char* argv[]) {
   std::string errors;
   bool result = false;
 
+  VkJsonInstance instance;
+  instance.devices.resize(1);
+  VkJsonDevice& device = instance.devices[0];
+
   const char name[] = "Test device";
-  VkJsonDevice device;
   memcpy(device.properties.deviceName, name, sizeof(name));
   device.properties.limits.maxImageDimension1D = 3;
   device.properties.limits.maxSamplerLodBias = 3.5f;
@@ -59,14 +62,16 @@ int main(int argc, char* argv[]) {
       VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT};
   device.formats.insert(std::make_pair(VK_FORMAT_R8_UNORM, format_props));
   device.formats.insert(std::make_pair(VK_FORMAT_R8G8_UNORM, format_props));
-  std::string json = VkJsonDeviceToJson(device);
+
+  std::string json = VkJsonInstanceToJson(instance);
   std::cout << json << std::endl;
 
-  VkJsonDevice device2;
-  result = VkJsonDeviceFromJson(json, &device2, &errors);
+  VkJsonInstance instance2;
+  result = VkJsonInstanceFromJson(json, &instance2, &errors);
   EXPECT(result);
   if (!result)
     std::cout << "Error: " << errors << std::endl;
+  const VkJsonDevice& device2 = instance2.devices.at(0);
 
   EXPECT(!memcmp(&device.properties, &device2.properties,
                  sizeof(device.properties)));