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);