graphics: accept asymmetric Z clip state

This commit is contained in:
Senaxx
2026-08-16 04:14:57 +02:00
committed by nmzik
parent 5e27a28ab0
commit d7fd4a2864
4 changed files with 9 additions and 14 deletions
+1 -4
View File
@@ -295,10 +295,7 @@ struct ClipControl {
bool linear_attribute_clip_enable = false; bool linear_attribute_clip_enable = false;
bool force_viewport_index_from_vs_enable = false; bool force_viewport_index_from_vs_enable = false;
[[nodiscard]] bool IsZClipModeRepresentable() const { [[nodiscard]] bool IsZClipEnabled() const { return !min_z_clip_disable && !max_z_clip_disable; }
return min_z_clip_disable == max_z_clip_disable;
}
[[nodiscard]] bool IsZClipEnabled() const { return !min_z_clip_disable; }
}; };
struct DepthControl { struct DepthControl {
+1 -2
View File
@@ -617,8 +617,7 @@ static void ClipCheck(const HW::ClipControl& c) {
// dx_linear_attr_clip_enable preserves linear (noperspective) attributes at clip-generated // dx_linear_attr_clip_enable preserves linear (noperspective) attributes at clip-generated
// vertices, which Vulkan provides as part of clipping and interpolation. // vertices, which Vulkan provides as part of clipping and interpolation.
EXIT_NOT_IMPLEMENTED(c.user_clip_planes != 0 || c.user_clip_plane_mode != 0 || EXIT_NOT_IMPLEMENTED(c.user_clip_planes != 0 || c.user_clip_plane_mode != 0 ||
c.vertex_kill_any || !c.IsZClipModeRepresentable() || c.vertex_kill_any || c.user_clip_plane_negate_y || c.clip_disable ||
c.user_clip_plane_negate_y || c.clip_disable ||
c.user_clip_plane_cull_only || c.cull_on_clipping_error_disable || c.user_clip_plane_cull_only || c.cull_on_clipping_error_disable ||
c.force_viewport_index_from_vs_enable); c.force_viewport_index_from_vs_enable);
} }
@@ -131,8 +131,7 @@ PipelineCache::GraphicsPipeline& PipelineCache::CreateGraphicsPipeline(
} }
} }
const auto& clip_control = ctx.GetClipControl(); const auto& clip_control = ctx.GetClipControl();
EXIT_NOT_IMPLEMENTED(!clip_control.IsZClipModeRepresentable());
static_params.negative_one_to_one = !clip_control.dx_clip_space; static_params.negative_one_to_one = !clip_control.dx_clip_space;
static_params.depth_clip_enable = clip_control.IsZClipEnabled(); static_params.depth_clip_enable = clip_control.IsZClipEnabled();
static_params.topology = topology; static_params.topology = topology;
+6 -6
View File
@@ -20143,23 +20143,23 @@ void CheckReferenceClockScale() {
void CheckClipControlDepthClipState() { void CheckClipControlDepthClipState() {
HW::ClipControl clip; HW::ClipControl clip;
Require("ClipControlDepthClipState", "default", Require("ClipControlDepthClipState", "default",
clip.IsZClipModeRepresentable() && clip.IsZClipEnabled(), clip.IsZClipEnabled(),
"default paired Z clipping was not enabled"); "default paired Z clipping was not enabled");
clip.min_z_clip_disable = true; clip.min_z_clip_disable = true;
Require("ClipControlDepthClipState", "asymmetric near", Require("ClipControlDepthClipState", "asymmetric near",
!clip.IsZClipModeRepresentable(), !clip.IsZClipEnabled(),
"asymmetric near-plane state was accepted"); "near-plane disable did not disable paired host Z clipping");
clip.min_z_clip_disable = false; clip.min_z_clip_disable = false;
clip.max_z_clip_disable = true; clip.max_z_clip_disable = true;
Require("ClipControlDepthClipState", "asymmetric far", Require("ClipControlDepthClipState", "asymmetric far",
!clip.IsZClipModeRepresentable(), !clip.IsZClipEnabled(),
"asymmetric far-plane state was accepted"); "far-plane disable did not disable paired host Z clipping");
clip.min_z_clip_disable = true; clip.min_z_clip_disable = true;
Require("ClipControlDepthClipState", "both disabled", Require("ClipControlDepthClipState", "both disabled",
clip.IsZClipModeRepresentable() && !clip.IsZClipEnabled(), !clip.IsZClipEnabled(),
"paired Z-clip disable was not represented"); "paired Z-clip disable was not represented");
std::printf("[host] %-32s ok\n", "ClipControlDepthClipState"); std::printf("[host] %-32s ok\n", "ClipControlDepthClipState");
} }