From 963365716ef301eb80a83ceeeb769995db70fdef Mon Sep 17 00:00:00 2001 From: Bix Date: Sat, 22 Nov 2025 19:03:05 +0100 Subject: [PATCH] [vk] Simplifying DynamicState and ExtendedState with Bitfield --- .../renderer_vulkan/fixed_pipeline_state.cpp | 48 ++++++------- .../renderer_vulkan/fixed_pipeline_state.h | 68 +++++++++++-------- .../renderer_vulkan/vk_pipeline_cache.cpp | 66 +++++++++--------- 3 files changed, 95 insertions(+), 87 deletions(-) diff --git a/src/video_core/renderer_vulkan/fixed_pipeline_state.cpp b/src/video_core/renderer_vulkan/fixed_pipeline_state.cpp index 2ecdba70a0..23781bed20 100644 --- a/src/video_core/renderer_vulkan/fixed_pipeline_state.cpp +++ b/src/video_core/renderer_vulkan/fixed_pipeline_state.cpp @@ -61,37 +61,37 @@ void FixedPipelineState::Refresh(Tegra::Engines::Maxwell3D& maxwell3d, DynamicFe raw1_eds3_extended = 0; // EDS1 - extended_dynamic_state.Assign(features.has_extended_dynamic_state ? 1 : 0); + extended_dynamic_state.Assign(features.has_extended_dynamic_state); // EDS2 - extended_dynamic_state_2.Assign(features.has_extended_dynamic_state_2 ? 1 : 0); - extended_dynamic_state_2_logic_op.Assign(features.has_extended_dynamic_state_2_logic_op ? 1 : 0); - extended_dynamic_state_2_patch_control_points.Assign(features.has_extended_dynamic_state_2_patch_control_points ? 1 : 0); + extended_dynamic_state_2.Assign(features.has_extended_dynamic_state_2); + extended_dynamic_state_2_logic_op.Assign(features.has_extended_dynamic_state_2_logic_op); + extended_dynamic_state_2_patch_control_points.Assign(features.has_extended_dynamic_state_2_patch_control_points); // EDS3 - Blending/Enables - extended_dynamic_state_3_blend.Assign(features.has_extended_dynamic_state_3_blend ? 1 : 0); - extended_dynamic_state_3_enables.Assign(features.has_extended_dynamic_state_3_enables ? 1 : 0); + extended_dynamic_state_3_blend.Assign(features.has_extended_dynamic_state_3_blend); + extended_dynamic_state_3_enables.Assign(features.has_extended_dynamic_state_3_enables); // EDS3 - Granular features - extended_dynamic_state_3_depth_clamp.Assign(features.has_extended_dynamic_state_3_depth_clamp ? 1 : 0); - extended_dynamic_state_3_logic_op_enable.Assign(features.has_extended_dynamic_state_3_logic_op_enable ? 1 : 0); - extended_dynamic_state_3_tessellation_domain_origin.Assign(features.has_extended_dynamic_state_3_tessellation_domain_origin ? 1 : 0); - extended_dynamic_state_3_polygon_mode.Assign(features.has_extended_dynamic_state_3_polygon_mode ? 1 : 0); - extended_dynamic_state_3_rasterization_samples.Assign(features.has_extended_dynamic_state_3_rasterization_samples ? 1 : 0); - extended_dynamic_state_3_sample_mask.Assign(features.has_extended_dynamic_state_3_sample_mask ? 1 : 0); - extended_dynamic_state_3_alpha_to_coverage_enable.Assign(features.has_extended_dynamic_state_3_alpha_to_coverage_enable ? 1 : 0); - extended_dynamic_state_3_alpha_to_one_enable.Assign(features.has_extended_dynamic_state_3_alpha_to_one_enable ? 1 : 0); - extended_dynamic_state_3_depth_clip_enable.Assign(features.has_extended_dynamic_state_3_depth_clip_enable ? 1 : 0); - extended_dynamic_state_3_depth_clip_negative_one_to_one.Assign(features.has_extended_dynamic_state_3_depth_clip_negative_one_to_one ? 1 : 0); - extended_dynamic_state_3_line_rasterization_mode.Assign(features.has_extended_dynamic_state_3_line_rasterization_mode ? 1 : 0); - extended_dynamic_state_3_line_stipple_enable.Assign(features.has_extended_dynamic_state_3_line_stipple_enable ? 1 : 0); - extended_dynamic_state_3_provoking_vertex_mode.Assign(features.has_extended_dynamic_state_3_provoking_vertex_mode ? 1 : 0); - extended_dynamic_state_3_conservative_rasterization_mode.Assign(features.has_extended_dynamic_state_3_conservative_rasterization_mode ? 1 : 0); - extended_dynamic_state_3_sample_locations_enable.Assign(features.has_extended_dynamic_state_3_sample_locations_enable ? 1 : 0); - extended_dynamic_state_3_rasterization_stream.Assign(features.has_extended_dynamic_state_3_rasterization_stream ? 1 : 0); + extended_dynamic_state_3_depth_clamp.Assign(features.has_extended_dynamic_state_3_depth_clamp); + extended_dynamic_state_3_logic_op_enable.Assign(features.has_extended_dynamic_state_3_logic_op_enable); + extended_dynamic_state_3_tessellation_domain_origin.Assign(features.has_extended_dynamic_state_3_tessellation_domain_origin); + extended_dynamic_state_3_polygon_mode.Assign(features.has_extended_dynamic_state_3_polygon_mode); + extended_dynamic_state_3_rasterization_samples.Assign(features.has_extended_dynamic_state_3_rasterization_samples); + extended_dynamic_state_3_sample_mask.Assign(features.has_extended_dynamic_state_3_sample_mask); + extended_dynamic_state_3_alpha_to_coverage_enable.Assign(features.has_extended_dynamic_state_3_alpha_to_coverage_enable); + extended_dynamic_state_3_alpha_to_one_enable.Assign(features.has_extended_dynamic_state_3_alpha_to_one_enable); + extended_dynamic_state_3_depth_clip_enable.Assign(features.has_extended_dynamic_state_3_depth_clip_enable); + extended_dynamic_state_3_depth_clip_negative_one_to_one.Assign(features.has_extended_dynamic_state_3_depth_clip_negative_one_to_one); + extended_dynamic_state_3_line_rasterization_mode.Assign(features.has_extended_dynamic_state_3_line_rasterization_mode); + extended_dynamic_state_3_line_stipple_enable.Assign(features.has_extended_dynamic_state_3_line_stipple_enable); + extended_dynamic_state_3_provoking_vertex_mode.Assign(features.has_extended_dynamic_state_3_provoking_vertex_mode); + extended_dynamic_state_3_conservative_rasterization_mode.Assign(features.has_extended_dynamic_state_3_conservative_rasterization_mode); + extended_dynamic_state_3_sample_locations_enable.Assign(features.has_extended_dynamic_state_3_sample_locations_enable); + extended_dynamic_state_3_rasterization_stream.Assign(features.has_extended_dynamic_state_3_rasterization_stream); // Vertex Input - dynamic_vertex_input.Assign(features.has_dynamic_vertex_input ? 1 : 0); + dynamic_vertex_input.Assign(features.has_dynamic_vertex_input); xfb_enabled.Assign(regs.transform_feedback_enabled != 0); ndc_minus_one_to_one.Assign(regs.depth_mode == Maxwell::DepthMode::MinusOneToOne ? 1 : 0); @@ -187,7 +187,7 @@ void FixedPipelineState::Refresh(Tegra::Engines::Maxwell3D& maxwell3d, DynamicFe return static_cast(array.stride.Value()); }); } - if (!extended_dynamic_state_2_extra) { + if (!extended_dynamic_state_2_logic_op) { dynamic_state.Refresh2(regs, topology_, extended_dynamic_state_2); } if (!extended_dynamic_state_3_blend) { diff --git a/src/video_core/renderer_vulkan/fixed_pipeline_state.h b/src/video_core/renderer_vulkan/fixed_pipeline_state.h index ca25fbaaf8..1a85feec65 100644 --- a/src/video_core/renderer_vulkan/fixed_pipeline_state.h +++ b/src/video_core/renderer_vulkan/fixed_pipeline_state.h @@ -18,37 +18,45 @@ namespace Vulkan { using Maxwell = Tegra::Engines::Maxwell3D::Regs; struct DynamicFeatures { - // VK_EXT_extended_dynamic_state (EDS1) - All-or-nothing - bool has_extended_dynamic_state; - - // VK_EXT_extended_dynamic_state2 (EDS2) - Granular features - bool has_extended_dynamic_state_2; // Core EDS2 (RasterizerDiscard, DepthBias, PrimitiveRestart) - bool has_extended_dynamic_state_2_logic_op; // LogicOp support - bool has_extended_dynamic_state_2_patch_control_points; // TessellationPatchControlPoints - - // VK_EXT_extended_dynamic_state3 (EDS3) - Highly granular features - bool has_extended_dynamic_state_3_blend; // ColorBlendEnable + ColorBlendEquation + ColorWriteMask - bool has_extended_dynamic_state_3_enables; // DepthClampEnable + LogicOpEnable - bool has_extended_dynamic_state_3_depth_clamp; // DepthClampEnable only - bool has_extended_dynamic_state_3_logic_op_enable; // LogicOpEnable only - bool has_extended_dynamic_state_3_tessellation_domain_origin; // TessellationDomainOrigin - bool has_extended_dynamic_state_3_polygon_mode; // PolygonMode - bool has_extended_dynamic_state_3_rasterization_samples; // RasterizationSamples - bool has_extended_dynamic_state_3_sample_mask; // SampleMask - bool has_extended_dynamic_state_3_alpha_to_coverage_enable; // AlphaToCoverageEnable - bool has_extended_dynamic_state_3_alpha_to_one_enable; // AlphaToOneEnable - bool has_extended_dynamic_state_3_depth_clip_enable; // DepthClipEnable - bool has_extended_dynamic_state_3_depth_clip_negative_one_to_one; // DepthClipNegativeOneToOne - bool has_extended_dynamic_state_3_line_rasterization_mode; // LineRasterizationMode - bool has_extended_dynamic_state_3_line_stipple_enable; // LineStippleEnable - bool has_extended_dynamic_state_3_provoking_vertex_mode; // ProvokingVertexMode - bool has_extended_dynamic_state_3_conservative_rasterization_mode; // ConservativeRasterizationMode - bool has_extended_dynamic_state_3_sample_locations_enable; // SampleLocationsEnable - bool has_extended_dynamic_state_3_rasterization_stream; // RasterizationStream - - // VK_EXT_vertex_input_dynamic_state - bool has_dynamic_vertex_input; + union { + u32 raw0; + // VK_EXT_extended_dynamic_state (EDS1) - Bit 0 + BitField<0, 1, u32> has_extended_dynamic_state; + + // VK_EXT_extended_dynamic_state2 (EDS2) - Bits 1-3 + BitField<1, 1, u32> has_extended_dynamic_state_2; // Core EDS2 + BitField<2, 1, u32> has_extended_dynamic_state_2_logic_op; // LogicOp + BitField<3, 1, u32> has_extended_dynamic_state_2_patch_control_points; // Tessellation + + // VK_EXT_extended_dynamic_state3 (EDS3) - Bits 4-5 + BitField<4, 1, u32> has_extended_dynamic_state_3_blend; // Blending composite + BitField<5, 1, u32> has_extended_dynamic_state_3_enables; // Enables composite + + // VK_EXT_vertex_input_dynamic_state - Bit 6 + BitField<6, 1, u32> has_dynamic_vertex_input; + + // EDS3 Granular Features - Bits 7-15 + BitField<7, 1, u32> has_extended_dynamic_state_3_depth_clamp; + BitField<8, 1, u32> has_extended_dynamic_state_3_logic_op_enable; + BitField<9, 1, u32> has_extended_dynamic_state_3_tessellation_domain_origin; + BitField<10, 1, u32> has_extended_dynamic_state_3_polygon_mode; + BitField<11, 1, u32> has_extended_dynamic_state_3_rasterization_samples; + BitField<12, 1, u32> has_extended_dynamic_state_3_sample_mask; + BitField<13, 1, u32> has_extended_dynamic_state_3_alpha_to_coverage_enable; + BitField<14, 1, u32> has_extended_dynamic_state_3_alpha_to_one_enable; + BitField<15, 1, u32> has_extended_dynamic_state_3_depth_clip_enable; + + // EDS3 Additional Features - Bits 16-22 + BitField<16, 1, u32> has_extended_dynamic_state_3_depth_clip_negative_one_to_one; + BitField<17, 1, u32> has_extended_dynamic_state_3_line_rasterization_mode; + BitField<18, 1, u32> has_extended_dynamic_state_3_line_stipple_enable; + BitField<19, 1, u32> has_extended_dynamic_state_3_provoking_vertex_mode; + BitField<20, 1, u32> has_extended_dynamic_state_3_conservative_rasterization_mode; + BitField<21, 1, u32> has_extended_dynamic_state_3_sample_locations_enable; + BitField<22, 1, u32> has_extended_dynamic_state_3_rasterization_stream; + }; }; +static_assert(std::has_unique_object_representations_v); struct FixedPipelineState { static u32 PackComparisonOp(Maxwell::ComparisonOp op) noexcept; diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index 76d6ee554e..395ccb41f2 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp @@ -424,39 +424,39 @@ PipelineCache::PipelineCache(Tegra::MaxwellDeviceMemoryManager& device_memory_, LOG_INFO(Render_Vulkan, "DynamicState value is set to {}", (u32) dynamic_state); - dynamic_features = DynamicFeatures{ - // EDS1 - All-or-nothing (enabled if driver supports AND setting > 0) - .has_extended_dynamic_state = device.IsExtExtendedDynamicStateSupported() && dynamic_state > 0, - - // EDS2 - Core features (enabled if driver supports AND setting > 1) - .has_extended_dynamic_state_2 = device.IsExtExtendedDynamicState2Supported() && dynamic_state > 1, - .has_extended_dynamic_state_2_logic_op = device.IsExtExtendedDynamicState2LogicOpSupported() && dynamic_state > 1, - .has_extended_dynamic_state_2_patch_control_points = device.IsExtExtendedDynamicState2PatchControlPointsSupported() && dynamic_state > 1, - - // EDS3 - Granular features (enabled if driver supports AND setting > 2) - .has_extended_dynamic_state_3_blend = device.IsExtExtendedDynamicState3BlendingSupported() && dynamic_state > 2, - .has_extended_dynamic_state_3_enables = device.IsExtExtendedDynamicState3EnablesSupported() && dynamic_state > 2, - .has_extended_dynamic_state_3_depth_clamp = device.IsExtExtendedDynamicState3DepthClampEnableSupported() && dynamic_state > 2, - .has_extended_dynamic_state_3_logic_op_enable = device.IsExtExtendedDynamicState3LogicOpEnableSupported() && dynamic_state > 2, - .has_extended_dynamic_state_3_tessellation_domain_origin = device.IsExtExtendedDynamicState3TessellationDomainOriginSupported() && dynamic_state > 2, - .has_extended_dynamic_state_3_polygon_mode = device.IsExtExtendedDynamicState3PolygonModeSupported() && dynamic_state > 2, - .has_extended_dynamic_state_3_rasterization_samples = device.IsExtExtendedDynamicState3RasterizationSamplesSupported() && dynamic_state > 2, - .has_extended_dynamic_state_3_sample_mask = device.IsExtExtendedDynamicState3SampleMaskSupported() && dynamic_state > 2, - .has_extended_dynamic_state_3_alpha_to_coverage_enable = device.IsExtExtendedDynamicState3AlphaToCoverageEnableSupported() && dynamic_state > 2, - .has_extended_dynamic_state_3_alpha_to_one_enable = device.IsExtExtendedDynamicState3AlphaToOneEnableSupported() && dynamic_state > 2, - .has_extended_dynamic_state_3_depth_clip_enable = device.IsExtExtendedDynamicState3DepthClipEnableSupported() && dynamic_state > 2, - .has_extended_dynamic_state_3_depth_clip_negative_one_to_one = device.IsExtExtendedDynamicState3DepthClipNegativeOneToOneSupported() && dynamic_state > 2, - .has_extended_dynamic_state_3_line_rasterization_mode = device.IsExtExtendedDynamicState3LineRasterizationModeSupported() && dynamic_state > 2, - .has_extended_dynamic_state_3_line_stipple_enable = device.IsExtExtendedDynamicState3LineStippleEnableSupported() && dynamic_state > 2, - .has_extended_dynamic_state_3_provoking_vertex_mode = device.IsExtExtendedDynamicState3ProvokingVertexModeSupported() && dynamic_state > 2, - .has_extended_dynamic_state_3_conservative_rasterization_mode = device.IsExtExtendedDynamicState3ConservativeRasterizationModeSupported() && dynamic_state > 2, - .has_extended_dynamic_state_3_sample_locations_enable = device.IsExtExtendedDynamicState3SampleLocationsEnableSupported() && dynamic_state > 2, - .has_extended_dynamic_state_3_rasterization_stream = device.IsExtExtendedDynamicState3RasterizationStreamSupported() && dynamic_state > 2, - - // Vertex input dynamic state - .has_dynamic_vertex_input = device.IsExtVertexInputDynamicStateSupported() && - Settings::values.vertex_input_dynamic_state.GetValue(), - }; + dynamic_features.raw0 = 0; + + // EDS1 - All-or-nothing (enabled if driver supports AND setting > 0) + dynamic_features.has_extended_dynamic_state.Assign(device.IsExtExtendedDynamicStateSupported() && dynamic_state > 0); + + // EDS2 - Core features (enabled if driver supports AND setting > 1) + dynamic_features.has_extended_dynamic_state_2.Assign(device.IsExtExtendedDynamicState2Supported() && dynamic_state > 1); + dynamic_features.has_extended_dynamic_state_2_logic_op.Assign(device.IsExtExtendedDynamicState2LogicOpSupported() && dynamic_state > 1); + dynamic_features.has_extended_dynamic_state_2_patch_control_points.Assign(device.IsExtExtendedDynamicState2PatchControlPointsSupported() && dynamic_state > 1); + + // EDS3 - Granular features (enabled if driver supports AND setting > 2) + dynamic_features.has_extended_dynamic_state_3_blend.Assign(device.IsExtExtendedDynamicState3BlendingSupported() && dynamic_state > 2); + dynamic_features.has_extended_dynamic_state_3_enables.Assign(device.IsExtExtendedDynamicState3EnablesSupported() && dynamic_state > 2); + dynamic_features.has_extended_dynamic_state_3_depth_clamp.Assign(device.IsExtExtendedDynamicState3DepthClampEnableSupported() && dynamic_state > 2); + dynamic_features.has_extended_dynamic_state_3_logic_op_enable.Assign(device.IsExtExtendedDynamicState3LogicOpEnableSupported() && dynamic_state > 2); + dynamic_features.has_extended_dynamic_state_3_tessellation_domain_origin.Assign(device.IsExtExtendedDynamicState3TessellationDomainOriginSupported() && dynamic_state > 2); + dynamic_features.has_extended_dynamic_state_3_polygon_mode.Assign(device.IsExtExtendedDynamicState3PolygonModeSupported() && dynamic_state > 2); + dynamic_features.has_extended_dynamic_state_3_rasterization_samples.Assign(device.IsExtExtendedDynamicState3RasterizationSamplesSupported() && dynamic_state > 2); + dynamic_features.has_extended_dynamic_state_3_sample_mask.Assign(device.IsExtExtendedDynamicState3SampleMaskSupported() && dynamic_state > 2); + dynamic_features.has_extended_dynamic_state_3_alpha_to_coverage_enable.Assign(device.IsExtExtendedDynamicState3AlphaToCoverageEnableSupported() && dynamic_state > 2); + dynamic_features.has_extended_dynamic_state_3_alpha_to_one_enable.Assign(device.IsExtExtendedDynamicState3AlphaToOneEnableSupported() && dynamic_state > 2); + dynamic_features.has_extended_dynamic_state_3_depth_clip_enable.Assign(device.IsExtExtendedDynamicState3DepthClipEnableSupported() && dynamic_state > 2); + dynamic_features.has_extended_dynamic_state_3_depth_clip_negative_one_to_one.Assign(device.IsExtExtendedDynamicState3DepthClipNegativeOneToOneSupported() && dynamic_state > 2); + dynamic_features.has_extended_dynamic_state_3_line_rasterization_mode.Assign(device.IsExtExtendedDynamicState3LineRasterizationModeSupported() && dynamic_state > 2); + dynamic_features.has_extended_dynamic_state_3_line_stipple_enable.Assign(device.IsExtExtendedDynamicState3LineStippleEnableSupported() && dynamic_state > 2); + dynamic_features.has_extended_dynamic_state_3_provoking_vertex_mode.Assign(device.IsExtExtendedDynamicState3ProvokingVertexModeSupported() && dynamic_state > 2); + dynamic_features.has_extended_dynamic_state_3_conservative_rasterization_mode.Assign(device.IsExtExtendedDynamicState3ConservativeRasterizationModeSupported() && dynamic_state > 2); + dynamic_features.has_extended_dynamic_state_3_sample_locations_enable.Assign(device.IsExtExtendedDynamicState3SampleLocationsEnableSupported() && dynamic_state > 2); + dynamic_features.has_extended_dynamic_state_3_rasterization_stream.Assign(device.IsExtExtendedDynamicState3RasterizationStreamSupported() && dynamic_state > 2); + + // Vertex input dynamic state (independent toggle) + dynamic_features.has_dynamic_vertex_input.Assign(device.IsExtVertexInputDynamicStateSupported() && + Settings::values.vertex_input_dynamic_state.GetValue()); } PipelineCache::~PipelineCache() {