diff --git a/src/video_core/renderer_vulkan/fixed_pipeline_state.cpp b/src/video_core/renderer_vulkan/fixed_pipeline_state.cpp index 0ced890929..c7a4985b87 100644 --- a/src/video_core/renderer_vulkan/fixed_pipeline_state.cpp +++ b/src/video_core/renderer_vulkan/fixed_pipeline_state.cpp @@ -11,6 +11,7 @@ #include #include "common/cityhash.h" #include "common/common_types.h" +#include "common/logging.h" #include "common/settings.h" #include "video_core/engines/maxwell_3d.h" #include "video_core/renderer_vulkan/fixed_pipeline_state.h" @@ -88,6 +89,27 @@ bool ComputeAttachment0DualSourceBlend(const Maxwell& regs) { : uses_dual_source(regs.blend); } +const char* GeometryClipName(Maxwell::ViewportClipControl::GeometryClip clip) { + switch (clip) { + case Maxwell::ViewportClipControl::GeometryClip::WZero: + return "WZero"; + case Maxwell::ViewportClipControl::GeometryClip::Passthrough: + return "Passthrough"; + case Maxwell::ViewportClipControl::GeometryClip::FrustumXY: + return "FrustumXY"; + case Maxwell::ViewportClipControl::GeometryClip::FrustumXYZ: + return "FrustumXYZ"; + case Maxwell::ViewportClipControl::GeometryClip::WZeroNoZCull: + return "WZeroNoZCull"; + case Maxwell::ViewportClipControl::GeometryClip::FrustumZ: + return "FrustumZ"; + case Maxwell::ViewportClipControl::GeometryClip::WZeroTriFillOrClip: + return "WZeroTriFillOrClip"; + default: + return "Unknown"; + } +} + void RefreshXfbState(VideoCommon::TransformFeedbackState& state, const Maxwell& regs) { std::ranges::transform(regs.transform_feedback.controls, state.layouts.begin(), [](const auto& layout) { @@ -105,6 +127,29 @@ void FixedPipelineState::Refresh(Tegra::Engines::Maxwell3D& maxwell3d, DynamicFe const Maxwell& regs = maxwell3d.regs; const auto topology_ = maxwell3d.draw_manager.draw_state.topology; + { + const auto& clip = regs.viewport_clip_control; + const u32 clip_key = (static_cast(clip.geometry_clip.Value()) << 8) | + (static_cast(clip.geometry_guardband_z.Value()) << 6) | + (static_cast(clip.geometry_guardband.Value()) << 5) | + (clip.pixel_max_z.Value() << 2) | (clip.pixel_min_z.Value() << 1) | + clip.depth_0_to_1.Value(); + static u32 last_clip_key = ~0U; + if (clip_key != last_clip_key) { + last_clip_key = clip_key; + LOG_WARNING(Render_Vulkan, + "Viewport clip control: geometry_clip={} guardband_z={} guardband={} " + "depth_0_to_1={} pixel_min_z={} pixel_max_z={} depth_mode={}", + GeometryClipName(clip.geometry_clip.Value()), + static_cast(clip.geometry_guardband_z.Value()), + static_cast(clip.geometry_guardband.Value()), + clip.depth_0_to_1.Value(), clip.pixel_min_z.Value(), + clip.pixel_max_z.Value(), + regs.depth_mode == Maxwell::DepthMode::MinusOneToOne ? "MinusOneToOne" + : "ZeroToOne"); + } + } + driver_id = features.driver_id; driver_version = features.driver_version;