diff --git a/src/graphics/guest_gpu/hardwareContext.h b/src/graphics/guest_gpu/hardwareContext.h index 2cb5997a9..b7f46ac1b 100644 --- a/src/graphics/guest_gpu/hardwareContext.h +++ b/src/graphics/guest_gpu/hardwareContext.h @@ -295,10 +295,7 @@ struct ClipControl { bool linear_attribute_clip_enable = false; bool force_viewport_index_from_vs_enable = false; - [[nodiscard]] bool IsZClipModeRepresentable() const { - return min_z_clip_disable == max_z_clip_disable; - } - [[nodiscard]] bool IsZClipEnabled() const { return !min_z_clip_disable; } + [[nodiscard]] bool IsZClipEnabled() const { return !min_z_clip_disable && !max_z_clip_disable; } }; struct DepthControl { diff --git a/src/graphics/host_gpu/renderer/debug.cpp b/src/graphics/host_gpu/renderer/debug.cpp index ec16789ae..d4ac21094 100644 --- a/src/graphics/host_gpu/renderer/debug.cpp +++ b/src/graphics/host_gpu/renderer/debug.cpp @@ -617,8 +617,7 @@ static void ClipCheck(const HW::ClipControl& c) { // dx_linear_attr_clip_enable preserves linear (noperspective) attributes at clip-generated // vertices, which Vulkan provides as part of clipping and interpolation. EXIT_NOT_IMPLEMENTED(c.user_clip_planes != 0 || c.user_clip_plane_mode != 0 || - c.vertex_kill_any || !c.IsZClipModeRepresentable() || - c.user_clip_plane_negate_y || c.clip_disable || + c.vertex_kill_any || c.user_clip_plane_negate_y || c.clip_disable || c.user_clip_plane_cull_only || c.cull_on_clipping_error_disable || c.force_viewport_index_from_vs_enable); } diff --git a/src/graphics/host_gpu/renderer/pipeline/pipelineCache.cpp b/src/graphics/host_gpu/renderer/pipeline/pipelineCache.cpp index e3acb2bf2..89b9b8e3d 100644 --- a/src/graphics/host_gpu/renderer/pipeline/pipelineCache.cpp +++ b/src/graphics/host_gpu/renderer/pipeline/pipelineCache.cpp @@ -131,8 +131,7 @@ PipelineCache::GraphicsPipeline& PipelineCache::CreateGraphicsPipeline( } } - const auto& clip_control = ctx.GetClipControl(); - EXIT_NOT_IMPLEMENTED(!clip_control.IsZClipModeRepresentable()); + const auto& clip_control = ctx.GetClipControl(); static_params.negative_one_to_one = !clip_control.dx_clip_space; static_params.depth_clip_enable = clip_control.IsZClipEnabled(); static_params.topology = topology; diff --git a/tests/ShaderRecompilerComputeTests.cpp b/tests/ShaderRecompilerComputeTests.cpp index 2e8eda601..2729872eb 100644 --- a/tests/ShaderRecompilerComputeTests.cpp +++ b/tests/ShaderRecompilerComputeTests.cpp @@ -20143,23 +20143,23 @@ void CheckReferenceClockScale() { void CheckClipControlDepthClipState() { HW::ClipControl clip; Require("ClipControlDepthClipState", "default", - clip.IsZClipModeRepresentable() && clip.IsZClipEnabled(), + clip.IsZClipEnabled(), "default paired Z clipping was not enabled"); clip.min_z_clip_disable = true; Require("ClipControlDepthClipState", "asymmetric near", - !clip.IsZClipModeRepresentable(), - "asymmetric near-plane state was accepted"); + !clip.IsZClipEnabled(), + "near-plane disable did not disable paired host Z clipping"); clip.min_z_clip_disable = false; clip.max_z_clip_disable = true; Require("ClipControlDepthClipState", "asymmetric far", - !clip.IsZClipModeRepresentable(), - "asymmetric far-plane state was accepted"); + !clip.IsZClipEnabled(), + "far-plane disable did not disable paired host Z clipping"); clip.min_z_clip_disable = true; Require("ClipControlDepthClipState", "both disabled", - clip.IsZClipModeRepresentable() && !clip.IsZClipEnabled(), + !clip.IsZClipEnabled(), "paired Z-clip disable was not represented"); std::printf("[host] %-32s ok\n", "ClipControlDepthClipState"); }