Modify PixelRoutine to implement FunctionT

Bug: b/143479561
Change-Id: Iedd6b62b5b3dcc46a789f15112656cfe191cb4de
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/37708
Tested-by: Antonio Maiorano <amaiorano@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
diff --git a/src/Device/PixelProcessor.cpp b/src/Device/PixelProcessor.cpp
index e20cecd..196f004 100644
--- a/src/Device/PixelProcessor.cpp
+++ b/src/Device/PixelProcessor.cpp
@@ -147,7 +147,7 @@
 	void PixelProcessor::setRoutineCacheSize(int cacheSize)
 	{
 		delete routineCache;
-		routineCache = new RoutineCache<State>(clamp(cacheSize, 1, 65536));
+		routineCache = new RoutineCacheType(clamp(cacheSize, 1, 65536));
 	}
 
 	const PixelProcessor::State PixelProcessor::update(const Context* context) const
@@ -206,7 +206,7 @@
 		return state;
 	}
 
-	std::shared_ptr<Routine> PixelProcessor::routine(const State &state,
+	PixelProcessor::RoutineType PixelProcessor::routine(const State &state,
 		vk::PipelineLayout const *pipelineLayout,
 		SpirvShader const *pixelShader,
 		const vk::DescriptorSet::Bindings &descriptorSets)
diff --git a/src/Device/PixelProcessor.hpp b/src/Device/PixelProcessor.hpp
index da6d1a4..83e1654 100644
--- a/src/Device/PixelProcessor.hpp
+++ b/src/Device/PixelProcessor.hpp
@@ -28,6 +28,8 @@
 	struct DrawData;
 	struct Primitive;
 
+	using RasterizerFunction = FunctionT<void(const Primitive* primitive, int count, int cluster, int clusterCount, DrawData* draw)>;
+
 	class PixelProcessor
 	{
 	public:
@@ -136,7 +138,7 @@
 		};
 
 	public:
-		typedef void (*RoutinePointer)(const Primitive *primitive, int count, int cluster, int clusterCount, DrawData *draw);
+		using RoutineType = RasterizerFunction::RoutineType;
 
 		PixelProcessor();
 
@@ -146,7 +148,7 @@
 
 	protected:
 		const State update(const Context* context) const;
-		std::shared_ptr<Routine> routine(const State &state, vk::PipelineLayout const *pipelineLayout,
+		RoutineType routine(const State &state, vk::PipelineLayout const *pipelineLayout,
 		                                 SpirvShader const *pixelShader, const vk::DescriptorSet::Bindings &descriptorSets);
 		void setRoutineCacheSize(int routineCacheSize);
 
@@ -154,7 +156,8 @@
 		Factor factor;
 
 	private:
-		RoutineCache<State> *routineCache;
+		using RoutineCacheType = RoutineCacheT<State, RasterizerFunction::CFunctionType>;
+		RoutineCacheType *routineCache;
 	};
 }
 
diff --git a/src/Device/Rasterizer.hpp b/src/Device/Rasterizer.hpp
index a206508..4e64e0e 100644
--- a/src/Device/Rasterizer.hpp
+++ b/src/Device/Rasterizer.hpp
@@ -21,7 +21,7 @@
 
 namespace sw
 {
-	class Rasterizer : public Function<Void(Pointer<Byte>, Int, Int, Int, Pointer<Byte>)>
+	class Rasterizer : public RasterizerFunction
 	{
 	public:
 		Rasterizer() : primitive(Arg<0>()), count(Arg<1>()), cluster(Arg<2>()), clusterCount(Arg<3>()), data(Arg<4>()) {}
diff --git a/src/Device/Renderer.cpp b/src/Device/Renderer.cpp
index 1401eab..66428f1 100644
--- a/src/Device/Renderer.cpp
+++ b/src/Device/Renderer.cpp
@@ -270,7 +270,6 @@
 		draw->setupRoutine = setupRoutine;
 		draw->pixelRoutine = pixelRoutine;
 		draw->setupPointer = (SetupProcessor::RoutinePointer)setupRoutine->getEntry();
-		draw->pixelPointer = (PixelProcessor::RoutinePointer)pixelRoutine->getEntry();
 		draw->setupPrimitives = setupPrimitives;
 		draw->setupState = setupState;
 
@@ -434,7 +433,7 @@
 
 		vertexRoutine = {};
 		setupRoutine.reset();
-		pixelRoutine.reset();
+		pixelRoutine = {};
 	}
 
 	void DrawCall::run(const marl::Loan<DrawCall>& draw, marl::Ticket::Queue* tickets, marl::Ticket::Queue clusterQueues[MaxClusterCount])
@@ -543,7 +542,7 @@
 				auto& draw = data->draw;
 				auto& batch = data->batch;
 				MARL_SCOPED_EVENT("PIXEL draw %d, batch %d, cluster %d", draw->id, batch->id, cluster);
-				draw->pixelPointer(&batch->primitives.front(), batch->numVisible, cluster, MaxClusterCount, draw->data);
+				draw->pixelRoutine(&batch->primitives.front(), batch->numVisible, cluster, MaxClusterCount, draw->data);
 				batch->clusterTickets[cluster].done();
 			});
 		}
diff --git a/src/Device/Renderer.hpp b/src/Device/Renderer.hpp
index 5efa221..71cf349 100644
--- a/src/Device/Renderer.hpp
+++ b/src/Device/Renderer.hpp
@@ -156,10 +156,9 @@
 
 		VertexProcessor::RoutineType vertexRoutine;
 		std::shared_ptr<Routine> setupRoutine;
-		std::shared_ptr<Routine> pixelRoutine;
+		PixelProcessor::RoutineType pixelRoutine;
 
 		SetupProcessor::RoutinePointer setupPointer;
-		PixelProcessor::RoutinePointer pixelPointer;
 
 		SetupFunction setupPrimitives;
 		SetupProcessor::State setupState;
@@ -238,7 +237,7 @@
 
 		VertexProcessor::RoutineType vertexRoutine;
 		std::shared_ptr<Routine> setupRoutine;
-		std::shared_ptr<Routine> pixelRoutine;
+		PixelProcessor::RoutineType pixelRoutine;
 
 		vk::Device* device;
 	};