From 8ff0741515f91aad937a473900e880740f823f02 Mon Sep 17 00:00:00 2001 From: Jesse Hall Date: Sat, 11 Jun 2016 23:09:56 -0700 Subject: [PATCH] vkjson: Add ability to dump an entire instance --- libs/vkjson/vkjson.cc | 14 ++++++++++++++ libs/vkjson/vkjson.h | 4 ++++ libs/vkjson/vkjson_info.cc | 37 ++++++++++++++++++++++++++++--------- libs/vkjson/vkjson_unittest.cc | 13 +++++++++---- 4 files changed, 55 insertions(+), 13 deletions(-) diff --git a/libs/vkjson/vkjson.cc b/libs/vkjson/vkjson.cc index 4a49457..361b487 100644 --- a/libs/vkjson/vkjson.cc +++ b/libs/vkjson/vkjson.cc @@ -337,6 +337,10 @@ inline bool Iterate(Visitor* visitor, VkJsonDevice* device) { visitor->Visit("formats", &device->formats); } +template +inline bool Iterate(Visitor* visitor, VkJsonInstance* instance) { + return visitor->Visit("devices", &instance->devices); +} template using EnableForArithmetic = @@ -662,6 +666,16 @@ template 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); } diff --git a/libs/vkjson/vkjson.h b/libs/vkjson/vkjson.h index 1b6c1cf..5b7bf5e 100644 --- a/libs/vkjson/vkjson.h +++ b/libs/vkjson/vkjson.h @@ -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); diff --git a/libs/vkjson/vkjson_info.cc b/libs/vkjson/vkjson_info.cc index e9cf649..98165de 100644 --- a/libs/vkjson/vkjson_info.cc +++ b/libs/vkjson/vkjson_info.cc @@ -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++) { diff --git a/libs/vkjson/vkjson_unittest.cc b/libs/vkjson/vkjson_unittest.cc index cdd677b..5c6839a 100644 --- a/libs/vkjson/vkjson_unittest.cc +++ b/libs/vkjson/vkjson_unittest.cc @@ -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))); -- 2.7.4