diff options
| author | Charles Giessen <charles@lunarg.com> | 2022-10-27 14:11:10 -0600 |
|---|---|---|
| committer | Charles Giessen <46324611+charles-lunarg@users.noreply.github.com> | 2022-10-28 17:43:29 -0600 |
| commit | c09f4a4ee47174117e4cad075ae59ce25612fe45 (patch) | |
| tree | 9b0ee83139b048a41ce004889006dea29d20c9a6 | |
| parent | 25fc297edb10221e321f51addc5fff40023b0dcc (diff) | |
| download | usermoji-c09f4a4ee47174117e4cad075ae59ce25612fe45.tar.xz | |
vulkaninfo: Improve array printing
Make the autogen use for loops instead of outputing printers for each
array element, since its needlessly verbose.
Make UUID and LUID printers use operator<< instead of to_string. This
simplifies the logic and makes sure that the array is printed correctly
everywhere, rather than requiring calling code to use to_string_XX()
where needed.
| -rw-r--r-- | scripts/vulkaninfo_generator.py | 11 | ||||
| -rw-r--r-- | vulkaninfo/generated/vulkaninfo.hpp | 154 | ||||
| -rw-r--r-- | vulkaninfo/outputprinter.h | 26 | ||||
| -rw-r--r-- | vulkaninfo/vulkaninfo.cpp | 6 |
4 files changed, 75 insertions, 122 deletions
diff --git a/scripts/vulkaninfo_generator.py b/scripts/vulkaninfo_generator.py index 1eba3e11..4fac2cfa 100644 --- a/scripts/vulkaninfo_generator.py +++ b/scripts/vulkaninfo_generator.py @@ -545,11 +545,7 @@ def PrintStructure(struct, types_to_gen, structure_names, aliases): elif v.typeID == "uint8_t" and (v.arrayLength == '8' or v.arrayLength == '16'): # VK_UUID_SIZE if v.arrayLength == '8': out += ' if (obj.deviceLUIDValid) { // special case\n' - out += f''' if (p.Type() == OutputType::json) {{ - ArrayWrapper arr(p, "{v.name}"); - for (uint32_t i = 0; i < {v.arrayLength}; i++) p.PrintElement(static_cast<uint32_t>(obj.{v.name}[i])); - }} else - p.PrintKeyString("{v.name}", to_string_{v.arrayLength}(obj.{v.name}));\n''' + out += f' p.PrintKeyValue("{v.name}", obj.{v.name});\n' if v.arrayLength == '8': out += ' }\n' elif struct.name == "VkQueueFamilyGlobalPriorityPropertiesKHR" and v.name == "priorities": @@ -561,9 +557,8 @@ def PrintStructure(struct, types_to_gen, structure_names, aliases): out += f' p.PrintString(VkQueueGlobalPriorityKHRString(obj.priorities[i]));\n' out += f" }}\n" elif v.arrayLength.isdigit(): - out += f' {{ ArrayWrapper arr(p,"{v.name}", ' + v.arrayLength + ');\n' - for i in range(0, int(v.arrayLength)): - out += f" p.PrintElement(obj.{v.name}[{str(i)}]);\n" + out += f' {{\n ArrayWrapper arr(p,"{v.name}", ' + v.arrayLength + ');\n' + out += f' for (uint32_t i = 0; i < {v.arrayLength}; i++) {{ p.PrintElement(obj.{v.name}[i]); }}\n' out += f" }}\n" else: # dynamic array length based on other member out += f' ArrayWrapper arr(p,"{v.name}", obj.' + v.arrayLength + ');\n' diff --git a/vulkaninfo/generated/vulkaninfo.hpp b/vulkaninfo/generated/vulkaninfo.hpp index 475f7626..13bab86c 100644 --- a/vulkaninfo/generated/vulkaninfo.hpp +++ b/vulkaninfo/generated/vulkaninfo.hpp @@ -1703,22 +1703,10 @@ void DumpVkPhysicalDeviceHostQueryResetFeatures(Printer &p, std::string name, co void DumpVkPhysicalDeviceIDProperties(Printer &p, std::string name, const VkPhysicalDeviceIDProperties &obj) { ObjectWrapper object{p, name}; p.SetMinKeyWidth(15); - if (p.Type() == OutputType::json) { - ArrayWrapper arr(p, "deviceUUID"); - for (uint32_t i = 0; i < 16; i++) p.PrintElement(static_cast<uint32_t>(obj.deviceUUID[i])); - } else - p.PrintKeyString("deviceUUID", to_string_16(obj.deviceUUID)); - if (p.Type() == OutputType::json) { - ArrayWrapper arr(p, "driverUUID"); - for (uint32_t i = 0; i < 16; i++) p.PrintElement(static_cast<uint32_t>(obj.driverUUID[i])); - } else - p.PrintKeyString("driverUUID", to_string_16(obj.driverUUID)); + p.PrintKeyValue("deviceUUID", obj.deviceUUID); + p.PrintKeyValue("driverUUID", obj.driverUUID); if (obj.deviceLUIDValid) { // special case - if (p.Type() == OutputType::json) { - ArrayWrapper arr(p, "deviceLUID"); - for (uint32_t i = 0; i < 8; i++) p.PrintElement(static_cast<uint32_t>(obj.deviceLUID[i])); - } else - p.PrintKeyString("deviceLUID", to_string_8(obj.deviceLUID)); + p.PrintKeyValue("deviceLUID", obj.deviceLUID); } p.PrintKeyValue("deviceNodeMask", obj.deviceNodeMask); p.PrintKeyBool("deviceLUIDValid", static_cast<bool>(obj.deviceLUIDValid)); @@ -1837,16 +1825,14 @@ void DumpVkPhysicalDeviceLimits(Printer &p, std::string name, const VkPhysicalDe p.PrintKeyValue("maxFragmentDualSrcAttachments", obj.maxFragmentDualSrcAttachments); p.PrintKeyValue("maxFragmentCombinedOutputResources", obj.maxFragmentCombinedOutputResources); p.PrintKeyValue("maxComputeSharedMemorySize", obj.maxComputeSharedMemorySize); - { ArrayWrapper arr(p,"maxComputeWorkGroupCount", 3); - p.PrintElement(obj.maxComputeWorkGroupCount[0]); - p.PrintElement(obj.maxComputeWorkGroupCount[1]); - p.PrintElement(obj.maxComputeWorkGroupCount[2]); + { + ArrayWrapper arr(p,"maxComputeWorkGroupCount", 3); + for (uint32_t i = 0; i < 3; i++) { p.PrintElement(obj.maxComputeWorkGroupCount[i]); } } p.PrintKeyValue("maxComputeWorkGroupInvocations", obj.maxComputeWorkGroupInvocations); - { ArrayWrapper arr(p,"maxComputeWorkGroupSize", 3); - p.PrintElement(obj.maxComputeWorkGroupSize[0]); - p.PrintElement(obj.maxComputeWorkGroupSize[1]); - p.PrintElement(obj.maxComputeWorkGroupSize[2]); + { + ArrayWrapper arr(p,"maxComputeWorkGroupSize", 3); + for (uint32_t i = 0; i < 3; i++) { p.PrintElement(obj.maxComputeWorkGroupSize[i]); } } p.PrintKeyValue("subPixelPrecisionBits", obj.subPixelPrecisionBits); p.PrintKeyValue("subTexelPrecisionBits", obj.subTexelPrecisionBits); @@ -1856,13 +1842,13 @@ void DumpVkPhysicalDeviceLimits(Printer &p, std::string name, const VkPhysicalDe p.PrintKeyValue("maxSamplerLodBias", obj.maxSamplerLodBias); p.PrintKeyValue("maxSamplerAnisotropy", obj.maxSamplerAnisotropy); p.PrintKeyValue("maxViewports", obj.maxViewports); - { ArrayWrapper arr(p,"maxViewportDimensions", 2); - p.PrintElement(obj.maxViewportDimensions[0]); - p.PrintElement(obj.maxViewportDimensions[1]); + { + ArrayWrapper arr(p,"maxViewportDimensions", 2); + for (uint32_t i = 0; i < 2; i++) { p.PrintElement(obj.maxViewportDimensions[i]); } } - { ArrayWrapper arr(p,"viewportBoundsRange", 2); - p.PrintElement(obj.viewportBoundsRange[0]); - p.PrintElement(obj.viewportBoundsRange[1]); + { + ArrayWrapper arr(p,"viewportBoundsRange", 2); + for (uint32_t i = 0; i < 2; i++) { p.PrintElement(obj.viewportBoundsRange[i]); } } p.PrintKeyValue("viewportSubPixelBits", obj.viewportSubPixelBits); p.PrintKeyValue("minMemoryMapAlignment", obj.minMemoryMapAlignment); @@ -1896,13 +1882,13 @@ void DumpVkPhysicalDeviceLimits(Printer &p, std::string name, const VkPhysicalDe p.PrintKeyValue("maxCullDistances", obj.maxCullDistances); p.PrintKeyValue("maxCombinedClipAndCullDistances", obj.maxCombinedClipAndCullDistances); p.PrintKeyValue("discreteQueuePriorities", obj.discreteQueuePriorities); - { ArrayWrapper arr(p,"pointSizeRange", 2); - p.PrintElement(obj.pointSizeRange[0]); - p.PrintElement(obj.pointSizeRange[1]); + { + ArrayWrapper arr(p,"pointSizeRange", 2); + for (uint32_t i = 0; i < 2; i++) { p.PrintElement(obj.pointSizeRange[i]); } } - { ArrayWrapper arr(p,"lineWidthRange", 2); - p.PrintElement(obj.lineWidthRange[0]); - p.PrintElement(obj.lineWidthRange[1]); + { + ArrayWrapper arr(p,"lineWidthRange", 2); + for (uint32_t i = 0; i < 2; i++) { p.PrintElement(obj.lineWidthRange[i]); } } p.PrintKeyValue("pointSizeGranularity", obj.pointSizeGranularity); p.PrintKeyValue("lineWidthGranularity", obj.lineWidthGranularity); @@ -1947,41 +1933,13 @@ void DumpVkPhysicalDeviceMaintenance4Properties(Printer &p, std::string name, co void DumpVkPhysicalDeviceMemoryBudgetPropertiesEXT(Printer &p, std::string name, const VkPhysicalDeviceMemoryBudgetPropertiesEXT &obj) { ObjectWrapper object{p, name}; p.SetMinKeyWidth(14); - { ArrayWrapper arr(p,"heapBudget", 16); - p.PrintElement(obj.heapBudget[0]); - p.PrintElement(obj.heapBudget[1]); - p.PrintElement(obj.heapBudget[2]); - p.PrintElement(obj.heapBudget[3]); - p.PrintElement(obj.heapBudget[4]); - p.PrintElement(obj.heapBudget[5]); - p.PrintElement(obj.heapBudget[6]); - p.PrintElement(obj.heapBudget[7]); - p.PrintElement(obj.heapBudget[8]); - p.PrintElement(obj.heapBudget[9]); - p.PrintElement(obj.heapBudget[10]); - p.PrintElement(obj.heapBudget[11]); - p.PrintElement(obj.heapBudget[12]); - p.PrintElement(obj.heapBudget[13]); - p.PrintElement(obj.heapBudget[14]); - p.PrintElement(obj.heapBudget[15]); + { + ArrayWrapper arr(p,"heapBudget", 16); + for (uint32_t i = 0; i < 16; i++) { p.PrintElement(obj.heapBudget[i]); } } - { ArrayWrapper arr(p,"heapUsage", 16); - p.PrintElement(obj.heapUsage[0]); - p.PrintElement(obj.heapUsage[1]); - p.PrintElement(obj.heapUsage[2]); - p.PrintElement(obj.heapUsage[3]); - p.PrintElement(obj.heapUsage[4]); - p.PrintElement(obj.heapUsage[5]); - p.PrintElement(obj.heapUsage[6]); - p.PrintElement(obj.heapUsage[7]); - p.PrintElement(obj.heapUsage[8]); - p.PrintElement(obj.heapUsage[9]); - p.PrintElement(obj.heapUsage[10]); - p.PrintElement(obj.heapUsage[11]); - p.PrintElement(obj.heapUsage[12]); - p.PrintElement(obj.heapUsage[13]); - p.PrintElement(obj.heapUsage[14]); - p.PrintElement(obj.heapUsage[15]); + { + ArrayWrapper arr(p,"heapUsage", 16); + for (uint32_t i = 0; i < 16; i++) { p.PrintElement(obj.heapUsage[i]); } } } void DumpVkPhysicalDeviceMemoryPriorityFeaturesEXT(Printer &p, std::string name, const VkPhysicalDeviceMemoryPriorityFeaturesEXT &obj) { @@ -2002,31 +1960,27 @@ void DumpVkPhysicalDeviceMeshShaderPropertiesEXT(Printer &p, std::string name, c ObjectWrapper object{p, name}; p.SetMinKeyWidth(37); p.PrintKeyValue("maxTaskWorkGroupTotalCount", obj.maxTaskWorkGroupTotalCount); - { ArrayWrapper arr(p,"maxTaskWorkGroupCount", 3); - p.PrintElement(obj.maxTaskWorkGroupCount[0]); - p.PrintElement(obj.maxTaskWorkGroupCount[1]); - p.PrintElement(obj.maxTaskWorkGroupCount[2]); + { + ArrayWrapper arr(p,"maxTaskWorkGroupCount", 3); + for (uint32_t i = 0; i < 3; i++) { p.PrintElement(obj.maxTaskWorkGroupCount[i]); } } p.PrintKeyValue("maxTaskWorkGroupInvocations", obj.maxTaskWorkGroupInvocations); - { ArrayWrapper arr(p,"maxTaskWorkGroupSize", 3); - p.PrintElement(obj.maxTaskWorkGroupSize[0]); - p.PrintElement(obj.maxTaskWorkGroupSize[1]); - p.PrintElement(obj.maxTaskWorkGroupSize[2]); + { + ArrayWrapper arr(p,"maxTaskWorkGroupSize", 3); + for (uint32_t i = 0; i < 3; i++) { p.PrintElement(obj.maxTaskWorkGroupSize[i]); } } p.PrintKeyValue("maxTaskPayloadSize", obj.maxTaskPayloadSize); p.PrintKeyValue("maxTaskSharedMemorySize", obj.maxTaskSharedMemorySize); p.PrintKeyValue("maxTaskPayloadAndSharedMemorySize", obj.maxTaskPayloadAndSharedMemorySize); p.PrintKeyValue("maxMeshWorkGroupTotalCount", obj.maxMeshWorkGroupTotalCount); - { ArrayWrapper arr(p,"maxMeshWorkGroupCount", 3); - p.PrintElement(obj.maxMeshWorkGroupCount[0]); - p.PrintElement(obj.maxMeshWorkGroupCount[1]); - p.PrintElement(obj.maxMeshWorkGroupCount[2]); + { + ArrayWrapper arr(p,"maxMeshWorkGroupCount", 3); + for (uint32_t i = 0; i < 3; i++) { p.PrintElement(obj.maxMeshWorkGroupCount[i]); } } p.PrintKeyValue("maxMeshWorkGroupInvocations", obj.maxMeshWorkGroupInvocations); - { ArrayWrapper arr(p,"maxMeshWorkGroupSize", 3); - p.PrintElement(obj.maxMeshWorkGroupSize[0]); - p.PrintElement(obj.maxMeshWorkGroupSize[1]); - p.PrintElement(obj.maxMeshWorkGroupSize[2]); + { + ArrayWrapper arr(p,"maxMeshWorkGroupSize", 3); + for (uint32_t i = 0; i < 3; i++) { p.PrintElement(obj.maxMeshWorkGroupSize[i]); } } p.PrintKeyValue("maxMeshSharedMemorySize", obj.maxMeshSharedMemorySize); p.PrintKeyValue("maxMeshPayloadAndSharedMemorySize", obj.maxMeshPayloadAndSharedMemorySize); @@ -2302,9 +2256,9 @@ void DumpVkPhysicalDeviceSampleLocationsPropertiesEXT(Printer &p, std::string na p.SetMinKeyWidth(32); DumpVkSampleCountFlags(p, "sampleLocationSampleCounts", obj.sampleLocationSampleCounts); DumpVkExtent2D(p, "maxSampleLocationGridSize", obj.maxSampleLocationGridSize); - { ArrayWrapper arr(p,"sampleLocationCoordinateRange", 2); - p.PrintElement(obj.sampleLocationCoordinateRange[0]); - p.PrintElement(obj.sampleLocationCoordinateRange[1]); + { + ArrayWrapper arr(p,"sampleLocationCoordinateRange", 2); + for (uint32_t i = 0; i < 2; i++) { p.PrintElement(obj.sampleLocationCoordinateRange[i]); } } p.PrintKeyValue("sampleLocationSubPixelBits", obj.sampleLocationSubPixelBits); p.PrintKeyBool("variableSampleLocations", static_cast<bool>(obj.variableSampleLocations)); @@ -2443,11 +2397,7 @@ void DumpVkPhysicalDeviceShaderModuleIdentifierFeaturesEXT(Printer &p, std::stri void DumpVkPhysicalDeviceShaderModuleIdentifierPropertiesEXT(Printer &p, std::string name, const VkPhysicalDeviceShaderModuleIdentifierPropertiesEXT &obj) { ObjectWrapper object{p, name}; p.SetMinKeyWidth(39); - if (p.Type() == OutputType::json) { - ArrayWrapper arr(p, "shaderModuleIdentifierAlgorithmUUID"); - for (uint32_t i = 0; i < 16; i++) p.PrintElement(static_cast<uint32_t>(obj.shaderModuleIdentifierAlgorithmUUID[i])); - } else - p.PrintKeyString("shaderModuleIdentifierAlgorithmUUID", to_string_16(obj.shaderModuleIdentifierAlgorithmUUID)); + p.PrintKeyValue("shaderModuleIdentifierAlgorithmUUID", obj.shaderModuleIdentifierAlgorithmUUID); } void DumpVkPhysicalDeviceShaderSubgroupExtendedTypesFeatures(Printer &p, std::string name, const VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures &obj) { ObjectWrapper object{p, name}; @@ -2612,22 +2562,10 @@ void DumpVkPhysicalDeviceVulkan11Features(Printer &p, std::string name, const Vk void DumpVkPhysicalDeviceVulkan11Properties(Printer &p, std::string name, const VkPhysicalDeviceVulkan11Properties &obj) { ObjectWrapper object{p, name}; p.SetMinKeyWidth(33); - if (p.Type() == OutputType::json) { - ArrayWrapper arr(p, "deviceUUID"); - for (uint32_t i = 0; i < 16; i++) p.PrintElement(static_cast<uint32_t>(obj.deviceUUID[i])); - } else - p.PrintKeyString("deviceUUID", to_string_16(obj.deviceUUID)); - if (p.Type() == OutputType::json) { - ArrayWrapper arr(p, "driverUUID"); - for (uint32_t i = 0; i < 16; i++) p.PrintElement(static_cast<uint32_t>(obj.driverUUID[i])); - } else - p.PrintKeyString("driverUUID", to_string_16(obj.driverUUID)); + p.PrintKeyValue("deviceUUID", obj.deviceUUID); + p.PrintKeyValue("driverUUID", obj.driverUUID); if (obj.deviceLUIDValid) { // special case - if (p.Type() == OutputType::json) { - ArrayWrapper arr(p, "deviceLUID"); - for (uint32_t i = 0; i < 8; i++) p.PrintElement(static_cast<uint32_t>(obj.deviceLUID[i])); - } else - p.PrintKeyString("deviceLUID", to_string_8(obj.deviceLUID)); + p.PrintKeyValue("deviceLUID", obj.deviceLUID); } p.PrintKeyValue("deviceNodeMask", obj.deviceNodeMask); p.PrintKeyBool("deviceLUIDValid", static_cast<bool>(obj.deviceLUIDValid)); diff --git a/vulkaninfo/outputprinter.h b/vulkaninfo/outputprinter.h index 4dc36ef2..2efd179b 100644 --- a/vulkaninfo/outputprinter.h +++ b/vulkaninfo/outputprinter.h @@ -32,7 +32,7 @@ std::string insert_quotes(std::string s) { return "\"" + s + "\""; } -std::string to_string_16(const uint8_t uid[16]) { +std::string to_string(const std::array<uint8_t, 16> &uid) { std::stringstream ss; ss << std::hex << std::setfill('0'); for (int i = 0; i < 16; ++i) { @@ -41,8 +41,7 @@ std::string to_string_16(const uint8_t uid[16]) { } return ss.str(); } - -std::string to_string_8(const uint8_t uid[8]) { +std::string to_string(const std::array<uint8_t, 8> &uid) { std::stringstream ss; ss << std::hex << std::setfill('0'); for (int i = 0; i < 8; ++i) { @@ -516,6 +515,27 @@ class Printer { } } + // Need a specialization to handle C style arrays since they are implicitly converted to pointers + template <size_t N> + void PrintKeyValue(std::string key, const uint8_t (&values)[N]) { + switch (output_type) { + case (OutputType::json): { + ArrayStart(key, N); + for (uint32_t i = 0; i < N; i++) { + PrintElement(static_cast<uint32_t>(values[i])); + } + ArrayEnd(); + break; + } + default: { + std::array<uint8_t, N> arr{}; + std::copy(std::begin(values), std::end(values), std::begin(arr)); + PrintKeyString(key, to_string(arr)); + break; + } + } + } + // For printing key - string pairs (necessary because of json) void PrintKeyString(std::string key, std::string value, std::string value_description = "") { switch (output_type) { diff --git a/vulkaninfo/vulkaninfo.cpp b/vulkaninfo/vulkaninfo.cpp index af723207..cde4653b 100644 --- a/vulkaninfo/vulkaninfo.cpp +++ b/vulkaninfo/vulkaninfo.cpp @@ -301,7 +301,7 @@ void GpuDumpProps(Printer &p, AppGpu &gpu) { p.PrintKeyString("deviceID", to_hex_str(props.deviceID)); p.PrintKeyString("deviceType", VkPhysicalDeviceTypeString(props.deviceType)); p.PrintKeyString("deviceName", props.deviceName); - p.PrintKeyString("pipelineCacheUUID", to_string_16(props.pipelineCacheUUID)); + p.PrintKeyValue("pipelineCacheUUID", props.pipelineCacheUUID); } p.AddNewline(); DumpVkPhysicalDeviceLimits(p, "VkPhysicalDeviceLimits", gpu.props.limits); @@ -821,8 +821,8 @@ void DumpSummaryGPU(Printer &p, AppGpu &gpu) { } if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES) { VkPhysicalDeviceIDProperties *device_id_props = reinterpret_cast<VkPhysicalDeviceIDProperties *>(structure); - p.PrintKeyString("deviceUUID", to_string_16(device_id_props->deviceUUID)); - p.PrintKeyString("driverUUID", to_string_16(device_id_props->driverUUID)); + p.PrintKeyValue("deviceUUID", device_id_props->deviceUUID); + p.PrintKeyValue("driverUUID", device_id_props->driverUUID); } place = structure->pNext; } |
