From 8f14374b520506a79746247d3a1ce5f8aca83a3c Mon Sep 17 00:00:00 2001 From: Shahbaz Youssefi Date: Sun, 28 Aug 2022 10:10:43 -0400 Subject: [PATCH] Support VK_EXT_multisampled_render_to_single_sampled This extension greatly simplifies MSAA rendering on TBR hardware. --- .../VulkanPipelineStateViewer.cpp | 41 +- renderdoc/api/replay/vk_pipestate.h | 7 + renderdoc/driver/vulkan/vk_common.h | 6 + renderdoc/driver/vulkan/vk_core.cpp | 4 + renderdoc/driver/vulkan/vk_hookset_defs.h | 360 +++++++++--------- renderdoc/driver/vulkan/vk_info.cpp | 18 +- renderdoc/driver/vulkan/vk_info.h | 2 + renderdoc/driver/vulkan/vk_next_chains.cpp | 9 +- renderdoc/driver/vulkan/vk_replay.cpp | 4 + renderdoc/driver/vulkan/vk_serialise.cpp | 66 +++- renderdoc/driver/vulkan/vk_state.cpp | 12 + renderdoc/driver/vulkan/vk_state.h | 3 + .../driver/vulkan/wrappers/vk_cmd_funcs.cpp | 34 ++ renderdoc/replay/renderdoc_serialise.inl | 7 +- 14 files changed, 374 insertions(+), 199 deletions(-) diff --git a/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp b/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp index 6229f2d77..bd63c15b6 100644 --- a/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp +++ b/qrenderdoc/Windows/PipelineState/VulkanPipelineStateViewer.cpp @@ -39,6 +39,28 @@ Q_DECLARE_METATYPE(CombinedSamplerData); +namespace +{ +QString getTextureRenderSamples(const TextureDescription *tex, const VKPipe::RenderPass &renderpass) +{ + const uint32_t texSamples = tex ? tex->msSamp : 1; + const uint32_t renderSamples = renderpass.tileOnlyMSAASampleCount; + + QString result = lit("%1x").arg(std::max(texSamples, renderSamples)); + + // With VK_EXT_multisampled_render_to_single_sampled, attachments can either have N or 1 samples, + // where N is the same number of samples specified for MSRTSS. Attachments with Nx samples are + // rendered to normally, while 1x ones are implicitly rendered with N samples. The latter are + // specifically tagged as such. + if(renderSamples > 1 && texSamples == 1) + { + result += lit(" (tile-only)"); + } + + return result; +} +} // namespace + struct VulkanVBIBTag { VulkanVBIBTag() { offset = 0; } @@ -377,11 +399,11 @@ VulkanPipelineStateViewer::VulkanPipelineStateViewer(ICaptureContext &ctx, RDHeaderView *header = new RDHeaderView(Qt::Horizontal, this); ui->fbAttach->setHeader(header); - ui->fbAttach->setColumns( - {tr("Slot"), tr("Resource"), tr("Type"), tr("Dimensions"), tr("Format"), tr("Go")}); - header->setColumnStretchHints({2, 4, 2, 2, 3, -1}); + ui->fbAttach->setColumns({tr("Slot"), tr("Resource"), tr("Type"), tr("Dimensions"), + tr("Format"), tr("Samples"), tr("Go")}); + header->setColumnStretchHints({2, 4, 2, 2, 3, 1, -1}); - ui->fbAttach->setHoverIconColumn(5, action, action_hover); + ui->fbAttach->setHoverIconColumn(6, action, action_hover); ui->fbAttach->setClearSelectionOnFocusLoss(true); ui->fbAttach->setInstantTooltips(true); @@ -2631,6 +2653,7 @@ void VulkanPipelineStateViewer::setState() QString format; QString typeName; QString dimensions; + QString samples; bool tooltipOffsets = false; if(p.imageResourceId != ResourceId()) @@ -2643,6 +2666,7 @@ void VulkanPipelineStateViewer::setState() format = lit("-"); typeName = lit("-"); dimensions = lit("-"); + samples = lit("-"); } TextureDescription *tex = m_Ctx.GetTexture(p.imageResourceId); @@ -2656,6 +2680,7 @@ void VulkanPipelineStateViewer::setState() typeName = ToQStr(tex->type); } + samples = getTextureRenderSamples(tex, state.currentPass.renderpass); if(p.swizzle.red != TextureSwizzle::Red || p.swizzle.green != TextureSwizzle::Green || p.swizzle.blue != TextureSwizzle::Blue || p.swizzle.alpha != TextureSwizzle::Alpha) @@ -2745,8 +2770,8 @@ void VulkanPipelineStateViewer::setState() resName += tr(" (%1x%2 texels)").arg(shadingRateTexelSize.first).arg(shadingRateTexelSize.second); - RDTreeWidgetItem *node = - new RDTreeWidgetItem({slotname, resName, typeName, dimensions, format, QString()}); + RDTreeWidgetItem *node = new RDTreeWidgetItem( + {slotname, resName, typeName, dimensions, format, samples, QString()}); if(tex) node->setTag( @@ -4059,7 +4084,8 @@ void VulkanPipelineStateViewer::exportHTML(QXmlStreamWriter &xml, const VKPipe:: QString name = m_Ctx.GetResourceName(a.imageResourceId); rows.push_back({i, name, tex->width, tex->height, tex->depth, tex->arraysize, a.firstMip, - a.numMips, a.firstSlice, a.numSlices}); + a.numMips, a.firstSlice, a.numSlices, + getTextureRenderSamples(tex, pass.renderpass)}); i++; } @@ -4069,6 +4095,7 @@ void VulkanPipelineStateViewer::exportHTML(QXmlStreamWriter &xml, const VKPipe:: { tr("Slot"), tr("Image"), tr("Width"), tr("Height"), tr("Depth"), tr("Array Size"), tr("First mip"), tr("Number of mips"), tr("First array layer"), tr("Number of layers"), + tr("Sample Count"), }, rows); } diff --git a/renderdoc/api/replay/vk_pipestate.h b/renderdoc/api/replay/vk_pipestate.h index 93e974bf7..601206432 100644 --- a/renderdoc/api/replay/vk_pipestate.h +++ b/renderdoc/api/replay/vk_pipestate.h @@ -1082,6 +1082,13 @@ If the list is empty, fdm_offset is disabled and rendering is as normal. :type: List[Offset] )"); rdcarray fragmentDensityOffsets; + + DOCUMENT(R"(If VK_EXT_multisampled_render_to_single_sampled is enabled, contains the number of +samples used to render this subpass. + +If the subpass is not internally multisampled, tileOnlyMSAASampleCount is set to 0. +)"); + uint32_t tileOnlyMSAASampleCount = 0; }; DOCUMENT("Describes a single attachment in a framebuffer object."); diff --git a/renderdoc/driver/vulkan/vk_common.h b/renderdoc/driver/vulkan/vk_common.h index b834a8afc..bc683496b 100644 --- a/renderdoc/driver/vulkan/vk_common.h +++ b/renderdoc/driver/vulkan/vk_common.h @@ -935,6 +935,7 @@ DECLARE_REFLECTION_STRUCT(VkMemoryOpaqueCaptureAddressAllocateInfo); DECLARE_REFLECTION_STRUCT(VkMemoryPriorityAllocateInfoEXT); DECLARE_REFLECTION_STRUCT(VkMemoryRequirements2); DECLARE_REFLECTION_STRUCT(VkMultisamplePropertiesEXT); +DECLARE_REFLECTION_STRUCT(VkMultisampledRenderToSingleSampledInfoEXT); DECLARE_REFLECTION_STRUCT(VkPastPresentationTimingGOOGLE); DECLARE_REFLECTION_STRUCT(VkPerformanceCounterDescriptionKHR); DECLARE_REFLECTION_STRUCT(VkPerformanceCounterKHR); @@ -1002,6 +1003,7 @@ DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceMaintenance4Properties); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceMemoryBudgetPropertiesEXT); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceMemoryPriorityFeaturesEXT); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceMemoryProperties2); +DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceMultiviewFeatures); DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceMultiviewProperties); DECLARE_REFLECTION_STRUCT(VkPhysicalDevicePCIBusInfoPropertiesEXT); @@ -1155,6 +1157,7 @@ DECLARE_REFLECTION_STRUCT(VkSubpassDescription2); DECLARE_REFLECTION_STRUCT(VkSubpassDescriptionDepthStencilResolve); DECLARE_REFLECTION_STRUCT(VkSubpassEndInfo); DECLARE_REFLECTION_STRUCT(VkSubpassFragmentDensityMapOffsetEndInfoQCOM); +DECLARE_REFLECTION_STRUCT(VkSubpassResolvePerformanceQueryEXT); DECLARE_REFLECTION_STRUCT(VkSubpassSampleLocationsEXT); DECLARE_REFLECTION_STRUCT(VkSurfaceCapabilities2EXT); DECLARE_REFLECTION_STRUCT(VkSurfaceCapabilities2KHR); @@ -1318,6 +1321,7 @@ DECLARE_DESERIALISE_TYPE(VkMemoryOpaqueCaptureAddressAllocateInfo); DECLARE_DESERIALISE_TYPE(VkMemoryPriorityAllocateInfoEXT); DECLARE_DESERIALISE_TYPE(VkMemoryRequirements2); DECLARE_DESERIALISE_TYPE(VkMultisamplePropertiesEXT); +DECLARE_DESERIALISE_TYPE(VkMultisampledRenderToSingleSampledInfoEXT); DECLARE_DESERIALISE_TYPE(VkPerformanceCounterDescriptionKHR); DECLARE_DESERIALISE_TYPE(VkPerformanceCounterKHR); DECLARE_DESERIALISE_TYPE(VkPerformanceQuerySubmitInfoKHR); @@ -1382,6 +1386,7 @@ DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceMaintenance4Properties); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceMemoryBudgetPropertiesEXT); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceMemoryPriorityFeaturesEXT); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceMemoryProperties2); +DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceMultiviewFeatures); DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceMultiviewProperties); DECLARE_DESERIALISE_TYPE(VkPhysicalDevicePCIBusInfoPropertiesEXT); @@ -1532,6 +1537,7 @@ DECLARE_DESERIALISE_TYPE(VkSubpassDescription2); DECLARE_DESERIALISE_TYPE(VkSubpassDescriptionDepthStencilResolve); DECLARE_DESERIALISE_TYPE(VkSubpassEndInfo); DECLARE_DESERIALISE_TYPE(VkSubpassFragmentDensityMapOffsetEndInfoQCOM); +DECLARE_DESERIALISE_TYPE(VkSubpassResolvePerformanceQueryEXT); DECLARE_DESERIALISE_TYPE(VkSubpassSampleLocationsEXT); DECLARE_DESERIALISE_TYPE(VkSurfaceCapabilities2EXT); DECLARE_DESERIALISE_TYPE(VkSurfaceCapabilities2KHR); diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index e6b9dedd8..11753e979 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -1002,6 +1002,10 @@ static const VkExtensionProperties supportedExtensions[] = { VK_EXT_METAL_SURFACE_EXTENSION_NAME, VK_EXT_METAL_SURFACE_SPEC_VERSION, }, #endif + { + VK_EXT_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_EXTENSION_NAME, + VK_EXT_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_SPEC_VERSION, + }, { VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, VK_EXT_PCI_BUS_INFO_SPEC_VERSION, }, diff --git a/renderdoc/driver/vulkan/vk_hookset_defs.h b/renderdoc/driver/vulkan/vk_hookset_defs.h index b936b2f08..6b869c9db 100644 --- a/renderdoc/driver/vulkan/vk_hookset_defs.h +++ b/renderdoc/driver/vulkan/vk_hookset_defs.h @@ -438,109 +438,110 @@ // this is the union of the lists below - necessary because some extensions are in both lists // (device extensions with physical device functions) -#define DeclExts() \ - DeclExt(KHR_xlib_surface); \ - DeclExt(KHR_xcb_surface); \ - DeclExt(KHR_win32_surface); \ - DeclExt(KHR_android_surface); \ - DeclExt(MVK_macos_surface); \ - DeclExt(KHR_surface); \ - DeclExt(GGP_stream_descriptor_surface); \ - DeclExt(EXT_debug_report); \ - DeclExt(KHR_display); \ - DeclExt(NV_external_memory_capabilities); \ - DeclExt(KHR_get_physical_device_properties2); \ - DeclExt(EXT_display_surface_counter); \ - DeclExt(EXT_direct_mode_display); \ - DeclExt(EXT_acquire_xlib_display); \ - DeclExt(KHR_external_memory_capabilities); \ - DeclExt(KHR_external_semaphore_capabilities); \ - DeclExt(KHR_external_fence_capabilities); \ - DeclExt(EXT_debug_utils); \ - DeclExt(KHR_device_group_creation); \ - DeclExt(protected_memory); \ - DeclExt(KHR_get_surface_capabilities2); \ - DeclExt(KHR_get_display_properties2); \ - DeclExt(EXT_headless_surface); \ - DeclExt(EXT_metal_surface); \ - DeclExt(KHR_wayland_surface); \ - /* device extensions */ \ - DeclExt(EXT_debug_marker); \ - DeclExt(GGP_frame_token); \ - DeclExt(KHR_swapchain); \ - DeclExt(KHR_display_swapchain); \ - DeclExt(NV_external_memory); \ - DeclExt(NV_external_memory_win32); \ - DeclExt(NV_win32_keyed_mutex); \ - DeclExt(KHR_maintenance1); \ - DeclExt(KHR_maintenance2); \ - DeclExt(KHR_maintenance3); \ - DeclExt(EXT_display_control); \ - DeclExt(KHR_external_memory); \ - DeclExt(KHR_external_memory_win32); \ - DeclExt(KHR_external_memory_fd); \ - DeclExt(KHR_external_semaphore); \ - DeclExt(KHR_external_semaphore_win32); \ - DeclExt(KHR_external_semaphore_fd); \ - DeclExt(KHR_external_fence); \ - DeclExt(KHR_external_fence_win32); \ - DeclExt(KHR_external_fence_fd); \ - DeclExt(KHR_get_memory_requirements2); \ - DeclExt(AMD_shader_info); \ - DeclExt(KHR_push_descriptor); \ - DeclExt(KHR_descriptor_update_template); \ - DeclExt(KHR_bind_memory2); \ - DeclExt(EXT_conservative_rasterization); \ - DeclExt(EXT_global_priority); \ - DeclExt(AMD_buffer_marker); \ - DeclExt(EXT_vertex_attribute_divisor); \ - DeclExt(EXT_sampler_filter_minmax); \ - DeclExt(KHR_sampler_ycbcr_conversion); \ - DeclExt(KHR_device_group); \ - DeclExt(MVK_moltenvk); \ - DeclExt(KHR_draw_indirect_count); \ - DeclExt(EXT_validation_cache); \ - DeclExt(KHR_shared_presentable_image); \ - DeclExt(KHR_create_renderpass2); \ - DeclExt(EXT_transform_feedback); \ - DeclExt(EXT_conditional_rendering); \ - DeclExt(EXT_sample_locations); \ - DeclExt(EXT_discard_rectangles); \ - DeclExt(EXT_calibrated_timestamps); \ - DeclExt(EXT_host_query_reset); \ - DeclExt(EXT_buffer_device_address); \ - DeclExt(EXT_full_screen_exclusive); \ - DeclExt(EXT_hdr_metadata); \ - DeclExt(AMD_display_native_hdr); \ - DeclExt(EXT_depth_clip_control); \ - DeclExt(EXT_depth_clip_enable); \ - DeclExt(KHR_pipeline_executable_properties); \ - DeclExt(AMD_negative_viewport_height); \ - DeclExt(EXT_line_rasterization); \ - DeclExt(GOOGLE_display_timing); \ - DeclExt(KHR_timeline_semaphore); \ - DeclExt(KHR_performance_query); \ - DeclExt(KHR_buffer_device_address); \ - DeclExt(EXT_tooling_info); \ - DeclExt(KHR_separate_depth_stencil_layouts); \ - DeclExt(KHR_shader_non_semantic_info); \ - DeclExt(EXT_inline_uniform_block); \ - DeclExt(EXT_custom_border_color); \ - DeclExt(EXT_robustness2); \ - DeclExt(EXT_pipeline_creation_cache_control); \ - DeclExt(EXT_primitive_topology_list_restart); \ - DeclExt(EXT_primitives_generated_query); \ - DeclExt(EXT_private_data); \ - DeclExt(EXT_extended_dynamic_state); \ - DeclExt(KHR_copy_commands2); \ - DeclExt(KHR_synchronization2); \ - DeclExt(KHR_present_wait); \ - DeclExt(KHR_maintenance4); \ - DeclExt(EXT_color_write_enable); \ - DeclExt(EXT_extended_dynamic_state2); \ - DeclExt(EXT_vertex_input_dynamic_state); \ - DeclExt(KHR_dynamic_rendering); \ - DeclExt(KHR_fragment_shading_rate); \ +#define DeclExts() \ + DeclExt(KHR_xlib_surface); \ + DeclExt(KHR_xcb_surface); \ + DeclExt(KHR_win32_surface); \ + DeclExt(KHR_android_surface); \ + DeclExt(MVK_macos_surface); \ + DeclExt(KHR_surface); \ + DeclExt(GGP_stream_descriptor_surface); \ + DeclExt(EXT_debug_report); \ + DeclExt(KHR_display); \ + DeclExt(NV_external_memory_capabilities); \ + DeclExt(KHR_get_physical_device_properties2); \ + DeclExt(EXT_display_surface_counter); \ + DeclExt(EXT_direct_mode_display); \ + DeclExt(EXT_acquire_xlib_display); \ + DeclExt(KHR_external_memory_capabilities); \ + DeclExt(KHR_external_semaphore_capabilities); \ + DeclExt(KHR_external_fence_capabilities); \ + DeclExt(EXT_debug_utils); \ + DeclExt(KHR_device_group_creation); \ + DeclExt(protected_memory); \ + DeclExt(KHR_get_surface_capabilities2); \ + DeclExt(KHR_get_display_properties2); \ + DeclExt(EXT_headless_surface); \ + DeclExt(EXT_metal_surface); \ + DeclExt(KHR_wayland_surface); \ + /* device extensions */ \ + DeclExt(EXT_debug_marker); \ + DeclExt(GGP_frame_token); \ + DeclExt(KHR_swapchain); \ + DeclExt(KHR_display_swapchain); \ + DeclExt(NV_external_memory); \ + DeclExt(NV_external_memory_win32); \ + DeclExt(NV_win32_keyed_mutex); \ + DeclExt(KHR_maintenance1); \ + DeclExt(KHR_maintenance2); \ + DeclExt(KHR_maintenance3); \ + DeclExt(EXT_display_control); \ + DeclExt(KHR_external_memory); \ + DeclExt(KHR_external_memory_win32); \ + DeclExt(KHR_external_memory_fd); \ + DeclExt(KHR_external_semaphore); \ + DeclExt(KHR_external_semaphore_win32); \ + DeclExt(KHR_external_semaphore_fd); \ + DeclExt(KHR_external_fence); \ + DeclExt(KHR_external_fence_win32); \ + DeclExt(KHR_external_fence_fd); \ + DeclExt(KHR_get_memory_requirements2); \ + DeclExt(AMD_shader_info); \ + DeclExt(KHR_push_descriptor); \ + DeclExt(KHR_descriptor_update_template); \ + DeclExt(KHR_bind_memory2); \ + DeclExt(EXT_conservative_rasterization); \ + DeclExt(EXT_global_priority); \ + DeclExt(AMD_buffer_marker); \ + DeclExt(EXT_vertex_attribute_divisor); \ + DeclExt(EXT_sampler_filter_minmax); \ + DeclExt(KHR_sampler_ycbcr_conversion); \ + DeclExt(KHR_device_group); \ + DeclExt(MVK_moltenvk); \ + DeclExt(KHR_draw_indirect_count); \ + DeclExt(EXT_validation_cache); \ + DeclExt(KHR_shared_presentable_image); \ + DeclExt(KHR_create_renderpass2); \ + DeclExt(EXT_transform_feedback); \ + DeclExt(EXT_conditional_rendering); \ + DeclExt(EXT_sample_locations); \ + DeclExt(EXT_discard_rectangles); \ + DeclExt(EXT_calibrated_timestamps); \ + DeclExt(EXT_host_query_reset); \ + DeclExt(EXT_buffer_device_address); \ + DeclExt(EXT_full_screen_exclusive); \ + DeclExt(EXT_hdr_metadata); \ + DeclExt(AMD_display_native_hdr); \ + DeclExt(EXT_depth_clip_control); \ + DeclExt(EXT_depth_clip_enable); \ + DeclExt(KHR_pipeline_executable_properties); \ + DeclExt(AMD_negative_viewport_height); \ + DeclExt(EXT_line_rasterization); \ + DeclExt(GOOGLE_display_timing); \ + DeclExt(KHR_timeline_semaphore); \ + DeclExt(KHR_performance_query); \ + DeclExt(KHR_buffer_device_address); \ + DeclExt(EXT_tooling_info); \ + DeclExt(KHR_separate_depth_stencil_layouts); \ + DeclExt(KHR_shader_non_semantic_info); \ + DeclExt(EXT_inline_uniform_block); \ + DeclExt(EXT_custom_border_color); \ + DeclExt(EXT_robustness2); \ + DeclExt(EXT_pipeline_creation_cache_control); \ + DeclExt(EXT_primitive_topology_list_restart); \ + DeclExt(EXT_primitives_generated_query); \ + DeclExt(EXT_private_data); \ + DeclExt(EXT_extended_dynamic_state); \ + DeclExt(KHR_copy_commands2); \ + DeclExt(KHR_synchronization2); \ + DeclExt(KHR_present_wait); \ + DeclExt(KHR_maintenance4); \ + DeclExt(EXT_color_write_enable); \ + DeclExt(EXT_extended_dynamic_state2); \ + DeclExt(EXT_multisampled_render_to_single_sampled); \ + DeclExt(EXT_vertex_input_dynamic_state); \ + DeclExt(KHR_dynamic_rendering); \ + DeclExt(KHR_fragment_shading_rate); \ DeclExt(EXT_attachment_feedback_loop_layout); // for simplicity and since the check itself is platform agnostic, @@ -577,82 +578,83 @@ CheckExt(KHR_performance_query, VKXX); \ CheckExt(KHR_fragment_shading_rate, VKXX); -#define CheckDeviceExts() \ - CheckExt(EXT_debug_marker, VKXX); \ - CheckExt(GGP_frame_token, VKXX); \ - CheckExt(KHR_swapchain, VKXX); \ - CheckExt(KHR_display_swapchain, VKXX); \ - CheckExt(NV_external_memory, VKXX); \ - CheckExt(NV_external_memory_win32, VKXX); \ - CheckExt(NV_win32_keyed_mutex, VKXX); \ - CheckExt(KHR_maintenance1, VK11); \ - CheckExt(KHR_maintenance2, VK11); \ - CheckExt(KHR_maintenance3, VK11); \ - CheckExt(EXT_display_control, VKXX); \ - CheckExt(KHR_external_memory, VK11); \ - CheckExt(KHR_external_memory_win32, VKXX); \ - CheckExt(KHR_external_memory_fd, VKXX); \ - CheckExt(KHR_external_semaphore, VK11); \ - CheckExt(KHR_external_semaphore_win32, VKXX); \ - CheckExt(KHR_external_semaphore_fd, VKXX); \ - CheckExt(KHR_external_fence, VK11); \ - CheckExt(KHR_external_fence_win32, VKXX); \ - CheckExt(KHR_external_fence_fd, VKXX); \ - CheckExt(KHR_get_memory_requirements2, VK11); \ - CheckExt(AMD_shader_info, VKXX); \ - CheckExt(KHR_push_descriptor, VKXX); \ - CheckExt(KHR_descriptor_update_template, VK11); \ - CheckExt(KHR_bind_memory2, VK11); \ - CheckExt(EXT_conservative_rasterization, VKXX); \ - CheckExt(EXT_global_priority, VKXX); \ - CheckExt(AMD_buffer_marker, VKXX); \ - CheckExt(EXT_vertex_attribute_divisor, VKXX); \ - CheckExt(EXT_sampler_filter_minmax, VK12); \ - CheckExt(KHR_sampler_ycbcr_conversion, VK11); \ - CheckExt(KHR_device_group, VK11); \ - CheckExt(MVK_moltenvk, VKXX); \ - CheckExt(KHR_draw_indirect_count, VK12); \ - CheckExt(EXT_validation_cache, VKXX); \ - CheckExt(KHR_shared_presentable_image, VKXX); \ - CheckExt(KHR_create_renderpass2, VK12); \ - CheckExt(EXT_transform_feedback, VKXX); \ - CheckExt(EXT_conditional_rendering, VKXX); \ - CheckExt(EXT_sample_locations, VKXX); \ - CheckExt(EXT_discard_rectangles, VKXX); \ - CheckExt(EXT_calibrated_timestamps, VKXX); \ - CheckExt(EXT_host_query_reset, VK12); \ - CheckExt(EXT_buffer_device_address, VKXX); \ - CheckExt(EXT_hdr_metadata, VKXX); \ - CheckExt(AMD_display_native_hdr, VKXX); \ - CheckExt(EXT_depth_clip_control, VKXX); \ - CheckExt(EXT_depth_clip_enable, VKXX); \ - CheckExt(KHR_pipeline_executable_properties, VKXX); \ - CheckExt(AMD_negative_viewport_height, VKXX); \ - CheckExt(EXT_line_rasterization, VKXX); \ - CheckExt(GOOGLE_display_timing, VKXX); \ - CheckExt(KHR_timeline_semaphore, VK12); \ - CheckExt(KHR_performance_query, VKXX); \ - CheckExt(KHR_buffer_device_address, VK12); \ - CheckExt(EXT_tooling_info, VK13); \ - CheckExt(KHR_separate_depth_stencil_layouts, VK12); \ - CheckExt(KHR_shader_non_semantic_info, VK13); \ - CheckExt(EXT_inline_uniform_block, VK13); \ - CheckExt(EXT_custom_border_color, VKXX); \ - CheckExt(EXT_robustness2, VKXX); \ - CheckExt(EXT_pipeline_creation_cache_control, VKXX); \ - CheckExt(EXT_primitive_topology_list_restart, VKXX); \ - CheckExt(EXT_primitives_generated_query, VKXX); \ - CheckExt(EXT_private_data, VK13); \ - CheckExt(EXT_extended_dynamic_state, VK13); \ - CheckExt(KHR_copy_commands2, VK13); \ - CheckExt(KHR_synchronization2, VK13); \ - CheckExt(KHR_present_wait, VKXX); \ - CheckExt(KHR_maintenance4, VK13); \ - CheckExt(EXT_color_write_enable, VKXX); \ - CheckExt(EXT_extended_dynamic_state2, VK13); \ - CheckExt(EXT_vertex_input_dynamic_state, VKXX); \ - CheckExt(KHR_dynamic_rendering, VK13); \ - CheckExt(KHR_fragment_shading_rate, VKXX); \ +#define CheckDeviceExts() \ + CheckExt(EXT_debug_marker, VKXX); \ + CheckExt(GGP_frame_token, VKXX); \ + CheckExt(KHR_swapchain, VKXX); \ + CheckExt(KHR_display_swapchain, VKXX); \ + CheckExt(NV_external_memory, VKXX); \ + CheckExt(NV_external_memory_win32, VKXX); \ + CheckExt(NV_win32_keyed_mutex, VKXX); \ + CheckExt(KHR_maintenance1, VK11); \ + CheckExt(KHR_maintenance2, VK11); \ + CheckExt(KHR_maintenance3, VK11); \ + CheckExt(EXT_display_control, VKXX); \ + CheckExt(KHR_external_memory, VK11); \ + CheckExt(KHR_external_memory_win32, VKXX); \ + CheckExt(KHR_external_memory_fd, VKXX); \ + CheckExt(KHR_external_semaphore, VK11); \ + CheckExt(KHR_external_semaphore_win32, VKXX); \ + CheckExt(KHR_external_semaphore_fd, VKXX); \ + CheckExt(KHR_external_fence, VK11); \ + CheckExt(KHR_external_fence_win32, VKXX); \ + CheckExt(KHR_external_fence_fd, VKXX); \ + CheckExt(KHR_get_memory_requirements2, VK11); \ + CheckExt(AMD_shader_info, VKXX); \ + CheckExt(KHR_push_descriptor, VKXX); \ + CheckExt(KHR_descriptor_update_template, VK11); \ + CheckExt(KHR_bind_memory2, VK11); \ + CheckExt(EXT_conservative_rasterization, VKXX); \ + CheckExt(EXT_global_priority, VKXX); \ + CheckExt(AMD_buffer_marker, VKXX); \ + CheckExt(EXT_vertex_attribute_divisor, VKXX); \ + CheckExt(EXT_sampler_filter_minmax, VK12); \ + CheckExt(KHR_sampler_ycbcr_conversion, VK11); \ + CheckExt(KHR_device_group, VK11); \ + CheckExt(MVK_moltenvk, VKXX); \ + CheckExt(KHR_draw_indirect_count, VK12); \ + CheckExt(EXT_validation_cache, VKXX); \ + CheckExt(KHR_shared_presentable_image, VKXX); \ + CheckExt(KHR_create_renderpass2, VK12); \ + CheckExt(EXT_transform_feedback, VKXX); \ + CheckExt(EXT_conditional_rendering, VKXX); \ + CheckExt(EXT_sample_locations, VKXX); \ + CheckExt(EXT_discard_rectangles, VKXX); \ + CheckExt(EXT_calibrated_timestamps, VKXX); \ + CheckExt(EXT_host_query_reset, VK12); \ + CheckExt(EXT_buffer_device_address, VKXX); \ + CheckExt(EXT_hdr_metadata, VKXX); \ + CheckExt(AMD_display_native_hdr, VKXX); \ + CheckExt(EXT_depth_clip_control, VKXX); \ + CheckExt(EXT_depth_clip_enable, VKXX); \ + CheckExt(KHR_pipeline_executable_properties, VKXX); \ + CheckExt(AMD_negative_viewport_height, VKXX); \ + CheckExt(EXT_line_rasterization, VKXX); \ + CheckExt(GOOGLE_display_timing, VKXX); \ + CheckExt(KHR_timeline_semaphore, VK12); \ + CheckExt(KHR_performance_query, VKXX); \ + CheckExt(KHR_buffer_device_address, VK12); \ + CheckExt(EXT_tooling_info, VK13); \ + CheckExt(KHR_separate_depth_stencil_layouts, VK12); \ + CheckExt(KHR_shader_non_semantic_info, VK13); \ + CheckExt(EXT_inline_uniform_block, VK13); \ + CheckExt(EXT_custom_border_color, VKXX); \ + CheckExt(EXT_robustness2, VKXX); \ + CheckExt(EXT_pipeline_creation_cache_control, VKXX); \ + CheckExt(EXT_primitive_topology_list_restart, VKXX); \ + CheckExt(EXT_primitives_generated_query, VKXX); \ + CheckExt(EXT_private_data, VK13); \ + CheckExt(EXT_extended_dynamic_state, VK13); \ + CheckExt(KHR_copy_commands2, VK13); \ + CheckExt(KHR_synchronization2, VK13); \ + CheckExt(KHR_present_wait, VKXX); \ + CheckExt(KHR_maintenance4, VK13); \ + CheckExt(EXT_color_write_enable, VKXX); \ + CheckExt(EXT_extended_dynamic_state2, VK13); \ + CheckExt(EXT_multisampled_render_to_single_sampled, VKXX); \ + CheckExt(EXT_vertex_input_dynamic_state, VKXX); \ + CheckExt(KHR_dynamic_rendering, VK13); \ + CheckExt(KHR_fragment_shading_rate, VKXX); \ CheckExt(EXT_attachment_feedback_loop_layout, VKXX); #define HookInitVulkanInstanceExts_PhysDev() \ diff --git a/renderdoc/driver/vulkan/vk_info.cpp b/renderdoc/driver/vulkan/vk_info.cpp index 50ec47c68..b777187ff 100644 --- a/renderdoc/driver/vulkan/vk_info.cpp +++ b/renderdoc/driver/vulkan/vk_info.cpp @@ -1274,6 +1274,9 @@ void VulkanCreationInfo::RenderPass::Init(VulkanResourceManager *resourceMan, dst.feedbackLoop = false; + dst.tileOnlyMSAAEnable = false; + dst.tileOnlyMSAASampleCount = VK_SAMPLE_COUNT_1_BIT; + if(multiview && multiview->subpassCount > 0) { uint32_t mask = multiview->pViewMasks[subp]; @@ -1393,8 +1396,11 @@ void VulkanCreationInfo::RenderPass::Init(VulkanResourceManager *resourceMan, (const VkSubpassDescriptionDepthStencilResolve *)FindNextStruct( &src, VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE); + // Note: with VK_EXT_multisampled_render_to_single_sampled, it's possible for + // VkSubpassDescriptionDepthStencilResolve to be provided (for the sake of specifying the + // resolve mode) without an attachment. dst.depthstencilResolveAttachment = - (depthstencilResolve && + (depthstencilResolve && depthstencilResolve->pDepthStencilResolveAttachment && depthstencilResolve->pDepthStencilResolveAttachment->attachment != VK_ATTACHMENT_UNUSED ? depthstencilResolve->pDepthStencilResolveAttachment->attachment : -1); @@ -1431,6 +1437,16 @@ void VulkanCreationInfo::RenderPass::Init(VulkanResourceManager *resourceMan, dst.shadingRateTexelSize = shadingRate ? shadingRate->shadingRateAttachmentTexelSize : VkExtent2D({1, 1}); + // VK_EXT_multisampled_render_to_single_sampled + const VkMultisampledRenderToSingleSampledInfoEXT *tileOnlyMSAA = + (const VkMultisampledRenderToSingleSampledInfoEXT *)FindNextStruct( + &src, VK_STRUCTURE_TYPE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_INFO_EXT); + + dst.tileOnlyMSAAEnable = + tileOnlyMSAA ? tileOnlyMSAA->multisampledRenderToSingleSampledEnable != VK_FALSE : false; + dst.tileOnlyMSAASampleCount = + tileOnlyMSAA ? tileOnlyMSAA->rasterizationSamples : VK_SAMPLE_COUNT_1_BIT; + for(uint32_t i = 0; i < 32; i++) { if(src.viewMask & (1 << i)) diff --git a/renderdoc/driver/vulkan/vk_info.h b/renderdoc/driver/vulkan/vk_info.h index dcbc9b0a4..90f3a623d 100644 --- a/renderdoc/driver/vulkan/vk_info.h +++ b/renderdoc/driver/vulkan/vk_info.h @@ -482,6 +482,7 @@ struct VulkanCreationInfo int32_t depthstencilResolveAttachment; int32_t fragmentDensityAttachment; int32_t shadingRateAttachment; + VkSampleCountFlagBits tileOnlyMSAASampleCount; rdcarray inputLayouts; rdcarray inputStencilLayouts; @@ -496,6 +497,7 @@ struct VulkanCreationInfo rdcarray multiviews; bool feedbackLoop; + bool tileOnlyMSAAEnable; }; rdcarray subpasses; diff --git a/renderdoc/driver/vulkan/vk_next_chains.cpp b/renderdoc/driver/vulkan/vk_next_chains.cpp index 8b82f8a4d..8c5b3c721 100644 --- a/renderdoc/driver/vulkan/vk_next_chains.cpp +++ b/renderdoc/driver/vulkan/vk_next_chains.cpp @@ -193,6 +193,8 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, COPY_STRUCT(VK_STRUCTURE_TYPE_MEMORY_PRIORITY_ALLOCATE_INFO_EXT, VkMemoryPriorityAllocateInfoEXT); \ COPY_STRUCT(VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2, VkMemoryRequirements2); \ COPY_STRUCT(VK_STRUCTURE_TYPE_MULTISAMPLE_PROPERTIES_EXT, VkMultisamplePropertiesEXT); \ + COPY_STRUCT(VK_STRUCTURE_TYPE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_INFO_EXT, \ + VkMultisampledRenderToSingleSampledInfoEXT); \ COPY_STRUCT(VK_STRUCTURE_TYPE_PERFORMANCE_COUNTER_DESCRIPTION_KHR, \ VkPerformanceCounterDescriptionKHR); \ COPY_STRUCT(VK_STRUCTURE_TYPE_PERFORMANCE_COUNTER_KHR, VkPerformanceCounterKHR); \ @@ -318,6 +320,8 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, VkPhysicalDeviceMemoryProperties2); \ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT, \ VkPhysicalDeviceMemoryPriorityFeaturesEXT); \ + COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_FEATURES_EXT, \ + VkPhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT); \ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES, \ VkPhysicalDeviceMultiviewFeatures); \ COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES, \ @@ -552,6 +556,8 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, COPY_STRUCT(VK_STRUCTURE_TYPE_SUBPASS_FRAGMENT_DENSITY_MAP_OFFSET_END_INFO_QCOM, \ VkSubpassFragmentDensityMapOffsetEndInfoQCOM); \ COPY_STRUCT(VK_STRUCTURE_TYPE_SUBPASS_END_INFO, VkSubpassEndInfo); \ + COPY_STRUCT(VK_STRUCTURE_TYPE_SUBPASS_RESOLVE_PERFORMANCE_QUERY_EXT, \ + VkSubpassResolvePerformanceQueryEXT); \ COPY_STRUCT(VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_EXT, VkSurfaceCapabilities2EXT); \ COPY_STRUCT(VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_KHR, VkSurfaceCapabilities2KHR); \ COPY_STRUCT(VK_STRUCTURE_TYPE_SURFACE_FORMAT_2_KHR, VkSurfaceFormat2KHR); \ @@ -798,7 +804,6 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, case VK_STRUCTURE_TYPE_MEMORY_GET_ZIRCON_HANDLE_INFO_FUCHSIA: \ case VK_STRUCTURE_TYPE_MEMORY_HOST_POINTER_PROPERTIES_EXT: \ case VK_STRUCTURE_TYPE_MEMORY_ZIRCON_HANDLE_PROPERTIES_FUCHSIA: \ - case VK_STRUCTURE_TYPE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_INFO_EXT: \ case VK_STRUCTURE_TYPE_MULTIVIEW_PER_VIEW_ATTRIBUTES_INFO_NVX: \ case VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_VALVE: \ case VK_STRUCTURE_TYPE_PERFORMANCE_CONFIGURATION_ACQUIRE_INFO_INTEL: \ @@ -840,7 +845,6 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_PROPERTIES_EXT: \ - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_FEATURES_EXT: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE: \ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NON_SEAMLESS_CUBE_MAP_FEATURES_EXT: \ @@ -904,7 +908,6 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct, case VK_STRUCTURE_TYPE_SCREEN_SURFACE_CREATE_INFO_QNX: \ case VK_STRUCTURE_TYPE_SEMAPHORE_GET_ZIRCON_HANDLE_INFO_FUCHSIA: \ case VK_STRUCTURE_TYPE_SHADER_MODULE_IDENTIFIER_EXT: \ - case VK_STRUCTURE_TYPE_SUBPASS_RESOLVE_PERFORMANCE_QUERY_EXT: \ case VK_STRUCTURE_TYPE_SUBPASS_SHADING_PIPELINE_CREATE_INFO_HUAWEI: \ case VK_STRUCTURE_TYPE_SUBRESOURCE_LAYOUT_2_EXT: \ case VK_STRUCTURE_TYPE_SYSMEM_COLOR_SPACE_FUCHSIA: \ diff --git a/renderdoc/driver/vulkan/vk_replay.cpp b/renderdoc/driver/vulkan/vk_replay.cpp index a6724836c..181a5a4fc 100644 --- a/renderdoc/driver/vulkan/vk_replay.cpp +++ b/renderdoc/driver/vulkan/vk_replay.cpp @@ -1587,6 +1587,7 @@ void VulkanReplay::SavePipelineState(uint32_t eventId) rpState.resourceId = ResourceId(); rpState.subpass = 0; rpState.fragmentDensityOffsets.clear(); + rpState.tileOnlyMSAASampleCount = 0; fbState.resourceId = ResourceId(); // dynamic rendering does not provide a framebuffer dimension, it's implicit from the image @@ -1772,6 +1773,8 @@ void VulkanReplay::SavePipelineState(uint32_t eventId) c.m_RenderPass[state.GetRenderPass()].subpasses[state.subpass].multiviews; ret.currentPass.renderpass.feedbackLoop = c.m_RenderPass[state.GetRenderPass()].subpasses[state.subpass].feedbackLoop; + ret.currentPass.renderpass.tileOnlyMSAASampleCount = + c.m_RenderPass[state.GetRenderPass()].subpasses[state.subpass].tileOnlyMSAASampleCount; ResourceId fb = state.GetFramebuffer(); @@ -1851,6 +1854,7 @@ void VulkanReplay::SavePipelineState(uint32_t eventId) ret.currentPass.renderpass.fragmentDensityAttachment = -1; ret.currentPass.renderpass.shadingRateAttachment = -1; ret.currentPass.renderpass.shadingRateTexelSize = {1, 1}; + ret.currentPass.renderpass.tileOnlyMSAASampleCount = 0; ret.currentPass.framebuffer.resourceId = ResourceId(); ret.currentPass.framebuffer.attachments.clear(); diff --git a/renderdoc/driver/vulkan/vk_serialise.cpp b/renderdoc/driver/vulkan/vk_serialise.cpp index 8fc85059e..49e290dd0 100644 --- a/renderdoc/driver/vulkan/vk_serialise.cpp +++ b/renderdoc/driver/vulkan/vk_serialise.cpp @@ -1124,6 +1124,14 @@ SERIALISE_VK_HANDLES(); PNEXT_STRUCT(VK_STRUCTURE_TYPE_DEVICE_BUFFER_MEMORY_REQUIREMENTS, VkDeviceBufferMemoryRequirements) \ PNEXT_STRUCT(VK_STRUCTURE_TYPE_DEVICE_IMAGE_MEMORY_REQUIREMENTS, VkDeviceImageMemoryRequirements) \ \ + /* VK_EXT_multisampled_render_to_single_sampled */ \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_INFO_EXT, \ + VkMultisampledRenderToSingleSampledInfoEXT) \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_FEATURES_EXT, \ + VkPhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT) \ + PNEXT_STRUCT(VK_STRUCTURE_TYPE_SUBPASS_RESOLVE_PERFORMANCE_QUERY_EXT, \ + VkSubpassResolvePerformanceQueryEXT) \ + \ /* VK_KHR_multiview */ \ PNEXT_STRUCT(VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO, VkRenderPassMultiviewCreateInfo) \ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES, \ @@ -1412,12 +1420,6 @@ SERIALISE_VK_HANDLES(); PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT) \ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_PROPERTIES_EXT) \ \ - /* VK_EXT_multisampled_render_to_single_sampled */ \ - PNEXT_UNSUPPORTED( \ - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_FEATURES_EXT) \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_SUBPASS_RESOLVE_PERFORMANCE_QUERY_EXT) \ - PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_INFO_EXT) \ - \ /* VK_EXT_non_seamless_cube_map */ \ PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NON_SEAMLESS_CUBE_MAP_FEATURES_EXT) \ \ @@ -5877,6 +5879,55 @@ void Deserialise(const VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT &el) DeserialiseNext(el.pNext); } +template +void DoSerialise(SerialiserType &ser, VkMultisampledRenderToSingleSampledInfoEXT &el) +{ + RDCASSERT(ser.IsReading() || + el.sType == VK_STRUCTURE_TYPE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_INFO_EXT); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER(multisampledRenderToSingleSampledEnable); + SERIALISE_MEMBER(rasterizationSamples); +} + +template <> +void Deserialise(const VkMultisampledRenderToSingleSampledInfoEXT &el) +{ + DeserialiseNext(el.pNext); +} + +template +void DoSerialise(SerialiserType &ser, VkPhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT &el) +{ + RDCASSERT(ser.IsReading() || + el.sType == + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_FEATURES_EXT); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER(multisampledRenderToSingleSampled); +} + +template <> +void Deserialise(const VkPhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT &el) +{ + DeserialiseNext(el.pNext); +} + +template +void DoSerialise(SerialiserType &ser, VkSubpassResolvePerformanceQueryEXT &el) +{ + RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_SUBPASS_RESOLVE_PERFORMANCE_QUERY_EXT); + SerialiseNext(ser, el.sType, el.pNext); + + SERIALISE_MEMBER(optimal); +} + +template <> +void Deserialise(const VkSubpassResolvePerformanceQueryEXT &el) +{ + DeserialiseNext(el.pNext); +} + template void DoSerialise(SerialiserType &ser, VkPhysicalDeviceMultiviewFeatures &el) { @@ -10634,6 +10685,7 @@ INSTANTIATE_SERIALISE_TYPE(VkMemoryOpaqueCaptureAddressAllocateInfo); INSTANTIATE_SERIALISE_TYPE(VkMemoryPriorityAllocateInfoEXT); INSTANTIATE_SERIALISE_TYPE(VkMemoryRequirements2); INSTANTIATE_SERIALISE_TYPE(VkMultisamplePropertiesEXT); +INSTANTIATE_SERIALISE_TYPE(VkMultisampledRenderToSingleSampledInfoEXT); INSTANTIATE_SERIALISE_TYPE(VkPastPresentationTimingGOOGLE); INSTANTIATE_SERIALISE_TYPE(VkPerformanceCounterDescriptionKHR); INSTANTIATE_SERIALISE_TYPE(VkPerformanceCounterKHR); @@ -10698,6 +10750,7 @@ INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceMaintenance4Properties); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceMemoryBudgetPropertiesEXT); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceMemoryPriorityFeaturesEXT); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceMemoryProperties2); +INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceMultiviewFeatures); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceMultiviewProperties); INSTANTIATE_SERIALISE_TYPE(VkPhysicalDevicePCIBusInfoPropertiesEXT); @@ -10852,6 +10905,7 @@ INSTANTIATE_SERIALISE_TYPE(VkSubpassDescription2); INSTANTIATE_SERIALISE_TYPE(VkSubpassDescriptionDepthStencilResolve); INSTANTIATE_SERIALISE_TYPE(VkSubpassFragmentDensityMapOffsetEndInfoQCOM); INSTANTIATE_SERIALISE_TYPE(VkSubpassEndInfo); +INSTANTIATE_SERIALISE_TYPE(VkSubpassResolvePerformanceQueryEXT); INSTANTIATE_SERIALISE_TYPE(VkSubpassSampleLocationsEXT); INSTANTIATE_SERIALISE_TYPE(VkSurfaceCapabilities2EXT); INSTANTIATE_SERIALISE_TYPE(VkSurfaceCapabilities2KHR); diff --git a/renderdoc/driver/vulkan/vk_state.cpp b/renderdoc/driver/vulkan/vk_state.cpp index 7552362df..31db4d898 100644 --- a/renderdoc/driver/vulkan/vk_state.cpp +++ b/renderdoc/driver/vulkan/vk_state.cpp @@ -41,6 +41,7 @@ struct RenderingInfoStructs VkRenderingFragmentDensityMapAttachmentInfoEXT fragmentDensity; VkRenderingFragmentShadingRateAttachmentInfoKHR shadingRate; + VkMultisampledRenderToSingleSampledInfoEXT tileOnlyMSAA; }; void setupRenderingInfo(const VulkanRenderState::DynamicRendering &dynamicRendering, @@ -117,6 +118,17 @@ void setupRenderingInfo(const VulkanRenderState::DynamicRendering &dynamicRender structs->shadingRate.pNext = info->pNext; info->pNext = &structs->shadingRate; } + + structs->tileOnlyMSAA = { + VK_STRUCTURE_TYPE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_INFO_EXT, NULL, + dynamicRendering.tileOnlyMSAAEnable, dynamicRendering.tileOnlyMSAASampleCount, + }; + + if(dynamicRendering.tileOnlyMSAAEnable) + { + structs->tileOnlyMSAA.pNext = info->pNext; + info->pNext = &structs->tileOnlyMSAA; + } } } // namespace diff --git a/renderdoc/driver/vulkan/vk_state.h b/renderdoc/driver/vulkan/vk_state.h index 9fdad8475..295ceba32 100644 --- a/renderdoc/driver/vulkan/vk_state.h +++ b/renderdoc/driver/vulkan/vk_state.h @@ -234,6 +234,9 @@ struct VulkanRenderState VkImageView shadingRateView = VK_NULL_HANDLE; VkImageLayout shadingRateLayout = VK_IMAGE_LAYOUT_UNDEFINED; VkExtent2D shadingRateTexelSize = {1, 1}; + + bool tileOnlyMSAAEnable = false; + VkSampleCountFlagBits tileOnlyMSAASampleCount = VK_SAMPLE_COUNT_1_BIT; } dynamicRendering; // fdm offset diff --git a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp index 38884190b..c91a9fb79 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp @@ -1460,6 +1460,18 @@ bool WrappedVulkan::Serialise_vkEndCommandBuffer(SerialiserType &ser, VkCommandB info.pNext = &shadingRate; } + VkMultisampledRenderToSingleSampledInfoEXT tileOnlyMSAA = { + VK_STRUCTURE_TYPE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_INFO_EXT, NULL, + renderstate.dynamicRendering.tileOnlyMSAAEnable, + renderstate.dynamicRendering.tileOnlyMSAASampleCount, + }; + + if(renderstate.dynamicRendering.tileOnlyMSAAEnable) + { + tileOnlyMSAA.pNext = info.pNext; + info.pNext = &tileOnlyMSAA; + } + byte *tempMem = GetTempMemory(GetNextPatchSize(&info)); VkRenderingInfo *unwrappedInfo = UnwrapStructAndChain(m_State, tempMem, &info); @@ -6811,6 +6823,17 @@ bool WrappedVulkan::Serialise_vkCmdBeginRendering(SerialiserType &ser, VkCommand shadingRateAttachment->shadingRateAttachmentTexelSize; } + VkMultisampledRenderToSingleSampledInfoEXT *tileOnlyMSAA = + (VkMultisampledRenderToSingleSampledInfoEXT *)FindNextStruct( + &RenderingInfo, VK_STRUCTURE_TYPE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_INFO_EXT); + + if(tileOnlyMSAA) + { + renderstate.dynamicRendering.tileOnlyMSAAEnable = + tileOnlyMSAA->multisampledRenderToSingleSampledEnable != VK_FALSE; + renderstate.dynamicRendering.tileOnlyMSAASampleCount = tileOnlyMSAA->rasterizationSamples; + } + rdcarray attachments; for(size_t i = 0; i < renderstate.dynamicRendering.color.size(); i++) @@ -6957,6 +6980,17 @@ bool WrappedVulkan::Serialise_vkCmdBeginRendering(SerialiserType &ser, VkCommand shadingRateAttachment->shadingRateAttachmentTexelSize; } + VkMultisampledRenderToSingleSampledInfoEXT *tileOnlyMSAA = + (VkMultisampledRenderToSingleSampledInfoEXT *)FindNextStruct( + &RenderingInfo, VK_STRUCTURE_TYPE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_INFO_EXT); + + if(tileOnlyMSAA) + { + renderstate.dynamicRendering.tileOnlyMSAAEnable = + tileOnlyMSAA->multisampledRenderToSingleSampledEnable != VK_FALSE; + renderstate.dynamicRendering.tileOnlyMSAASampleCount = tileOnlyMSAA->rasterizationSamples; + } + rdcarray attachments; for(size_t i = 0; i < renderstate.dynamicRendering.color.size(); i++) diff --git a/renderdoc/replay/renderdoc_serialise.inl b/renderdoc/replay/renderdoc_serialise.inl index 064b2ede8..526db359d 100644 --- a/renderdoc/replay/renderdoc_serialise.inl +++ b/renderdoc/replay/renderdoc_serialise.inl @@ -2233,8 +2233,9 @@ void DoSerialise(SerialiserType &ser, VKPipe::RenderPass &el) SERIALISE_MEMBER(shadingRateTexelSize); SERIALISE_MEMBER(multiviews); SERIALISE_MEMBER(fragmentDensityOffsets); + SERIALISE_MEMBER(tileOnlyMSAASampleCount); - SIZE_CHECK(160); + SIZE_CHECK(168); } template @@ -2284,7 +2285,7 @@ void DoSerialise(SerialiserType &ser, VKPipe::CurrentPass &el) SERIALISE_MEMBER(framebuffer); SERIALISE_MEMBER(renderArea); - SIZE_CHECK(224); + SIZE_CHECK(232); } template @@ -2352,7 +2353,7 @@ void DoSerialise(SerialiserType &ser, VKPipe::State &el) SERIALISE_MEMBER(conditionalRendering); - SIZE_CHECK(2240); + SIZE_CHECK(2248); } #pragma endregion Vulkan pipeline state