diff --git a/src/video_core/renderer_vulkan/fixed_pipeline_state.h b/src/video_core/renderer_vulkan/fixed_pipeline_state.h index 7398084219..ffdfd5e861 100644 --- a/src/video_core/renderer_vulkan/fixed_pipeline_state.h +++ b/src/video_core/renderer_vulkan/fixed_pipeline_state.h @@ -21,43 +21,35 @@ namespace Vulkan { using Maxwell = Tegra::Engines::Maxwell3D::Regs; struct DynamicFeatures { - 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; - }; + // VK_EXT_extended_dynamic_state (EDS1) - Bit 0 + bool has_extended_dynamic_state : 1; + // VK_EXT_extended_dynamic_state2 (EDS2) - Bits 1-3 + bool has_extended_dynamic_state_2 : 1; // Core EDS2 + bool has_extended_dynamic_state_2_logic_op : 1; // LogicOp + bool has_extended_dynamic_state_2_patch_control_points : 1; // Tessellation + // VK_EXT_extended_dynamic_state3 (EDS3) - Bits 4-5 + bool has_extended_dynamic_state_3_blend : 1; // Blending composite + bool has_extended_dynamic_state_3_enables : 1; // Enables composite + // VK_EXT_vertex_input_dynamic_state - Bit 6 + bool has_dynamic_vertex_input : 1; + // EDS3 Granular Features - Bits 7-15 + bool has_extended_dynamic_state_3_depth_clamp; + bool has_extended_dynamic_state_3_logic_op_enable; + bool has_extended_dynamic_state_3_tessellation_domain_origin; + bool has_extended_dynamic_state_3_polygon_mode; + bool has_extended_dynamic_state_3_rasterization_samples; + bool has_extended_dynamic_state_3_sample_mask; + bool has_extended_dynamic_state_3_alpha_to_coverage_enable : 1; + bool has_extended_dynamic_state_3_alpha_to_one_enable : 1; + bool has_extended_dynamic_state_3_depth_clip_enable : 1; + // EDS3 Additional Features - Bits 16-22 + bool has_extended_dynamic_state_3_depth_clip_negative_one_to_one : 1; + bool has_extended_dynamic_state_3_line_rasterization_mode : 1; + bool has_extended_dynamic_state_3_line_stipple_enable : 1; + bool has_extended_dynamic_state_3_provoking_vertex_mode : 1; + bool has_extended_dynamic_state_3_conservative_rasterization_mode : 1; + bool has_extended_dynamic_state_3_sample_locations_enable : 1; + bool has_extended_dynamic_state_3_rasterization_stream : 1; }; static_assert(std::has_unique_object_representations_v); diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index 2b6f686066..b21bc9cbf1 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp @@ -541,29 +541,29 @@ void PipelineCache::LoadDiskResources(u64 title_id, std::stop_token stop_loading file.read(reinterpret_cast(&key), sizeof(key)); // Validate dynamic features compatibility - granular per-feature check - if ((key.state.extended_dynamic_state != 0) != dynamic_features.has_extended_dynamic_state || - (key.state.extended_dynamic_state_2 != 0) != dynamic_features.has_extended_dynamic_state_2 || - (key.state.extended_dynamic_state_2_logic_op != 0) != dynamic_features.has_extended_dynamic_state_2_logic_op || - (key.state.extended_dynamic_state_2_patch_control_points != 0) != dynamic_features.has_extended_dynamic_state_2_patch_control_points || - (key.state.extended_dynamic_state_3_blend != 0) != dynamic_features.has_extended_dynamic_state_3_blend || - (key.state.extended_dynamic_state_3_enables != 0) != dynamic_features.has_extended_dynamic_state_3_enables || - (key.state.extended_dynamic_state_3_depth_clamp != 0) != dynamic_features.has_extended_dynamic_state_3_depth_clamp || - (key.state.extended_dynamic_state_3_logic_op_enable != 0) != dynamic_features.has_extended_dynamic_state_3_logic_op_enable || - (key.state.extended_dynamic_state_3_tessellation_domain_origin != 0) != dynamic_features.has_extended_dynamic_state_3_tessellation_domain_origin || - (key.state.extended_dynamic_state_3_polygon_mode != 0) != dynamic_features.has_extended_dynamic_state_3_polygon_mode || - (key.state.extended_dynamic_state_3_rasterization_samples != 0) != dynamic_features.has_extended_dynamic_state_3_rasterization_samples || - (key.state.extended_dynamic_state_3_sample_mask != 0) != dynamic_features.has_extended_dynamic_state_3_sample_mask || - (key.state.extended_dynamic_state_3_alpha_to_coverage_enable != 0) != dynamic_features.has_extended_dynamic_state_3_alpha_to_coverage_enable || - (key.state.extended_dynamic_state_3_alpha_to_one_enable != 0) != dynamic_features.has_extended_dynamic_state_3_alpha_to_one_enable || - (key.state.extended_dynamic_state_3_depth_clip_enable != 0) != dynamic_features.has_extended_dynamic_state_3_depth_clip_enable || - (key.state.extended_dynamic_state_3_depth_clip_negative_one_to_one != 0) != dynamic_features.has_extended_dynamic_state_3_depth_clip_negative_one_to_one || - (key.state.extended_dynamic_state_3_line_rasterization_mode != 0) != dynamic_features.has_extended_dynamic_state_3_line_rasterization_mode || - (key.state.extended_dynamic_state_3_line_stipple_enable != 0) != dynamic_features.has_extended_dynamic_state_3_line_stipple_enable || - (key.state.extended_dynamic_state_3_provoking_vertex_mode != 0) != dynamic_features.has_extended_dynamic_state_3_provoking_vertex_mode || - (key.state.extended_dynamic_state_3_conservative_rasterization_mode != 0) != dynamic_features.has_extended_dynamic_state_3_conservative_rasterization_mode || - (key.state.extended_dynamic_state_3_sample_locations_enable != 0) != dynamic_features.has_extended_dynamic_state_3_sample_locations_enable || - (key.state.extended_dynamic_state_3_rasterization_stream != 0) != dynamic_features.has_extended_dynamic_state_3_rasterization_stream || - (key.state.dynamic_vertex_input != 0) != dynamic_features.has_dynamic_vertex_input) { + if ((key.state.extended_dynamic_state != 0) != dynamic_features.has_extended_dynamic_state + || (key.state.extended_dynamic_state_2 != 0) != dynamic_features.has_extended_dynamic_state_2 + || (key.state.extended_dynamic_state_2_logic_op != 0) != dynamic_features.has_extended_dynamic_state_2_logic_op + || (key.state.extended_dynamic_state_2_patch_control_points != 0) != dynamic_features.has_extended_dynamic_state_2_patch_control_points + || (key.state.extended_dynamic_state_3_blend != 0) != dynamic_features.has_extended_dynamic_state_3_blend + || (key.state.extended_dynamic_state_3_enables != 0) != dynamic_features.has_extended_dynamic_state_3_enables + || (key.state.extended_dynamic_state_3_depth_clamp != 0) != dynamic_features.has_extended_dynamic_state_3_depth_clamp + || (key.state.extended_dynamic_state_3_logic_op_enable != 0) != dynamic_features.has_extended_dynamic_state_3_logic_op_enable + || (key.state.extended_dynamic_state_3_tessellation_domain_origin != 0) != dynamic_features.has_extended_dynamic_state_3_tessellation_domain_origin + || (key.state.extended_dynamic_state_3_polygon_mode != 0) != dynamic_features.has_extended_dynamic_state_3_polygon_mode + || (key.state.extended_dynamic_state_3_rasterization_samples != 0) != dynamic_features.has_extended_dynamic_state_3_rasterization_samples + || (key.state.extended_dynamic_state_3_sample_mask != 0) != dynamic_features.has_extended_dynamic_state_3_sample_mask + || (key.state.extended_dynamic_state_3_alpha_to_coverage_enable != 0) != dynamic_features.has_extended_dynamic_state_3_alpha_to_coverage_enable + || (key.state.extended_dynamic_state_3_alpha_to_one_enable != 0) != dynamic_features.has_extended_dynamic_state_3_alpha_to_one_enable + || (key.state.extended_dynamic_state_3_depth_clip_enable != 0) != dynamic_features.has_extended_dynamic_state_3_depth_clip_enable + || (key.state.extended_dynamic_state_3_depth_clip_negative_one_to_one != 0) != dynamic_features.has_extended_dynamic_state_3_depth_clip_negative_one_to_one + || (key.state.extended_dynamic_state_3_line_rasterization_mode != 0) != dynamic_features.has_extended_dynamic_state_3_line_rasterization_mode + || (key.state.extended_dynamic_state_3_line_stipple_enable != 0) != dynamic_features.has_extended_dynamic_state_3_line_stipple_enable + || (key.state.extended_dynamic_state_3_provoking_vertex_mode != 0) != dynamic_features.has_extended_dynamic_state_3_provoking_vertex_mode + || (key.state.extended_dynamic_state_3_conservative_rasterization_mode != 0) != dynamic_features.has_extended_dynamic_state_3_conservative_rasterization_mode + || (key.state.extended_dynamic_state_3_sample_locations_enable != 0) != dynamic_features.has_extended_dynamic_state_3_sample_locations_enable + || (key.state.extended_dynamic_state_3_rasterization_stream != 0) != dynamic_features.has_extended_dynamic_state_3_rasterization_stream + || (key.state.dynamic_vertex_input != 0) != dynamic_features.has_dynamic_vertex_input) { return; } workers.QueueWork([this, key, envs_ = std::move(envs), &state, &callback]() mutable {