summaryrefslogtreecommitdiffstats
path: root/src/video_core/clipper.cpp
diff options
context:
space:
mode:
authorYuri Kunde Schlesner <yuriks@yuriks.net>2014-12-23 16:05:51 +0100
committerYuri Kunde Schlesner <yuriks@yuriks.net>2014-12-29 05:08:11 +0100
commit8369ee58035ca98f776428f6cccbcf987fee3bc9 (patch)
tree3c1800823ffe55529ba6dbcba0c4407d2da625f2 /src/video_core/clipper.cpp
parentGPU: Bitwise texture swizzling (diff)
downloadyuzu-8369ee58035ca98f776428f6cccbcf987fee3bc9.tar
yuzu-8369ee58035ca98f776428f6cccbcf987fee3bc9.tar.gz
yuzu-8369ee58035ca98f776428f6cccbcf987fee3bc9.tar.bz2
yuzu-8369ee58035ca98f776428f6cccbcf987fee3bc9.tar.lz
yuzu-8369ee58035ca98f776428f6cccbcf987fee3bc9.tar.xz
yuzu-8369ee58035ca98f776428f6cccbcf987fee3bc9.tar.zst
yuzu-8369ee58035ca98f776428f6cccbcf987fee3bc9.zip
Diffstat (limited to 'src/video_core/clipper.cpp')
-rw-r--r--src/video_core/clipper.cpp13
1 files changed, 10 insertions, 3 deletions
diff --git a/src/video_core/clipper.cpp b/src/video_core/clipper.cpp
index 0521ef866..1744066ba 100644
--- a/src/video_core/clipper.cpp
+++ b/src/video_core/clipper.cpp
@@ -91,10 +91,17 @@ static void InitScreenCoordinates(OutputVertex& vtx)
viewport.zscale = float24::FromRawFloat24(registers.viewport_depth_range);
viewport.offset_z = float24::FromRawFloat24(registers.viewport_depth_far_plane);
+ float24 inv_w = float24::FromFloat32(1.f) / vtx.pos.w;
+ vtx.color *= inv_w;
+ vtx.tc0 *= inv_w;
+ vtx.tc1 *= inv_w;
+ vtx.tc2 *= inv_w;
+ vtx.pos.w = inv_w;
+
// TODO: Not sure why the viewport width needs to be divided by 2 but the viewport height does not
- vtx.screenpos[0] = (vtx.pos.x / vtx.pos.w + float24::FromFloat32(1.0)) * viewport.halfsize_x + viewport.offset_x;
- vtx.screenpos[1] = (vtx.pos.y / vtx.pos.w + float24::FromFloat32(1.0)) * viewport.halfsize_y + viewport.offset_y;
- vtx.screenpos[2] = viewport.offset_z - vtx.pos.z / vtx.pos.w * viewport.zscale;
+ vtx.screenpos[0] = (vtx.pos.x * inv_w + float24::FromFloat32(1.0)) * viewport.halfsize_x + viewport.offset_x;
+ vtx.screenpos[1] = (vtx.pos.y * inv_w + float24::FromFloat32(1.0)) * viewport.halfsize_y + viewport.offset_y;
+ vtx.screenpos[2] = viewport.offset_z - vtx.pos.z * inv_w * viewport.zscale;
}
void ProcessTriangle(OutputVertex &v0, OutputVertex &v1, OutputVertex &v2) {