Device: Don't inherit [Vertex,Setup,Pixel]Processor.

Prefer composition over inheritance.
Makes it clear that the virtual destructors on these processors are unnecessary.

Bug: b/126126820
Change-Id: I062c06191ec1cdfb81f2a2773a976bf5c596e658
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/43817
Tested-by: Ben Clayton <bclayton@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Kokoro-Result: kokoro <noreply+kokoro@google.com>
diff --git a/src/Device/PixelProcessor.hpp b/src/Device/PixelProcessor.hpp
index ad6ea69..8416cc0 100644
--- a/src/Device/PixelProcessor.hpp
+++ b/src/Device/PixelProcessor.hpp
@@ -150,7 +150,6 @@
 
 	void setBlendConstant(const float4 &blendConstant);
 
-protected:
 	const State update(const Context *context) const;
 	RoutineType routine(const State &state, vk::PipelineLayout const *pipelineLayout,
 	                    SpirvShader const *pixelShader, const vk::DescriptorSet::Bindings &descriptorSets);
diff --git a/src/Device/Renderer.cpp b/src/Device/Renderer.cpp
index f8fdefa..e32a8a6 100644
--- a/src/Device/Renderer.cpp
+++ b/src/Device/Renderer.cpp
@@ -156,9 +156,9 @@
 Renderer::Renderer(vk::Device *device)
     : device(device)
 {
-	VertexProcessor::setRoutineCacheSize(1024);
-	PixelProcessor::setRoutineCacheSize(1024);
-	SetupProcessor::setRoutineCacheSize(1024);
+	vertexProcessor.setRoutineCacheSize(1024);
+	pixelProcessor.setRoutineCacheSize(1024);
+	setupProcessor.setRoutineCacheSize(1024);
 }
 
 Renderer::~Renderer()
@@ -204,13 +204,13 @@
 	if(update)
 	{
 		MARL_SCOPED_EVENT("update");
-		vertexState = VertexProcessor::update(context);
-		setupState = SetupProcessor::update(context);
-		pixelState = PixelProcessor::update(context);
+		vertexState = vertexProcessor.update(context);
+		setupState = setupProcessor.update(context);
+		pixelState = pixelProcessor.update(context);
 
-		vertexRoutine = VertexProcessor::routine(vertexState, context->pipelineLayout, context->vertexShader, context->descriptorSets);
-		setupRoutine = SetupProcessor::routine(setupState);
-		pixelRoutine = PixelProcessor::routine(pixelState, context->pipelineLayout, context->pixelShader, context->descriptorSets);
+		vertexRoutine = vertexProcessor.routine(vertexState, context->pipelineLayout, context->vertexShader, context->descriptorSets);
+		setupRoutine = setupProcessor.routine(setupState);
+		pixelRoutine = pixelProcessor.routine(pixelState, context->pipelineLayout, context->pixelShader, context->descriptorSets);
 	}
 
 	DrawCall::SetupFunction setupPrimitives = nullptr;
@@ -285,7 +285,7 @@
 
 	data->lineWidth = context->lineWidth;
 
-	data->factor = factor;
+	data->factor = pixelProcessor.factor;
 
 	if(pixelState.alphaToCoverage)
 	{
@@ -1184,4 +1184,9 @@
 	this->scissor = scissor;
 }
 
+void Renderer::setBlendConstant(const float4 &blendConstant)
+{
+	pixelProcessor.setBlendConstant(blendConstant);
+}
+
 }  // namespace sw
diff --git a/src/Device/Renderer.hpp b/src/Device/Renderer.hpp
index 9e01d94..f3ccec5 100644
--- a/src/Device/Renderer.hpp
+++ b/src/Device/Renderer.hpp
@@ -189,7 +189,7 @@
 	static bool setupPoint(Primitive &primitive, Triangle &triangle, const DrawCall &draw);
 };
 
-class alignas(16) Renderer : public VertexProcessor, public PixelProcessor, public SetupProcessor
+class alignas(16) Renderer
 {
 public:
 	Renderer(vk::Device *device);
@@ -209,6 +209,8 @@
 	void setViewport(const VkViewport &viewport);
 	void setScissor(const VkRect2D &scissor);
 
+	void setBlendConstant(const float4 &blendConstant);
+
 	void addQuery(vk::Query *query);
 	void removeQuery(vk::Query *query);
 
@@ -229,6 +231,10 @@
 	marl::Ticket::Queue drawTickets;
 	marl::Ticket::Queue clusterQueues[MaxClusterCount];
 
+	VertexProcessor vertexProcessor;
+	PixelProcessor pixelProcessor;
+	SetupProcessor setupProcessor;
+
 	VertexProcessor::State vertexState;
 	SetupProcessor::State setupState;
 	PixelProcessor::State pixelState;
diff --git a/src/Device/SetupProcessor.hpp b/src/Device/SetupProcessor.hpp
index 9089b79..5224802 100644
--- a/src/Device/SetupProcessor.hpp
+++ b/src/Device/SetupProcessor.hpp
@@ -73,7 +73,6 @@
 
 	~SetupProcessor();
 
-protected:
 	State update(const sw::Context *context) const;
 	RoutineType routine(const State &state);
 
diff --git a/src/Device/VertexProcessor.hpp b/src/Device/VertexProcessor.hpp
index 1c5b28c..5dbb232 100644
--- a/src/Device/VertexProcessor.hpp
+++ b/src/Device/VertexProcessor.hpp
@@ -93,7 +93,6 @@
 
 	virtual ~VertexProcessor();
 
-protected:
 	const State update(const sw::Context *context);
 	RoutineType routine(const State &state, vk::PipelineLayout const *pipelineLayout,
 	                    SpirvShader const *vertexShader, const vk::DescriptorSet::Bindings &descriptorSets);