diff options
author | Jesse Hall <jessehall@google.com> | 2016-06-11 23:09:56 -0700 |
---|---|---|
committer | Jesse Hall <jessehall@google.com> | 2016-06-13 21:44:04 -0700 |
commit | 6f328aec9b6c8667e12fee73847d9954814991dd (patch) | |
tree | b5e7f81f7ceba328613d9cbc759a042a7014c1f1 | |
parent | 92e5460b8791123cc3329e74d47c2ac03729a9d4 (diff) | |
download | vulkan-validation-layers-6f328aec9b6c8667e12fee73847d9954814991dd.tar.gz |
vkjson: Add ability to dump an entire instance
-rw-r--r-- | libs/vkjson/vkjson.cc | 14 | ||||
-rw-r--r-- | libs/vkjson/vkjson.h | 4 | ||||
-rw-r--r-- | libs/vkjson/vkjson_info.cc | 37 | ||||
-rw-r--r-- | 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 26b8a09ab..293198660 100644 --- a/libs/vkjson/vkjson.cc +++ b/libs/vkjson/vkjson.cc @@ -344,6 +344,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 = @@ -669,6 +673,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); } diff --git a/libs/vkjson/vkjson.h b/libs/vkjson/vkjson.h index 7dfdfca9b..79f6feaf6 100644 --- a/libs/vkjson/vkjson.h +++ b/libs/vkjson/vkjson.h @@ -60,6 +60,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 4471fc5a4..38a0655c2 100644 --- a/libs/vkjson/vkjson_info.cc +++ b/libs/vkjson/vkjson_info.cc @@ -38,6 +38,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; @@ -46,7 +47,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; @@ -72,18 +75,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; } @@ -130,13 +144,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; } @@ -147,7 +165,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 30ac423a9..20419592c 100644 --- a/libs/vkjson/vkjson_unittest.cc +++ b/libs/vkjson/vkjson_unittest.cc @@ -52,8 +52,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; @@ -66,14 +69,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))); |