diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/engines/maxwell_3d.cpp | 1 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/fixed_pipeline_state.cpp | 70 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/fixed_pipeline_state.h | 35 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp | 36 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_pipeline_cache.cpp | 9 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_rasterizer.cpp | 94 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_rasterizer.h | 3 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_state_tracker.cpp | 14 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_state_tracker.h | 29 | ||||
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_device.cpp | 73 | ||||
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_device.h | 24 | ||||
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_wrapper.cpp | 5 | ||||
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_wrapper.h | 25 |
13 files changed, 313 insertions, 105 deletions
diff --git a/src/video_core/engines/maxwell_3d.cpp b/src/video_core/engines/maxwell_3d.cpp index 7f406e171..d44a5cabf 100644 --- a/src/video_core/engines/maxwell_3d.cpp +++ b/src/video_core/engines/maxwell_3d.cpp | |||
| @@ -124,7 +124,6 @@ void Maxwell3D::InitializeRegisterDefaults() { | |||
| 124 | regs.gl_front_face = Maxwell3D::Regs::FrontFace::ClockWise; | 124 | regs.gl_front_face = Maxwell3D::Regs::FrontFace::ClockWise; |
| 125 | regs.polygon_mode_back = Maxwell3D::Regs::PolygonMode::Fill; | 125 | regs.polygon_mode_back = Maxwell3D::Regs::PolygonMode::Fill; |
| 126 | regs.polygon_mode_front = Maxwell3D::Regs::PolygonMode::Fill; | 126 | regs.polygon_mode_front = Maxwell3D::Regs::PolygonMode::Fill; |
| 127 | regs.logic_op.op = Maxwell3D::Regs::LogicOp::Op::Clear; | ||
| 128 | 127 | ||
| 129 | shadow_state = regs; | 128 | shadow_state = regs; |
| 130 | } | 129 | } |
diff --git a/src/video_core/renderer_vulkan/fixed_pipeline_state.cpp b/src/video_core/renderer_vulkan/fixed_pipeline_state.cpp index b1623b882..3d328a250 100644 --- a/src/video_core/renderer_vulkan/fixed_pipeline_state.cpp +++ b/src/video_core/renderer_vulkan/fixed_pipeline_state.cpp | |||
| @@ -56,22 +56,16 @@ void FixedPipelineState::Refresh(Tegra::Engines::Maxwell3D& maxwell3d, DynamicFe | |||
| 56 | extended_dynamic_state.Assign(features.has_extended_dynamic_state ? 1 : 0); | 56 | extended_dynamic_state.Assign(features.has_extended_dynamic_state ? 1 : 0); |
| 57 | extended_dynamic_state_2.Assign(features.has_extended_dynamic_state_2 ? 1 : 0); | 57 | extended_dynamic_state_2.Assign(features.has_extended_dynamic_state_2 ? 1 : 0); |
| 58 | extended_dynamic_state_2_extra.Assign(features.has_extended_dynamic_state_2_extra ? 1 : 0); | 58 | extended_dynamic_state_2_extra.Assign(features.has_extended_dynamic_state_2_extra ? 1 : 0); |
| 59 | extended_dynamic_state_3.Assign(features.has_extended_dynamic_state_3 ? 1 : 0); | 59 | extended_dynamic_state_3_blend.Assign(features.has_extended_dynamic_state_3_blend ? 1 : 0); |
| 60 | extended_dynamic_state_3_enables.Assign(features.has_extended_dynamic_state_3_enables ? 1 : 0); | ||
| 60 | dynamic_vertex_input.Assign(features.has_dynamic_vertex_input ? 1 : 0); | 61 | dynamic_vertex_input.Assign(features.has_dynamic_vertex_input ? 1 : 0); |
| 61 | xfb_enabled.Assign(regs.transform_feedback_enabled != 0); | 62 | xfb_enabled.Assign(regs.transform_feedback_enabled != 0); |
| 62 | depth_clamp_disabled.Assign(regs.viewport_clip_control.geometry_clip == | ||
| 63 | Maxwell::ViewportClipControl::GeometryClip::Passthrough || | ||
| 64 | regs.viewport_clip_control.geometry_clip == | ||
| 65 | Maxwell::ViewportClipControl::GeometryClip::FrustumXYZ || | ||
| 66 | regs.viewport_clip_control.geometry_clip == | ||
| 67 | Maxwell::ViewportClipControl::GeometryClip::FrustumZ); | ||
| 68 | ndc_minus_one_to_one.Assign(regs.depth_mode == Maxwell::DepthMode::MinusOneToOne ? 1 : 0); | 63 | ndc_minus_one_to_one.Assign(regs.depth_mode == Maxwell::DepthMode::MinusOneToOne ? 1 : 0); |
| 69 | polygon_mode.Assign(PackPolygonMode(regs.polygon_mode_front)); | 64 | polygon_mode.Assign(PackPolygonMode(regs.polygon_mode_front)); |
| 70 | tessellation_primitive.Assign(static_cast<u32>(regs.tessellation.params.domain_type.Value())); | 65 | tessellation_primitive.Assign(static_cast<u32>(regs.tessellation.params.domain_type.Value())); |
| 71 | tessellation_spacing.Assign(static_cast<u32>(regs.tessellation.params.spacing.Value())); | 66 | tessellation_spacing.Assign(static_cast<u32>(regs.tessellation.params.spacing.Value())); |
| 72 | tessellation_clockwise.Assign(regs.tessellation.params.output_primitives.Value() == | 67 | tessellation_clockwise.Assign(regs.tessellation.params.output_primitives.Value() == |
| 73 | Maxwell::Tessellation::OutputPrimitives::Triangles_CW); | 68 | Maxwell::Tessellation::OutputPrimitives::Triangles_CW); |
| 74 | logic_op_enable.Assign(regs.logic_op.enable != 0 ? 1 : 0); | ||
| 75 | patch_control_points_minus_one.Assign(regs.patch_vertices - 1); | 69 | patch_control_points_minus_one.Assign(regs.patch_vertices - 1); |
| 76 | topology.Assign(topology_); | 70 | topology.Assign(topology_); |
| 77 | msaa_mode.Assign(regs.anti_alias_samples_mode); | 71 | msaa_mode.Assign(regs.anti_alias_samples_mode); |
| @@ -138,12 +132,6 @@ void FixedPipelineState::Refresh(Tegra::Engines::Maxwell3D& maxwell3d, DynamicFe | |||
| 138 | } | 132 | } |
| 139 | } | 133 | } |
| 140 | } | 134 | } |
| 141 | if (maxwell3d.dirty.flags[Dirty::Blending]) { | ||
| 142 | maxwell3d.dirty.flags[Dirty::Blending] = false; | ||
| 143 | for (size_t index = 0; index < attachments.size(); ++index) { | ||
| 144 | attachments[index].Refresh(regs, index); | ||
| 145 | } | ||
| 146 | } | ||
| 147 | if (maxwell3d.dirty.flags[Dirty::ViewportSwizzles]) { | 135 | if (maxwell3d.dirty.flags[Dirty::ViewportSwizzles]) { |
| 148 | maxwell3d.dirty.flags[Dirty::ViewportSwizzles] = false; | 136 | maxwell3d.dirty.flags[Dirty::ViewportSwizzles] = false; |
| 149 | const auto& transform = regs.viewport_transform; | 137 | const auto& transform = regs.viewport_transform; |
| @@ -155,11 +143,22 @@ void FixedPipelineState::Refresh(Tegra::Engines::Maxwell3D& maxwell3d, DynamicFe | |||
| 155 | dynamic_state.raw2 = 0; | 143 | dynamic_state.raw2 = 0; |
| 156 | if (!extended_dynamic_state) { | 144 | if (!extended_dynamic_state) { |
| 157 | dynamic_state.Refresh(regs); | 145 | dynamic_state.Refresh(regs); |
| 146 | std::ranges::transform(regs.vertex_streams, vertex_strides.begin(), [](const auto& array) { | ||
| 147 | return static_cast<u16>(array.stride.Value()); | ||
| 148 | }); | ||
| 158 | } | 149 | } |
| 159 | if (!extended_dynamic_state_2_extra) { | 150 | if (!extended_dynamic_state_2_extra) { |
| 160 | dynamic_state.Refresh2(regs, topology, extended_dynamic_state_2); | 151 | dynamic_state.Refresh2(regs, topology, extended_dynamic_state_2); |
| 161 | } | 152 | } |
| 162 | if (!extended_dynamic_state_3) { | 153 | if (!extended_dynamic_state_3_blend) { |
| 154 | if (maxwell3d.dirty.flags[Dirty::Blending]) { | ||
| 155 | maxwell3d.dirty.flags[Dirty::Blending] = false; | ||
| 156 | for (size_t index = 0; index < attachments.size(); ++index) { | ||
| 157 | attachments[index].Refresh(regs, index); | ||
| 158 | } | ||
| 159 | } | ||
| 160 | } | ||
| 161 | if (!extended_dynamic_state_3_enables) { | ||
| 163 | dynamic_state.Refresh3(regs); | 162 | dynamic_state.Refresh3(regs); |
| 164 | } | 163 | } |
| 165 | if (xfb_enabled) { | 164 | if (xfb_enabled) { |
| @@ -177,12 +176,11 @@ void FixedPipelineState::BlendingAttachment::Refresh(const Maxwell& regs, size_t | |||
| 177 | mask_a.Assign(mask.A); | 176 | mask_a.Assign(mask.A); |
| 178 | 177 | ||
| 179 | // TODO: C++20 Use templated lambda to deduplicate code | 178 | // TODO: C++20 Use templated lambda to deduplicate code |
| 179 | if (!regs.blend.enable[index]) { | ||
| 180 | return; | ||
| 181 | } | ||
| 180 | 182 | ||
| 181 | if (!regs.blend_per_target_enabled) { | 183 | const auto setup_blend = [&]<typename T>(const T& src) { |
| 182 | if (!regs.blend.enable[index]) { | ||
| 183 | return; | ||
| 184 | } | ||
| 185 | const auto& src = regs.blend; | ||
| 186 | equation_rgb.Assign(PackBlendEquation(src.color_op)); | 184 | equation_rgb.Assign(PackBlendEquation(src.color_op)); |
| 187 | equation_a.Assign(PackBlendEquation(src.alpha_op)); | 185 | equation_a.Assign(PackBlendEquation(src.alpha_op)); |
| 188 | factor_source_rgb.Assign(PackBlendFactor(src.color_source)); | 186 | factor_source_rgb.Assign(PackBlendFactor(src.color_source)); |
| @@ -190,20 +188,13 @@ void FixedPipelineState::BlendingAttachment::Refresh(const Maxwell& regs, size_t | |||
| 190 | factor_source_a.Assign(PackBlendFactor(src.alpha_source)); | 188 | factor_source_a.Assign(PackBlendFactor(src.alpha_source)); |
| 191 | factor_dest_a.Assign(PackBlendFactor(src.alpha_dest)); | 189 | factor_dest_a.Assign(PackBlendFactor(src.alpha_dest)); |
| 192 | enable.Assign(1); | 190 | enable.Assign(1); |
| 193 | return; | 191 | }; |
| 194 | } | ||
| 195 | 192 | ||
| 196 | if (!regs.blend.enable[index]) { | 193 | if (!regs.blend_per_target_enabled) { |
| 194 | setup_blend(regs.blend); | ||
| 197 | return; | 195 | return; |
| 198 | } | 196 | } |
| 199 | const auto& src = regs.blend_per_target[index]; | 197 | setup_blend(regs.blend_per_target[index]); |
| 200 | equation_rgb.Assign(PackBlendEquation(src.color_op)); | ||
| 201 | equation_a.Assign(PackBlendEquation(src.alpha_op)); | ||
| 202 | factor_source_rgb.Assign(PackBlendFactor(src.color_source)); | ||
| 203 | factor_dest_rgb.Assign(PackBlendFactor(src.color_dest)); | ||
| 204 | factor_source_a.Assign(PackBlendFactor(src.alpha_source)); | ||
| 205 | factor_dest_a.Assign(PackBlendFactor(src.alpha_dest)); | ||
| 206 | enable.Assign(1); | ||
| 207 | } | 198 | } |
| 208 | 199 | ||
| 209 | void FixedPipelineState::DynamicState::Refresh(const Maxwell& regs) { | 200 | void FixedPipelineState::DynamicState::Refresh(const Maxwell& regs) { |
| @@ -236,12 +227,11 @@ void FixedPipelineState::DynamicState::Refresh(const Maxwell& regs) { | |||
| 236 | depth_test_func.Assign(PackComparisonOp(regs.depth_test_func)); | 227 | depth_test_func.Assign(PackComparisonOp(regs.depth_test_func)); |
| 237 | cull_face.Assign(PackCullFace(regs.gl_cull_face)); | 228 | cull_face.Assign(PackCullFace(regs.gl_cull_face)); |
| 238 | cull_enable.Assign(regs.gl_cull_test_enabled != 0 ? 1 : 0); | 229 | cull_enable.Assign(regs.gl_cull_test_enabled != 0 ? 1 : 0); |
| 239 | std::ranges::transform(regs.vertex_streams, vertex_strides.begin(), [](const auto& array) { | ||
| 240 | return static_cast<u16>(array.stride.Value()); | ||
| 241 | }); | ||
| 242 | } | 230 | } |
| 243 | 231 | ||
| 244 | void FixedPipelineState::DynamicState::Refresh2(const Maxwell& regs, Maxwell::PrimitiveTopology topology_, bool base_feautures_supported) { | 232 | void FixedPipelineState::DynamicState::Refresh2(const Maxwell& regs, |
| 233 | Maxwell::PrimitiveTopology topology_, | ||
| 234 | bool base_feautures_supported) { | ||
| 245 | logic_op.Assign(PackLogicOp(regs.logic_op.op)); | 235 | logic_op.Assign(PackLogicOp(regs.logic_op.op)); |
| 246 | 236 | ||
| 247 | if (base_feautures_supported) { | 237 | if (base_feautures_supported) { |
| @@ -260,7 +250,15 @@ void FixedPipelineState::DynamicState::Refresh2(const Maxwell& regs, Maxwell::Pr | |||
| 260 | depth_bias_enable.Assign(enabled_lut[POLYGON_OFFSET_ENABLE_LUT[topology_index]] != 0 ? 1 : 0); | 250 | depth_bias_enable.Assign(enabled_lut[POLYGON_OFFSET_ENABLE_LUT[topology_index]] != 0 ? 1 : 0); |
| 261 | } | 251 | } |
| 262 | 252 | ||
| 263 | void FixedPipelineState::DynamicState::Refresh3(const Maxwell&) {} | 253 | void FixedPipelineState::DynamicState::Refresh3(const Maxwell& regs) { |
| 254 | logic_op_enable.Assign(regs.logic_op.enable != 0 ? 1 : 0); | ||
| 255 | depth_clamp_disabled.Assign(regs.viewport_clip_control.geometry_clip == | ||
| 256 | Maxwell::ViewportClipControl::GeometryClip::Passthrough || | ||
| 257 | regs.viewport_clip_control.geometry_clip == | ||
| 258 | Maxwell::ViewportClipControl::GeometryClip::FrustumXYZ || | ||
| 259 | regs.viewport_clip_control.geometry_clip == | ||
| 260 | Maxwell::ViewportClipControl::GeometryClip::FrustumZ); | ||
| 261 | } | ||
| 264 | 262 | ||
| 265 | size_t FixedPipelineState::Hash() const noexcept { | 263 | size_t FixedPipelineState::Hash() const noexcept { |
| 266 | const u64 hash = Common::CityHash64(reinterpret_cast<const char*>(this), Size()); | 264 | const u64 hash = Common::CityHash64(reinterpret_cast<const char*>(this), Size()); |
diff --git a/src/video_core/renderer_vulkan/fixed_pipeline_state.h b/src/video_core/renderer_vulkan/fixed_pipeline_state.h index 88680e448..f47406347 100644 --- a/src/video_core/renderer_vulkan/fixed_pipeline_state.h +++ b/src/video_core/renderer_vulkan/fixed_pipeline_state.h | |||
| @@ -21,7 +21,8 @@ struct DynamicFeatures { | |||
| 21 | bool has_extended_dynamic_state; | 21 | bool has_extended_dynamic_state; |
| 22 | bool has_extended_dynamic_state_2; | 22 | bool has_extended_dynamic_state_2; |
| 23 | bool has_extended_dynamic_state_2_extra; | 23 | bool has_extended_dynamic_state_2_extra; |
| 24 | bool has_extended_dynamic_state_3; | 24 | bool has_extended_dynamic_state_3_blend; |
| 25 | bool has_extended_dynamic_state_3_enables; | ||
| 25 | bool has_dynamic_vertex_input; | 26 | bool has_dynamic_vertex_input; |
| 26 | }; | 27 | }; |
| 27 | 28 | ||
| @@ -147,6 +148,8 @@ struct FixedPipelineState { | |||
| 147 | BitField<4, 1, u32> depth_bias_enable; | 148 | BitField<4, 1, u32> depth_bias_enable; |
| 148 | BitField<5, 1, u32> rasterize_enable; | 149 | BitField<5, 1, u32> rasterize_enable; |
| 149 | BitField<6, 4, u32> logic_op; | 150 | BitField<6, 4, u32> logic_op; |
| 151 | BitField<10, 1, u32> logic_op_enable; | ||
| 152 | BitField<11, 1, u32> depth_clamp_disabled; | ||
| 150 | }; | 153 | }; |
| 151 | union { | 154 | union { |
| 152 | u32 raw2; | 155 | u32 raw2; |
| @@ -159,8 +162,6 @@ struct FixedPipelineState { | |||
| 159 | BitField<28, 1, u32> front_face; | 162 | BitField<28, 1, u32> front_face; |
| 160 | BitField<29, 3, u32> depth_test_func; | 163 | BitField<29, 3, u32> depth_test_func; |
| 161 | }; | 164 | }; |
| 162 | // Vertex stride is a 12 bits value, we have 4 bits to spare per element | ||
| 163 | std::array<u16, Maxwell::NumVertexArrays> vertex_strides; | ||
| 164 | 165 | ||
| 165 | void Refresh(const Maxwell& regs); | 166 | void Refresh(const Maxwell& regs); |
| 166 | void Refresh2(const Maxwell& regs, Maxwell::PrimitiveTopology topology, bool base_feautures_supported); | 167 | void Refresh2(const Maxwell& regs, Maxwell::PrimitiveTopology topology, bool base_feautures_supported); |
| @@ -184,17 +185,16 @@ struct FixedPipelineState { | |||
| 184 | BitField<0, 1, u32> extended_dynamic_state; | 185 | BitField<0, 1, u32> extended_dynamic_state; |
| 185 | BitField<1, 1, u32> extended_dynamic_state_2; | 186 | BitField<1, 1, u32> extended_dynamic_state_2; |
| 186 | BitField<2, 1, u32> extended_dynamic_state_2_extra; | 187 | BitField<2, 1, u32> extended_dynamic_state_2_extra; |
| 187 | BitField<3, 1, u32> extended_dynamic_state_3; | 188 | BitField<3, 1, u32> extended_dynamic_state_3_blend; |
| 188 | BitField<4, 1, u32> dynamic_vertex_input; | 189 | BitField<4, 1, u32> extended_dynamic_state_3_enables; |
| 189 | BitField<5, 1, u32> xfb_enabled; | 190 | BitField<5, 1, u32> dynamic_vertex_input; |
| 190 | BitField<6, 1, u32> depth_clamp_disabled; | 191 | BitField<6, 1, u32> xfb_enabled; |
| 191 | BitField<7, 1, u32> ndc_minus_one_to_one; | 192 | BitField<7, 1, u32> ndc_minus_one_to_one; |
| 192 | BitField<8, 2, u32> polygon_mode; | 193 | BitField<8, 2, u32> polygon_mode; |
| 193 | BitField<10, 2, u32> tessellation_primitive; | 194 | BitField<10, 2, u32> tessellation_primitive; |
| 194 | BitField<12, 2, u32> tessellation_spacing; | 195 | BitField<12, 2, u32> tessellation_spacing; |
| 195 | BitField<14, 1, u32> tessellation_clockwise; | 196 | BitField<14, 1, u32> tessellation_clockwise; |
| 196 | BitField<15, 1, u32> logic_op_enable; | 197 | BitField<15, 5, u32> patch_control_points_minus_one; |
| 197 | BitField<16, 5, u32> patch_control_points_minus_one; | ||
| 198 | 198 | ||
| 199 | BitField<24, 4, Maxwell::PrimitiveTopology> topology; | 199 | BitField<24, 4, Maxwell::PrimitiveTopology> topology; |
| 200 | BitField<28, 4, Tegra::Texture::MsaaMode> msaa_mode; | 200 | BitField<28, 4, Tegra::Texture::MsaaMode> msaa_mode; |
| @@ -217,16 +217,19 @@ struct FixedPipelineState { | |||
| 217 | 217 | ||
| 218 | u32 alpha_test_ref; | 218 | u32 alpha_test_ref; |
| 219 | u32 point_size; | 219 | u32 point_size; |
| 220 | std::array<BlendingAttachment, Maxwell::NumRenderTargets> attachments; | ||
| 221 | std::array<u16, Maxwell::NumViewports> viewport_swizzles; | 220 | std::array<u16, Maxwell::NumViewports> viewport_swizzles; |
| 222 | union { | 221 | union { |
| 223 | u64 attribute_types; // Used with VK_EXT_vertex_input_dynamic_state | 222 | u64 attribute_types; // Used with VK_EXT_vertex_input_dynamic_state |
| 224 | u64 enabled_divisors; | 223 | u64 enabled_divisors; |
| 225 | }; | 224 | }; |
| 225 | |||
| 226 | DynamicState dynamic_state; | ||
| 227 | std::array<BlendingAttachment, Maxwell::NumRenderTargets> attachments; | ||
| 226 | std::array<VertexAttribute, Maxwell::NumVertexAttributes> attributes; | 228 | std::array<VertexAttribute, Maxwell::NumVertexAttributes> attributes; |
| 227 | std::array<u32, Maxwell::NumVertexArrays> binding_divisors; | 229 | std::array<u32, Maxwell::NumVertexArrays> binding_divisors; |
| 230 | // Vertex stride is a 12 bits value, we have 4 bits to spare per element | ||
| 231 | std::array<u16, Maxwell::NumVertexArrays> vertex_strides; | ||
| 228 | 232 | ||
| 229 | DynamicState dynamic_state; | ||
| 230 | VideoCommon::TransformFeedbackState xfb_state; | 233 | VideoCommon::TransformFeedbackState xfb_state; |
| 231 | 234 | ||
| 232 | void Refresh(Tegra::Engines::Maxwell3D& maxwell3d, DynamicFeatures& features); | 235 | void Refresh(Tegra::Engines::Maxwell3D& maxwell3d, DynamicFeatures& features); |
| @@ -244,17 +247,17 @@ struct FixedPipelineState { | |||
| 244 | // When transform feedback is enabled, use the whole struct | 247 | // When transform feedback is enabled, use the whole struct |
| 245 | return sizeof(*this); | 248 | return sizeof(*this); |
| 246 | } | 249 | } |
| 247 | if (dynamic_vertex_input && extended_dynamic_state_2) { | 250 | if (dynamic_vertex_input && extended_dynamic_state_3_blend) { |
| 248 | // Exclude dynamic state and attributes | 251 | // Exclude dynamic state and attributes |
| 249 | return offsetof(FixedPipelineState, attributes); | 252 | return offsetof(FixedPipelineState, dynamic_state); |
| 250 | } | 253 | } |
| 251 | if (extended_dynamic_state_2_extra) { | 254 | if (dynamic_vertex_input) { |
| 252 | // Exclude dynamic state | 255 | // Exclude dynamic state |
| 253 | return offsetof(FixedPipelineState, dynamic_state); | 256 | return offsetof(FixedPipelineState, attributes); |
| 254 | } | 257 | } |
| 255 | if (extended_dynamic_state) { | 258 | if (extended_dynamic_state) { |
| 256 | // Exclude dynamic state | 259 | // Exclude dynamic state |
| 257 | return offsetof(FixedPipelineState, dynamic_state.raw2); | 260 | return offsetof(FixedPipelineState, vertex_strides); |
| 258 | } | 261 | } |
| 259 | // Default | 262 | // Default |
| 260 | return offsetof(FixedPipelineState, xfb_state); | 263 | return offsetof(FixedPipelineState, xfb_state); |
diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp index ce82a9c65..dab3d7e3f 100644 --- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp +++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp | |||
| @@ -489,9 +489,11 @@ void GraphicsPipeline::ConfigureDraw(const RescalingPushConstant& rescaling, | |||
| 489 | if (bind_pipeline) { | 489 | if (bind_pipeline) { |
| 490 | cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, *pipeline); | 490 | cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, *pipeline); |
| 491 | } | 491 | } |
| 492 | cmdbuf.PushConstants(*pipeline_layout, VK_SHADER_STAGE_ALL_GRAPHICS, | 492 | if (is_rescaling) { |
| 493 | RESCALING_LAYOUT_WORDS_OFFSET, sizeof(rescaling_data), | 493 | cmdbuf.PushConstants(*pipeline_layout, VK_SHADER_STAGE_ALL_GRAPHICS, |
| 494 | rescaling_data.data()); | 494 | RESCALING_LAYOUT_WORDS_OFFSET, sizeof(rescaling_data), |
| 495 | rescaling_data.data()); | ||
| 496 | } | ||
| 495 | if (update_rescaling) { | 497 | if (update_rescaling) { |
| 496 | const f32 config_down_factor{Settings::values.resolution_info.down_factor}; | 498 | const f32 config_down_factor{Settings::values.resolution_info.down_factor}; |
| 497 | const f32 scale_down_factor{is_rescaling ? config_down_factor : 1.0f}; | 499 | const f32 scale_down_factor{is_rescaling ? config_down_factor : 1.0f}; |
| @@ -524,9 +526,8 @@ void GraphicsPipeline::MakePipeline(VkRenderPass render_pass) { | |||
| 524 | FixedPipelineState::DynamicState dynamic{}; | 526 | FixedPipelineState::DynamicState dynamic{}; |
| 525 | if (!key.state.extended_dynamic_state) { | 527 | if (!key.state.extended_dynamic_state) { |
| 526 | dynamic = key.state.dynamic_state; | 528 | dynamic = key.state.dynamic_state; |
| 527 | } | 529 | } else { |
| 528 | if (!key.state.extended_dynamic_state_2) { | 530 | dynamic.raw1 = key.state.dynamic_state.raw1; |
| 529 | dynamic.raw2 = key.state.dynamic_state.raw2; | ||
| 530 | } | 531 | } |
| 531 | static_vector<VkVertexInputBindingDescription, 32> vertex_bindings; | 532 | static_vector<VkVertexInputBindingDescription, 32> vertex_bindings; |
| 532 | static_vector<VkVertexInputBindingDivisorDescriptionEXT, 32> vertex_binding_divisors; | 533 | static_vector<VkVertexInputBindingDivisorDescriptionEXT, 32> vertex_binding_divisors; |
| @@ -564,7 +565,7 @@ void GraphicsPipeline::MakePipeline(VkRenderPass render_pass) { | |||
| 564 | instanced ? VK_VERTEX_INPUT_RATE_INSTANCE : VK_VERTEX_INPUT_RATE_VERTEX; | 565 | instanced ? VK_VERTEX_INPUT_RATE_INSTANCE : VK_VERTEX_INPUT_RATE_VERTEX; |
| 565 | vertex_bindings.push_back({ | 566 | vertex_bindings.push_back({ |
| 566 | .binding = static_cast<u32>(index), | 567 | .binding = static_cast<u32>(index), |
| 567 | .stride = dynamic.vertex_strides[index], | 568 | .stride = key.state.vertex_strides[index], |
| 568 | .inputRate = rate, | 569 | .inputRate = rate, |
| 569 | }); | 570 | }); |
| 570 | if (instanced) { | 571 | if (instanced) { |
| @@ -675,7 +676,7 @@ void GraphicsPipeline::MakePipeline(VkRenderPass render_pass) { | |||
| 675 | .pNext = nullptr, | 676 | .pNext = nullptr, |
| 676 | .flags = 0, | 677 | .flags = 0, |
| 677 | .depthClampEnable = | 678 | .depthClampEnable = |
| 678 | static_cast<VkBool32>(key.state.depth_clamp_disabled == 0 ? VK_TRUE : VK_FALSE), | 679 | static_cast<VkBool32>(dynamic.depth_clamp_disabled == 0 ? VK_TRUE : VK_FALSE), |
| 679 | .rasterizerDiscardEnable = | 680 | .rasterizerDiscardEnable = |
| 680 | static_cast<VkBool32>(dynamic.rasterize_enable == 0 ? VK_TRUE : VK_FALSE), | 681 | static_cast<VkBool32>(dynamic.rasterize_enable == 0 ? VK_TRUE : VK_FALSE), |
| 681 | .polygonMode = | 682 | .polygonMode = |
| @@ -785,13 +786,13 @@ void GraphicsPipeline::MakePipeline(VkRenderPass render_pass) { | |||
| 785 | .sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO, | 786 | .sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO, |
| 786 | .pNext = nullptr, | 787 | .pNext = nullptr, |
| 787 | .flags = 0, | 788 | .flags = 0, |
| 788 | .logicOpEnable = key.state.logic_op_enable != 0, | 789 | .logicOpEnable = dynamic.logic_op_enable != 0, |
| 789 | .logicOp = static_cast<VkLogicOp>(dynamic.logic_op.Value()), | 790 | .logicOp = static_cast<VkLogicOp>(dynamic.logic_op.Value()), |
| 790 | .attachmentCount = static_cast<u32>(cb_attachments.size()), | 791 | .attachmentCount = static_cast<u32>(cb_attachments.size()), |
| 791 | .pAttachments = cb_attachments.data(), | 792 | .pAttachments = cb_attachments.data(), |
| 792 | .blendConstants = {}, | 793 | .blendConstants = {}, |
| 793 | }; | 794 | }; |
| 794 | static_vector<VkDynamicState, 23> dynamic_states{ | 795 | static_vector<VkDynamicState, 28> dynamic_states{ |
| 795 | VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR, | 796 | VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR, |
| 796 | VK_DYNAMIC_STATE_DEPTH_BIAS, VK_DYNAMIC_STATE_BLEND_CONSTANTS, | 797 | VK_DYNAMIC_STATE_DEPTH_BIAS, VK_DYNAMIC_STATE_BLEND_CONSTANTS, |
| 797 | VK_DYNAMIC_STATE_DEPTH_BOUNDS, VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK, | 798 | VK_DYNAMIC_STATE_DEPTH_BOUNDS, VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK, |
| @@ -825,6 +826,21 @@ void GraphicsPipeline::MakePipeline(VkRenderPass render_pass) { | |||
| 825 | if (key.state.extended_dynamic_state_2_extra) { | 826 | if (key.state.extended_dynamic_state_2_extra) { |
| 826 | dynamic_states.push_back(VK_DYNAMIC_STATE_LOGIC_OP_EXT); | 827 | dynamic_states.push_back(VK_DYNAMIC_STATE_LOGIC_OP_EXT); |
| 827 | } | 828 | } |
| 829 | if (key.state.extended_dynamic_state_3_blend) { | ||
| 830 | static constexpr std::array extended3{ | ||
| 831 | VK_DYNAMIC_STATE_COLOR_BLEND_ENABLE_EXT, | ||
| 832 | VK_DYNAMIC_STATE_COLOR_BLEND_EQUATION_EXT, | ||
| 833 | VK_DYNAMIC_STATE_COLOR_WRITE_MASK_EXT, | ||
| 834 | }; | ||
| 835 | dynamic_states.insert(dynamic_states.end(), extended3.begin(), extended3.end()); | ||
| 836 | } | ||
| 837 | if (key.state.extended_dynamic_state_3_enables) { | ||
| 838 | static constexpr std::array extended3{ | ||
| 839 | VK_DYNAMIC_STATE_DEPTH_CLAMP_ENABLE_EXT, | ||
| 840 | VK_DYNAMIC_STATE_LOGIC_OP_ENABLE_EXT, | ||
| 841 | }; | ||
| 842 | dynamic_states.insert(dynamic_states.end(), extended3.begin(), extended3.end()); | ||
| 843 | } | ||
| 828 | } | 844 | } |
| 829 | const VkPipelineDynamicStateCreateInfo dynamic_state_ci{ | 845 | const VkPipelineDynamicStateCreateInfo dynamic_state_ci{ |
| 830 | .sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO, | 846 | .sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO, |
diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index ee1ad744f..6cd162422 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp | |||
| @@ -356,7 +356,8 @@ PipelineCache::PipelineCache(RasterizerVulkan& rasterizer_, const Device& device | |||
| 356 | .has_extended_dynamic_state = device.IsExtExtendedDynamicStateSupported(), | 356 | .has_extended_dynamic_state = device.IsExtExtendedDynamicStateSupported(), |
| 357 | .has_extended_dynamic_state_2 = device.IsExtExtendedDynamicState2Supported(), | 357 | .has_extended_dynamic_state_2 = device.IsExtExtendedDynamicState2Supported(), |
| 358 | .has_extended_dynamic_state_2_extra = device.IsExtExtendedDynamicState2ExtrasSupported(), | 358 | .has_extended_dynamic_state_2_extra = device.IsExtExtendedDynamicState2ExtrasSupported(), |
| 359 | .has_extended_dynamic_state_3 = device.IsExtExtendedDynamicState3Supported(), | 359 | .has_extended_dynamic_state_3_blend = device.IsExtExtendedDynamicState3BlendingSupported(), |
| 360 | .has_extended_dynamic_state_3_enables = device.IsExtExtendedDynamicState3EnablesSupported(), | ||
| 360 | .has_dynamic_vertex_input = device.IsExtVertexInputDynamicStateSupported(), | 361 | .has_dynamic_vertex_input = device.IsExtVertexInputDynamicStateSupported(), |
| 361 | }; | 362 | }; |
| 362 | } | 363 | } |
| @@ -456,8 +457,10 @@ void PipelineCache::LoadDiskResources(u64 title_id, std::stop_token stop_loading | |||
| 456 | dynamic_features.has_extended_dynamic_state_2 || | 457 | dynamic_features.has_extended_dynamic_state_2 || |
| 457 | (key.state.extended_dynamic_state_2_extra != 0) != | 458 | (key.state.extended_dynamic_state_2_extra != 0) != |
| 458 | dynamic_features.has_extended_dynamic_state_2_extra || | 459 | dynamic_features.has_extended_dynamic_state_2_extra || |
| 459 | (key.state.extended_dynamic_state_3 != 0) != | 460 | (key.state.extended_dynamic_state_3_blend != 0) != |
| 460 | dynamic_features.has_extended_dynamic_state_3 || | 461 | dynamic_features.has_extended_dynamic_state_3_blend || |
| 462 | (key.state.extended_dynamic_state_3_enables != 0) != | ||
| 463 | dynamic_features.has_extended_dynamic_state_3_enables || | ||
| 461 | (key.state.dynamic_vertex_input != 0) != dynamic_features.has_dynamic_vertex_input) { | 464 | (key.state.dynamic_vertex_input != 0) != dynamic_features.has_dynamic_vertex_input) { |
| 462 | return; | 465 | return; |
| 463 | } | 466 | } |
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 3cf6b796b..143af93c5 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp | |||
| @@ -698,10 +698,17 @@ void RasterizerVulkan::UpdateDynamicStates() { | |||
| 698 | UpdateRasterizerDiscardEnable(regs); | 698 | UpdateRasterizerDiscardEnable(regs); |
| 699 | UpdateDepthBiasEnable(regs); | 699 | UpdateDepthBiasEnable(regs); |
| 700 | } | 700 | } |
| 701 | if (device.IsExtExtendedDynamicState3EnablesSupported()) { | ||
| 702 | UpdateLogicOpEnable(regs); | ||
| 703 | UpdateDepthClampEnable(regs); | ||
| 704 | } | ||
| 701 | } | 705 | } |
| 702 | if (device.IsExtExtendedDynamicState2ExtrasSupported()) { | 706 | if (device.IsExtExtendedDynamicState2ExtrasSupported()) { |
| 703 | UpdateLogicOp(regs); | 707 | UpdateLogicOp(regs); |
| 704 | } | 708 | } |
| 709 | if (device.IsExtExtendedDynamicState3Supported()) { | ||
| 710 | UpdateBlending(regs); | ||
| 711 | } | ||
| 705 | } | 712 | } |
| 706 | } | 713 | } |
| 707 | 714 | ||
| @@ -970,7 +977,30 @@ void RasterizerVulkan::UpdateDepthBiasEnable(Tegra::Engines::Maxwell3D::Regs& re | |||
| 970 | }; | 977 | }; |
| 971 | const u32 topology_index = static_cast<u32>(maxwell3d->draw_manager->GetDrawState().topology); | 978 | const u32 topology_index = static_cast<u32>(maxwell3d->draw_manager->GetDrawState().topology); |
| 972 | const u32 enable = enabled_lut[POLYGON_OFFSET_ENABLE_LUT[topology_index]]; | 979 | const u32 enable = enabled_lut[POLYGON_OFFSET_ENABLE_LUT[topology_index]]; |
| 973 | scheduler.Record([enable](vk::CommandBuffer cmdbuf) { cmdbuf.SetDepthBiasEnableEXT(enable); }); | 980 | scheduler.Record([enable](vk::CommandBuffer cmdbuf) { cmdbuf.SetDepthBiasEnableEXT(enable != 0); }); |
| 981 | } | ||
| 982 | |||
| 983 | void RasterizerVulkan::UpdateLogicOpEnable(Tegra::Engines::Maxwell3D::Regs& regs) { | ||
| 984 | if (!state_tracker.TouchLogicOpEnable()) { | ||
| 985 | return; | ||
| 986 | } | ||
| 987 | scheduler.Record([enable = regs.logic_op.enable](vk::CommandBuffer cmdbuf) { | ||
| 988 | cmdbuf.SetLogicOpEnableEXT(enable != 0); | ||
| 989 | }); | ||
| 990 | } | ||
| 991 | |||
| 992 | void RasterizerVulkan::UpdateDepthClampEnable(Tegra::Engines::Maxwell3D::Regs& regs) { | ||
| 993 | if (!state_tracker.TouchDepthClampEnable()) { | ||
| 994 | return; | ||
| 995 | } | ||
| 996 | bool is_enabled = !(regs.viewport_clip_control.geometry_clip == | ||
| 997 | Maxwell::ViewportClipControl::GeometryClip::Passthrough || | ||
| 998 | regs.viewport_clip_control.geometry_clip == | ||
| 999 | Maxwell::ViewportClipControl::GeometryClip::FrustumXYZ || | ||
| 1000 | regs.viewport_clip_control.geometry_clip == | ||
| 1001 | Maxwell::ViewportClipControl::GeometryClip::FrustumZ); | ||
| 1002 | scheduler.Record( | ||
| 1003 | [is_enabled](vk::CommandBuffer cmdbuf) { cmdbuf.SetDepthClampEnableEXT(is_enabled); }); | ||
| 974 | } | 1004 | } |
| 975 | 1005 | ||
| 976 | void RasterizerVulkan::UpdateDepthCompareOp(Tegra::Engines::Maxwell3D::Regs& regs) { | 1006 | void RasterizerVulkan::UpdateDepthCompareOp(Tegra::Engines::Maxwell3D::Regs& regs) { |
| @@ -1041,6 +1071,68 @@ void RasterizerVulkan::UpdateLogicOp(Tegra::Engines::Maxwell3D::Regs& regs) { | |||
| 1041 | scheduler.Record([op](vk::CommandBuffer cmdbuf) { cmdbuf.SetLogicOpEXT(op); }); | 1071 | scheduler.Record([op](vk::CommandBuffer cmdbuf) { cmdbuf.SetLogicOpEXT(op); }); |
| 1042 | } | 1072 | } |
| 1043 | 1073 | ||
| 1074 | void RasterizerVulkan::UpdateBlending(Tegra::Engines::Maxwell3D::Regs& regs) { | ||
| 1075 | if (!state_tracker.TouchBlending()) { | ||
| 1076 | return; | ||
| 1077 | } | ||
| 1078 | |||
| 1079 | if (state_tracker.TouchColorMask()) { | ||
| 1080 | std::array<VkColorComponentFlags, Maxwell::NumRenderTargets> setup_masks{}; | ||
| 1081 | for (size_t index = 0; index < Maxwell::NumRenderTargets; index++) { | ||
| 1082 | const auto& mask = regs.color_mask[regs.color_mask_common ? 0 : index]; | ||
| 1083 | auto& current = setup_masks[index]; | ||
| 1084 | if (mask.R) { | ||
| 1085 | current |= VK_COLOR_COMPONENT_R_BIT; | ||
| 1086 | } | ||
| 1087 | if (mask.G) { | ||
| 1088 | current |= VK_COLOR_COMPONENT_G_BIT; | ||
| 1089 | } | ||
| 1090 | if (mask.B) { | ||
| 1091 | current |= VK_COLOR_COMPONENT_B_BIT; | ||
| 1092 | } | ||
| 1093 | if (mask.A) { | ||
| 1094 | current |= VK_COLOR_COMPONENT_A_BIT; | ||
| 1095 | } | ||
| 1096 | } | ||
| 1097 | scheduler.Record([setup_masks](vk::CommandBuffer cmdbuf) { | ||
| 1098 | cmdbuf.SetColorWriteMaskEXT(0, setup_masks); | ||
| 1099 | }); | ||
| 1100 | } | ||
| 1101 | |||
| 1102 | if (state_tracker.TouchBlendEnable()) { | ||
| 1103 | std::array<VkBool32, Maxwell::NumRenderTargets> setup_enables{}; | ||
| 1104 | std::ranges::transform( | ||
| 1105 | regs.blend.enable, setup_enables.begin(), | ||
| 1106 | [&](const auto& is_enabled) { return is_enabled != 0 ? VK_TRUE : VK_FALSE; }); | ||
| 1107 | scheduler.Record([setup_enables](vk::CommandBuffer cmdbuf) { | ||
| 1108 | cmdbuf.SetColorBlendEnableEXT(0, setup_enables); | ||
| 1109 | }); | ||
| 1110 | } | ||
| 1111 | |||
| 1112 | if (state_tracker.TouchBlendEquations()) { | ||
| 1113 | std::array<VkColorBlendEquationEXT, Maxwell::NumRenderTargets> setup_blends{}; | ||
| 1114 | for (size_t index = 0; index < Maxwell::NumRenderTargets; index++) { | ||
| 1115 | const auto blend_setup = [&]<typename T>(const T& guest_blend) { | ||
| 1116 | auto& host_blend = setup_blends[index]; | ||
| 1117 | host_blend.srcColorBlendFactor = MaxwellToVK::BlendFactor(guest_blend.color_source); | ||
| 1118 | host_blend.dstColorBlendFactor = MaxwellToVK::BlendFactor(guest_blend.color_dest); | ||
| 1119 | host_blend.colorBlendOp = MaxwellToVK::BlendEquation(guest_blend.color_op); | ||
| 1120 | host_blend.srcAlphaBlendFactor = MaxwellToVK::BlendFactor(guest_blend.alpha_source); | ||
| 1121 | host_blend.dstAlphaBlendFactor = MaxwellToVK::BlendFactor(guest_blend.alpha_dest); | ||
| 1122 | host_blend.alphaBlendOp = MaxwellToVK::BlendEquation(guest_blend.alpha_op); | ||
| 1123 | }; | ||
| 1124 | if (!regs.blend_per_target_enabled) { | ||
| 1125 | blend_setup(regs.blend); | ||
| 1126 | continue; | ||
| 1127 | } | ||
| 1128 | blend_setup(regs.blend_per_target[index]); | ||
| 1129 | } | ||
| 1130 | scheduler.Record([setup_blends](vk::CommandBuffer cmdbuf) { | ||
| 1131 | cmdbuf.SetColorBlendEquationEXT(0, setup_blends); | ||
| 1132 | }); | ||
| 1133 | } | ||
| 1134 | } | ||
| 1135 | |||
| 1044 | void RasterizerVulkan::UpdateStencilTestEnable(Tegra::Engines::Maxwell3D::Regs& regs) { | 1136 | void RasterizerVulkan::UpdateStencilTestEnable(Tegra::Engines::Maxwell3D::Regs& regs) { |
| 1045 | if (!state_tracker.TouchStencilTestEnable()) { | 1137 | if (!state_tracker.TouchStencilTestEnable()) { |
| 1046 | return; | 1138 | return; |
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.h b/src/video_core/renderer_vulkan/vk_rasterizer.h index 67d35eff7..839de6b26 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.h +++ b/src/video_core/renderer_vulkan/vk_rasterizer.h | |||
| @@ -142,10 +142,13 @@ private: | |||
| 142 | void UpdatePrimitiveRestartEnable(Tegra::Engines::Maxwell3D::Regs& regs); | 142 | void UpdatePrimitiveRestartEnable(Tegra::Engines::Maxwell3D::Regs& regs); |
| 143 | void UpdateRasterizerDiscardEnable(Tegra::Engines::Maxwell3D::Regs& regs); | 143 | void UpdateRasterizerDiscardEnable(Tegra::Engines::Maxwell3D::Regs& regs); |
| 144 | void UpdateDepthBiasEnable(Tegra::Engines::Maxwell3D::Regs& regs); | 144 | void UpdateDepthBiasEnable(Tegra::Engines::Maxwell3D::Regs& regs); |
| 145 | void UpdateLogicOpEnable(Tegra::Engines::Maxwell3D::Regs& regs); | ||
| 146 | void UpdateDepthClampEnable(Tegra::Engines::Maxwell3D::Regs& regs); | ||
| 145 | void UpdateFrontFace(Tegra::Engines::Maxwell3D::Regs& regs); | 147 | void UpdateFrontFace(Tegra::Engines::Maxwell3D::Regs& regs); |
| 146 | void UpdateStencilOp(Tegra::Engines::Maxwell3D::Regs& regs); | 148 | void UpdateStencilOp(Tegra::Engines::Maxwell3D::Regs& regs); |
| 147 | void UpdateStencilTestEnable(Tegra::Engines::Maxwell3D::Regs& regs); | 149 | void UpdateStencilTestEnable(Tegra::Engines::Maxwell3D::Regs& regs); |
| 148 | void UpdateLogicOp(Tegra::Engines::Maxwell3D::Regs& regs); | 150 | void UpdateLogicOp(Tegra::Engines::Maxwell3D::Regs& regs); |
| 151 | void UpdateBlending(Tegra::Engines::Maxwell3D::Regs& regs); | ||
| 149 | 152 | ||
| 150 | void UpdateVertexInput(Tegra::Engines::Maxwell3D::Regs& regs); | 153 | void UpdateVertexInput(Tegra::Engines::Maxwell3D::Regs& regs); |
| 151 | 154 | ||
diff --git a/src/video_core/renderer_vulkan/vk_state_tracker.cpp b/src/video_core/renderer_vulkan/vk_state_tracker.cpp index 1f8528e3e..bfea503de 100644 --- a/src/video_core/renderer_vulkan/vk_state_tracker.cpp +++ b/src/video_core/renderer_vulkan/vk_state_tracker.cpp | |||
| @@ -48,7 +48,13 @@ Flags MakeInvalidationFlags() { | |||
| 48 | PrimitiveRestartEnable, | 48 | PrimitiveRestartEnable, |
| 49 | RasterizerDiscardEnable, | 49 | RasterizerDiscardEnable, |
| 50 | DepthBiasEnable, | 50 | DepthBiasEnable, |
| 51 | LogicOpEnable, | ||
| 52 | DepthClampEnable, | ||
| 51 | LogicOp, | 53 | LogicOp, |
| 54 | Blending, | ||
| 55 | ColorMask, | ||
| 56 | BlendEquations, | ||
| 57 | BlendEnable, | ||
| 52 | }; | 58 | }; |
| 53 | Flags flags{}; | 59 | Flags flags{}; |
| 54 | for (const int flag : INVALIDATION_FLAGS) { | 60 | for (const int flag : INVALIDATION_FLAGS) { |
| @@ -128,6 +134,8 @@ void SetupDirtyStateEnable(Tables& tables) { | |||
| 128 | setup(OFF(polygon_offset_point_enable), DepthBiasEnable); | 134 | setup(OFF(polygon_offset_point_enable), DepthBiasEnable); |
| 129 | setup(OFF(polygon_offset_line_enable), DepthBiasEnable); | 135 | setup(OFF(polygon_offset_line_enable), DepthBiasEnable); |
| 130 | setup(OFF(polygon_offset_fill_enable), DepthBiasEnable); | 136 | setup(OFF(polygon_offset_fill_enable), DepthBiasEnable); |
| 137 | setup(OFF(logic_op.enable), LogicOpEnable); | ||
| 138 | setup(OFF(viewport_clip_control.geometry_clip), DepthClampEnable); | ||
| 131 | } | 139 | } |
| 132 | 140 | ||
| 133 | void SetupDirtyDepthCompareOp(Tables& tables) { | 141 | void SetupDirtyDepthCompareOp(Tables& tables) { |
| @@ -157,10 +165,16 @@ void SetupDirtyStencilOp(Tables& tables) { | |||
| 157 | 165 | ||
| 158 | void SetupDirtyBlending(Tables& tables) { | 166 | void SetupDirtyBlending(Tables& tables) { |
| 159 | tables[0][OFF(color_mask_common)] = Blending; | 167 | tables[0][OFF(color_mask_common)] = Blending; |
| 168 | tables[1][OFF(color_mask_common)] = ColorMask; | ||
| 160 | tables[0][OFF(blend_per_target_enabled)] = Blending; | 169 | tables[0][OFF(blend_per_target_enabled)] = Blending; |
| 170 | tables[1][OFF(blend_per_target_enabled)] = BlendEquations; | ||
| 161 | FillBlock(tables[0], OFF(color_mask), NUM(color_mask), Blending); | 171 | FillBlock(tables[0], OFF(color_mask), NUM(color_mask), Blending); |
| 172 | FillBlock(tables[1], OFF(color_mask), NUM(color_mask), ColorMask); | ||
| 162 | FillBlock(tables[0], OFF(blend), NUM(blend), Blending); | 173 | FillBlock(tables[0], OFF(blend), NUM(blend), Blending); |
| 174 | FillBlock(tables[1], OFF(blend), NUM(blend), BlendEquations); | ||
| 175 | FillBlock(tables[1], OFF(blend.enable), NUM(blend.enable), BlendEnable); | ||
| 163 | FillBlock(tables[0], OFF(blend_per_target), NUM(blend_per_target), Blending); | 176 | FillBlock(tables[0], OFF(blend_per_target), NUM(blend_per_target), Blending); |
| 177 | FillBlock(tables[1], OFF(blend_per_target), NUM(blend_per_target), BlendEquations); | ||
| 164 | } | 178 | } |
| 165 | 179 | ||
| 166 | void SetupDirtySpecialOps(Tables& tables) { | 180 | void SetupDirtySpecialOps(Tables& tables) { |
diff --git a/src/video_core/renderer_vulkan/vk_state_tracker.h b/src/video_core/renderer_vulkan/vk_state_tracker.h index 6050f5d26..7cdc70c60 100644 --- a/src/video_core/renderer_vulkan/vk_state_tracker.h +++ b/src/video_core/renderer_vulkan/vk_state_tracker.h | |||
| @@ -50,8 +50,13 @@ enum : u8 { | |||
| 50 | DepthBiasEnable, | 50 | DepthBiasEnable, |
| 51 | StateEnable, | 51 | StateEnable, |
| 52 | LogicOp, | 52 | LogicOp, |
| 53 | LogicOpEnable, | ||
| 54 | DepthClampEnable, | ||
| 53 | 55 | ||
| 54 | Blending, | 56 | Blending, |
| 57 | BlendEnable, | ||
| 58 | BlendEquations, | ||
| 59 | ColorMask, | ||
| 55 | ViewportSwizzles, | 60 | ViewportSwizzles, |
| 56 | 61 | ||
| 57 | Last, | 62 | Last, |
| @@ -144,6 +149,14 @@ public: | |||
| 144 | return Exchange(Dirty::DepthBiasEnable, false); | 149 | return Exchange(Dirty::DepthBiasEnable, false); |
| 145 | } | 150 | } |
| 146 | 151 | ||
| 152 | bool TouchLogicOpEnable() { | ||
| 153 | return Exchange(Dirty::LogicOpEnable, false); | ||
| 154 | } | ||
| 155 | |||
| 156 | bool TouchDepthClampEnable() { | ||
| 157 | return Exchange(Dirty::DepthClampEnable, false); | ||
| 158 | } | ||
| 159 | |||
| 147 | bool TouchDepthCompareOp() { | 160 | bool TouchDepthCompareOp() { |
| 148 | return Exchange(Dirty::DepthCompareOp, false); | 161 | return Exchange(Dirty::DepthCompareOp, false); |
| 149 | } | 162 | } |
| @@ -156,6 +169,22 @@ public: | |||
| 156 | return Exchange(Dirty::StencilOp, false); | 169 | return Exchange(Dirty::StencilOp, false); |
| 157 | } | 170 | } |
| 158 | 171 | ||
| 172 | bool TouchBlending() { | ||
| 173 | return Exchange(Dirty::Blending, false); | ||
| 174 | } | ||
| 175 | |||
| 176 | bool TouchBlendEnable() { | ||
| 177 | return Exchange(Dirty::BlendEnable, false); | ||
| 178 | } | ||
| 179 | |||
| 180 | bool TouchBlendEquations() { | ||
| 181 | return Exchange(Dirty::BlendEquations, false); | ||
| 182 | } | ||
| 183 | |||
| 184 | bool TouchColorMask() { | ||
| 185 | return Exchange(Dirty::ColorMask, false); | ||
| 186 | } | ||
| 187 | |||
| 159 | bool TouchStencilTestEnable() { | 188 | bool TouchStencilTestEnable() { |
| 160 | return Exchange(Dirty::StencilTestEnable, false); | 189 | return Exchange(Dirty::StencilTestEnable, false); |
| 161 | } | 190 | } |
diff --git a/src/video_core/vulkan_common/vulkan_device.cpp b/src/video_core/vulkan_common/vulkan_device.cpp index 7294fcfe3..780f5dede 100644 --- a/src/video_core/vulkan_common/vulkan_device.cpp +++ b/src/video_core/vulkan_common/vulkan_device.cpp | |||
| @@ -569,28 +569,31 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR | |||
| 569 | LOG_INFO(Render_Vulkan, "Device doesn't support extended dynamic state"); | 569 | LOG_INFO(Render_Vulkan, "Device doesn't support extended dynamic state"); |
| 570 | } | 570 | } |
| 571 | 571 | ||
| 572 | VkPhysicalDeviceExtendedDynamicState2FeaturesEXT dynamic_state2; | 572 | VkPhysicalDeviceExtendedDynamicState2FeaturesEXT dynamic_state_2; |
| 573 | if (ext_extended_dynamic_state2) { | 573 | if (ext_extended_dynamic_state_2) { |
| 574 | dynamic_state2 = { | 574 | dynamic_state_2 = { |
| 575 | .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT, | 575 | .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT, |
| 576 | .pNext = nullptr, | 576 | .pNext = nullptr, |
| 577 | .extendedDynamicState2 = VK_TRUE, | 577 | .extendedDynamicState2 = VK_TRUE, |
| 578 | .extendedDynamicState2LogicOp = ext_extended_dynamic_state2_extra ? VK_TRUE : VK_FALSE, | 578 | .extendedDynamicState2LogicOp = ext_extended_dynamic_state_2_extra ? VK_TRUE : VK_FALSE, |
| 579 | }; | 579 | }; |
| 580 | SetNext(next, dynamic_state2); | 580 | SetNext(next, dynamic_state_2); |
| 581 | } else { | 581 | } else { |
| 582 | LOG_INFO(Render_Vulkan, "Device doesn't support extended dynamic state 2"); | 582 | LOG_INFO(Render_Vulkan, "Device doesn't support extended dynamic state 2"); |
| 583 | } | 583 | } |
| 584 | 584 | ||
| 585 | VkPhysicalDeviceExtendedDynamicState3FeaturesEXT dynamic_state3; | 585 | VkPhysicalDeviceExtendedDynamicState3FeaturesEXT dynamic_state_3; |
| 586 | if (ext_extended_dynamic_state3) { | 586 | if (ext_extended_dynamic_state_3) { |
| 587 | dynamic_state3 = { | 587 | dynamic_state_3 = { |
| 588 | .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT, | 588 | .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT, |
| 589 | .pNext = nullptr, | 589 | .pNext = nullptr, |
| 590 | .extendedDynamicState3ColorBlendEnable = VK_TRUE, | 590 | .extendedDynamicState3DepthClampEnable = ext_extended_dynamic_state_3_enables ? VK_TRUE : VK_FALSE, |
| 591 | .extendedDynamicState3ColorBlendEquation = VK_TRUE, | 591 | .extendedDynamicState3LogicOpEnable = ext_extended_dynamic_state_3_enables ? VK_TRUE : VK_FALSE, |
| 592 | .extendedDynamicState3ColorBlendEnable = ext_extended_dynamic_state_3_blend ? VK_TRUE : VK_FALSE, | ||
| 593 | .extendedDynamicState3ColorBlendEquation = ext_extended_dynamic_state_3_blend ? VK_TRUE : VK_FALSE, | ||
| 594 | .extendedDynamicState3ColorWriteMask = ext_extended_dynamic_state_3_blend ? VK_TRUE : VK_FALSE, | ||
| 592 | }; | 595 | }; |
| 593 | SetNext(next, dynamic_state3); | 596 | SetNext(next, dynamic_state_3); |
| 594 | } else { | 597 | } else { |
| 595 | LOG_INFO(Render_Vulkan, "Device doesn't support extended dynamic state 3"); | 598 | LOG_INFO(Render_Vulkan, "Device doesn't support extended dynamic state 3"); |
| 596 | } | 599 | } |
| @@ -1117,8 +1120,8 @@ std::vector<const char*> Device::LoadExtensions(bool requires_surface) { | |||
| 1117 | bool has_ext_transform_feedback{}; | 1120 | bool has_ext_transform_feedback{}; |
| 1118 | bool has_ext_custom_border_color{}; | 1121 | bool has_ext_custom_border_color{}; |
| 1119 | bool has_ext_extended_dynamic_state{}; | 1122 | bool has_ext_extended_dynamic_state{}; |
| 1120 | bool has_ext_extended_dynamic_state2{}; | 1123 | bool has_ext_extended_dynamic_state_2{}; |
| 1121 | bool has_ext_extended_dynamic_state3{}; | 1124 | bool has_ext_extended_dynamic_state_3{}; |
| 1122 | bool has_ext_shader_atomic_int64{}; | 1125 | bool has_ext_shader_atomic_int64{}; |
| 1123 | bool has_ext_provoking_vertex{}; | 1126 | bool has_ext_provoking_vertex{}; |
| 1124 | bool has_ext_vertex_input_dynamic_state{}; | 1127 | bool has_ext_vertex_input_dynamic_state{}; |
| @@ -1163,9 +1166,9 @@ std::vector<const char*> Device::LoadExtensions(bool requires_surface) { | |||
| 1163 | test(has_ext_transform_feedback, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME, false); | 1166 | test(has_ext_transform_feedback, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME, false); |
| 1164 | test(has_ext_custom_border_color, VK_EXT_CUSTOM_BORDER_COLOR_EXTENSION_NAME, false); | 1167 | test(has_ext_custom_border_color, VK_EXT_CUSTOM_BORDER_COLOR_EXTENSION_NAME, false); |
| 1165 | test(has_ext_extended_dynamic_state, VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME, false); | 1168 | test(has_ext_extended_dynamic_state, VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME, false); |
| 1166 | test(has_ext_extended_dynamic_state2, VK_EXT_EXTENDED_DYNAMIC_STATE_2_EXTENSION_NAME, | 1169 | test(has_ext_extended_dynamic_state_2, VK_EXT_EXTENDED_DYNAMIC_STATE_2_EXTENSION_NAME, |
| 1167 | false); | 1170 | false); |
| 1168 | test(has_ext_extended_dynamic_state3, VK_EXT_EXTENDED_DYNAMIC_STATE_3_EXTENSION_NAME, | 1171 | test(has_ext_extended_dynamic_state_3, VK_EXT_EXTENDED_DYNAMIC_STATE_3_EXTENSION_NAME, |
| 1169 | false); | 1172 | false); |
| 1170 | test(has_ext_subgroup_size_control, VK_EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME, true); | 1173 | test(has_ext_subgroup_size_control, VK_EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME, true); |
| 1171 | test(has_ext_provoking_vertex, VK_EXT_PROVOKING_VERTEX_EXTENSION_NAME, false); | 1174 | test(has_ext_provoking_vertex, VK_EXT_PROVOKING_VERTEX_EXTENSION_NAME, false); |
| @@ -1316,33 +1319,39 @@ std::vector<const char*> Device::LoadExtensions(bool requires_surface) { | |||
| 1316 | ext_extended_dynamic_state = true; | 1319 | ext_extended_dynamic_state = true; |
| 1317 | } | 1320 | } |
| 1318 | } | 1321 | } |
| 1319 | if (has_ext_extended_dynamic_state2) { | 1322 | if (has_ext_extended_dynamic_state_2) { |
| 1320 | VkPhysicalDeviceExtendedDynamicState2FeaturesEXT extended_dynamic_state2; | 1323 | VkPhysicalDeviceExtendedDynamicState2FeaturesEXT extended_dynamic_state_2; |
| 1321 | extended_dynamic_state2.sType = | 1324 | extended_dynamic_state_2.sType = |
| 1322 | VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT; | 1325 | VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT; |
| 1323 | extended_dynamic_state2.pNext = nullptr; | 1326 | extended_dynamic_state_2.pNext = nullptr; |
| 1324 | features.pNext = &extended_dynamic_state2; | 1327 | features.pNext = &extended_dynamic_state_2; |
| 1325 | physical.GetFeatures2(features); | 1328 | physical.GetFeatures2(features); |
| 1326 | 1329 | ||
| 1327 | if (extended_dynamic_state2.extendedDynamicState2) { | 1330 | if (extended_dynamic_state_2.extendedDynamicState2) { |
| 1328 | extensions.push_back(VK_EXT_EXTENDED_DYNAMIC_STATE_2_EXTENSION_NAME); | 1331 | extensions.push_back(VK_EXT_EXTENDED_DYNAMIC_STATE_2_EXTENSION_NAME); |
| 1329 | ext_extended_dynamic_state2 = true; | 1332 | ext_extended_dynamic_state_2 = true; |
| 1330 | ext_extended_dynamic_state2_extra = | 1333 | ext_extended_dynamic_state_2_extra = |
| 1331 | extended_dynamic_state2.extendedDynamicState2LogicOp; | 1334 | extended_dynamic_state_2.extendedDynamicState2LogicOp; |
| 1332 | } | 1335 | } |
| 1333 | } | 1336 | } |
| 1334 | if (has_ext_extended_dynamic_state3) { | 1337 | if (has_ext_extended_dynamic_state_3) { |
| 1335 | VkPhysicalDeviceExtendedDynamicState3FeaturesEXT extended_dynamic_state3; | 1338 | VkPhysicalDeviceExtendedDynamicState3FeaturesEXT extended_dynamic_state_3; |
| 1336 | extended_dynamic_state3.sType = | 1339 | extended_dynamic_state_3.sType = |
| 1337 | VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT; | 1340 | VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT; |
| 1338 | extended_dynamic_state3.pNext = nullptr; | 1341 | extended_dynamic_state_3.pNext = nullptr; |
| 1339 | features.pNext = &extended_dynamic_state3; | 1342 | features.pNext = &extended_dynamic_state_3; |
| 1340 | physical.GetFeatures2(features); | 1343 | physical.GetFeatures2(features); |
| 1341 | 1344 | ||
| 1342 | if (extended_dynamic_state3.extendedDynamicState3ColorBlendEnable && | 1345 | ext_extended_dynamic_state_3_blend = extended_dynamic_state_3.extendedDynamicState3ColorBlendEnable && |
| 1343 | extended_dynamic_state3.extendedDynamicState3ColorBlendEquation) { | 1346 | extended_dynamic_state_3.extendedDynamicState3ColorBlendEquation && |
| 1347 | extended_dynamic_state_3.extendedDynamicState3ColorWriteMask; | ||
| 1348 | |||
| 1349 | ext_extended_dynamic_state_3_enables = extended_dynamic_state_3.extendedDynamicState3DepthClampEnable && | ||
| 1350 | extended_dynamic_state_3.extendedDynamicState3LogicOpEnable; | ||
| 1351 | |||
| 1352 | ext_extended_dynamic_state_3 = ext_extended_dynamic_state_3_blend || ext_extended_dynamic_state_3_enables; | ||
| 1353 | if (ext_extended_dynamic_state_3) { | ||
| 1344 | extensions.push_back(VK_EXT_EXTENDED_DYNAMIC_STATE_3_EXTENSION_NAME); | 1354 | extensions.push_back(VK_EXT_EXTENDED_DYNAMIC_STATE_3_EXTENSION_NAME); |
| 1345 | ext_extended_dynamic_state3 = true; | ||
| 1346 | } | 1355 | } |
| 1347 | } | 1356 | } |
| 1348 | if (has_ext_line_rasterization) { | 1357 | if (has_ext_line_rasterization) { |
diff --git a/src/video_core/vulkan_common/vulkan_device.h b/src/video_core/vulkan_common/vulkan_device.h index 51b049c0d..b58ec736f 100644 --- a/src/video_core/vulkan_common/vulkan_device.h +++ b/src/video_core/vulkan_common/vulkan_device.h | |||
| @@ -288,16 +288,26 @@ public: | |||
| 288 | 288 | ||
| 289 | /// Returns true if the device supports VK_EXT_extended_dynamic_state2. | 289 | /// Returns true if the device supports VK_EXT_extended_dynamic_state2. |
| 290 | bool IsExtExtendedDynamicState2Supported() const { | 290 | bool IsExtExtendedDynamicState2Supported() const { |
| 291 | return ext_extended_dynamic_state2; | 291 | return ext_extended_dynamic_state_2; |
| 292 | } | 292 | } |
| 293 | 293 | ||
| 294 | bool IsExtExtendedDynamicState2ExtrasSupported() const { | 294 | bool IsExtExtendedDynamicState2ExtrasSupported() const { |
| 295 | return ext_extended_dynamic_state2_extra; | 295 | return ext_extended_dynamic_state_2_extra; |
| 296 | } | 296 | } |
| 297 | 297 | ||
| 298 | /// Returns true if the device supports VK_EXT_extended_dynamic_state3. | 298 | /// Returns true if the device supports VK_EXT_extended_dynamic_state3. |
| 299 | bool IsExtExtendedDynamicState3Supported() const { | 299 | bool IsExtExtendedDynamicState3Supported() const { |
| 300 | return ext_extended_dynamic_state3; | 300 | return ext_extended_dynamic_state_3; |
| 301 | } | ||
| 302 | |||
| 303 | /// Returns true if the device supports VK_EXT_extended_dynamic_state3. | ||
| 304 | bool IsExtExtendedDynamicState3BlendingSupported() const { | ||
| 305 | return ext_extended_dynamic_state_3_blend; | ||
| 306 | } | ||
| 307 | |||
| 308 | /// Returns true if the device supports VK_EXT_extended_dynamic_state3. | ||
| 309 | bool IsExtExtendedDynamicState3EnablesSupported() const { | ||
| 310 | return ext_extended_dynamic_state_3_enables; | ||
| 301 | } | 311 | } |
| 302 | 312 | ||
| 303 | /// Returns true if the device supports VK_EXT_line_rasterization. | 313 | /// Returns true if the device supports VK_EXT_line_rasterization. |
| @@ -482,9 +492,11 @@ private: | |||
| 482 | bool ext_transform_feedback{}; ///< Support for VK_EXT_transform_feedback. | 492 | bool ext_transform_feedback{}; ///< Support for VK_EXT_transform_feedback. |
| 483 | bool ext_custom_border_color{}; ///< Support for VK_EXT_custom_border_color. | 493 | bool ext_custom_border_color{}; ///< Support for VK_EXT_custom_border_color. |
| 484 | bool ext_extended_dynamic_state{}; ///< Support for VK_EXT_extended_dynamic_state. | 494 | bool ext_extended_dynamic_state{}; ///< Support for VK_EXT_extended_dynamic_state. |
| 485 | bool ext_extended_dynamic_state2{}; ///< Support for VK_EXT_extended_dynamic_state2. | 495 | bool ext_extended_dynamic_state_2{}; ///< Support for VK_EXT_extended_dynamic_state2. |
| 486 | bool ext_extended_dynamic_state2_extra{}; ///< Support for VK_EXT_extended_dynamic_state2. | 496 | bool ext_extended_dynamic_state_2_extra{}; ///< Support for VK_EXT_extended_dynamic_state2. |
| 487 | bool ext_extended_dynamic_state3{}; ///< Support for VK_EXT_extended_dynamic_state3. | 497 | bool ext_extended_dynamic_state_3{}; ///< Support for VK_EXT_extended_dynamic_state3. |
| 498 | bool ext_extended_dynamic_state_3_blend{}; ///< Support for VK_EXT_extended_dynamic_state3. | ||
| 499 | bool ext_extended_dynamic_state_3_enables{}; ///< Support for VK_EXT_extended_dynamic_state3. | ||
| 488 | bool ext_line_rasterization{}; ///< Support for VK_EXT_line_rasterization. | 500 | bool ext_line_rasterization{}; ///< Support for VK_EXT_line_rasterization. |
| 489 | bool ext_vertex_input_dynamic_state{}; ///< Support for VK_EXT_vertex_input_dynamic_state. | 501 | bool ext_vertex_input_dynamic_state{}; ///< Support for VK_EXT_vertex_input_dynamic_state. |
| 490 | bool ext_shader_stencil_export{}; ///< Support for VK_EXT_shader_stencil_export. | 502 | bool ext_shader_stencil_export{}; ///< Support for VK_EXT_shader_stencil_export. |
diff --git a/src/video_core/vulkan_common/vulkan_wrapper.cpp b/src/video_core/vulkan_common/vulkan_wrapper.cpp index 8745cf80f..861767c13 100644 --- a/src/video_core/vulkan_common/vulkan_wrapper.cpp +++ b/src/video_core/vulkan_common/vulkan_wrapper.cpp | |||
| @@ -125,6 +125,8 @@ void Load(VkDevice device, DeviceDispatch& dld) noexcept { | |||
| 125 | X(vkCmdSetPrimitiveRestartEnableEXT); | 125 | X(vkCmdSetPrimitiveRestartEnableEXT); |
| 126 | X(vkCmdSetRasterizerDiscardEnableEXT); | 126 | X(vkCmdSetRasterizerDiscardEnableEXT); |
| 127 | X(vkCmdSetDepthBiasEnableEXT); | 127 | X(vkCmdSetDepthBiasEnableEXT); |
| 128 | X(vkCmdSetLogicOpEnableEXT); | ||
| 129 | X(vkCmdSetDepthClampEnableEXT); | ||
| 128 | X(vkCmdSetFrontFaceEXT); | 130 | X(vkCmdSetFrontFaceEXT); |
| 129 | X(vkCmdSetLogicOpEXT); | 131 | X(vkCmdSetLogicOpEXT); |
| 130 | X(vkCmdSetPatchControlPointsEXT); | 132 | X(vkCmdSetPatchControlPointsEXT); |
| @@ -133,6 +135,9 @@ void Load(VkDevice device, DeviceDispatch& dld) noexcept { | |||
| 133 | X(vkCmdSetStencilOpEXT); | 135 | X(vkCmdSetStencilOpEXT); |
| 134 | X(vkCmdSetStencilTestEnableEXT); | 136 | X(vkCmdSetStencilTestEnableEXT); |
| 135 | X(vkCmdSetVertexInputEXT); | 137 | X(vkCmdSetVertexInputEXT); |
| 138 | X(vkCmdSetColorWriteMaskEXT); | ||
| 139 | X(vkCmdSetColorBlendEnableEXT); | ||
| 140 | X(vkCmdSetColorBlendEquationEXT); | ||
| 136 | X(vkCmdResolveImage); | 141 | X(vkCmdResolveImage); |
| 137 | X(vkCreateBuffer); | 142 | X(vkCreateBuffer); |
| 138 | X(vkCreateBufferView); | 143 | X(vkCreateBufferView); |
diff --git a/src/video_core/vulkan_common/vulkan_wrapper.h b/src/video_core/vulkan_common/vulkan_wrapper.h index c4b7051fc..d7ae14478 100644 --- a/src/video_core/vulkan_common/vulkan_wrapper.h +++ b/src/video_core/vulkan_common/vulkan_wrapper.h | |||
| @@ -237,6 +237,8 @@ struct DeviceDispatch : InstanceDispatch { | |||
| 237 | PFN_vkCmdSetPrimitiveRestartEnableEXT vkCmdSetPrimitiveRestartEnableEXT{}; | 237 | PFN_vkCmdSetPrimitiveRestartEnableEXT vkCmdSetPrimitiveRestartEnableEXT{}; |
| 238 | PFN_vkCmdSetRasterizerDiscardEnableEXT vkCmdSetRasterizerDiscardEnableEXT{}; | 238 | PFN_vkCmdSetRasterizerDiscardEnableEXT vkCmdSetRasterizerDiscardEnableEXT{}; |
| 239 | PFN_vkCmdSetDepthBiasEnableEXT vkCmdSetDepthBiasEnableEXT{}; | 239 | PFN_vkCmdSetDepthBiasEnableEXT vkCmdSetDepthBiasEnableEXT{}; |
| 240 | PFN_vkCmdSetLogicOpEnableEXT vkCmdSetLogicOpEnableEXT{}; | ||
| 241 | PFN_vkCmdSetDepthClampEnableEXT vkCmdSetDepthClampEnableEXT{}; | ||
| 240 | PFN_vkCmdSetEvent vkCmdSetEvent{}; | 242 | PFN_vkCmdSetEvent vkCmdSetEvent{}; |
| 241 | PFN_vkCmdSetFrontFaceEXT vkCmdSetFrontFaceEXT{}; | 243 | PFN_vkCmdSetFrontFaceEXT vkCmdSetFrontFaceEXT{}; |
| 242 | PFN_vkCmdSetPatchControlPointsEXT vkCmdSetPatchControlPointsEXT{}; | 244 | PFN_vkCmdSetPatchControlPointsEXT vkCmdSetPatchControlPointsEXT{}; |
| @@ -251,6 +253,9 @@ struct DeviceDispatch : InstanceDispatch { | |||
| 251 | PFN_vkCmdSetStencilWriteMask vkCmdSetStencilWriteMask{}; | 253 | PFN_vkCmdSetStencilWriteMask vkCmdSetStencilWriteMask{}; |
| 252 | PFN_vkCmdSetVertexInputEXT vkCmdSetVertexInputEXT{}; | 254 | PFN_vkCmdSetVertexInputEXT vkCmdSetVertexInputEXT{}; |
| 253 | PFN_vkCmdSetViewport vkCmdSetViewport{}; | 255 | PFN_vkCmdSetViewport vkCmdSetViewport{}; |
| 256 | PFN_vkCmdSetColorWriteMaskEXT vkCmdSetColorWriteMaskEXT{}; | ||
| 257 | PFN_vkCmdSetColorBlendEnableEXT vkCmdSetColorBlendEnableEXT{}; | ||
| 258 | PFN_vkCmdSetColorBlendEquationEXT vkCmdSetColorBlendEquationEXT{}; | ||
| 254 | PFN_vkCmdWaitEvents vkCmdWaitEvents{}; | 259 | PFN_vkCmdWaitEvents vkCmdWaitEvents{}; |
| 255 | PFN_vkCreateBuffer vkCreateBuffer{}; | 260 | PFN_vkCreateBuffer vkCreateBuffer{}; |
| 256 | PFN_vkCreateBufferView vkCreateBufferView{}; | 261 | PFN_vkCreateBufferView vkCreateBufferView{}; |
| @@ -1236,6 +1241,14 @@ public: | |||
| 1236 | dld->vkCmdSetDepthBiasEnableEXT(handle, enable ? VK_TRUE : VK_FALSE); | 1241 | dld->vkCmdSetDepthBiasEnableEXT(handle, enable ? VK_TRUE : VK_FALSE); |
| 1237 | } | 1242 | } |
| 1238 | 1243 | ||
| 1244 | void SetLogicOpEnableEXT(bool enable) const noexcept { | ||
| 1245 | dld->vkCmdSetLogicOpEnableEXT(handle, enable ? VK_TRUE : VK_FALSE); | ||
| 1246 | } | ||
| 1247 | |||
| 1248 | void SetDepthClampEnableEXT(bool enable) const noexcept { | ||
| 1249 | dld->vkCmdSetDepthClampEnableEXT(handle, enable ? VK_TRUE : VK_FALSE); | ||
| 1250 | } | ||
| 1251 | |||
| 1239 | void SetFrontFaceEXT(VkFrontFace front_face) const noexcept { | 1252 | void SetFrontFaceEXT(VkFrontFace front_face) const noexcept { |
| 1240 | dld->vkCmdSetFrontFaceEXT(handle, front_face); | 1253 | dld->vkCmdSetFrontFaceEXT(handle, front_face); |
| 1241 | } | 1254 | } |
| @@ -1248,6 +1261,18 @@ public: | |||
| 1248 | dld->vkCmdSetPatchControlPointsEXT(handle, patch_control_points); | 1261 | dld->vkCmdSetPatchControlPointsEXT(handle, patch_control_points); |
| 1249 | } | 1262 | } |
| 1250 | 1263 | ||
| 1264 | void SetColorWriteMaskEXT(u32 first, Span<VkColorComponentFlags> masks) const noexcept { | ||
| 1265 | dld->vkCmdSetColorWriteMaskEXT(handle, first, masks.size(), masks.data()); | ||
| 1266 | } | ||
| 1267 | |||
| 1268 | void SetColorBlendEnableEXT(u32 first, Span<VkBool32> enables) const noexcept { | ||
| 1269 | dld->vkCmdSetColorBlendEnableEXT(handle, first, enables.size(), enables.data()); | ||
| 1270 | } | ||
| 1271 | |||
| 1272 | void SetColorBlendEquationEXT(u32 first, Span<VkColorBlendEquationEXT> equations) const noexcept { | ||
| 1273 | dld->vkCmdSetColorBlendEquationEXT(handle, first, equations.size(), equations.data()); | ||
| 1274 | } | ||
| 1275 | |||
| 1251 | void SetLineWidth(float line_width) const noexcept { | 1276 | void SetLineWidth(float line_width) const noexcept { |
| 1252 | dld->vkCmdSetLineWidth(handle, line_width); | 1277 | dld->vkCmdSetLineWidth(handle, line_width); |
| 1253 | } | 1278 | } |