From d78e44688c0d93959e72c71d7f8e50a0000df0b1 Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 20 Aug 2025 09:59:27 +0100 Subject: [PATCH] Add support for VK_EXT_pipeline_robustness --- renderdoc/driver/vulkan/extension_support.md | 2 +- renderdoc/driver/vulkan/vk_common.h | 8 +++ renderdoc/driver/vulkan/vk_core.cpp | 4 ++ renderdoc/driver/vulkan/vk_info.cpp | 47 +++++++++++++ renderdoc/driver/vulkan/vk_info.h | 15 ++++ renderdoc/driver/vulkan/vk_next_chains.cpp | 8 ++- renderdoc/driver/vulkan/vk_serialise.cpp | 68 +++++++++++++++++-- renderdoc/driver/vulkan/vk_shader_cache.cpp | 44 +++++++++++- renderdoc/driver/vulkan/vk_stringise.cpp | 26 +++++++ .../vulkan/wrappers/vk_device_funcs.cpp | 7 ++ 10 files changed, 219 insertions(+), 10 deletions(-) diff --git a/renderdoc/driver/vulkan/extension_support.md b/renderdoc/driver/vulkan/extension_support.md index 9cafb5a1f..504825ad0 100644 --- a/renderdoc/driver/vulkan/extension_support.md +++ b/renderdoc/driver/vulkan/extension_support.md @@ -87,6 +87,7 @@ Maintainers can update this file by updating vk.xml in this folder and running ` * `VK_EXT_pci_bus_info` * `VK_EXT_pipeline_creation_cache_control` * `VK_EXT_pipeline_creation_feedback` +* `VK_EXT_pipeline_robustness` * `VK_EXT_post_depth_coverage` * `VK_EXT_present_mode_fifo_latest_ready` * `VK_EXT_primitive_topology_list_restart` @@ -309,7 +310,6 @@ The portability subset is only relevant on mac, which is not a supported platfor * `VK_EXT_physical_device_drm` * `VK_EXT_pipeline_library_group_handles` * `VK_EXT_pipeline_protected_access` -* `VK_EXT_pipeline_robustness` * `VK_EXT_shader_float8` * `VK_EXT_shader_module_identifier` * `VK_EXT_shader_replicated_composites` diff --git a/renderdoc/driver/vulkan/vk_common.h b/renderdoc/driver/vulkan/vk_common.h index 6ac1a725f..6f2981b42 100644 --- a/renderdoc/driver/vulkan/vk_common.h +++ b/renderdoc/driver/vulkan/vk_common.h @@ -1755,6 +1755,8 @@ DECLARE_REFLECTION_STRUCT(VkPhysicalDevicePerformanceQueryFeaturesKHR); DECLARE_REFLECTION_STRUCT(VkPhysicalDevicePerformanceQueryPropertiesKHR); DECLARE_REFLECTION_STRUCT(VkPhysicalDevicePipelineCreationCacheControlFeatures); DECLARE_REFLECTION_STRUCT(VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR); +DECLARE_REFLECTION_STRUCT(VkPhysicalDevicePipelineRobustnessFeaturesEXT); +DECLARE_REFLECTION_STRUCT(VkPhysicalDevicePipelineRobustnessPropertiesEXT); DECLARE_REFLECTION_STRUCT(VkPhysicalDevicePointClippingProperties); DECLARE_REFLECTION_STRUCT(VkPhysicalDevicePresentId2FeaturesKHR); DECLARE_REFLECTION_STRUCT(VkPhysicalDevicePresentIdFeaturesKHR); @@ -1866,6 +1868,7 @@ DECLARE_REFLECTION_STRUCT(VkPipelineRasterizationProvokingVertexStateCreateInfoE DECLARE_REFLECTION_STRUCT(VkPipelineRasterizationStateCreateInfo); DECLARE_REFLECTION_STRUCT(VkPipelineRasterizationStateStreamCreateInfoEXT); DECLARE_REFLECTION_STRUCT(VkPipelineRenderingCreateInfo); +DECLARE_REFLECTION_STRUCT(VkPipelineRobustnessCreateInfo); DECLARE_REFLECTION_STRUCT(VkPipelineSampleLocationsStateCreateInfoEXT); DECLARE_REFLECTION_STRUCT(VkPipelineShaderStageCreateInfo); DECLARE_REFLECTION_STRUCT(VkPipelineShaderStageRequiredSubgroupSizeCreateInfo); @@ -2273,6 +2276,8 @@ DECLARE_DESERIALISE_TYPE(VkPhysicalDevicePerformanceQueryFeaturesKHR); DECLARE_DESERIALISE_TYPE(VkPhysicalDevicePerformanceQueryPropertiesKHR); DECLARE_DESERIALISE_TYPE(VkPhysicalDevicePipelineCreationCacheControlFeatures); DECLARE_DESERIALISE_TYPE(VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR); +DECLARE_DESERIALISE_TYPE(VkPhysicalDevicePipelineRobustnessFeaturesEXT); +DECLARE_DESERIALISE_TYPE(VkPhysicalDevicePipelineRobustnessPropertiesEXT); DECLARE_DESERIALISE_TYPE(VkPhysicalDevicePointClippingProperties); DECLARE_DESERIALISE_TYPE(VkPhysicalDevicePresentId2FeaturesKHR); DECLARE_DESERIALISE_TYPE(VkPhysicalDevicePresentIdFeaturesKHR); @@ -2384,6 +2389,7 @@ DECLARE_DESERIALISE_TYPE(VkPipelineRasterizationProvokingVertexStateCreateInfoEX DECLARE_DESERIALISE_TYPE(VkPipelineRasterizationStateCreateInfo); DECLARE_DESERIALISE_TYPE(VkPipelineRasterizationStateStreamCreateInfoEXT); DECLARE_DESERIALISE_TYPE(VkPipelineRenderingCreateInfo); +DECLARE_DESERIALISE_TYPE(VkPipelineRobustnessCreateInfo); DECLARE_DESERIALISE_TYPE(VkPipelineSampleLocationsStateCreateInfoEXT); DECLARE_DESERIALISE_TYPE(VkPipelineShaderStageCreateInfo); DECLARE_DESERIALISE_TYPE(VkPipelineShaderStageRequiredSubgroupSizeCreateInfo); @@ -2791,6 +2797,8 @@ DECLARE_REFLECTION_ENUM(VkPipelineCreationFeedbackFlagBits); DECLARE_REFLECTION_ENUM(VkPipelineDepthStencilStateCreateFlagBits); DECLARE_REFLECTION_ENUM(VkPipelineExecutableStatisticFormatKHR); DECLARE_REFLECTION_ENUM(VkPipelineLayoutCreateFlagBits); +DECLARE_REFLECTION_ENUM(VkPipelineRobustnessBufferBehavior); +DECLARE_REFLECTION_ENUM(VkPipelineRobustnessImageBehavior); DECLARE_REFLECTION_ENUM(VkPipelineShaderStageCreateFlagBits); DECLARE_REFLECTION_ENUM(VkPipelineStageFlagBits); DECLARE_REFLECTION_ENUM(VkPipelineStageFlagBits2); diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index 85b6fc392..5ef85d4da 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -1278,6 +1278,10 @@ static const VkExtensionProperties supportedExtensions[] = { VK_EXT_PIPELINE_CREATION_FEEDBACK_EXTENSION_NAME, VK_EXT_PIPELINE_CREATION_FEEDBACK_SPEC_VERSION, }, + { + VK_EXT_PIPELINE_ROBUSTNESS_EXTENSION_NAME, + VK_EXT_PIPELINE_ROBUSTNESS_SPEC_VERSION, + }, { VK_EXT_POST_DEPTH_COVERAGE_EXTENSION_NAME, VK_EXT_POST_DEPTH_COVERAGE_SPEC_VERSION, diff --git a/renderdoc/driver/vulkan/vk_info.cpp b/renderdoc/driver/vulkan/vk_info.cpp index 385558d52..705dde3b8 100644 --- a/renderdoc/driver/vulkan/vk_info.cpp +++ b/renderdoc/driver/vulkan/vk_info.cpp @@ -1262,6 +1262,13 @@ void VulkanCreationInfo::Pipeline::Init(VulkanResourceManager *resourceMan, dynamicStates[VkDynamicScissor] = false; } + vertexInputRobustness = VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DEVICE_DEFAULT; + const VkPipelineRobustnessCreateInfo *robustness = + (const VkPipelineRobustnessCreateInfo *)FindNextStruct( + pCreateInfo, VK_STRUCTURE_TYPE_PIPELINE_ROBUSTNESS_CREATE_INFO); + if(robustness) + vertexInputRobustness = robustness->vertexInputs; + // VkPipelineShaderStageCreateInfo for(uint32_t i = 0; i < pCreateInfo->stageCount; i++) { @@ -1272,6 +1279,26 @@ void VulkanCreationInfo::Pipeline::Init(VulkanResourceManager *resourceMan, ShaderEntry &shad = shaders[stageIndex]; + shad.storageBufferRobustness = shad.uniformBufferRobustness = + VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DEVICE_DEFAULT; + shad.imageRobustness = VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_DEVICE_DEFAULT; + + const VkPipelineRobustnessCreateInfo *shaderRobustness = + (const VkPipelineRobustnessCreateInfo *)FindNextStruct( + &pCreateInfo->pStages[i], VK_STRUCTURE_TYPE_PIPELINE_ROBUSTNESS_CREATE_INFO); + + // If VkPipelineRobustnessCreateInfo is specified for both a pipeline and a pipeline stage, the + // VkPipelineRobustnessCreateInfo specified for the pipeline stage will take precedence. + if(shaderRobustness == NULL) + shaderRobustness = robustness; + + if(shaderRobustness) + { + shad.storageBufferRobustness = shaderRobustness->storageBuffers; + shad.uniformBufferRobustness = shaderRobustness->uniformBuffers; + shad.imageRobustness = shaderRobustness->images; + } + const VkPipelineShaderStageRequiredSubgroupSizeCreateInfo *subgroupSize = (const VkPipelineShaderStageRequiredSubgroupSizeCreateInfo *)FindNextStruct( &pCreateInfo->pStages[i], @@ -1903,11 +1930,31 @@ void VulkanCreationInfo::Pipeline::Init(VulkanResourceManager *resourceMan, Vulk // need to figure out which states are valid to be NULL + // If VkPipelineRobustnessCreateInfo is specified for both a pipeline and a pipeline stage, the + // VkPipelineRobustnessCreateInfo specified for the pipeline stage will take precedence. + const VkPipelineRobustnessCreateInfo *shaderRobustness = + (const VkPipelineRobustnessCreateInfo *)FindNextStruct( + &pCreateInfo->stage, VK_STRUCTURE_TYPE_PIPELINE_ROBUSTNESS_CREATE_INFO); + + if(shaderRobustness == NULL) + shaderRobustness = (const VkPipelineRobustnessCreateInfo *)FindNextStruct( + pCreateInfo, VK_STRUCTURE_TYPE_PIPELINE_ROBUSTNESS_CREATE_INFO); + // VkPipelineShaderStageCreateInfo { ResourceId shadid = GetResID(pCreateInfo->stage.module); ShaderEntry &shad = shaders[5]; // 5 is the compute shader's index (VS, TCS, TES, GS, FS, CS) + shad.storageBufferRobustness = shad.uniformBufferRobustness = + VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DEVICE_DEFAULT; + shad.imageRobustness = VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_DEVICE_DEFAULT; + if(shaderRobustness) + { + shad.storageBufferRobustness = shaderRobustness->storageBuffers; + shad.uniformBufferRobustness = shaderRobustness->uniformBuffers; + shad.imageRobustness = shaderRobustness->images; + } + const VkPipelineShaderStageRequiredSubgroupSizeCreateInfo *subgroupSize = (const VkPipelineShaderStageRequiredSubgroupSizeCreateInfo *)FindNextStruct( &pCreateInfo->stage, diff --git a/renderdoc/driver/vulkan/vk_info.h b/renderdoc/driver/vulkan/vk_info.h index e2e83e136..391de979b 100644 --- a/renderdoc/driver/vulkan/vk_info.h +++ b/renderdoc/driver/vulkan/vk_info.h @@ -251,6 +251,18 @@ struct VulkanCreationInfo // VkPipelineShaderStageRequiredSubgroupSizeCreateInfo uint32_t requiredSubgroupSize = 0; + + // VkPipelineRobustnessCreateInfo + VkPipelineRobustnessBufferBehavior storageBufferRobustness; + VkPipelineRobustnessBufferBehavior uniformBufferRobustness; + VkPipelineRobustnessImageBehavior imageRobustness; + + bool HasRobustness() const + { + return storageBufferRobustness != VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DEVICE_DEFAULT || + uniformBufferRobustness != VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DEVICE_DEFAULT || + imageRobustness != VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_DEVICE_DEFAULT; + } }; struct Pipeline @@ -446,6 +458,9 @@ struct VulkanCreationInfo // VkPipelineRasterizationProvokingVertexStateCreateInfoEXT VkProvokingVertexModeEXT provokingVertex; + + // VkPipelineRobustnessCreateInfo + VkPipelineRobustnessBufferBehavior vertexInputRobustness; }; std::unordered_map m_Pipeline; diff --git a/renderdoc/driver/vulkan/vk_next_chains.cpp b/renderdoc/driver/vulkan/vk_next_chains.cpp index bb744cddd..0a2f948f8 100644 --- a/renderdoc/driver/vulkan/vk_next_chains.cpp +++ b/renderdoc/driver/vulkan/vk_next_chains.cpp @@ -443,6 +443,10 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, VkPhysicalDevicePipelineCreationCacheControlFeatures); \ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR, \ VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR) \ + COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_FEATURES, \ + VkPhysicalDevicePipelineRobustnessFeatures) \ + COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_PROPERTIES, \ + VkPhysicalDevicePipelineRobustnessProperties) \ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES, \ VkPhysicalDevicePointClippingProperties); \ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_FEATURES_KHR, \ @@ -649,6 +653,7 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, VkPipelineRasterizationStateCreateInfo); \ COPY_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT, \ VkPipelineRasterizationStateStreamCreateInfoEXT); \ + COPY_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_ROBUSTNESS_CREATE_INFO, VkPipelineRobustnessCreateInfo); \ COPY_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT, \ VkPipelineSampleLocationsStateCreateInfoEXT); \ COPY_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, VkPipelineShaderStageCreateInfo); \ @@ -1233,8 +1238,6 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_OPACITY_MICROMAP_FEATURES_ARM: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_PROPERTIES_FEATURES_EXT: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_PROTECTED_ACCESS_FEATURES: \ - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_FEATURES: \ - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_PROPERTIES: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_BARRIER_FEATURES_NV: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_QUEUE_FAMILY_DATA_GRAPH_PROCESSING_ENGINE_INFO_ARM: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAW_ACCESS_CHAINS_FEATURES_NV: \ @@ -1307,7 +1310,6 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, case VK_STRUCTURE_TYPE_PIPELINE_PROPERTIES_IDENTIFIER_EXT: \ case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_RASTERIZATION_ORDER_AMD: \ case VK_STRUCTURE_TYPE_PIPELINE_REPRESENTATIVE_FRAGMENT_TEST_STATE_CREATE_INFO_NV: \ - case VK_STRUCTURE_TYPE_PIPELINE_ROBUSTNESS_CREATE_INFO: \ case VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_MODULE_IDENTIFIER_CREATE_INFO_EXT: \ case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_COARSE_SAMPLE_ORDER_STATE_CREATE_INFO_NV: \ case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_DEPTH_CLAMP_CONTROL_CREATE_INFO_EXT: \ diff --git a/renderdoc/driver/vulkan/vk_serialise.cpp b/renderdoc/driver/vulkan/vk_serialise.cpp index 03fc162f6..b991a8e22 100644 --- a/renderdoc/driver/vulkan/vk_serialise.cpp +++ b/renderdoc/driver/vulkan/vk_serialise.cpp @@ -853,6 +853,13 @@ SERIALISE_VK_HANDLES(); PNEXT_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO, \ VkPipelineCreationFeedbackCreateInfo) \ \ + /* VK_EXT_pipeline_robustness */ \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_ROBUSTNESS_CREATE_INFO, VkPipelineRobustnessCreateInfo) \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_FEATURES, \ + VkPhysicalDevicePipelineRobustnessFeatures) \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_PROPERTIES, \ + VkPhysicalDevicePipelineRobustnessProperties) \ + \ /* VK_EXT_primitive_topology_list_restart */ \ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT, \ VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT) \ @@ -1899,11 +1906,6 @@ SERIALISE_VK_HANDLES(); /* VK_EXT_pipeline_protected_access */ \ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_PROTECTED_ACCESS_FEATURES) \ \ - /* VK_EXT_pipeline_robustness */ \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PIPELINE_ROBUSTNESS_CREATE_INFO) \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_FEATURES) \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_PROPERTIES) \ - \ /* VK_EXT_shader_float8 */ \ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT8_FEATURES_EXT) \ \ @@ -10590,6 +10592,59 @@ void Deserialise(const VkPipelineCreationFeedbackCreateInfo &el) delete[] el.pPipelineStageCreationFeedbacks; } +template +void DoSerialise(SerialiserType &ser, VkPipelineRobustnessCreateInfo &el) +{ + RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_PIPELINE_ROBUSTNESS_CREATE_INFO); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER(storageBuffers); + SERIALISE_MEMBER(uniformBuffers); + SERIALISE_MEMBER(vertexInputs); + SERIALISE_MEMBER(images); +} + +template <> +void Deserialise(const VkPipelineRobustnessCreateInfo &el) +{ + DeserialiseNext(el.pNext); +} + +template +void DoSerialise(SerialiserType &ser, VkPhysicalDevicePipelineRobustnessProperties &el) +{ + RDCASSERT(ser.IsReading() || + el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_PROPERTIES); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER(defaultRobustnessStorageBuffers); + SERIALISE_MEMBER(defaultRobustnessUniformBuffers); + SERIALISE_MEMBER(defaultRobustnessVertexInputs); + SERIALISE_MEMBER(defaultRobustnessImages); +} + +template <> +void Deserialise(const VkPhysicalDevicePipelineRobustnessProperties &el) +{ + DeserialiseNext(el.pNext); +} + +template +void DoSerialise(SerialiserType &ser, VkPhysicalDevicePipelineRobustnessFeatures &el) +{ + RDCASSERT(ser.IsReading() || + el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_FEATURES); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER(pipelineRobustness); +} + +template <> +void Deserialise(const VkPhysicalDevicePipelineRobustnessFeatures &el) +{ + DeserialiseNext(el.pNext); +} + template void DoSerialise(SerialiserType &ser, VkDisplayPowerInfoEXT &el) { @@ -14627,6 +14682,8 @@ INSTANTIATE_SERIALISE_TYPE(VkPhysicalDevicePerformanceQueryFeaturesKHR); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDevicePerformanceQueryPropertiesKHR); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDevicePipelineCreationCacheControlFeatures); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR); +INSTANTIATE_SERIALISE_TYPE(VkPhysicalDevicePipelineRobustnessFeatures); +INSTANTIATE_SERIALISE_TYPE(VkPhysicalDevicePipelineRobustnessProperties); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDevicePointClippingProperties); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDevicePresentId2FeaturesKHR); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDevicePresentIdFeaturesKHR); @@ -14737,6 +14794,7 @@ INSTANTIATE_SERIALISE_TYPE(VkPipelineRasterizationProvokingVertexStateCreateInfo INSTANTIATE_SERIALISE_TYPE(VkPipelineRasterizationStateCreateInfo); INSTANTIATE_SERIALISE_TYPE(VkPipelineRasterizationStateStreamCreateInfoEXT); INSTANTIATE_SERIALISE_TYPE(VkPipelineRenderingCreateInfo); +INSTANTIATE_SERIALISE_TYPE(VkPipelineRobustnessCreateInfo); INSTANTIATE_SERIALISE_TYPE(VkPipelineSampleLocationsStateCreateInfoEXT); INSTANTIATE_SERIALISE_TYPE(VkPipelineShaderStageCreateInfo); INSTANTIATE_SERIALISE_TYPE(VkPipelineShaderStageRequiredSubgroupSizeCreateInfo); diff --git a/renderdoc/driver/vulkan/vk_shader_cache.cpp b/renderdoc/driver/vulkan/vk_shader_cache.cpp index dc4f5b737..6b635d244 100644 --- a/renderdoc/driver/vulkan/vk_shader_cache.cpp +++ b/renderdoc/driver/vulkan/vk_shader_cache.cpp @@ -608,6 +608,7 @@ void VulkanShaderCache::MakeGraphicsPipelineInfo(VkGraphicsPipelineCreateInfo &p uint32_t dataOffset = 0; static VkPipelineShaderStageRequiredSubgroupSizeCreateInfo reqSubgroupSize[NumShaderStages] = {}; + static VkPipelineRobustnessCreateInfo shaderRobustness[NumShaderStages] = {}; // reserve space for spec constants for(uint32_t i = 0; i < NumShaderStages; i++) @@ -624,12 +625,25 @@ void VulkanShaderCache::MakeGraphicsPipelineInfo(VkGraphicsPipelineCreateInfo &p if(pipeInfo.shaders[i].requiredSubgroupSize != 0) { + reqSubgroupSize[i].requiredSubgroupSize = pipeInfo.shaders[i].requiredSubgroupSize; + reqSubgroupSize[i].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO; - reqSubgroupSize[i].requiredSubgroupSize = pipeInfo.shaders[i].requiredSubgroupSize; + reqSubgroupSize[i].pNext = (void *)stages[stageCount].pNext; stages[stageCount].pNext = &reqSubgroupSize[i]; } + if(pipeInfo.shaders[i].HasRobustness()) + { + shaderRobustness[i].images = pipeInfo.shaders[i].imageRobustness; + shaderRobustness[i].uniformBuffers = pipeInfo.shaders[i].uniformBufferRobustness; + shaderRobustness[i].storageBuffers = pipeInfo.shaders[i].storageBufferRobustness; + + shaderRobustness[i].sType = VK_STRUCTURE_TYPE_PIPELINE_ROBUSTNESS_CREATE_INFO; + shaderRobustness[i].pNext = stages[stageCount].pNext; + stages[stageCount].pNext = &shaderRobustness; + } + if(!pipeInfo.shaders[i].specialization.empty()) { stages[stageCount].pSpecializationInfo = &specInfo[i]; @@ -1082,6 +1096,20 @@ void VulkanShaderCache::MakeGraphicsPipelineInfo(VkGraphicsPipelineCreateInfo &p ret.flags = (uint32_t)flags; } + static VkPipelineRobustnessCreateInfo VkPipelineRobustnessCreateInfo = { + VK_STRUCTURE_TYPE_PIPELINE_ROBUSTNESS_CREATE_INFO, + }; + + // we only need to specify vertex input robustness, all per-shader robustness is handled via + // pNexts on the stages above + if(pipeInfo.vertexInputRobustness != VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DEVICE_DEFAULT) + { + VkPipelineRobustnessCreateInfo.vertexInputs = pipeInfo.vertexInputRobustness; + + VkPipelineRobustnessCreateInfo.pNext = ret.pNext; + ret.pNext = &VkPipelineRobustnessCreateInfo; + } + pipeCreateInfo = ret; } @@ -1146,9 +1174,23 @@ void VulkanShaderCache::MakeComputePipelineInfo(VkComputePipelineCreateInfo &pip if(pipeInfo.shaders[i].requiredSubgroupSize != 0) { reqSubgroupSize.requiredSubgroupSize = pipeInfo.shaders[i].requiredSubgroupSize; + reqSubgroupSize.pNext = (void *)stage.pNext; stage.pNext = &reqSubgroupSize; } + static VkPipelineRobustnessCreateInfo robustness = { + VK_STRUCTURE_TYPE_PIPELINE_ROBUSTNESS_CREATE_INFO, + }; + + if(pipeInfo.shaders[i].HasRobustness()) + { + robustness.images = pipeInfo.shaders[i].imageRobustness; + robustness.uniformBuffers = pipeInfo.shaders[i].uniformBufferRobustness; + robustness.storageBuffers = pipeInfo.shaders[i].storageBufferRobustness; + robustness.pNext = stage.pNext; + stage.pNext = &robustness; + } + VkComputePipelineCreateInfo ret = { VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, NULL, diff --git a/renderdoc/driver/vulkan/vk_stringise.cpp b/renderdoc/driver/vulkan/vk_stringise.cpp index dc26be6ee..50dec717e 100644 --- a/renderdoc/driver/vulkan/vk_stringise.cpp +++ b/renderdoc/driver/vulkan/vk_stringise.cpp @@ -3976,6 +3976,32 @@ rdcstr DoStringise(const VkDefaultVertexAttributeValueKHR &el) END_ENUM_STRINGISE(); } +template <> +rdcstr DoStringise(const VkPipelineRobustnessImageBehavior &el) +{ + BEGIN_ENUM_STRINGISE(VkPipelineRobustnessImageBehavior); + { + STRINGISE_ENUM(VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_DEVICE_DEFAULT); + STRINGISE_ENUM(VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_DISABLED); + STRINGISE_ENUM(VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS_2); + STRINGISE_ENUM(VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS); + } + END_ENUM_STRINGISE(); +} + +template <> +rdcstr DoStringise(const VkPipelineRobustnessBufferBehavior &el) +{ + BEGIN_ENUM_STRINGISE(VkPipelineRobustnessBufferBehavior); + { + STRINGISE_ENUM(VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DEVICE_DEFAULT); + STRINGISE_ENUM(VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DISABLED); + STRINGISE_ENUM(VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2); + STRINGISE_ENUM(VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS); + } + END_ENUM_STRINGISE(); +} + template <> rdcstr DoStringise(const VkSemaphoreWaitFlagBits &el) { diff --git a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp index 242179dea..a6226f2d2 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp @@ -3571,6 +3571,13 @@ bool WrappedVulkan::Serialise_vkCreateDevice(SerialiserType &ser, VkPhysicalDevi CHECK_PHYS_EXT_FEATURE(maintenance9); } END_PHYS_EXT_CHECK(); + + BEGIN_PHYS_EXT_CHECK(VkPhysicalDevicePipelineRobustnessFeatures, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_FEATURES); + { + CHECK_PHYS_EXT_FEATURE(pipelineRobustness); + } + END_PHYS_EXT_CHECK(); } if(availFeatures.depthClamp)