From a6c1ba1fc54929ab390eca35a8587c3043c970ff Mon Sep 17 00:00:00 2001 From: baldurk Date: Tue, 20 Jun 2023 14:35:01 +0100 Subject: [PATCH] Add support for VK_EXT_attachment_feedback_loop_dynamic_state --- .../VulkanPipelineStateViewer.cpp | 35 ++++++++++ renderdoc/api/replay/vk_pipestate.h | 9 +++ renderdoc/driver/vulkan/vk_common.h | 3 + renderdoc/driver/vulkan/vk_core.cpp | 8 +++ renderdoc/driver/vulkan/vk_core.h | 6 ++ renderdoc/driver/vulkan/vk_hookset_defs.h | 10 ++- renderdoc/driver/vulkan/vk_overlay.cpp | 4 ++ renderdoc/driver/vulkan/vk_replay.cpp | 4 ++ renderdoc/driver/vulkan/vk_serialise.cpp | 27 ++++++-- renderdoc/driver/vulkan/vk_state.cpp | 6 ++ renderdoc/driver/vulkan/vk_state.h | 3 + renderdoc/driver/vulkan/vk_stringise.cpp | 3 +- .../driver/vulkan/wrappers/vk_cmd_funcs.cpp | 9 +++ .../vulkan/wrappers/vk_device_funcs.cpp | 9 +++ .../vulkan/wrappers/vk_dynamic_funcs.cpp | 64 ++++++++++++++++++- renderdoc/replay/renderdoc_serialise.inl | 7 +- 16 files changed, 197 insertions(+), 10 deletions(-) diff --git a/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp b/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp index 0a14b77d6..db290ec9b 100644 --- a/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp +++ b/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp @@ -2866,6 +2866,41 @@ void VulkanPipelineStateViewer::setState() resName += tr(" (%1x%2 texels)").arg(shadingRateTexelSize.first).arg(shadingRateTexelSize.second); + // append if colour or depth/stencil feedback is allowed + if(a.type == AttType::Color && state.currentPass.colorFeedbackAllowed) + { + resName += tr(" (Feedback)"); + } + else if(a.type == AttType::Depth && state.currentPass.depthFeedbackAllowed && + state.currentPass.stencilFeedbackAllowed) + { + resName += tr(" (Feedback)"); + } + else if(a.type == AttType::Depth && (state.currentPass.depthFeedbackAllowed || + state.currentPass.stencilFeedbackAllowed)) + { + // if only one of depth or stencil is allowed, display that specifically + if(tex->format.type == ResourceFormatType::D16S8 || + tex->format.type == ResourceFormatType::D24S8 || + tex->format.type == ResourceFormatType::D32S8) + { + if(state.currentPass.depthFeedbackAllowed) + resName += tr(" (Depth Feedback)"); + else if(state.currentPass.stencilFeedbackAllowed) + resName += tr(" (Depth Feedback)"); + } + else if(tex->format.type == ResourceFormatType::S8 && + state.currentPass.stencilFeedbackAllowed) + { + resName += tr(" (Feedback)"); + } + // this case must be depth-only, since depth/stencil and stencil-only are covered above. + else if(state.currentPass.depthFeedbackAllowed) + { + resName += tr(" (Feedback)"); + } + } + node = new RDTreeWidgetItem( {slotname, resName, typeName, dimensions, format, samples, QString()}); diff --git a/renderdoc/api/replay/vk_pipestate.h b/renderdoc/api/replay/vk_pipestate.h index 074f7489b..0c311eff5 100644 --- a/renderdoc/api/replay/vk_pipestate.h +++ b/renderdoc/api/replay/vk_pipestate.h @@ -1229,6 +1229,15 @@ struct CurrentPass :type: VKRenderArea )"); RenderArea renderArea; + + DOCUMENT("If feedback loops are allowed on color attachments"); + bool colorFeedbackAllowed = false; + + DOCUMENT("If feedback loops are allowed on depth attachments"); + bool depthFeedbackAllowed = false; + + DOCUMENT("If feedback loops are allowed on stencil attachments"); + bool stencilFeedbackAllowed = false; }; DOCUMENT("Contains the layout of a range of subresources in an image."); diff --git a/renderdoc/driver/vulkan/vk_common.h b/renderdoc/driver/vulkan/vk_common.h index 2fb01aaa1..b2b50b3e1 100644 --- a/renderdoc/driver/vulkan/vk_common.h +++ b/renderdoc/driver/vulkan/vk_common.h @@ -925,6 +925,7 @@ enum class VulkanChunk : uint32_t vkCmdEndRendering, vkCmdSetFragmentShadingRateKHR, vkSetDeviceMemoryPriorityEXT, + vkCmdSetAttachmentFeedbackLoopEnableEXT, Max, }; @@ -1132,6 +1133,7 @@ DECLARE_REFLECTION_STRUCT(VkPhysicalDevice16BitStorageFeatures); DECLARE_REFLECTION_STRUCT(VkPhysicalDevice4444FormatsFeaturesEXT); DECLARE_REFLECTION_STRUCT(VkPhysicalDevice8BitStorageFeatures); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceASTCDecodeFeaturesEXT); +DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceBorderColorSwizzleFeaturesEXT); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceBufferDeviceAddressFeatures); @@ -1540,6 +1542,7 @@ DECLARE_DESERIALISE_TYPE(VkPhysicalDevice16BitStorageFeatures); DECLARE_DESERIALISE_TYPE(VkPhysicalDevice4444FormatsFeaturesEXT); DECLARE_DESERIALISE_TYPE(VkPhysicalDevice8BitStorageFeatures); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceASTCDecodeFeaturesEXT); +DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceBorderColorSwizzleFeaturesEXT); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceCoherentMemoryFeaturesAMD); diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index 5955c1910..f0d86fc16 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -895,6 +895,10 @@ static const VkExtensionProperties supportedExtensions[] = { { VK_EXT_ASTC_DECODE_MODE_EXTENSION_NAME, VK_EXT_ASTC_DECODE_MODE_SPEC_VERSION, }, + { + VK_EXT_ATTACHMENT_FEEDBACK_LOOP_DYNAMIC_STATE_EXTENSION_NAME, + VK_EXT_ATTACHMENT_FEEDBACK_LOOP_DYNAMIC_STATE_SPEC_VERSION, + }, { VK_EXT_ATTACHMENT_FEEDBACK_LOOP_LAYOUT_EXTENSION_NAME, VK_EXT_ATTACHMENT_FEEDBACK_LOOP_LAYOUT_SPEC_VERSION, @@ -3718,6 +3722,10 @@ bool WrappedVulkan::ProcessChunk(ReadSerialiser &ser, VulkanChunk chunk) case VulkanChunk::vkSetDeviceMemoryPriorityEXT: return Serialise_vkSetDeviceMemoryPriorityEXT(ser, VK_NULL_HANDLE, VK_NULL_HANDLE, 0.0f); + case VulkanChunk::vkCmdSetAttachmentFeedbackLoopEnableEXT: + return Serialise_vkCmdSetAttachmentFeedbackLoopEnableEXT(ser, VK_NULL_HANDLE, + VK_IMAGE_ASPECT_NONE); + // chunks that are reserved but not yet serialised case VulkanChunk::vkResetCommandPool: case VulkanChunk::vkCreateDepthTargetView: diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index a3b829b5f..128311973 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -447,6 +447,7 @@ private: bool m_FragmentShadingRate = false; bool m_DynColorWrite = false; bool m_DynVertexInput = false; + bool m_DynAttachmentLoop = false; PFN_vkSetDeviceLoaderData m_SetDeviceLoaderData; @@ -1220,6 +1221,7 @@ public: bool FragmentShadingRate() const { return m_FragmentShadingRate; } bool DynamicColorWrite() const { return m_DynColorWrite; } bool DynamicVertexInput() const { return m_DynVertexInput; } + bool DynamicAttachmentLoop() const { return m_DynAttachmentLoop; } VulkanRenderState &GetRenderState() { return m_RenderState; } void SetActionCB(VulkanActionCallback *cb) { m_ActionCallback = cb; } void SetSubmitChain(void *submitChain) { m_SubmitChain = submitChain; } @@ -2633,4 +2635,8 @@ public: // VK_EXT_swapchain_maintenance1 VkResult vkReleaseSwapchainImagesEXT(VkDevice device, const VkReleaseSwapchainImagesInfoEXT *pReleaseInfo); + + // VK_EXT_attachment_feedback_loop_dynamic_state + IMPLEMENT_FUNCTION_SERIALISED(void, vkCmdSetAttachmentFeedbackLoopEnableEXT, + VkCommandBuffer commandBuffer, VkImageAspectFlags aspectMask); }; diff --git a/renderdoc/driver/vulkan/vk_hookset_defs.h b/renderdoc/driver/vulkan/vk_hookset_defs.h index 5e44204b0..7bdaedf28 100644 --- a/renderdoc/driver/vulkan/vk_hookset_defs.h +++ b/renderdoc/driver/vulkan/vk_hookset_defs.h @@ -547,7 +547,8 @@ DeclExt(EXT_attachment_feedback_loop_layout); \ DeclExt(EXT_pageable_device_local_memory); \ DeclExt(EXT_swapchain_maintenance1); \ - DeclExt(EXT_provoking_vertex); + DeclExt(EXT_provoking_vertex); \ + DeclExt(EXT_attachment_feedback_loop_dynamic_state); // for simplicity and since the check itself is platform agnostic, // these aren't protected in platform defines @@ -665,7 +666,8 @@ CheckExt(EXT_attachment_feedback_loop_layout, VKXX); \ CheckExt(EXT_pageable_device_local_memory, VKXX); \ CheckExt(EXT_swapchain_maintenance1, VKXX); \ - CheckExt(EXT_provoking_vertex, VKXX); + CheckExt(EXT_provoking_vertex, VKXX); \ + CheckExt(EXT_attachment_feedback_loop_dynamic_state, VKXX); #define HookInitVulkanInstanceExts_PhysDev() \ HookInitExtension(KHR_surface, GetPhysicalDeviceSurfaceSupportKHR); \ @@ -927,6 +929,8 @@ HookInitExtension(KHR_fragment_shading_rate, CmdSetFragmentShadingRateKHR); \ HookInitExtension(EXT_pageable_device_local_memory, SetDeviceMemoryPriorityEXT); \ HookInitExtension(EXT_swapchain_maintenance1, ReleaseSwapchainImagesEXT); \ + HookInitExtension(EXT_attachment_feedback_loop_dynamic_state, \ + CmdSetAttachmentFeedbackLoopEnableEXT); \ HookInitExtension_Device_Win32(); \ HookInitExtension_Device_Linux(); \ HookInitExtension_Device_GGP(); \ @@ -1653,6 +1657,8 @@ uint32_t, connectorId, VkDisplayKHR *, display); \ HookDefine2(VkResult, vkReleaseSwapchainImagesEXT, VkDevice, device, \ const VkReleaseSwapchainImagesInfoEXT *, pReleaseInfo); \ + HookDefine2(void, vkCmdSetAttachmentFeedbackLoopEnableEXT, VkCommandBuffer, commandBuffer, \ + VkImageAspectFlags, aspectMask); \ HookDefine_Win32(); \ HookDefine_Linux(); \ HookDefine_GGP(); \ diff --git a/renderdoc/driver/vulkan/vk_overlay.cpp b/renderdoc/driver/vulkan/vk_overlay.cpp index 63545d338..f0c73d2cb 100644 --- a/renderdoc/driver/vulkan/vk_overlay.cpp +++ b/renderdoc/driver/vulkan/vk_overlay.cpp @@ -2830,6 +2830,10 @@ ResourceId VulkanReplay::RenderOverlay(ResourceId texid, FloatVector clearCol, D { RDCERR("Vertex input dynamic state found, should have been stripped"); } + else if(d == VK_DYNAMIC_STATE_ATTACHMENT_FEEDBACK_LOOP_ENABLE_EXT) + { + vt->CmdSetAttachmentFeedbackLoopEnableEXT(Unwrap(cmd), state.feedbackAspects); + } } if(fmt.indexByteStride) diff --git a/renderdoc/driver/vulkan/vk_replay.cpp b/renderdoc/driver/vulkan/vk_replay.cpp index f7b952261..9a4f35508 100644 --- a/renderdoc/driver/vulkan/vk_replay.cpp +++ b/renderdoc/driver/vulkan/vk_replay.cpp @@ -1849,6 +1849,10 @@ void VulkanReplay::SavePipelineState(uint32_t eventId) ret.currentPass.framebuffer.attachments.clear(); } + ret.currentPass.colorFeedbackAllowed = (state.feedbackAspects & VK_IMAGE_ASPECT_COLOR_BIT) != 0; + ret.currentPass.depthFeedbackAllowed = (state.feedbackAspects & VK_IMAGE_ASPECT_DEPTH_BIT) != 0; + ret.currentPass.stencilFeedbackAllowed = (state.feedbackAspects & VK_IMAGE_ASPECT_STENCIL_BIT) != 0; + // Descriptor sets ret.graphics.descriptorSets.resize(state.graphics.descSets.size()); ret.compute.descriptorSets.resize(state.compute.descSets.size()); diff --git a/renderdoc/driver/vulkan/vk_serialise.cpp b/renderdoc/driver/vulkan/vk_serialise.cpp index 1f559232c..e941c36d8 100644 --- a/renderdoc/driver/vulkan/vk_serialise.cpp +++ b/renderdoc/driver/vulkan/vk_serialise.cpp @@ -565,6 +565,10 @@ SERIALISE_VK_HANDLES(); PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT, \ VkPhysicalDeviceASTCDecodeFeaturesEXT) \ \ + /* VK_EXT_attachment_feedback_loop_dynamic_state */ \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ATTACHMENT_FEEDBACK_LOOP_DYNAMIC_STATE_FEATURES_EXT, \ + VkPhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT) \ + \ /* VK_EXT_attachment_feedback_loop_layout */ \ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ATTACHMENT_FEEDBACK_LOOP_LAYOUT_FEATURES_EXT, \ VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT) \ @@ -1419,10 +1423,6 @@ SERIALISE_VK_HANDLES(); PNEXT_UNSUPPORTED( \ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_EARLY_AND_LATE_FRAGMENT_TESTS_FEATURES_AMD) \ \ - /* VK_EXT_attachment_feedback_loop_dynamic_state */ \ - PNEXT_UNSUPPORTED( \ - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ATTACHMENT_FEEDBACK_LOOP_DYNAMIC_STATE_FEATURES_EXT) \ - \ /* VK_EXT_external_memory_acquire_unmodified */ \ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_ACQUIRE_UNMODIFIED_EXT) \ \ @@ -8270,6 +8270,24 @@ void Deserialise(const VkExternalMemoryImageCreateInfoNV &el) DeserialiseNext(el.pNext); } +template +void DoSerialise(SerialiserType &ser, + VkPhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT &el) +{ + RDCASSERT(ser.IsReading() || + el.sType == + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ATTACHMENT_FEEDBACK_LOOP_DYNAMIC_STATE_FEATURES_EXT); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER(attachmentFeedbackLoopDynamicState); +} + +template <> +void Deserialise(const VkPhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT &el) +{ + DeserialiseNext(el.pNext); +} + template void DoSerialise(SerialiserType &ser, VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT &el) { @@ -11397,6 +11415,7 @@ INSTANTIATE_SERIALISE_TYPE(VkPhysicalDevice16BitStorageFeatures); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDevice4444FormatsFeaturesEXT); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDevice8BitStorageFeatures); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceASTCDecodeFeaturesEXT) +INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceBorderColorSwizzleFeaturesEXT); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceBufferDeviceAddressFeatures); diff --git a/renderdoc/driver/vulkan/vk_state.cpp b/renderdoc/driver/vulkan/vk_state.cpp index 9fd8cb7a3..c3935aec5 100644 --- a/renderdoc/driver/vulkan/vk_state.cpp +++ b/renderdoc/driver/vulkan/vk_state.cpp @@ -475,6 +475,12 @@ void VulkanRenderState::BindPipeline(WrappedVulkan *vk, VkCommandBuffer cmd, shadingRateCombiners); } + if(vk->DynamicAttachmentLoop()) + { + if(dynamicStates[VkDynamicAttachmentFeedbackLoopEnableEXT]) + ObjDisp(cmd)->CmdSetAttachmentFeedbackLoopEnableEXT(Unwrap(cmd), feedbackAspects); + } + if(graphics.pipeline != ResourceId()) BindDescriptorSetsForPipeline(vk, cmd, graphics, VK_PIPELINE_BIND_POINT_GRAPHICS); else diff --git a/renderdoc/driver/vulkan/vk_state.h b/renderdoc/driver/vulkan/vk_state.h index 5476c67bc..3cc591fe5 100644 --- a/renderdoc/driver/vulkan/vk_state.h +++ b/renderdoc/driver/vulkan/vk_state.h @@ -248,6 +248,9 @@ struct VulkanRenderState VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR, VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR, }; + // attachment feedback loop + VkImageAspectFlags feedbackAspects = VK_IMAGE_ASPECT_NONE; + private: ResourceId renderPass; ResourceId framebuffer; diff --git a/renderdoc/driver/vulkan/vk_stringise.cpp b/renderdoc/driver/vulkan/vk_stringise.cpp index d45155979..8203f4598 100644 --- a/renderdoc/driver/vulkan/vk_stringise.cpp +++ b/renderdoc/driver/vulkan/vk_stringise.cpp @@ -28,7 +28,7 @@ template <> rdcstr DoStringise(const VulkanChunk &el) { - RDCCOMPILE_ASSERT((uint32_t)VulkanChunk::Max == 1177, "Chunks changed without updating names"); + RDCCOMPILE_ASSERT((uint32_t)VulkanChunk::Max == 1178, "Chunks changed without updating names"); BEGIN_ENUM_STRINGISE(VulkanChunk) { @@ -209,6 +209,7 @@ rdcstr DoStringise(const VulkanChunk &el) STRINGISE_ENUM_CLASS(vkCmdEndRendering) STRINGISE_ENUM_CLASS(vkCmdSetFragmentShadingRateKHR) STRINGISE_ENUM_CLASS(vkSetDeviceMemoryPriorityEXT) + STRINGISE_ENUM_CLASS(vkCmdSetAttachmentFeedbackLoopEnableEXT) STRINGISE_ENUM_CLASS_NAMED(Max, "Max Chunk"); } END_ENUM_STRINGISE() diff --git a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp index ab99ed572..70babc0e3 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp @@ -3294,6 +3294,15 @@ bool WrappedVulkan::Serialise_vkCmdBindPipeline(SerialiserType &ser, VkCommandBu renderstate.vertexBindings[i].divisor = pipeInfo.vertexBindings[i].instanceDivisor; } } + if(!pipeInfo.dynamicStates[VkDynamicAttachmentFeedbackLoopEnableEXT]) + { + renderstate.feedbackAspects = VK_IMAGE_ASPECT_NONE; + if(pipeInfo.flags & VK_PIPELINE_CREATE_COLOR_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT) + renderstate.feedbackAspects |= VK_IMAGE_ASPECT_COLOR_BIT; + if(pipeInfo.flags & VK_PIPELINE_CREATE_DEPTH_STENCIL_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT) + renderstate.feedbackAspects |= + VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT; + } } } } diff --git a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp index a1b49027f..128a4467e 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp @@ -3095,6 +3095,15 @@ bool WrappedVulkan::Serialise_vkCreateDevice(SerialiserType &ser, VkPhysicalDevi CHECK_PHYS_EXT_FEATURE(transformFeedbackPreservesProvokingVertex); } END_PHYS_EXT_CHECK(); + + BEGIN_PHYS_EXT_CHECK( + VkPhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ATTACHMENT_FEEDBACK_LOOP_DYNAMIC_STATE_FEATURES_EXT); + { + CHECK_PHYS_EXT_FEATURE(attachmentFeedbackLoopDynamicState); + m_DynAttachmentLoop = ext->attachmentFeedbackLoopDynamicState != VK_FALSE; + } + END_PHYS_EXT_CHECK(); } if(availFeatures.depthClamp) diff --git a/renderdoc/driver/vulkan/wrappers/vk_dynamic_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_dynamic_funcs.cpp index d459402f4..9022b5f22 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_dynamic_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_dynamic_funcs.cpp @@ -1945,6 +1945,67 @@ void WrappedVulkan::vkCmdSetFragmentShadingRateKHR( } } +template +bool WrappedVulkan::Serialise_vkCmdSetAttachmentFeedbackLoopEnableEXT(SerialiserType &ser, + VkCommandBuffer commandBuffer, + VkImageAspectFlags aspectMask) +{ + SERIALISE_ELEMENT(commandBuffer); + SERIALISE_ELEMENT(aspectMask).Important(); + + Serialise_DebugMessages(ser); + + SERIALISE_CHECK_READ_ERRORS(); + + if(IsReplayingAndReading()) + { + m_LastCmdBufferID = GetResourceManager()->GetOriginalID(GetResID(commandBuffer)); + + if(IsActiveReplaying(m_State)) + { + if(InRerecordRange(m_LastCmdBufferID)) + { + commandBuffer = RerecordCmdBuf(m_LastCmdBufferID); + + { + VulkanRenderState &renderstate = GetCmdRenderState(); + renderstate.feedbackAspects = aspectMask; + } + } + else + { + commandBuffer = VK_NULL_HANDLE; + } + } + + if(commandBuffer != VK_NULL_HANDLE) + ObjDisp(commandBuffer)->CmdSetAttachmentFeedbackLoopEnableEXT(Unwrap(commandBuffer), aspectMask); + } + + return true; +} + +void WrappedVulkan::vkCmdSetAttachmentFeedbackLoopEnableEXT(VkCommandBuffer commandBuffer, + VkImageAspectFlags aspectMask) +{ + SCOPED_DBG_SINK(); + + SERIALISE_TIME_CALL( + ObjDisp(commandBuffer)->CmdSetAttachmentFeedbackLoopEnableEXT(Unwrap(commandBuffer), aspectMask)); + + if(IsCaptureMode(m_State)) + { + VkResourceRecord *record = GetRecord(commandBuffer); + + CACHE_THREAD_SERIALISER(); + + SCOPED_SERIALISE_CHUNK(VulkanChunk::vkCmdSetAttachmentFeedbackLoopEnableEXT); + Serialise_vkCmdSetAttachmentFeedbackLoopEnableEXT(ser, commandBuffer, aspectMask); + + record->AddChunk(scope.Get(&record->cmdInfo->alloc)); + } +} + INSTANTIATE_FUNCTION_SERIALISED(void, vkCmdSetViewport, VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount, const VkViewport *pViewports); @@ -2032,7 +2093,8 @@ INSTANTIATE_FUNCTION_SERIALISED(void, vkCmdSetPrimitiveRestartEnable, VkCommandB VkBool32 primitiveRestartEnable); INSTANTIATE_FUNCTION_SERIALISED(void, vkCmdSetRasterizerDiscardEnable, VkCommandBuffer commandBuffer, VkBool32 rasterizerDiscardEnable); - INSTANTIATE_FUNCTION_SERIALISED(void, vkCmdSetFragmentShadingRateKHR, VkCommandBuffer commandBuffer, const VkExtent2D *pFragmentSize, const VkFragmentShadingRateCombinerOpKHR combinerOps[2]); +INSTANTIATE_FUNCTION_SERIALISED(void, vkCmdSetAttachmentFeedbackLoopEnableEXT, + VkCommandBuffer commandBuffer, VkImageAspectFlags aspectMask); diff --git a/renderdoc/replay/renderdoc_serialise.inl b/renderdoc/replay/renderdoc_serialise.inl index d6ffc7329..058149e3b 100644 --- a/renderdoc/replay/renderdoc_serialise.inl +++ b/renderdoc/replay/renderdoc_serialise.inl @@ -2293,8 +2293,11 @@ void DoSerialise(SerialiserType &ser, VKPipe::CurrentPass &el) SERIALISE_MEMBER(renderpass); SERIALISE_MEMBER(framebuffer); SERIALISE_MEMBER(renderArea); + SERIALISE_MEMBER(colorFeedbackAllowed); + SERIALISE_MEMBER(depthFeedbackAllowed); + SERIALISE_MEMBER(stencilFeedbackAllowed); - SIZE_CHECK(232); + SIZE_CHECK(240); } template @@ -2362,7 +2365,7 @@ void DoSerialise(SerialiserType &ser, VKPipe::State &el) SERIALISE_MEMBER(conditionalRendering); - SIZE_CHECK(2256); + SIZE_CHECK(2264); } #pragma endregion Vulkan pipeline state