Support VK_EXT_multisampled_render_to_single_sampled

This extension greatly simplifies MSAA rendering on TBR hardware.
This commit is contained in:
Shahbaz Youssefi
2022-08-28 10:10:43 -04:00
committed by Baldur Karlsson
parent 8e2e0b6bb5
commit 8f14374b52
14 changed files with 374 additions and 199 deletions
@@ -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);
}
+7
View File
@@ -1082,6 +1082,13 @@ If the list is empty, fdm_offset is disabled and rendering is as normal.
:type: List[Offset]
)");
rdcarray<Offset> 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.");
+6
View File
@@ -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);
+4
View File
@@ -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,
},
+181 -179
View File
@@ -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() \
+17 -1
View File
@@ -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))
+2
View File
@@ -482,6 +482,7 @@ struct VulkanCreationInfo
int32_t depthstencilResolveAttachment;
int32_t fragmentDensityAttachment;
int32_t shadingRateAttachment;
VkSampleCountFlagBits tileOnlyMSAASampleCount;
rdcarray<VkImageLayout> inputLayouts;
rdcarray<VkImageLayout> inputStencilLayouts;
@@ -496,6 +497,7 @@ struct VulkanCreationInfo
rdcarray<uint32_t> multiviews;
bool feedbackLoop;
bool tileOnlyMSAAEnable;
};
rdcarray<Subpass> subpasses;
+6 -3
View File
@@ -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: \
+4
View File
@@ -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();
+60 -6
View File
@@ -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 <typename SerialiserType>
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 <typename SerialiserType>
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 <typename SerialiserType>
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 <typename SerialiserType>
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);
+12
View File
@@ -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
+3
View File
@@ -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
@@ -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<ResourceId> 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<ResourceId> attachments;
for(size_t i = 0; i < renderstate.dynamicRendering.color.size(); i++)
+4 -3
View File
@@ -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 <typename SerialiserType>
@@ -2284,7 +2285,7 @@ void DoSerialise(SerialiserType &ser, VKPipe::CurrentPass &el)
SERIALISE_MEMBER(framebuffer);
SERIALISE_MEMBER(renderArea);
SIZE_CHECK(224);
SIZE_CHECK(232);
}
template <typename SerialiserType>
@@ -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