From 5c63bfa417b1f084d571d9a59e9cf107113f2278 Mon Sep 17 00:00:00 2001 From: Jake Turner Date: Mon, 2 Mar 2026 11:32:18 +0000 Subject: [PATCH] Serialisation support for VK_EXT_Custom_Resolve structures --- renderdoc/driver/vulkan/vk_common.h | 4 ++ renderdoc/driver/vulkan/vk_next_chains.cpp | 38 +++++++++++-- renderdoc/driver/vulkan/vk_serialise.cpp | 62 ++++++++++++++++++++-- 3 files changed, 96 insertions(+), 8 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_common.h b/renderdoc/driver/vulkan/vk_common.h index ddef6d360..ee57b11a9 100644 --- a/renderdoc/driver/vulkan/vk_common.h +++ b/renderdoc/driver/vulkan/vk_common.h @@ -1472,6 +1472,7 @@ DECLARE_REFLECTION_STRUCT(VkAttachmentFeedbackLoopInfoEXT); DECLARE_REFLECTION_STRUCT(VkAttachmentReference2); DECLARE_REFLECTION_STRUCT(VkAttachmentReferenceStencilLayout); DECLARE_REFLECTION_STRUCT(VkAttachmentSampleLocationsEXT); +DECLARE_REFLECTION_STRUCT(VkBeginCustomResolveInfoEXT); DECLARE_REFLECTION_STRUCT(VkBindBufferMemoryDeviceGroupInfo); DECLARE_REFLECTION_STRUCT(VkBindBufferMemoryInfo); DECLARE_REFLECTION_STRUCT(VkBindDescriptorBufferEmbeddedSamplersInfoEXT) @@ -1516,6 +1517,7 @@ DECLARE_REFLECTION_STRUCT(VkCopyImageToImageInfo); DECLARE_REFLECTION_STRUCT(VkCopyImageToMemoryInfo); DECLARE_REFLECTION_STRUCT(VkCopyMemoryToAccelerationStructureInfoKHR); DECLARE_REFLECTION_STRUCT(VkCopyMemoryToImageInfo); +DECLARE_REFLECTION_STRUCT(VkCustomResolveCreateInfoEXT); DECLARE_REFLECTION_STRUCT(VkDebugMarkerMarkerInfoEXT); DECLARE_REFLECTION_STRUCT(VkDebugMarkerObjectNameInfoEXT); DECLARE_REFLECTION_STRUCT(VkDebugMarkerObjectTagInfoEXT); @@ -1673,6 +1675,7 @@ DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceConditionalRenderingFeaturesEXT); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceConservativeRasterizationPropertiesEXT); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceCustomBorderColorFeaturesEXT); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceCustomBorderColorPropertiesEXT); +DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceCustomResolveFeaturesEXT); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceDepthClampZeroOneFeaturesKHR); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceDepthClipControlFeaturesEXT); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceDepthClipEnableFeaturesEXT); @@ -2056,6 +2059,7 @@ DECLARE_DESERIALISE_TYPE(VkCopyImageToImageInfo); DECLARE_DESERIALISE_TYPE(VkCopyImageToMemoryInfo); DECLARE_DESERIALISE_TYPE(VkCopyMemoryToAccelerationStructureInfoKHR); DECLARE_DESERIALISE_TYPE(VkCopyMemoryToImageInfo); +DECLARE_DESERIALISE_TYPE(VkBeginCustomResolveInfoEXT); DECLARE_DESERIALISE_TYPE(VkDebugMarkerMarkerInfoEXT); DECLARE_DESERIALISE_TYPE(VkDebugMarkerObjectNameInfoEXT); DECLARE_DESERIALISE_TYPE(VkDebugMarkerObjectTagInfoEXT); diff --git a/renderdoc/driver/vulkan/vk_next_chains.cpp b/renderdoc/driver/vulkan/vk_next_chains.cpp index 777c6540d..38050ee24 100644 --- a/renderdoc/driver/vulkan/vk_next_chains.cpp +++ b/renderdoc/driver/vulkan/vk_next_chains.cpp @@ -109,6 +109,7 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, COPY_STRUCT(VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2, VkAttachmentReference2); \ COPY_STRUCT(VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT, \ VkAttachmentReferenceStencilLayout); \ + COPY_STRUCT(VK_STRUCTURE_TYPE_BEGIN_CUSTOM_RESOLVE_INFO_EXT, VkBeginCustomResolveInfoEXT); \ COPY_STRUCT(VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO, \ VkBindBufferMemoryDeviceGroupInfo); \ COPY_STRUCT(VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO, \ @@ -271,6 +272,8 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, VkPhysicalDeviceCustomBorderColorFeaturesEXT); \ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT, \ VkPhysicalDeviceCustomBorderColorPropertiesEXT); \ + COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_RESOLVE_FEATURES_EXT, \ + VkPhysicalDeviceCustomResolveFeaturesEXT); \ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV, \ VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV); \ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLAMP_ZERO_ONE_FEATURES_KHR, \ @@ -1002,7 +1005,6 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, case VK_STRUCTURE_TYPE_ANTI_LAG_DATA_AMD: \ case VK_STRUCTURE_TYPE_ANTI_LAG_PRESENTATION_INFO_AMD: \ case VK_STRUCTURE_TYPE_ATTACHMENT_SAMPLE_COUNT_INFO_AMD: \ - case VK_STRUCTURE_TYPE_BEGIN_CUSTOM_RESOLVE_INFO_EXT: \ case VK_STRUCTURE_TYPE_BIND_ACCELERATION_STRUCTURE_MEMORY_INFO_NV: \ case VK_STRUCTURE_TYPE_BIND_DATA_GRAPH_PIPELINE_SESSION_MEMORY_INFO_ARM: \ case VK_STRUCTURE_TYPE_BIND_HEAP_INFO_EXT: \ @@ -1044,7 +1046,6 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, case VK_STRUCTURE_TYPE_CU_LAUNCH_INFO_NVX: \ case VK_STRUCTURE_TYPE_CU_MODULE_CREATE_INFO_NVX: \ case VK_STRUCTURE_TYPE_CU_MODULE_TEXTURING_MODE_CREATE_INFO_NVX: \ - case VK_STRUCTURE_TYPE_CUSTOM_RESOLVE_CREATE_INFO_EXT: \ case VK_STRUCTURE_TYPE_DATA_GRAPH_PIPELINE_BUILTIN_MODEL_CREATE_INFO_QCOM: \ case VK_STRUCTURE_TYPE_DATA_GRAPH_PIPELINE_COMPILER_CONTROL_CREATE_INFO_ARM: \ case VK_STRUCTURE_TYPE_DATA_GRAPH_PIPELINE_CONSTANT_ARM: \ @@ -1216,7 +1217,6 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COVERAGE_REDUCTION_MODE_FEATURES_NV: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUBIC_CLAMP_FEATURES_QCOM: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUBIC_WEIGHTS_FEATURES_QCOM: \ - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_RESOLVE_FEATURES_EXT: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DATA_GRAPH_FEATURES_ARM: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DATA_GRAPH_MODEL_FEATURES_QCOM: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_BIAS_CONTROL_FEATURES_EXT: \ @@ -1679,6 +1679,14 @@ size_t GetNextPatchSize(const void *pNext) memSize += GetNextPatchSize(info->pRegions[i].pNext); break; } + case VK_STRUCTURE_TYPE_CUSTOM_RESOLVE_CREATE_INFO_EXT: + { + memSize += sizeof(VkCustomResolveCreateInfoEXT); + + VkCustomResolveCreateInfoEXT *info = (VkCustomResolveCreateInfoEXT *)next; + memSize += info->colorAttachmentCount * sizeof(VkFormat); + break; + } case VK_STRUCTURE_TYPE_DEPENDENCY_INFO: { memSize += sizeof(VkDependencyInfo); @@ -2579,6 +2587,26 @@ void UnwrapNextChain(CaptureState state, const char *structName, byte *&tempMem, break; } + case VK_STRUCTURE_TYPE_CUSTOM_RESOLVE_CREATE_INFO_EXT: + { + const VkCustomResolveCreateInfoEXT *in = (const VkCustomResolveCreateInfoEXT *)nextInput; + VkCustomResolveCreateInfoEXT *out = (VkCustomResolveCreateInfoEXT *)tempMem; + + // append immediately so tempMem is incremented + AppendModifiedChainedStruct(tempMem, out, nextChainTail); + + // allocate unwrapped array + VkFormat *outFormats = (VkFormat *)tempMem; + tempMem += sizeof(VkFormat) * in->colorAttachmentCount; + + *out = *in; + + out->pColorAttachmentFormats = outFormats; + for(uint32_t i = 0; i < in->colorAttachmentCount; i++) + outFormats[i] = in->pColorAttachmentFormats[i]; + + break; + } case VK_STRUCTURE_TYPE_DEPENDENCY_INFO: { const VkDependencyInfo *in = (const VkDependencyInfo *)nextInput; @@ -3698,6 +3726,10 @@ void CopyNextChainForPatching(const char *structName, byte *&tempMem, VkBaseInSt case VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2: CopyNextChainedStruct(sizeof(VkCopyImageInfo2), tempMem, nextInput, nextChainTail); break; + case VK_STRUCTURE_TYPE_CUSTOM_RESOLVE_CREATE_INFO_EXT: + CopyNextChainedStruct(sizeof(VkCustomResolveCreateInfoEXT), tempMem, nextInput, + nextChainTail); + break; case VK_STRUCTURE_TYPE_DEPENDENCY_INFO: CopyNextChainedStruct(sizeof(VkDependencyInfo), tempMem, nextInput, nextChainTail); break; diff --git a/renderdoc/driver/vulkan/vk_serialise.cpp b/renderdoc/driver/vulkan/vk_serialise.cpp index 08d87a6f2..13ac15586 100644 --- a/renderdoc/driver/vulkan/vk_serialise.cpp +++ b/renderdoc/driver/vulkan/vk_serialise.cpp @@ -606,6 +606,12 @@ SERIALISE_VK_HANDLES(); PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT, \ VkPhysicalDeviceCustomBorderColorFeaturesEXT) \ \ + /* VK_EXT_custom_resolve */ \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_RESOLVE_FEATURES_EXT, \ + VkPhysicalDeviceCustomResolveFeaturesEXT) \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_BEGIN_CUSTOM_RESOLVE_INFO_EXT, VkBeginCustomResolveInfoEXT) \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_CUSTOM_RESOLVE_CREATE_INFO_EXT, VkCustomResolveCreateInfoEXT) \ + \ /* VK_EXT_debug_marker */ \ PNEXT_STRUCT(VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_NAME_INFO_EXT, VkDebugMarkerObjectNameInfoEXT) \ PNEXT_STRUCT(VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_TAG_INFO_EXT, VkDebugMarkerObjectTagInfoEXT) \ @@ -1820,11 +1826,6 @@ SERIALISE_VK_HANDLES(); PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT) \ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT) \ \ - /* VK_EXT_custom_resolve */ \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_BEGIN_CUSTOM_RESOLVE_INFO_EXT) \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_CUSTOM_RESOLVE_CREATE_INFO_EXT) \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_RESOLVE_FEATURES_EXT) \ - \ /* VK_EXT_depth_bias_control */ \ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_BIAS_CONTROL_FEATURES_EXT) \ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_DEPTH_BIAS_INFO_EXT) \ @@ -6486,6 +6487,22 @@ void Deserialise(const VkPhysicalDeviceCustomBorderColorFeaturesEXT &el) DeserialiseNext(el.pNext); } +template +void DoSerialise(SerialiserType &ser, VkPhysicalDeviceCustomResolveFeaturesEXT &el) +{ + RDCASSERT(ser.IsReading() || + el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_RESOLVE_FEATURES_EXT); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER(customResolve); +} + +template <> +void Deserialise(const VkPhysicalDeviceCustomResolveFeaturesEXT &el) +{ + DeserialiseNext(el.pNext); +} + template void DoSerialise(SerialiserType &ser, VkPipelineTessellationDomainOriginStateCreateInfo &el) { @@ -14831,6 +14848,39 @@ void Deserialise(const VkMemoryToImageCopy &el) FreeAlignedBuffer((byte *)el.pHostPointer); } +template +void DoSerialise(SerialiserType &ser, VkBeginCustomResolveInfoEXT &el) +{ + RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_BEGIN_CUSTOM_RESOLVE_INFO_EXT); + SerialiseNext(ser, el.sType, el.pNext); +} + +template <> +void Deserialise(const VkBeginCustomResolveInfoEXT &el) +{ + DeserialiseNext(el.pNext); +} + +template +void DoSerialise(SerialiserType &ser, VkCustomResolveCreateInfoEXT &el) +{ + RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_CUSTOM_RESOLVE_CREATE_INFO_EXT); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER(customResolve); + SERIALISE_MEMBER(colorAttachmentCount); + SERIALISE_MEMBER_ARRAY(pColorAttachmentFormats, colorAttachmentCount); + SERIALISE_MEMBER(depthAttachmentFormat); + SERIALISE_MEMBER(stencilAttachmentFormat); +} + +template <> +void Deserialise(const VkCustomResolveCreateInfoEXT &el) +{ + DeserialiseNext(el.pNext); + delete[] el.pColorAttachmentFormats; +} + // pNext structs - always have deserialise for the next chain INSTANTIATE_SERIALISE_TYPE(VkAccelerationStructureBuildGeometryInfoKHR); INSTANTIATE_SERIALISE_TYPE(VkAccelerationStructureBuildSizesInfoKHR); @@ -14851,6 +14901,7 @@ INSTANTIATE_SERIALISE_TYPE(VkAttachmentFeedbackLoopInfoEXT); INSTANTIATE_SERIALISE_TYPE(VkAttachmentReference2); INSTANTIATE_SERIALISE_TYPE(VkAttachmentReferenceStencilLayout); INSTANTIATE_SERIALISE_TYPE(VkAttachmentSampleLocationsEXT); +INSTANTIATE_SERIALISE_TYPE(VkBeginCustomResolveInfoEXT); INSTANTIATE_SERIALISE_TYPE(VkBindBufferMemoryDeviceGroupInfo); INSTANTIATE_SERIALISE_TYPE(VkBindBufferMemoryInfo); INSTANTIATE_SERIALISE_TYPE(VkBindDescriptorBufferEmbeddedSamplersInfoEXT); @@ -15052,6 +15103,7 @@ INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceConditionalRenderingFeaturesEXT); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceConservativeRasterizationPropertiesEXT); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceCustomBorderColorFeaturesEXT); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceCustomBorderColorPropertiesEXT); +INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceCustomResolveFeaturesEXT); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceDepthClampZeroOneFeaturesKHR); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceDepthClipControlFeaturesEXT); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceDepthClipEnableFeaturesEXT);