Modify SetupRoutine to implement FunctionT
Bug: b/143479561
Change-Id: I555db2de99dfc5a139fbdf61c8ac4447e58ffd02
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/37709
Reviewed-by: Alexis Hétu <sugoi@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
Tested-by: Antonio Maiorano <amaiorano@google.com>
diff --git a/src/Device/Renderer.cpp b/src/Device/Renderer.cpp
index 66428f1..42dcfdd 100644
--- a/src/Device/Renderer.cpp
+++ b/src/Device/Renderer.cpp
@@ -269,7 +269,6 @@
draw->vertexRoutine = vertexRoutine;
draw->setupRoutine = setupRoutine;
draw->pixelRoutine = pixelRoutine;
- draw->setupPointer = (SetupProcessor::RoutinePointer)setupRoutine->getEntry();
draw->setupPrimitives = setupPrimitives;
draw->setupState = setupState;
@@ -432,7 +431,7 @@
}
vertexRoutine = {};
- setupRoutine.reset();
+ setupRoutine = {};
pixelRoutine = {};
}
@@ -614,7 +613,6 @@
int DrawCall::setupSolidTriangles(Triangle *triangles, Primitive *primitives, const DrawCall *drawCall, int count)
{
auto &state = drawCall->setupState;
- auto setupRoutine = drawCall->setupPointer;
int ms = state.multiSample;
const DrawData *data = drawCall->data;
@@ -640,7 +638,7 @@
}
}
- if(setupRoutine(primitives, triangles, &polygon, data))
+ if(drawCall->setupRoutine(primitives, triangles, &polygon, data))
{
primitives += ms;
visible++;
@@ -788,7 +786,6 @@
bool DrawCall::setupLine(Primitive &primitive, Triangle &triangle, const DrawCall &draw)
{
- const SetupProcessor::RoutinePointer &setupRoutine = draw.setupPointer;
const DrawData &data = *draw.data;
float lineWidth = data.lineWidth;
@@ -876,7 +873,7 @@
}
}
- return setupRoutine(&primitive, &triangle, &polygon, &data);
+ return draw.setupRoutine(&primitive, &triangle, &polygon, &data);
}
}
else // Diamond test convention
@@ -982,7 +979,7 @@
}
}
- return setupRoutine(&primitive, &triangle, &polygon, &data);
+ return draw.setupRoutine(&primitive, &triangle, &polygon, &data);
}
}
@@ -991,7 +988,6 @@
bool DrawCall::setupPoint(Primitive &primitive, Triangle &triangle, const DrawCall &draw)
{
- const SetupProcessor::RoutinePointer &setupRoutine = draw.setupPointer;
const DrawData &data = *draw.data;
Vertex &v = triangle.v0;
@@ -1048,7 +1044,7 @@
triangle.v1.projected.x += iround(subPixF * 0.5f * pSize);
triangle.v2.projected.y -= iround(subPixF * 0.5f * pSize) * (data.HxF[0] > 0.0f ? 1 : -1); // Both Direct3D and OpenGL expect (0, 0) in the top-left corner
- return setupRoutine(&primitive, &triangle, &polygon, &data);
+ return draw.setupRoutine(&primitive, &triangle, &polygon, &data);
}
return false;
diff --git a/src/Device/Renderer.hpp b/src/Device/Renderer.hpp
index 71cf349..93bd9bf 100644
--- a/src/Device/Renderer.hpp
+++ b/src/Device/Renderer.hpp
@@ -155,11 +155,9 @@
VkLineRasterizationModeEXT lineRasterizationMode;
VertexProcessor::RoutineType vertexRoutine;
- std::shared_ptr<Routine> setupRoutine;
+ SetupProcessor::RoutineType setupRoutine;
PixelProcessor::RoutineType pixelRoutine;
- SetupProcessor::RoutinePointer setupPointer;
-
SetupFunction setupPrimitives;
SetupProcessor::State setupState;
@@ -236,7 +234,7 @@
PixelProcessor::State pixelState;
VertexProcessor::RoutineType vertexRoutine;
- std::shared_ptr<Routine> setupRoutine;
+ SetupProcessor::RoutineType setupRoutine;
PixelProcessor::RoutineType pixelRoutine;
vk::Device* device;
diff --git a/src/Device/SetupProcessor.cpp b/src/Device/SetupProcessor.cpp
index 9984051..61634af 100644
--- a/src/Device/SetupProcessor.cpp
+++ b/src/Device/SetupProcessor.cpp
@@ -94,7 +94,7 @@
return state;
}
- std::shared_ptr<Routine> SetupProcessor::routine(const State &state)
+ SetupProcessor::RoutineType SetupProcessor::routine(const State &state)
{
auto routine = routineCache->query(state);
@@ -114,6 +114,6 @@
void SetupProcessor::setRoutineCacheSize(int cacheSize)
{
delete routineCache;
- routineCache = new RoutineCache<State>(clamp(cacheSize, 1, 65536));
+ routineCache = new RoutineCacheType(clamp(cacheSize, 1, 65536));
}
}
diff --git a/src/Device/SetupProcessor.hpp b/src/Device/SetupProcessor.hpp
index 1c79710..335a6b2 100644
--- a/src/Device/SetupProcessor.hpp
+++ b/src/Device/SetupProcessor.hpp
@@ -30,6 +30,8 @@
struct DrawCall;
struct DrawData;
+ using SetupFunction = FunctionT<int(Primitive* primitive, const Triangle* triangle, const Polygon* polygon, const DrawData* draw)>;
+
class SetupProcessor
{
public:
@@ -60,7 +62,7 @@
uint32_t hash;
};
- typedef bool (*RoutinePointer)(Primitive *primitive, const Triangle *triangle, const Polygon *polygon, const DrawData *draw);
+ using RoutineType = SetupFunction::RoutineType;
SetupProcessor();
@@ -68,12 +70,13 @@
protected:
State update(const sw::Context* context) const;
- std::shared_ptr<Routine> routine(const State &state);
+ RoutineType routine(const State &state);
void setRoutineCacheSize(int cacheSize);
private:
- RoutineCache<State> *routineCache;
+ using RoutineCacheType = RoutineCacheT<State, SetupFunction::CFunctionType>;
+ RoutineCacheType *routineCache;
};
}
diff --git a/src/Pipeline/SetupRoutine.cpp b/src/Pipeline/SetupRoutine.cpp
index 7ebd9ef..3627220 100644
--- a/src/Pipeline/SetupRoutine.cpp
+++ b/src/Pipeline/SetupRoutine.cpp
@@ -25,7 +25,6 @@
{
SetupRoutine::SetupRoutine(const SetupProcessor::State &state) : state(state)
{
- routine = 0;
}
SetupRoutine::~SetupRoutine()
@@ -34,7 +33,7 @@
void SetupRoutine::generate()
{
- Function<Int(Pointer<Byte>, Pointer<Byte>, Pointer<Byte>, Pointer<Byte>)> function;
+ SetupFunction function;
{
Pointer<Byte> primitive(function.Arg<0>());
Pointer<Byte> tri(function.Arg<1>());
@@ -610,7 +609,7 @@
#endif
}
- std::shared_ptr<Routine> SetupRoutine::getRoutine()
+ SetupFunction::RoutineType SetupRoutine::getRoutine()
{
return routine;
}
diff --git a/src/Pipeline/SetupRoutine.hpp b/src/Pipeline/SetupRoutine.hpp
index 469b4de..953bf42 100644
--- a/src/Pipeline/SetupRoutine.hpp
+++ b/src/Pipeline/SetupRoutine.hpp
@@ -30,7 +30,7 @@
virtual ~SetupRoutine();
void generate();
- std::shared_ptr<Routine> getRoutine();
+ SetupFunction::RoutineType getRoutine();
private:
void setupGradient(Pointer<Byte> &primitive, Pointer<Byte> &triangle, Float4 &w012, Float4 (&m)[3], Pointer<Byte> &v0, Pointer<Byte> &v1, Pointer<Byte> &v2, int attribute, int planeEquation, bool flatShading, bool perspective, int component);
@@ -40,7 +40,7 @@
const SetupProcessor::State &state;
- std::shared_ptr<Routine> routine;
+ SetupFunction::RoutineType routine;
};
}