From 6bd7e7cc1ae2f9795caeec0280f4bc8992abf445 Mon Sep 17 00:00:00 2001 From: Danylo Piliaiev Date: Mon, 25 Oct 2021 21:02:32 +0300 Subject: [PATCH] Add support for VK_EXT_attachment_feedback_loop_layout Signed-off-by: Danylo Piliaiev --- .../VulkanPipelineStateViewer.cpp | 9 ++++--- renderdoc/api/replay/vk_pipestate.h | 3 +++ renderdoc/driver/vulkan/extension_support.md | 2 +- renderdoc/driver/vulkan/vk_common.h | 2 ++ renderdoc/driver/vulkan/vk_core.cpp | 4 +++ renderdoc/driver/vulkan/vk_hookset_defs.h | 6 +++-- renderdoc/driver/vulkan/vk_info.cpp | 10 ++++++++ renderdoc/driver/vulkan/vk_info.h | 2 ++ renderdoc/driver/vulkan/vk_next_chains.cpp | 3 ++- renderdoc/driver/vulkan/vk_replay.cpp | 3 +++ renderdoc/driver/vulkan/vk_serialise.cpp | 25 ++++++++++++++++--- .../vulkan/wrappers/vk_device_funcs.cpp | 8 ++++++ 12 files changed, 67 insertions(+), 10 deletions(-) diff --git a/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp b/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp index 9e9b10a9c..4ebfa58c7 100644 --- a/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp +++ b/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp @@ -2584,9 +2584,12 @@ void VulkanPipelineStateViewer::setState() } else { - ui->renderpass->setText(QFormatStr("Render Pass: %1 (Subpass %2)") - .arg(ToQStr(state.currentPass.renderpass.resourceId)) - .arg(state.currentPass.renderpass.subpass)); + QString text = QFormatStr("Render Pass: %1 (Subpass %2)") + .arg(ToQStr(state.currentPass.renderpass.resourceId)) + .arg(state.currentPass.renderpass.subpass); + if(state.currentPass.renderpass.feedbackLoop) + text += tr(" (Feedback Loop)"); + ui->renderpass->setText(text); ui->framebuffer->setText( QFormatStr("Framebuffer: %1").arg(ToQStr(state.currentPass.framebuffer.resourceId))); } diff --git a/renderdoc/api/replay/vk_pipestate.h b/renderdoc/api/replay/vk_pipestate.h index 0d708ca6d..9167d9131 100644 --- a/renderdoc/api/replay/vk_pipestate.h +++ b/renderdoc/api/replay/vk_pipestate.h @@ -992,6 +992,9 @@ struct RenderPass DOCUMENT("Whether or not dynamic rendering is currently suspended."); bool suspended = false; + DOCUMENT("Whether or not there is a potential feedback loop."); + bool feedbackLoop = false; + DOCUMENT("The index of the current active subpass."); uint32_t subpass; diff --git a/renderdoc/driver/vulkan/extension_support.md b/renderdoc/driver/vulkan/extension_support.md index 5953899be..c6938f9b7 100644 --- a/renderdoc/driver/vulkan/extension_support.md +++ b/renderdoc/driver/vulkan/extension_support.md @@ -25,6 +25,7 @@ Maintainers can update this file by updating vk.xml in this folder and running ` * `VK_EXT_4444_formats` * `VK_EXT_acquire_xlib_display` * `VK_EXT_astc_decode_mode` +* `VK_EXT_attachment_feedback_loop_layout` * `VK_EXT_buffer_device_address` * `VK_EXT_calibrated_timestamps` * `VK_EXT_color_write_enable` @@ -230,7 +231,6 @@ Ray tracing extensions are now standard and will likely be supported at some poi ## EXT Extensions * `VK_EXT_acquire_drm_display` -* `VK_EXT_attachment_feedback_loop_layout` * `VK_EXT_blend_operation_advanced` * `VK_EXT_border_color_swizzle` * `VK_EXT_depth_clip_control` diff --git a/renderdoc/driver/vulkan/vk_common.h b/renderdoc/driver/vulkan/vk_common.h index c2b9b752a..27e1bf33f 100644 --- a/renderdoc/driver/vulkan/vk_common.h +++ b/renderdoc/driver/vulkan/vk_common.h @@ -943,6 +943,7 @@ DECLARE_REFLECTION_STRUCT(VkPhysicalDevice16BitStorageFeatures); DECLARE_REFLECTION_STRUCT(VkPhysicalDevice4444FormatsFeaturesEXT); DECLARE_REFLECTION_STRUCT(VkPhysicalDevice8BitStorageFeatures); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceASTCDecodeFeaturesEXT); +DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceBufferDeviceAddressFeatures); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceBufferDeviceAddressFeaturesEXT); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceCoherentMemoryFeaturesAMD); @@ -1320,6 +1321,7 @@ DECLARE_DESERIALISE_TYPE(VkPhysicalDevice16BitStorageFeatures); DECLARE_DESERIALISE_TYPE(VkPhysicalDevice4444FormatsFeaturesEXT); DECLARE_DESERIALISE_TYPE(VkPhysicalDevice8BitStorageFeatures); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceASTCDecodeFeaturesEXT); +DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceCoherentMemoryFeaturesAMD); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceColorWriteEnableFeaturesEXT); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceComputeShaderDerivativesFeaturesNV); diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index c799849b3..3479f26b2 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -876,6 +876,10 @@ static const VkExtensionProperties supportedExtensions[] = { { VK_EXT_ASTC_DECODE_MODE_EXTENSION_NAME, VK_EXT_ASTC_DECODE_MODE_SPEC_VERSION, }, + { + VK_EXT_ATTACHMENT_FEEDBACK_LOOP_LAYOUT_EXTENSION_NAME, + VK_EXT_ATTACHMENT_FEEDBACK_LOOP_LAYOUT_SPEC_VERSION, + }, { VK_EXT_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME, VK_EXT_BUFFER_DEVICE_ADDRESS_SPEC_VERSION, }, diff --git a/renderdoc/driver/vulkan/vk_hookset_defs.h b/renderdoc/driver/vulkan/vk_hookset_defs.h index ec14ba338..948bd6f64 100644 --- a/renderdoc/driver/vulkan/vk_hookset_defs.h +++ b/renderdoc/driver/vulkan/vk_hookset_defs.h @@ -537,7 +537,8 @@ DeclExt(EXT_extended_dynamic_state2); \ DeclExt(EXT_vertex_input_dynamic_state); \ DeclExt(KHR_dynamic_rendering); \ - DeclExt(KHR_fragment_shading_rate); + DeclExt(KHR_fragment_shading_rate); \ + DeclExt(EXT_attachment_feedback_loop_layout); // for simplicity and since the check itself is platform agnostic, // these aren't protected in platform defines @@ -645,7 +646,8 @@ CheckExt(EXT_extended_dynamic_state2, VK13); \ CheckExt(EXT_vertex_input_dynamic_state, VKXX); \ CheckExt(KHR_dynamic_rendering, VK13); \ - CheckExt(KHR_fragment_shading_rate, VKXX); + CheckExt(KHR_fragment_shading_rate, VKXX); \ + CheckExt(EXT_attachment_feedback_loop_layout, VKXX); #define HookInitVulkanInstanceExts_PhysDev() \ HookInitExtension(KHR_surface, GetPhysicalDeviceSurfaceSupportKHR); \ diff --git a/renderdoc/driver/vulkan/vk_info.cpp b/renderdoc/driver/vulkan/vk_info.cpp index 0b5011581..48cb9ed60 100644 --- a/renderdoc/driver/vulkan/vk_info.cpp +++ b/renderdoc/driver/vulkan/vk_info.cpp @@ -1260,6 +1260,8 @@ void VulkanCreationInfo::RenderPass::Init(VulkanResourceManager *resourceMan, dst.shadingRateLayout = VK_IMAGE_LAYOUT_UNDEFINED; dst.shadingRateTexelSize = VkExtent2D({1, 1}); + dst.feedbackLoop = false; + if(multiview && multiview->subpassCount > 0) { uint32_t mask = multiview->pViewMasks[subp]; @@ -1270,6 +1272,14 @@ void VulkanCreationInfo::RenderPass::Init(VulkanResourceManager *resourceMan, } } } + + for(uint32_t i = 0; i < pCreateInfo->dependencyCount; i++) + { + if(pCreateInfo->pDependencies[i].dependencyFlags & VK_DEPENDENCY_FEEDBACK_LOOP_BIT_EXT) + { + subpasses[pCreateInfo->pDependencies[i].dstSubpass].feedbackLoop = true; + } + } } void VulkanCreationInfo::RenderPass::Init(VulkanResourceManager *resourceMan, diff --git a/renderdoc/driver/vulkan/vk_info.h b/renderdoc/driver/vulkan/vk_info.h index f684aeb91..88bc3147a 100644 --- a/renderdoc/driver/vulkan/vk_info.h +++ b/renderdoc/driver/vulkan/vk_info.h @@ -491,6 +491,8 @@ struct VulkanCreationInfo VkExtent2D shadingRateTexelSize; rdcarray multiviews; + + bool feedbackLoop; }; rdcarray subpasses; diff --git a/renderdoc/driver/vulkan/vk_next_chains.cpp b/renderdoc/driver/vulkan/vk_next_chains.cpp index 8d367c90e..57c6a530c 100644 --- a/renderdoc/driver/vulkan/vk_next_chains.cpp +++ b/renderdoc/driver/vulkan/vk_next_chains.cpp @@ -205,6 +205,8 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, VkPhysicalDevice8BitStorageFeatures); \ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT, \ VkPhysicalDeviceASTCDecodeFeaturesEXT); \ + COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ATTACHMENT_FEEDBACK_LOOP_LAYOUT_FEATURES_EXT, \ + VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT); \ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT, \ VkPhysicalDeviceBufferDeviceAddressFeaturesEXT); \ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES, \ @@ -798,7 +800,6 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_PROPERTIES_KHR: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_AMIGO_PROFILING_FEATURES_SEC: \ - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ATTACHMENT_FEEDBACK_LOOP_LAYOUT_FEATURES_EXT: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BORDER_COLOR_SWIZZLE_FEATURES_EXT: \ diff --git a/renderdoc/driver/vulkan/vk_replay.cpp b/renderdoc/driver/vulkan/vk_replay.cpp index 0053bd25d..94640a5a2 100644 --- a/renderdoc/driver/vulkan/vk_replay.cpp +++ b/renderdoc/driver/vulkan/vk_replay.cpp @@ -1577,6 +1577,7 @@ void VulkanReplay::SavePipelineState(uint32_t eventId) rpState.dynamic = true; rpState.suspended = dyn.suspended; + rpState.feedbackLoop = false; rpState.resourceId = ResourceId(); rpState.subpass = 0; rpState.fragmentDensityOffsets.clear(); @@ -1763,6 +1764,8 @@ void VulkanReplay::SavePipelineState(uint32_t eventId) ret.currentPass.renderpass.multiviews = c.m_RenderPass[state.GetRenderPass()].subpasses[state.subpass].multiviews; + ret.currentPass.renderpass.feedbackLoop = + c.m_RenderPass[state.GetRenderPass()].subpasses[state.subpass].feedbackLoop; ResourceId fb = state.GetFramebuffer(); diff --git a/renderdoc/driver/vulkan/vk_serialise.cpp b/renderdoc/driver/vulkan/vk_serialise.cpp index eafcbbf3b..6819f891a 100644 --- a/renderdoc/driver/vulkan/vk_serialise.cpp +++ b/renderdoc/driver/vulkan/vk_serialise.cpp @@ -559,6 +559,10 @@ SERIALISE_VK_HANDLES(); PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT, \ VkPhysicalDeviceASTCDecodeFeaturesEXT) \ \ + /* VK_EXT_attachment_feedback_loop_layout */ \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ATTACHMENT_FEEDBACK_LOOP_LAYOUT_FEATURES_EXT, \ + VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT) \ + \ /* VK_EXT_buffer_device_address */ \ PNEXT_STRUCT(VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT, \ VkBufferDeviceAddressCreateInfoEXT) \ @@ -1328,9 +1332,6 @@ SERIALISE_VK_HANDLES(); PNEXT_UNSUPPORTED( \ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_EARLY_AND_LATE_FRAGMENT_TESTS_FEATURES_AMD) \ \ - /* VK_EXT_attachment_feedback_loop_layout */ \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ATTACHMENT_FEEDBACK_LOOP_LAYOUT_FEATURES_EXT) \ - \ /* VK_EXT_blend_operation_advanced */ \ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT) \ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT) \ @@ -7615,6 +7616,23 @@ void Deserialise(const VkExternalMemoryImageCreateInfoNV &el) DeserialiseNext(el.pNext); } +template +void DoSerialise(SerialiserType &ser, VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT &el) +{ + RDCASSERT(ser.IsReading() || + el.sType == + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ATTACHMENT_FEEDBACK_LOOP_LAYOUT_FEATURES_EXT); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER(attachmentFeedbackLoopLayout); +} + +template <> +void Deserialise(const VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT &el) +{ + DeserialiseNext(el.pNext); +} + template void DoSerialise(SerialiserType &ser, VkPhysicalDeviceShaderImageFootprintFeaturesNV &el) { @@ -10645,6 +10663,7 @@ INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceShaderIntegerDotProductProperties); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceShaderTerminateInvocationFeatures); +INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceSparseImageFormatInfo2); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceSubgroupProperties); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceSubgroupSizeControlFeatures); diff --git a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp index d9d1482a0..2d0238470 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp @@ -2345,6 +2345,14 @@ bool WrappedVulkan::Serialise_vkCreateDevice(SerialiserType &ser, VkPhysicalDevi } END_PHYS_EXT_CHECK(); + BEGIN_PHYS_EXT_CHECK( + VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ATTACHMENT_FEEDBACK_LOOP_LAYOUT_FEATURES_EXT); + { + CHECK_PHYS_EXT_FEATURE(attachmentFeedbackLoopLayout); + } + END_PHYS_EXT_CHECK(); + BEGIN_PHYS_EXT_CHECK( VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_KHR);