Remove the Clipper member from the Renderer class Clipper was essentially a static class used from an object. Changed it to actually being fully static and removed the Clipper member from the Renderer class. Change-Id: I146a9966317cfa9f73e679c7b471873cdd030122 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/30951 Tested-by: Alexis Hétu <sugoi@google.com> Reviewed-by: Chris Forbes <chrisforbes@google.com> Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
diff --git a/src/Device/Clipper.cpp b/src/Device/Clipper.cpp index 0bd04ab..43fa72b 100644 --- a/src/Device/Clipper.cpp +++ b/src/Device/Clipper.cpp
@@ -16,46 +16,23 @@ #include "Polygon.hpp" #include "Renderer.hpp" -#include "Vulkan/VkDebug.hpp" -namespace sw +namespace { - unsigned int Clipper::computeClipFlags(const float4 &v) + inline void clipEdge(sw::float4 &Vo, const sw::float4 &Vi, const sw::float4 &Vj, float di, float dj) { - 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) | - Clipper::CLIP_FINITE; // FIXME: xyz finite + float D = 1.0f / (dj - di); + + Vo.x = (dj * Vi.x - di * Vj.x) * D; + Vo.y = (dj * Vi.y - di * Vj.y) * D; + Vo.z = (dj * Vi.z - di * Vj.z) * D; + Vo.w = (dj * Vi.w - di * Vj.w) * D; } - bool Clipper::clip(Polygon &polygon, int clipFlagsOr, const DrawCall &draw) + void clipNear(sw::Polygon &polygon) { - if(clipFlagsOr & CLIP_FRUSTUM) - { - if(clipFlagsOr & CLIP_NEAR) clipNear(polygon); - if(polygon.n >= 3) { - if(clipFlagsOr & CLIP_FAR) clipFar(polygon); - if(polygon.n >= 3) { - if(clipFlagsOr & CLIP_LEFT) clipLeft(polygon); - if(polygon.n >= 3) { - if(clipFlagsOr & CLIP_RIGHT) clipRight(polygon); - if(polygon.n >= 3) { - if(clipFlagsOr & CLIP_TOP) clipTop(polygon); - if(polygon.n >= 3) { - if(clipFlagsOr & CLIP_BOTTOM) clipBottom(polygon); - }}}}} - } - - return polygon.n >= 3; - } - - void Clipper::clipNear(Polygon &polygon) - { - const float4 **V = polygon.P[polygon.i]; - const float4 **T = polygon.P[polygon.i + 1]; + const sw::float4 **V = polygon.P[polygon.i]; + const sw::float4 **T = polygon.P[polygon.i + 1]; int t = 0; @@ -90,10 +67,10 @@ polygon.i += 1; } - void Clipper::clipFar(Polygon &polygon) + void clipFar(sw::Polygon &polygon) { - const float4 **V = polygon.P[polygon.i]; - const float4 **T = polygon.P[polygon.i + 1]; + const sw::float4 **V = polygon.P[polygon.i]; + const sw::float4 **T = polygon.P[polygon.i + 1]; int t = 0; @@ -128,10 +105,10 @@ polygon.i += 1; } - void Clipper::clipLeft(Polygon &polygon) + void clipLeft(sw::Polygon &polygon) { - const float4 **V = polygon.P[polygon.i]; - const float4 **T = polygon.P[polygon.i + 1]; + const sw::float4 **V = polygon.P[polygon.i]; + const sw::float4 **T = polygon.P[polygon.i + 1]; int t = 0; @@ -166,10 +143,10 @@ polygon.i += 1; } - void Clipper::clipRight(Polygon &polygon) + void clipRight(sw::Polygon &polygon) { - const float4 **V = polygon.P[polygon.i]; - const float4 **T = polygon.P[polygon.i + 1]; + const sw::float4 **V = polygon.P[polygon.i]; + const sw::float4 **T = polygon.P[polygon.i + 1]; int t = 0; @@ -204,10 +181,10 @@ polygon.i += 1; } - void Clipper::clipTop(Polygon &polygon) + void clipTop(sw::Polygon &polygon) { - const float4 **V = polygon.P[polygon.i]; - const float4 **T = polygon.P[polygon.i + 1]; + const sw::float4 **V = polygon.P[polygon.i]; + const sw::float4 **T = polygon.P[polygon.i + 1]; int t = 0; @@ -242,10 +219,10 @@ polygon.i += 1; } - void Clipper::clipBottom(Polygon &polygon) + void clipBottom(sw::Polygon &polygon) { - const float4 **V = polygon.P[polygon.i]; - const float4 **T = polygon.P[polygon.i + 1]; + const sw::float4 **V = polygon.P[polygon.i]; + const sw::float4 **T = polygon.P[polygon.i + 1]; int t = 0; @@ -279,14 +256,39 @@ polygon.n = t; polygon.i += 1; } +} - inline void Clipper::clipEdge(float4 &Vo, const float4 &Vi, const float4 &Vj, float di, float dj) const +namespace sw +{ + unsigned int Clipper::ComputeClipFlags(const float4 &v) { - float D = 1.0f / (dj - di); + 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) | + Clipper::CLIP_FINITE; // FIXME: xyz finite + } - Vo.x = (dj * Vi.x - di * Vj.x) * D; - Vo.y = (dj * Vi.y - di * Vj.y) * D; - Vo.z = (dj * Vi.z - di * Vj.z) * D; - Vo.w = (dj * Vi.w - di * Vj.w) * D; + bool Clipper::Clip(Polygon &polygon, int clipFlagsOr, const DrawCall &draw) + { + if(clipFlagsOr & CLIP_FRUSTUM) + { + if(clipFlagsOr & CLIP_NEAR) clipNear(polygon); + if(polygon.n >= 3) { + if(clipFlagsOr & CLIP_FAR) clipFar(polygon); + if(polygon.n >= 3) { + if(clipFlagsOr & CLIP_LEFT) clipLeft(polygon); + if(polygon.n >= 3) { + if(clipFlagsOr & CLIP_RIGHT) clipRight(polygon); + if(polygon.n >= 3) { + if(clipFlagsOr & CLIP_TOP) clipTop(polygon); + if(polygon.n >= 3) { + if(clipFlagsOr & CLIP_BOTTOM) clipBottom(polygon); + }}}}} + } + + return polygon.n >= 3; } }
diff --git a/src/Device/Clipper.hpp b/src/Device/Clipper.hpp index 4eaf940..0d111fd 100644 --- a/src/Device/Clipper.hpp +++ b/src/Device/Clipper.hpp
@@ -15,18 +15,14 @@ #ifndef sw_Clipper_hpp #define sw_Clipper_hpp -#include "Plane.hpp" -#include "System/Types.hpp" - namespace sw { - struct Polygon; struct DrawCall; - struct DrawData; + struct Polygon; + struct float4; - class Clipper + struct Clipper { - public: enum ClipFlags { // Indicates the vertex is outside the respective frustum plane @@ -42,18 +38,8 @@ CLIP_FINITE = 1 << 7, // All position coordinates are finite }; - unsigned int computeClipFlags(const float4 &v); - bool clip(Polygon &polygon, int clipFlagsOr, const DrawCall &draw); - - private: - void clipNear(Polygon &polygon); - void clipFar(Polygon &polygon); - void clipLeft(Polygon &polygon); - void clipRight(Polygon &polygon); - void clipTop(Polygon &polygon); - void clipBottom(Polygon &polygon); - - void clipEdge(float4 &Vo, const float4 &Vi, const float4 &Vj, float di, float dj) const; + static unsigned int ComputeClipFlags(const float4 &v); + static bool Clip(Polygon &polygon, int clipFlagsOr, const DrawCall &draw); }; }
diff --git a/src/Device/Renderer.cpp b/src/Device/Renderer.cpp index 3a5a02f..712f748 100644 --- a/src/Device/Renderer.cpp +++ b/src/Device/Renderer.cpp
@@ -203,8 +203,6 @@ { setGlobalRenderingSettings(conventions, exactColorRounding); - clipper = new Clipper; - #if PERF_HUD resetTimers(); #endif @@ -264,9 +262,6 @@ terminateThreads(); sync->unlock(); - delete clipper; - clipper = nullptr; - delete resumeApp; resumeApp = nullptr; @@ -996,7 +991,7 @@ if(clipFlagsOr != Clipper::CLIP_FINITE) { - if(!clipper->clip(polygon, clipFlagsOr, draw)) + if(!Clipper::Clip(polygon, clipFlagsOr, draw)) { continue; } @@ -1116,19 +1111,19 @@ P[0].x += -dy0w; P[0].y += +dx0h; - C[0] = clipper->computeClipFlags(P[0]); + C[0] = Clipper::ComputeClipFlags(P[0]); P[1].x += -dy1w; P[1].y += +dx1h; - C[1] = clipper->computeClipFlags(P[1]); + C[1] = Clipper::ComputeClipFlags(P[1]); P[2].x += +dy1w; P[2].y += -dx1h; - C[2] = clipper->computeClipFlags(P[2]); + C[2] = Clipper::ComputeClipFlags(P[2]); P[3].x += +dy0w; P[3].y += -dx0h; - C[3] = clipper->computeClipFlags(P[3]); + C[3] = Clipper::ComputeClipFlags(P[3]); if((C[0] & C[1] & C[2] & C[3]) == Clipper::CLIP_FINITE) { @@ -1138,7 +1133,7 @@ if(clipFlagsOr != Clipper::CLIP_FINITE) { - if(!clipper->clip(polygon, clipFlagsOr, draw)) + if(!Clipper::Clip(polygon, clipFlagsOr, draw)) { return false; } @@ -1168,28 +1163,28 @@ float dy1 = lineWidth * 0.5f * P1.w / H; P[0].x += -dx0; - C[0] = clipper->computeClipFlags(P[0]); + C[0] = Clipper::ComputeClipFlags(P[0]); P[1].y += +dy0; - C[1] = clipper->computeClipFlags(P[1]); + C[1] = Clipper::ComputeClipFlags(P[1]); P[2].x += +dx0; - C[2] = clipper->computeClipFlags(P[2]); + C[2] = Clipper::ComputeClipFlags(P[2]); P[3].y += -dy0; - C[3] = clipper->computeClipFlags(P[3]); + C[3] = Clipper::ComputeClipFlags(P[3]); P[4].x += -dx1; - C[4] = clipper->computeClipFlags(P[4]); + C[4] = Clipper::ComputeClipFlags(P[4]); P[5].y += +dy1; - C[5] = clipper->computeClipFlags(P[5]); + C[5] = Clipper::ComputeClipFlags(P[5]); P[6].x += +dx1; - C[6] = clipper->computeClipFlags(P[6]); + C[6] = Clipper::ComputeClipFlags(P[6]); P[7].y += -dy1; - C[7] = clipper->computeClipFlags(P[7]); + C[7] = Clipper::ComputeClipFlags(P[7]); if((C[0] & C[1] & C[2] & C[3] & C[4] & C[5] & C[6] & C[7]) == Clipper::CLIP_FINITE) { @@ -1244,7 +1239,7 @@ if(clipFlagsOr != Clipper::CLIP_FINITE) { - if(!clipper->clip(polygon, clipFlagsOr, draw)) + if(!Clipper::Clip(polygon, clipFlagsOr, draw)) { return false; } @@ -1281,19 +1276,19 @@ P[0].x -= X; P[0].y += Y; - C[0] = clipper->computeClipFlags(P[0]); + C[0] = Clipper::ComputeClipFlags(P[0]); P[1].x += X; P[1].y += Y; - C[1] = clipper->computeClipFlags(P[1]); + C[1] = Clipper::ComputeClipFlags(P[1]); P[2].x += X; P[2].y -= Y; - C[2] = clipper->computeClipFlags(P[2]); + C[2] = Clipper::ComputeClipFlags(P[2]); P[3].x -= X; P[3].y -= Y; - C[3] = clipper->computeClipFlags(P[3]); + C[3] = Clipper::ComputeClipFlags(P[3]); triangle.v1 = triangle.v0; triangle.v2 = triangle.v0; @@ -1309,7 +1304,7 @@ if(clipFlagsOr != Clipper::CLIP_FINITE) { - if(!clipper->clip(polygon, clipFlagsOr, draw)) + if(!Clipper::Clip(polygon, clipFlagsOr, draw)) { return false; }
diff --git a/src/Device/Renderer.hpp b/src/Device/Renderer.hpp index 2c8c3be..8b1a6e0 100644 --- a/src/Device/Renderer.hpp +++ b/src/Device/Renderer.hpp
@@ -36,7 +36,6 @@ namespace sw { - class Clipper; struct DrawCall; class PixelShader; class VertexShader; @@ -248,7 +247,6 @@ void initializeThreads(); void terminateThreads(); - Clipper *clipper; VkViewport viewport; VkRect2D scissor; int clipFlags;