summaryrefslogtreecommitdiff
path: root/src/video_core/rasterizer.cpp
diff options
context:
space:
mode:
authorGravatar Tony Wasserka2015-01-02 20:37:25 +0100
committerGravatar Tony Wasserka2015-02-18 14:50:03 +0100
commit365236fa4c96eaba94b715b6844bff64238b70e5 (patch)
tree798fde7c74933dbc369617c2fd9641fdfa6e375f /src/video_core/rasterizer.cpp
parentPica/VertexShader: Implement the LOOP instruction. (diff)
downloadyuzu-365236fa4c96eaba94b715b6844bff64238b70e5.tar.gz
yuzu-365236fa4c96eaba94b715b6844bff64238b70e5.tar.xz
yuzu-365236fa4c96eaba94b715b6844bff64238b70e5.zip
Pica: Cleanup clipping code and change screenspace z to range from -1..0.
The change in depth range seems to reflect better to what applications are expecting, and makes for cleaner code overall (hence is more likely to reflect hardware behavior).
Diffstat (limited to 'src/video_core/rasterizer.cpp')
-rw-r--r--src/video_core/rasterizer.cpp11
1 files changed, 6 insertions, 5 deletions
diff --git a/src/video_core/rasterizer.cpp b/src/video_core/rasterizer.cpp
index 3faa10153..046c010ef 100644
--- a/src/video_core/rasterizer.cpp
+++ b/src/video_core/rasterizer.cpp
@@ -106,16 +106,17 @@ void ProcessTriangle(const VertexShader::OutputVertex& v0,
106 ScreenToRasterizerCoordinates(v1.screenpos), 106 ScreenToRasterizerCoordinates(v1.screenpos),
107 ScreenToRasterizerCoordinates(v2.screenpos) }; 107 ScreenToRasterizerCoordinates(v2.screenpos) };
108 108
109 if (registers.cull_mode == Regs::CullMode::KeepClockWise) { 109 if (registers.cull_mode == Regs::CullMode::KeepCounterClockWise) {
110 // Reverse vertex order and use the CCW code path. 110 // Reverse vertex order and use the CW code path.
111 std::swap(vtxpos[1], vtxpos[2]); 111 std::swap(vtxpos[1], vtxpos[2]);
112 } 112 }
113 113
114 if (registers.cull_mode != Regs::CullMode::KeepAll) { 114 if (registers.cull_mode != Regs::CullMode::KeepAll) {
115 // Cull away triangles which are wound clockwise. 115 // Cull away triangles which are wound counter-clockwise.
116 // TODO: A check for degenerate triangles ("== 0") should be considered for CullMode::KeepAll
117 if (SignedArea(vtxpos[0].xy(), vtxpos[1].xy(), vtxpos[2].xy()) <= 0) 116 if (SignedArea(vtxpos[0].xy(), vtxpos[1].xy(), vtxpos[2].xy()) <= 0)
118 return; 117 return;
118 } else {
119 // TODO: Consider A check for degenerate triangles ("SignedArea == 0")
119 } 120 }
120 121
121 // TODO: Proper scissor rect test! 122 // TODO: Proper scissor rect test!
@@ -475,7 +476,7 @@ void ProcessTriangle(const VertexShader::OutputVertex& v0,
475 476
476 // TODO: Does depth indeed only get written even if depth testing is enabled? 477 // TODO: Does depth indeed only get written even if depth testing is enabled?
477 if (registers.output_merger.depth_test_enable) { 478 if (registers.output_merger.depth_test_enable) {
478 u16 z = (u16)(-(v0.screenpos[2].ToFloat32() * w0 + 479 u16 z = (u16)((v0.screenpos[2].ToFloat32() * w0 +
479 v1.screenpos[2].ToFloat32() * w1 + 480 v1.screenpos[2].ToFloat32() * w1 +
480 v2.screenpos[2].ToFloat32() * w2) * 65535.f / wsum); 481 v2.screenpos[2].ToFloat32() * w2) * 65535.f / wsum);
481 u16 ref_z = GetDepth(x >> 4, y >> 4); 482 u16 ref_z = GetDepth(x >> 4, y >> 4);