diff options
| -rw-r--r-- | demos/vulkaninfo.c | 728 |
1 files changed, 495 insertions, 233 deletions
diff --git a/demos/vulkaninfo.c b/demos/vulkaninfo.c index b69a6ba1..59d6d192 100644 --- a/demos/vulkaninfo.c +++ b/demos/vulkaninfo.c @@ -474,6 +474,16 @@ static bool CheckExtensionEnabled(const char *extension_to_check, const char **e return false; } +static bool CheckPhysicalDeviceExtensionIncluded(const char *extension_to_check, VkExtensionProperties *extension_list, + uint32_t extension_count) { + for (uint32_t i = 0; i < extension_count; ++i) { + if (!strcmp(extension_to_check, extension_list[i].extensionName)) { + return true; + } + } + return false; +} + static void ExtractVersion(uint32_t version, uint32_t *major, uint32_t *minor, uint32_t *patch) { *major = version >> 22; *minor = (version >> 12) & 0x3ff; @@ -821,7 +831,23 @@ static void AppGpuInit(struct AppGpu *gpu, struct AppInstance *inst, uint32_t id if (CheckExtensionEnabled(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, gpu->inst->inst_extensions, gpu->inst->inst_extensions_count)) { gpu->props2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR; - gpu->props2.pNext = NULL; + gpu->props2.pNext = malloc(sizeof(VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT)); + + VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT *blend_op_adv_props = gpu->props2.pNext; + blend_op_adv_props->sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT; + blend_op_adv_props->pNext = malloc(sizeof(VkPhysicalDevicePointClippingPropertiesKHR)); + + VkPhysicalDevicePointClippingPropertiesKHR *pt_clip_props = blend_op_adv_props->pNext; + pt_clip_props->sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES_KHR; + pt_clip_props->pNext = malloc(sizeof(VkPhysicalDevicePushDescriptorPropertiesKHR)); + + VkPhysicalDevicePushDescriptorPropertiesKHR *push_desc_props = pt_clip_props->pNext; + push_desc_props->sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR; + push_desc_props->pNext = malloc(sizeof(VkPhysicalDeviceDiscardRectanglePropertiesEXT)); + + VkPhysicalDeviceDiscardRectanglePropertiesEXT *discard_rect_props = push_desc_props->pNext; + discard_rect_props->sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT; + discard_rect_props->pNext = NULL; inst->vkGetPhysicalDeviceProperties2KHR(gpu->obj, &gpu->props2); } @@ -858,17 +884,36 @@ static void AppGpuInit(struct AppGpu *gpu, struct AppInstance *inst, uint32_t id ERR_EXIT(VK_ERROR_OUT_OF_HOST_MEMORY); } for (i = 0; i < gpu->queue_count; ++i) { - float *queue_priorities = malloc(gpu->queue_props[i].queueCount * sizeof(float)); + float *queue_priorities = NULL; + if (CheckExtensionEnabled(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, gpu->inst->inst_extensions, + gpu->inst->inst_extensions_count)) { + queue_priorities = malloc(gpu->queue_props2[i].queueFamilyProperties.queueCount * sizeof(float)); + } else { + queue_priorities = malloc(gpu->queue_props[i].queueCount * sizeof(float)); + } if (!queue_priorities) { ERR_EXIT(VK_ERROR_OUT_OF_HOST_MEMORY); } - memset(queue_priorities, 0, gpu->queue_props[i].queueCount * sizeof(float)); + + if (CheckExtensionEnabled(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, gpu->inst->inst_extensions, + gpu->inst->inst_extensions_count)) { + memset(queue_priorities, 0, gpu->queue_props2[i].queueFamilyProperties.queueCount * sizeof(float)); + } else { + memset(queue_priorities, 0, gpu->queue_props[i].queueCount * sizeof(float)); + } gpu->queue_reqs[i].sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; gpu->queue_reqs[i].pNext = NULL; gpu->queue_reqs[i].flags = 0; gpu->queue_reqs[i].queueFamilyIndex = i; - gpu->queue_reqs[i].queueCount = gpu->queue_props[i].queueCount; + + if (CheckExtensionEnabled(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, gpu->inst->inst_extensions, + gpu->inst->inst_extensions_count)) { + gpu->queue_reqs[i].queueCount = gpu->queue_props2[i].queueFamilyProperties.queueCount; + } else { + gpu->queue_reqs[i].queueCount = gpu->queue_props[i].queueCount; + } + gpu->queue_reqs[i].pQueuePriorities = queue_priorities; } @@ -884,7 +929,23 @@ static void AppGpuInit(struct AppGpu *gpu, struct AppInstance *inst, uint32_t id inst->vkGetPhysicalDeviceMemoryProperties2KHR(gpu->obj, &gpu->memory_props2); gpu->features2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR; - gpu->features2.pNext = NULL; + gpu->features2.pNext = malloc(sizeof(VkPhysicalDevice16BitStorageFeaturesKHR)); + + VkPhysicalDevice16BitStorageFeaturesKHR *b16_store_features = gpu->features2.pNext; + b16_store_features->sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES_KHR; + b16_store_features->pNext = malloc(sizeof(VkPhysicalDeviceSamplerYcbcrConversionFeaturesKHR)); + + VkPhysicalDeviceSamplerYcbcrConversionFeaturesKHR *ycbcr_conv_features = b16_store_features->pNext; + ycbcr_conv_features->sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES_KHR; + ycbcr_conv_features->pNext = malloc(sizeof(VkPhysicalDeviceVariablePointerFeaturesKHR)); + + VkPhysicalDeviceVariablePointerFeaturesKHR *var_pointer_features = ycbcr_conv_features->pNext; + var_pointer_features->sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES_KHR; + var_pointer_features->pNext = malloc(sizeof(VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT)); + + VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT *blend_op_adv_features = var_pointer_features->pNext; + blend_op_adv_features->sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT; + blend_op_adv_features->pNext = NULL; inst->vkGetPhysicalDeviceFeatures2KHR(gpu->obj, &gpu->features2); } @@ -895,6 +956,15 @@ static void AppGpuInit(struct AppGpu *gpu, struct AppInstance *inst, uint32_t id static void AppGpuDestroy(struct AppGpu *gpu) { free(gpu->device_extensions); + VkPhysicalDevice16BitStorageFeaturesKHR *b16_store_features = gpu->features2.pNext; + VkPhysicalDeviceSamplerYcbcrConversionFeaturesKHR *ycbcr_conv_features = b16_store_features->pNext; + VkPhysicalDeviceVariablePointerFeaturesKHR *var_pointer_features = ycbcr_conv_features->pNext; + VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT *blend_op_adv_features = var_pointer_features->pNext; + free(blend_op_adv_features); + free(var_pointer_features); + free(ycbcr_conv_features); + free(b16_store_features); + for (uint32_t i = 0; i < gpu->queue_count; ++i) { free((void *)gpu->queue_reqs[i].pQueuePriorities); } @@ -905,6 +975,15 @@ static void AppGpuDestroy(struct AppGpu *gpu) { gpu->inst->inst_extensions_count)) { free(gpu->queue_props2); } + + VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT *blend_op_adv_props = gpu->props2.pNext; + VkPhysicalDevicePointClippingPropertiesKHR *pt_clip_props = blend_op_adv_props->pNext; + VkPhysicalDevicePushDescriptorPropertiesKHR *push_desc_props = pt_clip_props->pNext; + VkPhysicalDeviceDiscardRectanglePropertiesEXT *discard_rect_props = push_desc_props->pNext; + free(discard_rect_props); + free(push_desc_props); + free(pt_clip_props); + free(blend_op_adv_props); } // clang-format off @@ -1609,185 +1688,260 @@ static void AppDevDump(const struct AppGpu *gpu, FILE *out) { #endif static void AppGpuDumpFeatures(const struct AppGpu *gpu, FILE *out) { - const VkPhysicalDeviceFeatures *features = &gpu->features; + VkPhysicalDeviceFeatures features; + + if (CheckExtensionEnabled(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, gpu->inst->inst_extensions, + gpu->inst->inst_extensions_count)) { + const VkPhysicalDeviceFeatures *features2_const = &gpu->features2.features; + features = *features2_const; + } + else { + const VkPhysicalDeviceFeatures *features_const = &gpu->features; + features = *features_const; + } if (html_output) { fprintf(out, "\t\t\t\t\t<details><summary>VkPhysicalDeviceFeatures</summary>\n"); - fprintf(out, "\t\t\t\t\t\t<details><summary>alphaToOne = <div class='val'>%u</div></summary></details>\n", features->alphaToOne ); - fprintf(out, "\t\t\t\t\t\t<details><summary>depthBiasClamp = <div class='val'>%u</div></summary></details>\n", features->depthBiasClamp ); - fprintf(out, "\t\t\t\t\t\t<details><summary>depthBounds = <div class='val'>%u</div></summary></details>\n", features->depthBounds ); - fprintf(out, "\t\t\t\t\t\t<details><summary>depthClamp = <div class='val'>%u</div></summary></details>\n", features->depthClamp ); - fprintf(out, "\t\t\t\t\t\t<details><summary>drawIndirectFirstInstance = <div class='val'>%u</div></summary></details>\n", features->drawIndirectFirstInstance ); - fprintf(out, "\t\t\t\t\t\t<details><summary>dualSrcBlend = <div class='val'>%u</div></summary></details>\n", features->dualSrcBlend ); - fprintf(out, "\t\t\t\t\t\t<details><summary>fillModeNonSolid = <div class='val'>%u</div></summary></details>\n", features->fillModeNonSolid ); - fprintf(out, "\t\t\t\t\t\t<details><summary>fragmentStoresAndAtomics = <div class='val'>%u</div></summary></details>\n", features->fragmentStoresAndAtomics ); - fprintf(out, "\t\t\t\t\t\t<details><summary>fullDrawIndexUint32 = <div class='val'>%u</div></summary></details>\n", features->fullDrawIndexUint32 ); - fprintf(out, "\t\t\t\t\t\t<details><summary>geometryShader = <div class='val'>%u</div></summary></details>\n", features->geometryShader ); - fprintf(out, "\t\t\t\t\t\t<details><summary>imageCubeArray = <div class='val'>%u</div></summary></details>\n", features->imageCubeArray ); - fprintf(out, "\t\t\t\t\t\t<details><summary>independentBlend = <div class='val'>%u</div></summary></details>\n", features->independentBlend ); - fprintf(out, "\t\t\t\t\t\t<details><summary>inheritedQueries = <div class='val'>%u</div></summary></details>\n", features->inheritedQueries ); - fprintf(out, "\t\t\t\t\t\t<details><summary>largePoints = <div class='val'>%u</div></summary></details>\n", features->largePoints ); - fprintf(out, "\t\t\t\t\t\t<details><summary>logicOp = <div class='val'>%u</div></summary></details>\n", features->logicOp ); - fprintf(out, "\t\t\t\t\t\t<details><summary>multiDrawIndirect = <div class='val'>%u</div></summary></details>\n", features->multiDrawIndirect ); - fprintf(out, "\t\t\t\t\t\t<details><summary>multiViewport = <div class='val'>%u</div></summary></details>\n", features->multiViewport ); - fprintf(out, "\t\t\t\t\t\t<details><summary>occlusionQueryPrecise = <div class='val'>%u</div></summary></details>\n", features->occlusionQueryPrecise ); - fprintf(out, "\t\t\t\t\t\t<details><summary>pipelineStatisticsQuery = <div class='val'>%u</div></summary></details>\n", features->pipelineStatisticsQuery ); - fprintf(out, "\t\t\t\t\t\t<details><summary>robustBufferAccess = <div class='val'>%u</div></summary></details>\n", features->robustBufferAccess ); - fprintf(out, "\t\t\t\t\t\t<details><summary>samplerAnisotropy = <div class='val'>%u</div></summary></details>\n", features->samplerAnisotropy ); - fprintf(out, "\t\t\t\t\t\t<details><summary>sampleRateShading = <div class='val'>%u</div></summary></details>\n", features->sampleRateShading ); - fprintf(out, "\t\t\t\t\t\t<details><summary>shaderClipDistance = <div class='val'>%u</div></summary></details>\n", features->shaderClipDistance ); - fprintf(out, "\t\t\t\t\t\t<details><summary>shaderCullDistance = <div class='val'>%u</div></summary></details>\n", features->shaderCullDistance ); - fprintf(out, "\t\t\t\t\t\t<details><summary>shaderFloat64 = <div class='val'>%u</div></summary></details>\n", features->shaderFloat64 ); - fprintf(out, "\t\t\t\t\t\t<details><summary>shaderImageGatherExtended = <div class='val'>%u</div></summary></details>\n", features->shaderImageGatherExtended ); - fprintf(out, "\t\t\t\t\t\t<details><summary>shaderInt16 = <div class='val'>%u</div></summary></details>\n", features->shaderInt16 ); - fprintf(out, "\t\t\t\t\t\t<details><summary>shaderInt64 = <div class='val'>%u</div></summary></details>\n", features->shaderInt64 ); - fprintf(out, "\t\t\t\t\t\t<details><summary>shaderResourceMinLod = <div class='val'>%u</div></summary></details>\n", features->shaderResourceMinLod ); - fprintf(out, "\t\t\t\t\t\t<details><summary>shaderResourceResidency = <div class='val'>%u</div></summary></details>\n", features->shaderResourceResidency ); - fprintf(out, "\t\t\t\t\t\t<details><summary>shaderSampledImageArrayDynamicIndexing = <div class='val'>%u</div></summary></details>\n", features->shaderSampledImageArrayDynamicIndexing ); - fprintf(out, "\t\t\t\t\t\t<details><summary>shaderStorageBufferArrayDynamicIndexing = <div class='val'>%u</div></summary></details>\n", features->shaderStorageBufferArrayDynamicIndexing); - fprintf(out, "\t\t\t\t\t\t<details><summary>shaderStorageImageArrayDynamicIndexing = <div class='val'>%u</div></summary></details>\n", features->shaderStorageImageArrayDynamicIndexing ); - fprintf(out, "\t\t\t\t\t\t<details><summary>shaderStorageImageExtendedFormats = <div class='val'>%u</div></summary></details>\n", features->shaderStorageImageExtendedFormats ); - fprintf(out, "\t\t\t\t\t\t<details><summary>shaderStorageImageMultisample = <div class='val'>%u</div></summary></details>\n", features->shaderStorageImageMultisample ); - fprintf(out, "\t\t\t\t\t\t<details><summary>shaderStorageImageReadWithoutFormat = <div class='val'>%u</div></summary></details>\n", features->shaderStorageImageReadWithoutFormat ); - fprintf(out, "\t\t\t\t\t\t<details><summary>shaderStorageImageWriteWithoutFormat = <div class='val'>%u</div></summary></details>\n", features->shaderStorageImageWriteWithoutFormat ); - fprintf(out, "\t\t\t\t\t\t<details><summary>shaderTessellationAndGeometryPointSize = <div class='val'>%u</div></summary></details>\n", features->shaderTessellationAndGeometryPointSize ); - fprintf(out, "\t\t\t\t\t\t<details><summary>shaderUniformBufferArrayDynamicIndexing = <div class='val'>%u</div></summary></details>\n", features->shaderUniformBufferArrayDynamicIndexing); - fprintf(out, "\t\t\t\t\t\t<details><summary>sparseBinding = <div class='val'>%u</div></summary></details>\n", features->sparseBinding ); - fprintf(out, "\t\t\t\t\t\t<details><summary>sparseResidency2Samples = <div class='val'>%u</div></summary></details>\n", features->sparseResidency2Samples ); - fprintf(out, "\t\t\t\t\t\t<details><summary>sparseResidency4Samples = <div class='val'>%u</div></summary></details>\n", features->sparseResidency4Samples ); - fprintf(out, "\t\t\t\t\t\t<details><summary>sparseResidency8Samples = <div class='val'>%u</div></summary></details>\n", features->sparseResidency8Samples ); - fprintf(out, "\t\t\t\t\t\t<details><summary>sparseResidency16Samples = <div class='val'>%u</div></summary></details>\n", features->sparseResidency16Samples ); - fprintf(out, "\t\t\t\t\t\t<details><summary>sparseResidencyAliased = <div class='val'>%u</div></summary></details>\n", features->sparseResidencyAliased ); - fprintf(out, "\t\t\t\t\t\t<details><summary>sparseResidencyBuffer = <div class='val'>%u</div></summary></details>\n", features->sparseResidencyBuffer ); - fprintf(out, "\t\t\t\t\t\t<details><summary>sparseResidencyImage2D = <div class='val'>%u</div></summary></details>\n", features->sparseResidencyImage2D ); - fprintf(out, "\t\t\t\t\t\t<details><summary>sparseResidencyImage3D = <div class='val'>%u</div></summary></details>\n", features->sparseResidencyImage3D ); - fprintf(out, "\t\t\t\t\t\t<details><summary>tessellationShader = <div class='val'>%u</div></summary></details>\n", features->tessellationShader ); - fprintf(out, "\t\t\t\t\t\t<details><summary>textureCompressionASTC_LDR = <div class='val'>%u</div></summary></details>\n", features->textureCompressionASTC_LDR ); - fprintf(out, "\t\t\t\t\t\t<details><summary>textureCompressionBC = <div class='val'>%u</div></summary></details>\n", features->textureCompressionBC ); - fprintf(out, "\t\t\t\t\t\t<details><summary>textureCompressionETC2 = <div class='val'>%u</div></summary></details>\n", features->textureCompressionETC2 ); - fprintf(out, "\t\t\t\t\t\t<details><summary>variableMultisampleRate = <div class='val'>%u</div></summary></details>\n", features->variableMultisampleRate ); - fprintf(out, "\t\t\t\t\t\t<details><summary>vertexPipelineStoresAndAtomics = <div class='val'>%u</div></summary></details>\n", features->vertexPipelineStoresAndAtomics ); - fprintf(out, "\t\t\t\t\t\t<details><summary>wideLines = <div class='val'>%u</div></summary></details>\n", features->wideLines ); + fprintf(out, "\t\t\t\t\t\t<details><summary>alphaToOne = <div class='val'>%u</div></summary></details>\n", features.alphaToOne ); + fprintf(out, "\t\t\t\t\t\t<details><summary>depthBiasClamp = <div class='val'>%u</div></summary></details>\n", features.depthBiasClamp ); + fprintf(out, "\t\t\t\t\t\t<details><summary>depthBounds = <div class='val'>%u</div></summary></details>\n", features.depthBounds ); + fprintf(out, "\t\t\t\t\t\t<details><summary>depthClamp = <div class='val'>%u</div></summary></details>\n", features.depthClamp ); + fprintf(out, "\t\t\t\t\t\t<details><summary>drawIndirectFirstInstance = <div class='val'>%u</div></summary></details>\n", features.drawIndirectFirstInstance ); + fprintf(out, "\t\t\t\t\t\t<details><summary>dualSrcBlend = <div class='val'>%u</div></summary></details>\n", features.dualSrcBlend ); + fprintf(out, "\t\t\t\t\t\t<details><summary>fillModeNonSolid = <div class='val'>%u</div></summary></details>\n", features.fillModeNonSolid ); + fprintf(out, "\t\t\t\t\t\t<details><summary>fragmentStoresAndAtomics = <div class='val'>%u</div></summary></details>\n", features.fragmentStoresAndAtomics ); + fprintf(out, "\t\t\t\t\t\t<details><summary>fullDrawIndexUint32 = <div class='val'>%u</div></summary></details>\n", features.fullDrawIndexUint32 ); + fprintf(out, "\t\t\t\t\t\t<details><summary>geometryShader = <div class='val'>%u</div></summary></details>\n", features.geometryShader ); + fprintf(out, "\t\t\t\t\t\t<details><summary>imageCubeArray = <div class='val'>%u</div></summary></details>\n", features.imageCubeArray ); + fprintf(out, "\t\t\t\t\t\t<details><summary>independentBlend = <div class='val'>%u</div></summary></details>\n", features.independentBlend ); + fprintf(out, "\t\t\t\t\t\t<details><summary>inheritedQueries = <div class='val'>%u</div></summary></details>\n", features.inheritedQueries ); + fprintf(out, "\t\t\t\t\t\t<details><summary>largePoints = <div class='val'>%u</div></summary></details>\n", features.largePoints ); + fprintf(out, "\t\t\t\t\t\t<details><summary>logicOp = <div class='val'>%u</div></summary></details>\n", features.logicOp ); + fprintf(out, "\t\t\t\t\t\t<details><summary>multiDrawIndirect = <div class='val'>%u</div></summary></details>\n", features.multiDrawIndirect ); + fprintf(out, "\t\t\t\t\t\t<details><summary>multiViewport = <div class='val'>%u</div></summary></details>\n", features.multiViewport ); + fprintf(out, "\t\t\t\t\t\t<details><summary>occlusionQueryPrecise = <div class='val'>%u</div></summary></details>\n", features.occlusionQueryPrecise ); + fprintf(out, "\t\t\t\t\t\t<details><summary>pipelineStatisticsQuery = <div class='val'>%u</div></summary></details>\n", features.pipelineStatisticsQuery ); + fprintf(out, "\t\t\t\t\t\t<details><summary>robustBufferAccess = <div class='val'>%u</div></summary></details>\n", features.robustBufferAccess ); + fprintf(out, "\t\t\t\t\t\t<details><summary>samplerAnisotropy = <div class='val'>%u</div></summary></details>\n", features.samplerAnisotropy ); + fprintf(out, "\t\t\t\t\t\t<details><summary>sampleRateShading = <div class='val'>%u</div></summary></details>\n", features.sampleRateShading ); + fprintf(out, "\t\t\t\t\t\t<details><summary>shaderClipDistance = <div class='val'>%u</div></summary></details>\n", features.shaderClipDistance ); + fprintf(out, "\t\t\t\t\t\t<details><summary>shaderCullDistance = <div class='val'>%u</div></summary></details>\n", features.shaderCullDistance ); + fprintf(out, "\t\t\t\t\t\t<details><summary>shaderFloat64 = <div class='val'>%u</div></summary></details>\n", features.shaderFloat64 ); + fprintf(out, "\t\t\t\t\t\t<details><summary>shaderImageGatherExtended = <div class='val'>%u</div></summary></details>\n", features.shaderImageGatherExtended ); + fprintf(out, "\t\t\t\t\t\t<details><summary>shaderInt16 = <div class='val'>%u</div></summary></details>\n", features.shaderInt16 ); + fprintf(out, "\t\t\t\t\t\t<details><summary>shaderInt64 = <div class='val'>%u</div></summary></details>\n", features.shaderInt64 ); + fprintf(out, "\t\t\t\t\t\t<details><summary>shaderResourceMinLod = <div class='val'>%u</div></summary></details>\n", features.shaderResourceMinLod ); + fprintf(out, "\t\t\t\t\t\t<details><summary>shaderResourceResidency = <div class='val'>%u</div></summary></details>\n", features.shaderResourceResidency ); + fprintf(out, "\t\t\t\t\t\t<details><summary>shaderSampledImageArrayDynamicIndexing = <div class='val'>%u</div></summary></details>\n", features.shaderSampledImageArrayDynamicIndexing ); + fprintf(out, "\t\t\t\t\t\t<details><summary>shaderStorageBufferArrayDynamicIndexing = <div class='val'>%u</div></summary></details>\n", features.shaderStorageBufferArrayDynamicIndexing); + fprintf(out, "\t\t\t\t\t\t<details><summary>shaderStorageImageArrayDynamicIndexing = <div class='val'>%u</div></summary></details>\n", features.shaderStorageImageArrayDynamicIndexing ); + fprintf(out, "\t\t\t\t\t\t<details><summary>shaderStorageImageExtendedFormats = <div class='val'>%u</div></summary></details>\n", features.shaderStorageImageExtendedFormats ); + fprintf(out, "\t\t\t\t\t\t<details><summary>shaderStorageImageMultisample = <div class='val'>%u</div></summary></details>\n", features.shaderStorageImageMultisample ); + fprintf(out, "\t\t\t\t\t\t<details><summary>shaderStorageImageReadWithoutFormat = <div class='val'>%u</div></summary></details>\n", features.shaderStorageImageReadWithoutFormat ); + fprintf(out, "\t\t\t\t\t\t<details><summary>shaderStorageImageWriteWithoutFormat = <div class='val'>%u</div></summary></details>\n", features.shaderStorageImageWriteWithoutFormat ); + fprintf(out, "\t\t\t\t\t\t<details><summary>shaderTessellationAndGeometryPointSize = <div class='val'>%u</div></summary></details>\n", features.shaderTessellationAndGeometryPointSize ); + fprintf(out, "\t\t\t\t\t\t<details><summary>shaderUniformBufferArrayDynamicIndexing = <div class='val'>%u</div></summary></details>\n", features.shaderUniformBufferArrayDynamicIndexing); + fprintf(out, "\t\t\t\t\t\t<details><summary>sparseBinding = <div class='val'>%u</div></summary></details>\n", features.sparseBinding ); + fprintf(out, "\t\t\t\t\t\t<details><summary>sparseResidency2Samples = <div class='val'>%u</div></summary></details>\n", features.sparseResidency2Samples ); + fprintf(out, "\t\t\t\t\t\t<details><summary>sparseResidency4Samples = <div class='val'>%u</div></summary></details>\n", features.sparseResidency4Samples ); + fprintf(out, "\t\t\t\t\t\t<details><summary>sparseResidency8Samples = <div class='val'>%u</div></summary></details>\n", features.sparseResidency8Samples ); + fprintf(out, "\t\t\t\t\t\t<details><summary>sparseResidency16Samples = <div class='val'>%u</div></summary></details>\n", features.sparseResidency16Samples ); + fprintf(out, "\t\t\t\t\t\t<details><summary>sparseResidencyAliased = <div class='val'>%u</div></summary></details>\n", features.sparseResidencyAliased ); + fprintf(out, "\t\t\t\t\t\t<details><summary>sparseResidencyBuffer = <div class='val'>%u</div></summary></details>\n", features.sparseResidencyBuffer ); + fprintf(out, "\t\t\t\t\t\t<details><summary>sparseResidencyImage2D = <div class='val'>%u</div></summary></details>\n", features.sparseResidencyImage2D ); + fprintf(out, "\t\t\t\t\t\t<details><summary>sparseResidencyImage3D = <div class='val'>%u</div></summary></details>\n", features.sparseResidencyImage3D ); + fprintf(out, "\t\t\t\t\t\t<details><summary>tessellationShader = <div class='val'>%u</div></summary></details>\n", features.tessellationShader ); + fprintf(out, "\t\t\t\t\t\t<details><summary>textureCompressionASTC_LDR = <div class='val'>%u</div></summary></details>\n", features.textureCompressionASTC_LDR ); + fprintf(out, "\t\t\t\t\t\t<details><summary>textureCompressionBC = <div class='val'>%u</div></summary></details>\n", features.textureCompressionBC ); + fprintf(out, "\t\t\t\t\t\t<details><summary>textureCompressionETC2 = <div class='val'>%u</div></summary></details>\n", features.textureCompressionETC2 ); + fprintf(out, "\t\t\t\t\t\t<details><summary>variableMultisampleRate = <div class='val'>%u</div></summary></details>\n", features.variableMultisampleRate ); + fprintf(out, "\t\t\t\t\t\t<details><summary>vertexPipelineStoresAndAtomics = <div class='val'>%u</div></summary></details>\n", features.vertexPipelineStoresAndAtomics ); + fprintf(out, "\t\t\t\t\t\t<details><summary>wideLines = <div class='val'>%u</div></summary></details>\n", features.wideLines ); fprintf(out, "\t\t\t\t\t</details>\n"); } else if (human_readable_output) { printf("VkPhysicalDeviceFeatures:\n"); printf("=========================\n"); - printf("\talphaToOne = %u\n", features->alphaToOne ); - printf("\tdepthBiasClamp = %u\n", features->depthBiasClamp ); - printf("\tdepthBounds = %u\n", features->depthBounds ); - printf("\tdepthClamp = %u\n", features->depthClamp ); - printf("\tdrawIndirectFirstInstance = %u\n", features->drawIndirectFirstInstance ); - printf("\tdualSrcBlend = %u\n", features->dualSrcBlend ); - printf("\tfillModeNonSolid = %u\n", features->fillModeNonSolid ); - printf("\tfragmentStoresAndAtomics = %u\n", features->fragmentStoresAndAtomics ); - printf("\tfullDrawIndexUint32 = %u\n", features->fullDrawIndexUint32 ); - printf("\tgeometryShader = %u\n", features->geometryShader ); - printf("\timageCubeArray = %u\n", features->imageCubeArray ); - printf("\tindependentBlend = %u\n", features->independentBlend ); - printf("\tinheritedQueries = %u\n", features->inheritedQueries ); - printf("\tlargePoints = %u\n", features->largePoints ); - printf("\tlogicOp = %u\n", features->logicOp ); - printf("\tmultiDrawIndirect = %u\n", features->multiDrawIndirect ); - printf("\tmultiViewport = %u\n", features->multiViewport ); - printf("\tocclusionQueryPrecise = %u\n", features->occlusionQueryPrecise ); - printf("\tpipelineStatisticsQuery = %u\n", features->pipelineStatisticsQuery ); - printf("\trobustBufferAccess = %u\n", features->robustBufferAccess ); - printf("\tsamplerAnisotropy = %u\n", features->samplerAnisotropy ); - printf("\tsampleRateShading = %u\n", features->sampleRateShading ); - printf("\tshaderClipDistance = %u\n", features->shaderClipDistance ); - printf("\tshaderCullDistance = %u\n", features->shaderCullDistance ); - printf("\tshaderFloat64 = %u\n", features->shaderFloat64 ); - printf("\tshaderImageGatherExtended = %u\n", features->shaderImageGatherExtended ); - printf("\tshaderInt16 = %u\n", features->shaderInt16 ); - printf("\tshaderInt64 = %u\n", features->shaderInt64 ); - printf("\tshaderSampledImageArrayDynamicIndexing = %u\n", features->shaderSampledImageArrayDynamicIndexing ); - printf("\tshaderStorageBufferArrayDynamicIndexing = %u\n", features->shaderStorageBufferArrayDynamicIndexing); - printf("\tshaderStorageImageArrayDynamicIndexing = %u\n", features->shaderStorageImageArrayDynamicIndexing ); - printf("\tshaderStorageImageExtendedFormats = %u\n", features->shaderStorageImageExtendedFormats ); - printf("\tshaderStorageImageMultisample = %u\n", features->shaderStorageImageMultisample ); - printf("\tshaderStorageImageReadWithoutFormat = %u\n", features->shaderStorageImageReadWithoutFormat ); - printf("\tshaderStorageImageWriteWithoutFormat = %u\n", features->shaderStorageImageWriteWithoutFormat ); - printf("\tshaderTessellationAndGeometryPointSize = %u\n", features->shaderTessellationAndGeometryPointSize ); - printf("\tshaderUniformBufferArrayDynamicIndexing = %u\n", features->shaderUniformBufferArrayDynamicIndexing); - printf("\tsparseBinding = %u\n", features->sparseBinding ); - printf("\tsparseResidency2Samples = %u\n", features->sparseResidency2Samples ); - printf("\tsparseResidency4Samples = %u\n", features->sparseResidency4Samples ); - printf("\tsparseResidency8Samples = %u\n", features->sparseResidency8Samples ); - printf("\tsparseResidency16Samples = %u\n", features->sparseResidency16Samples ); - printf("\tsparseResidencyAliased = %u\n", features->sparseResidencyAliased ); - printf("\tsparseResidencyBuffer = %u\n", features->sparseResidencyBuffer ); - printf("\tsparseResidencyImage2D = %u\n", features->sparseResidencyImage2D ); - printf("\tsparseResidencyImage3D = %u\n", features->sparseResidencyImage3D ); - printf("\tshaderResourceMinLod = %u\n", features->shaderResourceMinLod ); - printf("\tshaderResourceResidency = %u\n", features->shaderResourceResidency ); - printf("\ttessellationShader = %u\n", features->tessellationShader ); - printf("\ttextureCompressionASTC_LDR = %u\n", features->textureCompressionASTC_LDR ); - printf("\ttextureCompressionBC = %u\n", features->textureCompressionBC ); - printf("\ttextureCompressionETC2 = %u\n", features->textureCompressionETC2 ); - printf("\tvariableMultisampleRate = %u\n", features->variableMultisampleRate ); - printf("\tvertexPipelineStoresAndAtomics = %u\n", features->vertexPipelineStoresAndAtomics ); - printf("\twideLines = %u\n", features->wideLines ); + printf("\talphaToOne = %u\n", features.alphaToOne ); + printf("\tdepthBiasClamp = %u\n", features.depthBiasClamp ); + printf("\tdepthBounds = %u\n", features.depthBounds ); + printf("\tdepthClamp = %u\n", features.depthClamp ); + printf("\tdrawIndirectFirstInstance = %u\n", features.drawIndirectFirstInstance ); + printf("\tdualSrcBlend = %u\n", features.dualSrcBlend ); + printf("\tfillModeNonSolid = %u\n", features.fillModeNonSolid ); + printf("\tfragmentStoresAndAtomics = %u\n", features.fragmentStoresAndAtomics ); + printf("\tfullDrawIndexUint32 = %u\n", features.fullDrawIndexUint32 ); + printf("\tgeometryShader = %u\n", features.geometryShader ); + printf("\timageCubeArray = %u\n", features.imageCubeArray ); + printf("\tindependentBlend = %u\n", features.independentBlend ); + printf("\tinheritedQueries = %u\n", features.inheritedQueries ); + printf("\tlargePoints = %u\n", features.largePoints ); + printf("\tlogicOp = %u\n", features.logicOp ); + printf("\tmultiDrawIndirect = %u\n", features.multiDrawIndirect ); + printf("\tmultiViewport = %u\n", features.multiViewport ); + printf("\tocclusionQueryPrecise = %u\n", features.occlusionQueryPrecise ); + printf("\tpipelineStatisticsQuery = %u\n", features.pipelineStatisticsQuery ); + printf("\trobustBufferAccess = %u\n", features.robustBufferAccess ); + printf("\tsamplerAnisotropy = %u\n", features.samplerAnisotropy ); + printf("\tsampleRateShading = %u\n", features.sampleRateShading ); + printf("\tshaderClipDistance = %u\n", features.shaderClipDistance ); + printf("\tshaderCullDistance = %u\n", features.shaderCullDistance ); + printf("\tshaderFloat64 = %u\n", features.shaderFloat64 ); + printf("\tshaderImageGatherExtended = %u\n", features.shaderImageGatherExtended ); + printf("\tshaderInt16 = %u\n", features.shaderInt16 ); + printf("\tshaderInt64 = %u\n", features.shaderInt64 ); + printf("\tshaderSampledImageArrayDynamicIndexing = %u\n", features.shaderSampledImageArrayDynamicIndexing ); + printf("\tshaderStorageBufferArrayDynamicIndexing = %u\n", features.shaderStorageBufferArrayDynamicIndexing); + printf("\tshaderStorageImageArrayDynamicIndexing = %u\n", features.shaderStorageImageArrayDynamicIndexing ); + printf("\tshaderStorageImageExtendedFormats = %u\n", features.shaderStorageImageExtendedFormats ); + printf("\tshaderStorageImageMultisample = %u\n", features.shaderStorageImageMultisample ); + printf("\tshaderStorageImageReadWithoutFormat = %u\n", features.shaderStorageImageReadWithoutFormat ); + printf("\tshaderStorageImageWriteWithoutFormat = %u\n", features.shaderStorageImageWriteWithoutFormat ); + printf("\tshaderTessellationAndGeometryPointSize = %u\n", features.shaderTessellationAndGeometryPointSize ); + printf("\tshaderUniformBufferArrayDynamicIndexing = %u\n", features.shaderUniformBufferArrayDynamicIndexing); + printf("\tsparseBinding = %u\n", features.sparseBinding ); + printf("\tsparseResidency2Samples = %u\n", features.sparseResidency2Samples ); + printf("\tsparseResidency4Samples = %u\n", features.sparseResidency4Samples ); + printf("\tsparseResidency8Samples = %u\n", features.sparseResidency8Samples ); + printf("\tsparseResidency16Samples = %u\n", features.sparseResidency16Samples ); + printf("\tsparseResidencyAliased = %u\n", features.sparseResidencyAliased ); + printf("\tsparseResidencyBuffer = %u\n", features.sparseResidencyBuffer ); + printf("\tsparseResidencyImage2D = %u\n", features.sparseResidencyImage2D ); + printf("\tsparseResidencyImage3D = %u\n", features.sparseResidencyImage3D ); + printf("\tshaderResourceMinLod = %u\n", features.shaderResourceMinLod ); + printf("\tshaderResourceResidency = %u\n", features.shaderResourceResidency ); + printf("\ttessellationShader = %u\n", features.tessellationShader ); + printf("\ttextureCompressionASTC_LDR = %u\n", features.textureCompressionASTC_LDR ); + printf("\ttextureCompressionBC = %u\n", features.textureCompressionBC ); + printf("\ttextureCompressionETC2 = %u\n", features.textureCompressionETC2 ); + printf("\tvariableMultisampleRate = %u\n", features.variableMultisampleRate ); + printf("\tvertexPipelineStoresAndAtomics = %u\n", features.vertexPipelineStoresAndAtomics ); + printf("\twideLines = %u\n", features.wideLines ); } if (json_output) { printf(",\n"); printf("\t\"VkPhysicalDeviceFeatures\": {\n"); - printf("\t\t\"alphaToOne\": %u,\n", features->alphaToOne); - printf("\t\t\"depthBiasClamp\": %u,\n", features->depthBiasClamp); - printf("\t\t\"depthBounds\": %u,\n", features->depthBounds); - printf("\t\t\"depthClamp\": %u,\n", features->depthClamp); - printf("\t\t\"drawIndirectFirstInstance\": %u,\n", features->drawIndirectFirstInstance); - printf("\t\t\"dualSrcBlend\": %u,\n", features->dualSrcBlend); - printf("\t\t\"fillModeNonSolid\": %u,\n", features->fillModeNonSolid); - printf("\t\t\"fragmentStoresAndAtomics\": %u,\n", features->fragmentStoresAndAtomics); - printf("\t\t\"fullDrawIndexUint32\": %u,\n", features->fullDrawIndexUint32); - printf("\t\t\"geometryShader\": %u,\n", features->geometryShader); - printf("\t\t\"imageCubeArray\": %u,\n", features->imageCubeArray); - printf("\t\t\"independentBlend\": %u,\n", features->independentBlend); - printf("\t\t\"inheritedQueries\": %u,\n", features->inheritedQueries); - printf("\t\t\"largePoints\": %u,\n", features->largePoints); - printf("\t\t\"logicOp\": %u,\n", features->logicOp); - printf("\t\t\"multiDrawIndirect\": %u,\n", features->multiDrawIndirect); - printf("\t\t\"multiViewport\": %u,\n", features->multiViewport); - printf("\t\t\"occlusionQueryPrecise\": %u,\n", features->occlusionQueryPrecise); - printf("\t\t\"pipelineStatisticsQuery\": %u,\n", features->pipelineStatisticsQuery); - printf("\t\t\"robustBufferAccess\": %u,\n", features->robustBufferAccess); - printf("\t\t\"samplerAnisotropy\": %u,\n", features->samplerAnisotropy); - printf("\t\t\"sampleRateShading\": %u,\n", features->sampleRateShading); - printf("\t\t\"shaderClipDistance\": %u,\n", features->shaderClipDistance); - printf("\t\t\"shaderCullDistance\": %u,\n", features->shaderCullDistance); - printf("\t\t\"shaderFloat64\": %u,\n", features->shaderFloat64); - printf("\t\t\"shaderImageGatherExtended\": %u,\n", features->shaderImageGatherExtended); - printf("\t\t\"shaderInt16\": %u,\n", features->shaderInt16); - printf("\t\t\"shaderInt64\": %u,\n", features->shaderInt64); - printf("\t\t\"shaderResourceMinLod\": %u,\n", features->shaderResourceMinLod); - printf("\t\t\"shaderResourceResidency\": %u,\n", features->shaderResourceResidency); - printf("\t\t\"shaderSampledImageArrayDynamicIndexing\": %u,\n", features->shaderSampledImageArrayDynamicIndexing); - printf("\t\t\"shaderStorageBufferArrayDynamicIndexing\": %u,\n", features->shaderStorageBufferArrayDynamicIndexing); - printf("\t\t\"shaderStorageImageArrayDynamicIndexing\": %u,\n", features->shaderStorageImageArrayDynamicIndexing); - printf("\t\t\"shaderStorageImageExtendedFormats\": %u,\n", features->shaderStorageImageExtendedFormats); - printf("\t\t\"shaderStorageImageMultisample\": %u,\n", features->shaderStorageImageMultisample); - printf("\t\t\"shaderStorageImageReadWithoutFormat\": %u,\n", features->shaderStorageImageReadWithoutFormat); - printf("\t\t\"shaderStorageImageWriteWithoutFormat\": %u,\n", features->shaderStorageImageWriteWithoutFormat); - printf("\t\t\"shaderTessellationAndGeometryPointSize\": %u,\n", features->shaderTessellationAndGeometryPointSize); - printf("\t\t\"shaderUniformBufferArrayDynamicIndexing\": %u,\n", features->shaderUniformBufferArrayDynamicIndexing); - printf("\t\t\"sparseBinding\": %u,\n", features->sparseBinding); - printf("\t\t\"sparseResidency2Samples\": %u,\n", features->sparseResidency2Samples); - printf("\t\t\"sparseResidency4Samples\": %u,\n", features->sparseResidency4Samples); - printf("\t\t\"sparseResidency8Samples\": %u,\n", features->sparseResidency8Samples); - printf("\t\t\"sparseResidency16Samples\": %u,\n", features->sparseResidency16Samples); - printf("\t\t\"sparseResidencyAliased\": %u,\n", features->sparseResidencyAliased); - printf("\t\t\"sparseResidencyBuffer\": %u,\n", features->sparseResidencyBuffer); - printf("\t\t\"sparseResidencyImage2D\": %u,\n", features->sparseResidencyImage2D); - printf("\t\t\"sparseResidencyImage3D\": %u,\n", features->sparseResidencyImage3D); - printf("\t\t\"tessellationShader\": %u,\n", features->tessellationShader); - printf("\t\t\"textureCompressionASTC_LDR\": %u,\n", features->textureCompressionASTC_LDR); - printf("\t\t\"textureCompressionBC\": %u,\n", features->textureCompressionBC); - printf("\t\t\"textureCompressionETC2\": %u,\n", features->textureCompressionETC2); - printf("\t\t\"variableMultisampleRate\": %u,\n", features->variableMultisampleRate); - printf("\t\t\"vertexPipelineStoresAndAtomics\": %u,\n", features->vertexPipelineStoresAndAtomics); - printf("\t\t\"wideLines\": %u\n", features->wideLines); + printf("\t\t\"alphaToOne\": %u,\n", features.alphaToOne); + printf("\t\t\"depthBiasClamp\": %u,\n", features.depthBiasClamp); + printf("\t\t\"depthBounds\": %u,\n", features.depthBounds); + printf("\t\t\"depthClamp\": %u,\n", features.depthClamp); + printf("\t\t\"drawIndirectFirstInstance\": %u,\n", features.drawIndirectFirstInstance); + printf("\t\t\"dualSrcBlend\": %u,\n", features.dualSrcBlend); + printf("\t\t\"fillModeNonSolid\": %u,\n", features.fillModeNonSolid); + printf("\t\t\"fragmentStoresAndAtomics\": %u,\n", features.fragmentStoresAndAtomics); + printf("\t\t\"fullDrawIndexUint32\": %u,\n", features.fullDrawIndexUint32); + printf("\t\t\"geometryShader\": %u,\n", features.geometryShader); + printf("\t\t\"imageCubeArray\": %u,\n", features.imageCubeArray); + printf("\t\t\"independentBlend\": %u,\n", features.independentBlend); + printf("\t\t\"inheritedQueries\": %u,\n", features.inheritedQueries); + printf("\t\t\"largePoints\": %u,\n", features.largePoints); + printf("\t\t\"logicOp\": %u,\n", features.logicOp); + printf("\t\t\"multiDrawIndirect\": %u,\n", features.multiDrawIndirect); + printf("\t\t\"multiViewport\": %u,\n", features.multiViewport); + printf("\t\t\"occlusionQueryPrecise\": %u,\n", features.occlusionQueryPrecise); + printf("\t\t\"pipelineStatisticsQuery\": %u,\n", features.pipelineStatisticsQuery); + printf("\t\t\"robustBufferAccess\": %u,\n", features.robustBufferAccess); + printf("\t\t\"samplerAnisotropy\": %u,\n", features.samplerAnisotropy); + printf("\t\t\"sampleRateShading\": %u,\n", features.sampleRateShading); + printf("\t\t\"shaderClipDistance\": %u,\n", features.shaderClipDistance); + printf("\t\t\"shaderCullDistance\": %u,\n", features.shaderCullDistance); + printf("\t\t\"shaderFloat64\": %u,\n", features.shaderFloat64); + printf("\t\t\"shaderImageGatherExtended\": %u,\n", features.shaderImageGatherExtended); + printf("\t\t\"shaderInt16\": %u,\n", features.shaderInt16); + printf("\t\t\"shaderInt64\": %u,\n", features.shaderInt64); + printf("\t\t\"shaderResourceMinLod\": %u,\n", features.shaderResourceMinLod); + printf("\t\t\"shaderResourceResidency\": %u,\n", features.shaderResourceResidency); + printf("\t\t\"shaderSampledImageArrayDynamicIndexing\": %u,\n", features.shaderSampledImageArrayDynamicIndexing); + printf("\t\t\"shaderStorageBufferArrayDynamicIndexing\": %u,\n", features.shaderStorageBufferArrayDynamicIndexing); + printf("\t\t\"shaderStorageImageArrayDynamicIndexing\": %u,\n", features.shaderStorageImageArrayDynamicIndexing); + printf("\t\t\"shaderStorageImageExtendedFormats\": %u,\n", features.shaderStorageImageExtendedFormats); + printf("\t\t\"shaderStorageImageMultisample\": %u,\n", features.shaderStorageImageMultisample); + printf("\t\t\"shaderStorageImageReadWithoutFormat\": %u,\n", features.shaderStorageImageReadWithoutFormat); + printf("\t\t\"shaderStorageImageWriteWithoutFormat\": %u,\n", features.shaderStorageImageWriteWithoutFormat); + printf("\t\t\"shaderTessellationAndGeometryPointSize\": %u,\n", features.shaderTessellationAndGeometryPointSize); + printf("\t\t\"shaderUniformBufferArrayDynamicIndexing\": %u,\n", features.shaderUniformBufferArrayDynamicIndexing); + printf("\t\t\"sparseBinding\": %u,\n", features.sparseBinding); + printf("\t\t\"sparseResidency2Samples\": %u,\n", features.sparseResidency2Samples); + printf("\t\t\"sparseResidency4Samples\": %u,\n", features.sparseResidency4Samples); + printf("\t\t\"sparseResidency8Samples\": %u,\n", features.sparseResidency8Samples); + printf("\t\t\"sparseResidency16Samples\": %u,\n", features.sparseResidency16Samples); + printf("\t\t\"sparseResidencyAliased\": %u,\n", features.sparseResidencyAliased); + printf("\t\t\"sparseResidencyBuffer\": %u,\n", features.sparseResidencyBuffer); + printf("\t\t\"sparseResidencyImage2D\": %u,\n", features.sparseResidencyImage2D); + printf("\t\t\"sparseResidencyImage3D\": %u,\n", features.sparseResidencyImage3D); + printf("\t\t\"tessellationShader\": %u,\n", features.tessellationShader); + printf("\t\t\"textureCompressionASTC_LDR\": %u,\n", features.textureCompressionASTC_LDR); + printf("\t\t\"textureCompressionBC\": %u,\n", features.textureCompressionBC); + printf("\t\t\"textureCompressionETC2\": %u,\n", features.textureCompressionETC2); + printf("\t\t\"variableMultisampleRate\": %u,\n", features.variableMultisampleRate); + printf("\t\t\"vertexPipelineStoresAndAtomics\": %u,\n", features.vertexPipelineStoresAndAtomics); + printf("\t\t\"wideLines\": %u\n", features.wideLines); printf("\t}"); } + + if (CheckExtensionEnabled(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, gpu->inst->inst_extensions, + gpu->inst->inst_extensions_count)) { + void *place = gpu->features2.pNext; + while (place) { + struct VkStructureHeader *structure = (struct VkStructureHeader*) place; + if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES_KHR && CheckPhysicalDeviceExtensionIncluded(VK_KHR_16BIT_STORAGE_EXTENSION_NAME, gpu->device_extensions, gpu->device_extension_count)) { + VkPhysicalDevice16BitStorageFeaturesKHR *b16_store_features = (VkPhysicalDevice16BitStorageFeaturesKHR*)structure; + if (html_output) { + fprintf(out, "\n\t\t\t\t\t<details><summary>VkPhysicalDevice16BitStorageFeatures</summary>\n"); + fprintf(out, "\t\t\t\t\t\t<details><summary>storageBuffer16BitAccess = <div class='val'>%u</div></summary></details>\n", b16_store_features->storageBuffer16BitAccess ); + fprintf(out, "\t\t\t\t\t\t<details><summary>uniformAndStorageBuffer16BitAccess = <div class='val'>%u</div></summary></details>\n", b16_store_features->uniformAndStorageBuffer16BitAccess); + fprintf(out, "\t\t\t\t\t\t<details><summary>storagePushConstant16 = <div class='val'>%u</div></summary></details>\n", b16_store_features->storagePushConstant16 ); + fprintf(out, "\t\t\t\t\t\t<details><summary>storageInputOutput16 = <div class='val'>%u</div></summary></details>\n", b16_store_features->storageInputOutput16 ); + fprintf(out, "\t\t\t\t\t</details>\n"); + } else if (human_readable_output) { + printf("\nVkPhysicalDevice16BitStorageFeatures:\n"); + printf("=====================================\n"); + printf("\tstorageBuffer16BitAccess = %u\n", b16_store_features->storageBuffer16BitAccess ); + printf("\tuniformAndStorageBuffer16BitAccess = %u\n", b16_store_features->uniformAndStorageBuffer16BitAccess); + printf("\tstoragePushConstant16 = %u\n", b16_store_features->storagePushConstant16 ); + printf("\tstorageInputOutput16 = %u\n", b16_store_features->storageInputOutput16 ); + } + } else if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES_KHR && CheckPhysicalDeviceExtensionIncluded(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME, gpu->device_extensions, gpu->device_extension_count)) { + VkPhysicalDeviceSamplerYcbcrConversionFeaturesKHR *sampler_ycbcr_features = (VkPhysicalDeviceSamplerYcbcrConversionFeaturesKHR*)structure; + if (html_output) { + fprintf(out, "\n\t\t\t\t\t<details><summary>VkPhysicalDeviceSamplerYcbcrConversionFeatures</summary>\n"); + fprintf(out, "\t\t\t\t\t\t<details><summary>samplerYcbcrConversion = <div class='val'>%u</div></summary></details>\n", sampler_ycbcr_features->samplerYcbcrConversion); + fprintf(out, "\t\t\t\t\t</details>\n"); + } + else if (human_readable_output) { + printf("\nVkPhysicalDeviceSamplerYcbcrConversionFeatures:\n"); + printf("===============================================\n"); + printf("\tsamplerYcbcrConversion = %u\n", sampler_ycbcr_features->samplerYcbcrConversion); + } + } else if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES_KHR && CheckPhysicalDeviceExtensionIncluded(VK_KHR_VARIABLE_POINTERS_EXTENSION_NAME, gpu->device_extensions, gpu->device_extension_count)) { + VkPhysicalDeviceVariablePointerFeaturesKHR *var_pointer_features = (VkPhysicalDeviceVariablePointerFeaturesKHR*)structure; + if (html_output) { + fprintf(out, "\n\t\t\t\t\t<details><summary>VkPhysicalDeviceVariablePointerFeatures</summary>\n"); + fprintf(out, "\t\t\t\t\t\t<details><summary>variablePointersStorageBuffer = <div class='val'>%u</div></summary></details>\n", var_pointer_features->variablePointersStorageBuffer); + fprintf(out, "\t\t\t\t\t\t<details><summary>variablePointers = <div class='val'>%u</div></summary></details>\n", var_pointer_features->variablePointers ); + fprintf(out, "\t\t\t\t\t</details>\n"); + } + else if (human_readable_output) { + printf("\nVkPhysicalDeviceVariablePointerFeatures:\n"); + printf("========================================\n"); + printf("\tvariablePointersStorageBuffer = %u\n", var_pointer_features->variablePointersStorageBuffer); + printf("\tvariablePointers = %u\n", var_pointer_features->variablePointers ); + } + } else if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT && CheckPhysicalDeviceExtensionIncluded(VK_EXT_BLEND_OPERATION_ADVANCED_EXTENSION_NAME, gpu->device_extensions, gpu->device_extension_count)) { + VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT *blend_op_adv_features = (VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT*)structure; + if (html_output) { + fprintf(out, "\n\t\t\t\t\t<details><summary>VkPhysicalDeviceBlendOperationAdvancedFeatures</summary>\n"); + fprintf(out, "\t\t\t\t\t\t<details><summary>advancedBlendCoherentOperations = <div class='val'>%u</div></summary></details>\n", blend_op_adv_features->advancedBlendCoherentOperations); + fprintf(out, "\t\t\t\t\t</details>\n"); + } + else if (human_readable_output) { + printf("\nVkPhysicalDeviceBlendOperationAdvancedFeatures:\n"); + printf("===============================================\n"); + printf("\tadvancedBlendCoherentOperations = %u\n", blend_op_adv_features->advancedBlendCoherentOperations); + } + } + place = structure->pNext; + } + } } static void AppDumpSparseProps(const VkPhysicalDeviceSparseProperties *sparse_props, FILE *out) { @@ -2190,8 +2344,18 @@ static void AppDumpLimits(const VkPhysicalDeviceLimits *limits, FILE *out) { } static void AppGpuDumpProps(const struct AppGpu *gpu, FILE *out) { - const VkPhysicalDeviceProperties *props = &gpu->props; - const uint32_t apiVersion = props->apiVersion; + VkPhysicalDeviceProperties props; + + if (CheckExtensionEnabled(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, gpu->inst->inst_extensions, + gpu->inst->inst_extensions_count)) { + const VkPhysicalDeviceProperties *props2_const = &gpu->props2.properties; + props = *props2_const; + } + else { + const VkPhysicalDeviceProperties *props_const = &gpu->props; + props = *props_const; + } + const uint32_t apiVersion = props.apiVersion; const uint32_t major = VK_VERSION_MAJOR(apiVersion); const uint32_t minor = VK_VERSION_MINOR(apiVersion); const uint32_t patch = VK_VERSION_PATCH(apiVersion); @@ -2199,33 +2363,38 @@ static void AppGpuDumpProps(const struct AppGpu *gpu, FILE *out) { if (html_output) { fprintf(out, "\t\t\t\t\t<details><summary>VkPhysicalDeviceProperties</summary>\n"); fprintf(out, "\t\t\t\t\t\t<details><summary>apiVersion = <div class='val'>0x%" PRIxLEAST32 "</div> (<div class='val'>%d.%d.%d</div>)</summary></details>\n", apiVersion, major, minor, patch); - fprintf(out, "\t\t\t\t\t\t<details><summary>driverVersion = <div class='val'>%u</div> (<div class='val'>0x%" PRIxLEAST32 "</div>)</summary></details>\n", props->driverVersion, props->driverVersion); - fprintf(out, "\t\t\t\t\t\t<details><summary>vendorID = <div class='val'>0x%04x</div></summary></details>\n", props->vendorID); - fprintf(out, "\t\t\t\t\t\t<details><summary>deviceID = <div class='val'>0x%04x</div></summary></details>\n", props->deviceID); - fprintf(out, "\t\t\t\t\t\t<details><summary>deviceType = %s</summary></details>\n", VkPhysicalDeviceTypeString(props->deviceType)); - fprintf(out, "\t\t\t\t\t\t<details><summary>deviceName = %s</summary></details>\n", props->deviceName); + fprintf(out, "\t\t\t\t\t\t<details><summary>driverVersion = <div class='val'>%u</div> (<div class='val'>0x%" PRIxLEAST32 "</div>)</summary></details>\n", props.driverVersion, props.driverVersion); + fprintf(out, "\t\t\t\t\t\t<details><summary>vendorID = <div class='val'>0x%04x</div></summary></details>\n", props.vendorID); + fprintf(out, "\t\t\t\t\t\t<details><summary>deviceID = <div class='val'>0x%04x</div></summary></details>\n", props.deviceID); + fprintf(out, "\t\t\t\t\t\t<details><summary>deviceType = %s</summary></details>\n", VkPhysicalDeviceTypeString(props.deviceType)); + fprintf(out, "\t\t\t\t\t\t<details><summary>deviceName = %s</summary></details>\n", props.deviceName); fprintf(out, "\t\t\t\t\t</details>\n"); } else if (human_readable_output) { printf("VkPhysicalDeviceProperties:\n"); printf("===========================\n"); printf("\tapiVersion = 0x%" PRIxLEAST32 " (%d.%d.%d)\n", apiVersion, major, minor, patch); - printf("\tdriverVersion = %u (0x%" PRIxLEAST32 ")\n", props->driverVersion, props->driverVersion); - printf("\tvendorID = 0x%04x\n", props->vendorID); - printf("\tdeviceID = 0x%04x\n", props->deviceID); - printf("\tdeviceType = %s\n", VkPhysicalDeviceTypeString(props->deviceType)); - printf("\tdeviceName = %s\n", props->deviceName); + printf("\tdriverVersion = %u (0x%" PRIxLEAST32 ")\n", props.driverVersion, props.driverVersion); + printf("\tvendorID = 0x%04x\n", props.vendorID); + printf("\tdeviceID = 0x%04x\n", props.deviceID); + printf("\tdeviceType = %s\n", VkPhysicalDeviceTypeString(props.deviceType)); + printf("\tdeviceName = %s\n", props.deviceName); } if (json_output) { printf(",\n"); printf("\t\"VkPhysicalDeviceProperties\": {\n"); printf("\t\t\"apiVersion\": %u,\n", apiVersion); - printf("\t\t\"deviceID\": %u,\n", props->deviceID); - printf("\t\t\"deviceName\": \"%s\",\n", props->deviceName); - printf("\t\t\"deviceType\": %u,\n", props->deviceType); - printf("\t\t\"driverVersion\": %u", props->driverVersion); + printf("\t\t\"deviceID\": %u,\n", props.deviceID); + printf("\t\t\"deviceName\": \"%s\",\n", props.deviceName); + printf("\t\t\"deviceType\": %u,\n", props.deviceType); + printf("\t\t\"driverVersion\": %u", props.driverVersion); } - AppDumpLimits(&gpu->props.limits, out); + if (CheckExtensionEnabled(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, gpu->inst->inst_extensions, gpu->inst->inst_extensions_count)) { + AppDumpLimits(&gpu->props2.properties.limits, out); + } + else { + AppDumpLimits(&gpu->props.limits, out); + } // Dump pipeline cache UUIDs to json if (json_output) { @@ -2236,20 +2405,93 @@ static void AppGpuDumpProps(const struct AppGpu *gpu, FILE *out) { printf(","); } printf("\n"); - printf("\t\t\t%u", props->pipelineCacheUUID[i]); + printf("\t\t\t%u", props.pipelineCacheUUID[i]); } printf("\n"); printf("\t\t]"); } - AppDumpSparseProps(&gpu->props.sparseProperties, out); + if (CheckExtensionEnabled(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, gpu->inst->inst_extensions, gpu->inst->inst_extensions_count)) { + AppDumpSparseProps(&gpu->props2.properties.sparseProperties, out); + } + else { + AppDumpSparseProps(&gpu->props.sparseProperties, out); + } if (json_output) { printf(",\n"); - printf("\t\t\"vendorID\": %u\n", props->vendorID); + printf("\t\t\"vendorID\": %u\n", props.vendorID); printf("\t}"); } + if (CheckExtensionEnabled(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, gpu->inst->inst_extensions, + gpu->inst->inst_extensions_count)) { + void *place = gpu->props2.pNext; + while (place) { + struct VkStructureHeader *structure = (struct VkStructureHeader*) place; + if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT && CheckPhysicalDeviceExtensionIncluded(VK_EXT_BLEND_OPERATION_ADVANCED_EXTENSION_NAME, gpu->device_extensions, gpu->device_extension_count)) { + VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT *blend_op_adv_props = (VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT*)structure; + if (html_output) { + fprintf(out, "\n\t\t\t\t\t<details><summary>VkPhysicalDeviceBlendOperationAdvancedProperties</summary>\n"); + fprintf(out, "\t\t\t\t\t\t<details><summary>advancedBlendMaxColorAttachments = <div class='val'>%u</div></summary></details>\n", blend_op_adv_props->advancedBlendMaxColorAttachments ); + fprintf(out, "\t\t\t\t\t\t<details><summary>advancedBlendIndependentBlend = <div class='val'>%u</div></summary></details>\n", blend_op_adv_props->advancedBlendIndependentBlend ); + fprintf(out, "\t\t\t\t\t\t<details><summary>advancedBlendNonPremultipliedSrcColor = <div class='val'>%u</div></summary></details>\n", blend_op_adv_props->advancedBlendNonPremultipliedSrcColor); + fprintf(out, "\t\t\t\t\t\t<details><summary>advancedBlendNonPremultipliedDstColor = <div class='val'>%u</div></summary></details>\n", blend_op_adv_props->advancedBlendNonPremultipliedDstColor); + fprintf(out, "\t\t\t\t\t\t<details><summary>advancedBlendCorrelatedOverlap = <div class='val'>%u</div></summary></details>\n", blend_op_adv_props->advancedBlendCorrelatedOverlap ); + fprintf(out, "\t\t\t\t\t\t<details><summary>advancedBlendAllOperations = <div class='val'>%u</div></summary></details>\n", blend_op_adv_props->advancedBlendAllOperations ); + fprintf(out, "\t\t\t\t\t</details>\n"); + } + else if (human_readable_output) { + printf("\nVkPhysicalDeviceBlendOperationAdvancedProperties:\n"); + printf("=================================================\n"); + printf("\tadvancedBlendMaxColorAttachments = %u\n", blend_op_adv_props->advancedBlendMaxColorAttachments ); + printf("\tadvancedBlendIndependentBlend = %u\n", blend_op_adv_props->advancedBlendIndependentBlend ); + printf("\tadvancedBlendNonPremultipliedSrcColor = %u\n", blend_op_adv_props->advancedBlendNonPremultipliedSrcColor); + printf("\tadvancedBlendNonPremultipliedDstColor = %u\n", blend_op_adv_props->advancedBlendNonPremultipliedDstColor); + printf("\tadvancedBlendCorrelatedOverlap = %u\n", blend_op_adv_props->advancedBlendCorrelatedOverlap ); + printf("\tadvancedBlendAllOperations = %u\n", blend_op_adv_props->advancedBlendAllOperations ); + } + } else if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES_KHR && CheckPhysicalDeviceExtensionIncluded(VK_KHR_MAINTENANCE2_EXTENSION_NAME, gpu->device_extensions, gpu->device_extension_count)) { + VkPhysicalDevicePointClippingPropertiesKHR *pt_clip_props = (VkPhysicalDevicePointClippingPropertiesKHR*)structure; + if (html_output) { + fprintf(out, "\n\t\t\t\t\t<details><summary>VkPhysicalDevicePointClippingProperties</summary>\n"); + fprintf(out, "\t\t\t\t\t\t<details><summary>pointClippingBehavior = <div class='val'>%u</div></summary></details>\n", pt_clip_props->pointClippingBehavior); + fprintf(out, "\t\t\t\t\t</details>\n"); + } + else if (human_readable_output) { + printf("\nVkPhysicalDevicePointClippingProperties:\n"); + printf("========================================\n"); + printf("\tpointClippingBehavior = %u\n", pt_clip_props->pointClippingBehavior); + } + } else if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR && CheckPhysicalDeviceExtensionIncluded(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME, gpu->device_extensions, gpu->device_extension_count)) { + VkPhysicalDevicePushDescriptorPropertiesKHR *push_desc_props = (VkPhysicalDevicePushDescriptorPropertiesKHR*)structure; + if (html_output) { + fprintf(out, "\n\t\t\t\t\t<details><summary>VkPhysicalDevicePushDescriptorProperties</summary>\n"); + fprintf(out, "\t\t\t\t\t\t<details><summary>maxPushDescriptors = <div class='val'>%u</div></summary></details>\n", push_desc_props->maxPushDescriptors); + fprintf(out, "\t\t\t\t\t</details>\n"); + } + else if (human_readable_output) { + printf("\nVkPhysicalDevicePushDescriptorProperties:\n"); + printf("=========================================\n"); + printf("\tmaxPushDescriptors = %u\n", push_desc_props->maxPushDescriptors); + } + } else if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT && CheckPhysicalDeviceExtensionIncluded(VK_EXT_DISCARD_RECTANGLES_EXTENSION_NAME, gpu->device_extensions, gpu->device_extension_count)) { + VkPhysicalDeviceDiscardRectanglePropertiesEXT *discard_rect_props = (VkPhysicalDeviceDiscardRectanglePropertiesEXT*)structure; + if (html_output) { + fprintf(out, "\n\t\t\t\t\t<details><summary>VkPhysicalDeviceDiscardRectangleProperties</summary>\n"); + fprintf(out, "\t\t\t\t\t\t<details><summary>maxDiscardRectangles = <div class='val'>%u</div></summary></details>\n", discard_rect_props->maxDiscardRectangles); + fprintf(out, "\t\t\t\t\t</details>\n"); + } + else if (human_readable_output) { + printf("\nVkPhysicalDeviceDiscardRectangleProperties:\n"); + printf("=========================================\n"); + printf("\tmaxDiscardRectangles = %u\n", discard_rect_props->maxDiscardRectangles); + } + } + place = structure->pNext; + } + } + fflush(out); fflush(stdout); } @@ -2328,7 +2570,17 @@ static void AppDumpExtensions(const char *indent, const char *layer_name, const } static void AppGpuDumpQueueProps(const struct AppGpu *gpu, uint32_t id, FILE *out) { - const VkQueueFamilyProperties *props = &gpu->queue_props[id]; + VkQueueFamilyProperties props; + + if (CheckExtensionEnabled(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, gpu->inst->inst_extensions, + gpu->inst->inst_extensions_count)) { + const VkQueueFamilyProperties *props2_const = &gpu->queue_props2[id].queueFamilyProperties; + props = *props2_const; + } + else { + const VkQueueFamilyProperties *props_const = &gpu->queue_props[id]; + props = *props_const; + } if (html_output) { fprintf(out, "\t\t\t\t\t<details><summary>VkQueueFamilyProperties[<div class='val'>%d</div>]</summary>\n", id); @@ -2340,47 +2592,47 @@ static void AppGpuDumpQueueProps(const struct AppGpu *gpu, uint32_t id, FILE *ou } if (html_output || human_readable_output) { char *sep = ""; // separator character - if (props->queueFlags & VK_QUEUE_GRAPHICS_BIT) { + if (props.queueFlags & VK_QUEUE_GRAPHICS_BIT) { fprintf(out, "GRAPHICS"); sep = " | "; } - if (props->queueFlags & VK_QUEUE_COMPUTE_BIT) { + if (props.queueFlags & VK_QUEUE_COMPUTE_BIT) { fprintf(out, "%sCOMPUTE", sep); sep = " | "; } - if (props->queueFlags & VK_QUEUE_TRANSFER_BIT) { + if (props.queueFlags & VK_QUEUE_TRANSFER_BIT) { fprintf(out, "%sTRANSFER", sep); sep = " | "; } - if (props->queueFlags & VK_QUEUE_SPARSE_BINDING_BIT) { + if (props.queueFlags & VK_QUEUE_SPARSE_BINDING_BIT) { fprintf(out, "%sSPARSE", sep); } } if (html_output) { fprintf(out, "</summary></details>\n"); - fprintf(out, "\t\t\t\t\t\t<details><summary>queueCount = <div class='val'>%u</div></summary></details>\n", props->queueCount); - fprintf(out, "\t\t\t\t\t\t<details><summary>timestampValidBits = <div class='val'>%u</div></summary></details>\n", props->timestampValidBits); + fprintf(out, "\t\t\t\t\t\t<details><summary>queueCount = <div class='val'>%u</div></summary></details>\n", props.queueCount); + fprintf(out, "\t\t\t\t\t\t<details><summary>timestampValidBits = <div class='val'>%u</div></summary></details>\n", props.timestampValidBits); fprintf(out, "\t\t\t\t\t\t<details><summary>minImageTransferGranularity = (<div class='val'>%d</div>, <div class='val'>%d</div>, <div class='val'>%d</div>)</summary></details>\n", - props->minImageTransferGranularity.width, props->minImageTransferGranularity.height, props->minImageTransferGranularity.depth); + props.minImageTransferGranularity.width, props.minImageTransferGranularity.height, props.minImageTransferGranularity.depth); fprintf(out, "\t\t\t\t\t</details>\n"); } else if (human_readable_output) { printf("\n"); - printf("\tqueueCount = %u\n", props->queueCount); - printf("\ttimestampValidBits = %u\n", props->timestampValidBits); - printf("\tminImageTransferGranularity = (%d, %d, %d)\n", props->minImageTransferGranularity.width, - props->minImageTransferGranularity.height, props->minImageTransferGranularity.depth); + printf("\tqueueCount = %u\n", props.queueCount); + printf("\ttimestampValidBits = %u\n", props.timestampValidBits); + printf("\tminImageTransferGranularity = (%d, %d, %d)\n", props.minImageTransferGranularity.width, + props.minImageTransferGranularity.height, props.minImageTransferGranularity.depth); } if (json_output) { printf("\t\t{\n"); printf("\t\t\t\"minImageTransferGranularity\": {\n"); - printf("\t\t\t\t\"depth\": %u,\n", props->minImageTransferGranularity.depth); - printf("\t\t\t\t\"height\": %u,\n", props->minImageTransferGranularity.height); - printf("\t\t\t\t\"width\": %u\n", props->minImageTransferGranularity.width); + printf("\t\t\t\t\"depth\": %u,\n", props.minImageTransferGranularity.depth); + printf("\t\t\t\t\"height\": %u,\n", props.minImageTransferGranularity.height); + printf("\t\t\t\t\"width\": %u\n", props.minImageTransferGranularity.width); printf("\t\t\t},\n"); - printf("\t\t\t\"queueCount\": %u,\n", props->queueCount); - printf("\t\t\t\"queueFlags\": %u,\n", props->queueFlags); - printf("\t\t\t\"timestampValidBits\": %u\n", props->timestampValidBits); + printf("\t\t\t\"queueCount\": %u,\n", props.queueCount); + printf("\t\t\t\"queueFlags\": %u,\n", props.queueFlags); + printf("\t\t\t\"timestampValidBits\": %u\n", props.timestampValidBits); printf("\t\t}"); } @@ -2412,26 +2664,36 @@ static char *HumanReadable(const size_t sz) { } static void AppGpuDumpMemoryProps(const struct AppGpu *gpu, FILE *out) { - const VkPhysicalDeviceMemoryProperties *props = &gpu->memory_props; + VkPhysicalDeviceMemoryProperties props; + + if (CheckExtensionEnabled(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, gpu->inst->inst_extensions, + gpu->inst->inst_extensions_count)) { + const VkPhysicalDeviceMemoryProperties *props2_const = &gpu->memory_props2.memoryProperties; + props = *props2_const; + } + else { + const VkPhysicalDeviceMemoryProperties *props_const = &gpu->memory_props; + props = *props_const; + } if (html_output) { fprintf(out, "\t\t\t\t\t<details><summary>VkPhysicalDeviceMemoryProperties</summary>\n"); - fprintf(out, "\t\t\t\t\t\t<details><summary>memoryHeapCount = <div class='val'>%u</div></summary>", props->memoryHeapCount); - if (props->memoryHeapCount > 0) { + fprintf(out, "\t\t\t\t\t\t<details><summary>memoryHeapCount = <div class='val'>%u</div></summary>", props.memoryHeapCount); + if (props.memoryHeapCount > 0) { fprintf(out, "\n"); } } else if (human_readable_output) { printf("VkPhysicalDeviceMemoryProperties:\n"); printf("=================================\n"); - printf("\tmemoryHeapCount = %u\n", props->memoryHeapCount); + printf("\tmemoryHeapCount = %u\n", props.memoryHeapCount); } if (json_output) { printf(",\n"); printf("\t\"VkPhysicalDeviceMemoryProperties\": {\n"); printf("\t\t\"memoryHeaps\": ["); } - for (uint32_t i = 0; i < props->memoryHeapCount; ++i) { - const VkDeviceSize memSize = props->memoryHeaps[i].size; + for (uint32_t i = 0; i < props.memoryHeapCount; ++i) { + const VkDeviceSize memSize = props.memoryHeaps[i].size; char *mem_size_human_readable = HumanReadable((const size_t)memSize); if (html_output) { @@ -2445,7 +2707,7 @@ static void AppGpuDumpMemoryProps(const struct AppGpu *gpu, FILE *out) { } free(mem_size_human_readable); - const VkMemoryHeapFlags heap_flags = props->memoryHeaps[i].flags; + const VkMemoryHeapFlags heap_flags = props.memoryHeaps[i].flags; if (html_output) { fprintf(out, "\t\t\t\t\t\t\t\t<details open><summary>flags</summary>\n"); fprintf(out, "\t\t\t\t\t\t\t\t\t<details><summary>"); @@ -2469,44 +2731,44 @@ static void AppGpuDumpMemoryProps(const struct AppGpu *gpu, FILE *out) { } } if (html_output) { - if (props->memoryHeapCount > 0) { + if (props.memoryHeapCount > 0) { fprintf(out, "\t\t\t\t\t\t"); } fprintf(out, "</details>\n"); } if (json_output) { - if (props->memoryHeapCount > 0) { + if (props.memoryHeapCount > 0) { printf("\n\t\t"); } printf("]"); } if (html_output) { - fprintf(out, "\t\t\t\t\t\t<details><summary>memoryTypeCount = <div class='val'>%u</div></summary>", props->memoryTypeCount); - if (props->memoryTypeCount > 0) { + fprintf(out, "\t\t\t\t\t\t<details><summary>memoryTypeCount = <div class='val'>%u</div></summary>", props.memoryTypeCount); + if (props.memoryTypeCount > 0) { fprintf(out, "\n"); } } else if (human_readable_output) { - printf("\tmemoryTypeCount = %u\n", props->memoryTypeCount); + printf("\tmemoryTypeCount = %u\n", props.memoryTypeCount); } if (json_output) { printf(",\n"); printf("\t\t\"memoryTypes\": ["); } - for (uint32_t i = 0; i < props->memoryTypeCount; ++i) { + for (uint32_t i = 0; i < props.memoryTypeCount; ++i) { if (html_output) { fprintf(out, "\t\t\t\t\t\t\t<details><summary>memoryTypes[<div class='val'>%u</div>]</summary>\n", i); - fprintf(out, "\t\t\t\t\t\t\t\t<details><summary>heapIndex = <div class='val'>%u</div></summary></details>\n", props->memoryTypes[i].heapIndex); - fprintf(out, "\t\t\t\t\t\t\t\t<details open><summary>propertyFlags = <div class='val'>0x%" PRIxLEAST32 "</div></summary>", props->memoryTypes[i].propertyFlags); - if (props->memoryTypes[i].propertyFlags == 0) { + fprintf(out, "\t\t\t\t\t\t\t\t<details><summary>heapIndex = <div class='val'>%u</div></summary></details>\n", props.memoryTypes[i].heapIndex); + fprintf(out, "\t\t\t\t\t\t\t\t<details open><summary>propertyFlags = <div class='val'>0x%" PRIxLEAST32 "</div></summary>", props.memoryTypes[i].propertyFlags); + if (props.memoryTypes[i].propertyFlags == 0) { fprintf(out, "</details>\n"); } else { fprintf(out, "\n"); } } else if (human_readable_output) { printf("\tmemoryTypes[%u] :\n", i); - printf("\t\theapIndex = %u\n", props->memoryTypes[i].heapIndex); - printf("\t\tpropertyFlags = 0x%" PRIxLEAST32 ":\n", props->memoryTypes[i].propertyFlags); + printf("\t\theapIndex = %u\n", props.memoryTypes[i].heapIndex); + printf("\t\tpropertyFlags = 0x%" PRIxLEAST32 ":\n", props.memoryTypes[i].propertyFlags); } if (json_output) { if (i > 0) { @@ -2514,20 +2776,20 @@ static void AppGpuDumpMemoryProps(const struct AppGpu *gpu, FILE *out) { } printf("\n"); printf("\t\t\t{\n"); - printf("\t\t\t\t\"heapIndex\": %u,\n", props->memoryTypes[i].heapIndex); - printf("\t\t\t\t\"propertyFlags\": %u\n", props->memoryTypes[i].propertyFlags); + printf("\t\t\t\t\"heapIndex\": %u,\n", props.memoryTypes[i].heapIndex); + printf("\t\t\t\t\"propertyFlags\": %u\n", props.memoryTypes[i].propertyFlags); printf("\t\t\t}"); } // Print each named flag to html or std output if it is set - const VkFlags flags = props->memoryTypes[i].propertyFlags; + const VkFlags flags = props.memoryTypes[i].propertyFlags; if (html_output) { if (flags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) fprintf(out, "\t\t\t\t\t\t\t\t\t<details><summary><div class='type'>VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT</div></summary></details>\n"); if (flags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) fprintf(out, "\t\t\t\t\t\t\t\t\t<details><summary><div class='type'>VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT</div></summary></details>\n"); if (flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) fprintf(out, "\t\t\t\t\t\t\t\t\t<details><summary><div class='type'>VK_MEMORY_PROPERTY_HOST_COHERENT_BIT</div></summary></details>\n"); if (flags & VK_MEMORY_PROPERTY_HOST_CACHED_BIT) fprintf(out, "\t\t\t\t\t\t\t\t\t<details><summary><div class='type'>VK_MEMORY_PROPERTY_HOST_CACHED_BIT</div></summary></details>\n"); if (flags & VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) fprintf(out, "\t\t\t\t\t\t\t\t\t<details><summary><div class='type'>VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT</div></summary></details>\n"); - if (props->memoryTypes[i].propertyFlags > 0) fprintf(out, "\t\t\t\t\t\t\t\t</details>\n"); + if (props.memoryTypes[i].propertyFlags > 0) fprintf(out, "\t\t\t\t\t\t\t\t</details>\n"); fprintf(out, "\t\t\t\t\t\t\t</details>\n"); } else if (human_readable_output) { if (flags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) printf("\t\t\tVK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT\n"); @@ -2538,14 +2800,14 @@ static void AppGpuDumpMemoryProps(const struct AppGpu *gpu, FILE *out) { } } if (html_output) { - if (props->memoryTypeCount > 0) { + if (props.memoryTypeCount > 0) { fprintf(out, "\t\t\t\t\t\t"); } fprintf(out, "</details>\n"); fprintf(out, "\t\t\t\t\t</details>\n"); } if (json_output) { - if (props->memoryTypeCount > 0) { + if (props.memoryTypeCount > 0) { printf("\n\t\t"); } printf("]\n"); |
