Support frustum clipping against z = -1.
This allows performing the depth range adjustment only once as part of the
viewport transform and not have it be affected by transform feedback.
Change-Id: I89fba3b131c234bea064b1b65f50b62261f4c307
Reviewed-on: https://swiftshader-review.googlesource.com/5421
Tested-by: Nicolas Capens <capn@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/Renderer/Clipper.cpp b/src/Renderer/Clipper.cpp
index 3256d68..1c17402 100644
--- a/src/Renderer/Clipper.cpp
+++ b/src/Renderer/Clipper.cpp
@@ -20,8 +20,9 @@
namespace sw
{
- Clipper::Clipper()
+ Clipper::Clipper(bool symmetricNormalizedDepth)
{
+ n = symmetricNormalizedDepth ? -1.0f : 0.0f;
}
Clipper::~Clipper()
@@ -30,12 +31,12 @@
unsigned int Clipper::computeClipFlags(const float4 &v)
{
- return ((v.x > v.w) ? CLIP_RIGHT : 0) |
- ((v.y > v.w) ? CLIP_TOP : 0) |
- ((v.z > v.w) ? CLIP_FAR : 0) |
- ((v.x < -v.w) ? CLIP_LEFT : 0) |
- ((v.y < -v.w) ? CLIP_BOTTOM : 0) |
- ((v.z < 0) ? CLIP_NEAR : 0) |
+ return ((v.x > v.w) ? CLIP_RIGHT : 0) |
+ ((v.y > v.w) ? CLIP_TOP : 0) |
+ ((v.z > v.w) ? CLIP_FAR : 0) |
+ ((v.x < -v.w) ? CLIP_LEFT : 0) |
+ ((v.y < -v.w) ? CLIP_BOTTOM : 0) |
+ ((v.z < n * v.w) ? CLIP_NEAR : 0) |
Clipper::CLIP_FINITE; // FIXME: xyz finite
}
@@ -90,8 +91,8 @@
{
int j = i == polygon.n - 1 ? 0 : i + 1;
- float di = V[i]->z;
- float dj = V[j]->z;
+ float di = V[i]->z - n * V[i]->w;
+ float dj = V[j]->z - n * V[j]->w;
if(di >= 0)
{
@@ -100,7 +101,7 @@
if(dj < 0)
{
clipEdge(polygon.B[polygon.b], *V[i], *V[j], di, dj);
- polygon.B[polygon.b].z = 0;
+ polygon.B[polygon.b].z = n * polygon.B[polygon.b].w;
T[t++] = &polygon.B[polygon.b++];
}
}
@@ -109,7 +110,7 @@
if(dj > 0)
{
clipEdge(polygon.B[polygon.b], *V[j], *V[i], dj, di);
- polygon.B[polygon.b].z = 0;
+ polygon.B[polygon.b].z = n * polygon.B[polygon.b].w;
T[t++] = &polygon.B[polygon.b++];
}
}