xref: /aosp_15_r20/external/swiftshader/src/Device/Renderer.hpp (revision 03ce13f70fcc45d86ee91b7ee4cab1936a95046e)
1*03ce13f7SAndroid Build Coastguard Worker // Copyright 2016 The SwiftShader Authors. All Rights Reserved.
2*03ce13f7SAndroid Build Coastguard Worker //
3*03ce13f7SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*03ce13f7SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*03ce13f7SAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*03ce13f7SAndroid Build Coastguard Worker //
7*03ce13f7SAndroid Build Coastguard Worker //    http://www.apache.org/licenses/LICENSE-2.0
8*03ce13f7SAndroid Build Coastguard Worker //
9*03ce13f7SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*03ce13f7SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*03ce13f7SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*03ce13f7SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*03ce13f7SAndroid Build Coastguard Worker // limitations under the License.
14*03ce13f7SAndroid Build Coastguard Worker 
15*03ce13f7SAndroid Build Coastguard Worker #ifndef sw_Renderer_hpp
16*03ce13f7SAndroid Build Coastguard Worker #define sw_Renderer_hpp
17*03ce13f7SAndroid Build Coastguard Worker 
18*03ce13f7SAndroid Build Coastguard Worker #include "PixelProcessor.hpp"
19*03ce13f7SAndroid Build Coastguard Worker #include "Primitive.hpp"
20*03ce13f7SAndroid Build Coastguard Worker #include "SetupProcessor.hpp"
21*03ce13f7SAndroid Build Coastguard Worker #include "VertexProcessor.hpp"
22*03ce13f7SAndroid Build Coastguard Worker #include "Vulkan/VkDescriptorSet.hpp"
23*03ce13f7SAndroid Build Coastguard Worker #include "Vulkan/VkPipeline.hpp"
24*03ce13f7SAndroid Build Coastguard Worker 
25*03ce13f7SAndroid Build Coastguard Worker #include "marl/finally.h"
26*03ce13f7SAndroid Build Coastguard Worker #include "marl/pool.h"
27*03ce13f7SAndroid Build Coastguard Worker #include "marl/ticket.h"
28*03ce13f7SAndroid Build Coastguard Worker 
29*03ce13f7SAndroid Build Coastguard Worker #include <atomic>
30*03ce13f7SAndroid Build Coastguard Worker 
31*03ce13f7SAndroid Build Coastguard Worker namespace vk {
32*03ce13f7SAndroid Build Coastguard Worker 
33*03ce13f7SAndroid Build Coastguard Worker class DescriptorSet;
34*03ce13f7SAndroid Build Coastguard Worker class Device;
35*03ce13f7SAndroid Build Coastguard Worker class Query;
36*03ce13f7SAndroid Build Coastguard Worker class PipelineLayout;
37*03ce13f7SAndroid Build Coastguard Worker 
38*03ce13f7SAndroid Build Coastguard Worker }  // namespace vk
39*03ce13f7SAndroid Build Coastguard Worker 
40*03ce13f7SAndroid Build Coastguard Worker namespace sw {
41*03ce13f7SAndroid Build Coastguard Worker 
42*03ce13f7SAndroid Build Coastguard Worker class CountedEvent;
43*03ce13f7SAndroid Build Coastguard Worker struct DrawCall;
44*03ce13f7SAndroid Build Coastguard Worker class PixelShader;
45*03ce13f7SAndroid Build Coastguard Worker class VertexShader;
46*03ce13f7SAndroid Build Coastguard Worker struct Task;
47*03ce13f7SAndroid Build Coastguard Worker class Resource;
48*03ce13f7SAndroid Build Coastguard Worker struct Constants;
49*03ce13f7SAndroid Build Coastguard Worker 
50*03ce13f7SAndroid Build Coastguard Worker static constexpr int MaxBatchSize = 128;
51*03ce13f7SAndroid Build Coastguard Worker static constexpr int MaxBatchCount = 16;
52*03ce13f7SAndroid Build Coastguard Worker static constexpr int MaxClusterCount = 16;
53*03ce13f7SAndroid Build Coastguard Worker static constexpr int MaxDrawCount = 16;
54*03ce13f7SAndroid Build Coastguard Worker 
55*03ce13f7SAndroid Build Coastguard Worker using TriangleBatch = std::array<Triangle, MaxBatchSize>;
56*03ce13f7SAndroid Build Coastguard Worker using PrimitiveBatch = std::array<Primitive, MaxBatchSize>;
57*03ce13f7SAndroid Build Coastguard Worker 
58*03ce13f7SAndroid Build Coastguard Worker struct DrawData
59*03ce13f7SAndroid Build Coastguard Worker {
60*03ce13f7SAndroid Build Coastguard Worker 	vk::DescriptorSet::Bindings descriptorSets = {};
61*03ce13f7SAndroid Build Coastguard Worker 	vk::DescriptorSet::DynamicOffsets descriptorDynamicOffsets = {};
62*03ce13f7SAndroid Build Coastguard Worker 
63*03ce13f7SAndroid Build Coastguard Worker 	const void *input[MAX_INTERFACE_COMPONENTS / 4];
64*03ce13f7SAndroid Build Coastguard Worker 	unsigned int robustnessSize[MAX_INTERFACE_COMPONENTS / 4];
65*03ce13f7SAndroid Build Coastguard Worker 	unsigned int stride[MAX_INTERFACE_COMPONENTS / 4];
66*03ce13f7SAndroid Build Coastguard Worker 	const void *indices;
67*03ce13f7SAndroid Build Coastguard Worker 
68*03ce13f7SAndroid Build Coastguard Worker 	int instanceID;
69*03ce13f7SAndroid Build Coastguard Worker 	int baseVertex;
70*03ce13f7SAndroid Build Coastguard Worker 	float lineWidth;
71*03ce13f7SAndroid Build Coastguard Worker 	int layer;
72*03ce13f7SAndroid Build Coastguard Worker 
73*03ce13f7SAndroid Build Coastguard Worker 	PixelProcessor::Stencil stencil[2];  // clockwise, counterclockwise
74*03ce13f7SAndroid Build Coastguard Worker 	PixelProcessor::Factor factor;
75*03ce13f7SAndroid Build Coastguard Worker 	unsigned int occlusion[MaxClusterCount];  // Number of pixels passing depth test
76*03ce13f7SAndroid Build Coastguard Worker 
77*03ce13f7SAndroid Build Coastguard Worker 	float WxF;
78*03ce13f7SAndroid Build Coastguard Worker 	float HxF;
79*03ce13f7SAndroid Build Coastguard Worker 	float X0xF;
80*03ce13f7SAndroid Build Coastguard Worker 	float Y0xF;
81*03ce13f7SAndroid Build Coastguard Worker 	float halfPixelX;
82*03ce13f7SAndroid Build Coastguard Worker 	float halfPixelY;
83*03ce13f7SAndroid Build Coastguard Worker 	float depthRange;
84*03ce13f7SAndroid Build Coastguard Worker 	float depthNear;
85*03ce13f7SAndroid Build Coastguard Worker 	float minimumResolvableDepthDifference;
86*03ce13f7SAndroid Build Coastguard Worker 	float constantDepthBias;
87*03ce13f7SAndroid Build Coastguard Worker 	float slopeDepthBias;
88*03ce13f7SAndroid Build Coastguard Worker 	float depthBiasClamp;
89*03ce13f7SAndroid Build Coastguard Worker 
90*03ce13f7SAndroid Build Coastguard Worker 	unsigned int *colorBuffer[MAX_COLOR_BUFFERS];
91*03ce13f7SAndroid Build Coastguard Worker 	int colorPitchB[MAX_COLOR_BUFFERS];
92*03ce13f7SAndroid Build Coastguard Worker 	int colorSliceB[MAX_COLOR_BUFFERS];
93*03ce13f7SAndroid Build Coastguard Worker 	float *depthBuffer;
94*03ce13f7SAndroid Build Coastguard Worker 	int depthPitchB;
95*03ce13f7SAndroid Build Coastguard Worker 	int depthSliceB;
96*03ce13f7SAndroid Build Coastguard Worker 	unsigned char *stencilBuffer;
97*03ce13f7SAndroid Build Coastguard Worker 	int stencilPitchB;
98*03ce13f7SAndroid Build Coastguard Worker 	int stencilSliceB;
99*03ce13f7SAndroid Build Coastguard Worker 
100*03ce13f7SAndroid Build Coastguard Worker 	int scissorX0;
101*03ce13f7SAndroid Build Coastguard Worker 	int scissorX1;
102*03ce13f7SAndroid Build Coastguard Worker 	int scissorY0;
103*03ce13f7SAndroid Build Coastguard Worker 	int scissorY1;
104*03ce13f7SAndroid Build Coastguard Worker 
105*03ce13f7SAndroid Build Coastguard Worker 	float a2c0;
106*03ce13f7SAndroid Build Coastguard Worker 	float a2c1;
107*03ce13f7SAndroid Build Coastguard Worker 	float a2c2;
108*03ce13f7SAndroid Build Coastguard Worker 	float a2c3;
109*03ce13f7SAndroid Build Coastguard Worker 
110*03ce13f7SAndroid Build Coastguard Worker 	vk::Pipeline::PushConstantStorage pushConstants;
111*03ce13f7SAndroid Build Coastguard Worker 
112*03ce13f7SAndroid Build Coastguard Worker 	bool rasterizerDiscard;
113*03ce13f7SAndroid Build Coastguard Worker };
114*03ce13f7SAndroid Build Coastguard Worker 
115*03ce13f7SAndroid Build Coastguard Worker struct DrawCall
116*03ce13f7SAndroid Build Coastguard Worker {
117*03ce13f7SAndroid Build Coastguard Worker 	struct BatchData
118*03ce13f7SAndroid Build Coastguard Worker 	{
119*03ce13f7SAndroid Build Coastguard Worker 		using Pool = marl::BoundedPool<BatchData, MaxBatchCount, marl::PoolPolicy::Preserve>;
120*03ce13f7SAndroid Build Coastguard Worker 
121*03ce13f7SAndroid Build Coastguard Worker 		TriangleBatch triangles;
122*03ce13f7SAndroid Build Coastguard Worker 		PrimitiveBatch primitives;
123*03ce13f7SAndroid Build Coastguard Worker 		VertexTask vertexTask;
124*03ce13f7SAndroid Build Coastguard Worker 		unsigned int id;
125*03ce13f7SAndroid Build Coastguard Worker 		unsigned int firstPrimitive;
126*03ce13f7SAndroid Build Coastguard Worker 		unsigned int numPrimitives;
127*03ce13f7SAndroid Build Coastguard Worker 		int numVisible;
128*03ce13f7SAndroid Build Coastguard Worker 		marl::Ticket clusterTickets[MaxClusterCount];
129*03ce13f7SAndroid Build Coastguard Worker 	};
130*03ce13f7SAndroid Build Coastguard Worker 
131*03ce13f7SAndroid Build Coastguard Worker 	using Pool = marl::BoundedPool<DrawCall, MaxDrawCount, marl::PoolPolicy::Preserve>;
132*03ce13f7SAndroid Build Coastguard Worker 	using SetupFunction = int (*)(vk::Device *device, Triangle *triangles, Primitive *primitives, const DrawCall *drawCall, int count);
133*03ce13f7SAndroid Build Coastguard Worker 
134*03ce13f7SAndroid Build Coastguard Worker 	DrawCall();
135*03ce13f7SAndroid Build Coastguard Worker 	~DrawCall();
136*03ce13f7SAndroid Build Coastguard Worker 
137*03ce13f7SAndroid Build Coastguard Worker 	static void run(vk::Device *device, const marl::Loan<DrawCall> &draw, marl::Ticket::Queue *tickets, marl::Ticket::Queue clusterQueues[MaxClusterCount]);
138*03ce13f7SAndroid Build Coastguard Worker 	static void processVertices(vk::Device *device, DrawCall *draw, BatchData *batch);
139*03ce13f7SAndroid Build Coastguard Worker 	static void processPrimitives(vk::Device *device, DrawCall *draw, BatchData *batch);
140*03ce13f7SAndroid Build Coastguard Worker 	static void processPixels(vk::Device *device, const marl::Loan<DrawCall> &draw, const marl::Loan<BatchData> &batch, const std::shared_ptr<marl::Finally> &finally);
141*03ce13f7SAndroid Build Coastguard Worker 	void setup();
142*03ce13f7SAndroid Build Coastguard Worker 	void teardown(vk::Device *device);
143*03ce13f7SAndroid Build Coastguard Worker 
144*03ce13f7SAndroid Build Coastguard Worker 	int id;
145*03ce13f7SAndroid Build Coastguard Worker 
146*03ce13f7SAndroid Build Coastguard Worker 	BatchData::Pool *batchDataPool;
147*03ce13f7SAndroid Build Coastguard Worker 	unsigned int numPrimitives;
148*03ce13f7SAndroid Build Coastguard Worker 	unsigned int numPrimitivesPerBatch;
149*03ce13f7SAndroid Build Coastguard Worker 	unsigned int numBatches;
150*03ce13f7SAndroid Build Coastguard Worker 
151*03ce13f7SAndroid Build Coastguard Worker 	VkPrimitiveTopology topology;
152*03ce13f7SAndroid Build Coastguard Worker 	VkProvokingVertexModeEXT provokingVertexMode;
153*03ce13f7SAndroid Build Coastguard Worker 	VkIndexType indexType;
154*03ce13f7SAndroid Build Coastguard Worker 	VkLineRasterizationModeEXT lineRasterizationMode;
155*03ce13f7SAndroid Build Coastguard Worker 
156*03ce13f7SAndroid Build Coastguard Worker 	bool depthClipEnable;
157*03ce13f7SAndroid Build Coastguard Worker 	bool depthClipNegativeOneToOne;
158*03ce13f7SAndroid Build Coastguard Worker 
159*03ce13f7SAndroid Build Coastguard Worker 	VertexProcessor::RoutineType vertexRoutine;
160*03ce13f7SAndroid Build Coastguard Worker 	SetupProcessor::RoutineType setupRoutine;
161*03ce13f7SAndroid Build Coastguard Worker 	PixelProcessor::RoutineType pixelRoutine;
162*03ce13f7SAndroid Build Coastguard Worker 	bool preRasterizationContainsImageWrite;
163*03ce13f7SAndroid Build Coastguard Worker 	bool fragmentContainsImageWrite;
164*03ce13f7SAndroid Build Coastguard Worker 
165*03ce13f7SAndroid Build Coastguard Worker 	SetupFunction setupPrimitives;
166*03ce13f7SAndroid Build Coastguard Worker 	SetupProcessor::State setupState;
167*03ce13f7SAndroid Build Coastguard Worker 
168*03ce13f7SAndroid Build Coastguard Worker 	vk::ImageView *colorBuffer[MAX_COLOR_BUFFERS];
169*03ce13f7SAndroid Build Coastguard Worker 	vk::ImageView *depthBuffer;
170*03ce13f7SAndroid Build Coastguard Worker 	vk::ImageView *stencilBuffer;
171*03ce13f7SAndroid Build Coastguard Worker 	vk::DescriptorSet::Array descriptorSetObjects;
172*03ce13f7SAndroid Build Coastguard Worker 	const vk::PipelineLayout *preRasterizationPipelineLayout;
173*03ce13f7SAndroid Build Coastguard Worker 	const vk::PipelineLayout *fragmentPipelineLayout;
174*03ce13f7SAndroid Build Coastguard Worker 	sw::CountedEvent *events;
175*03ce13f7SAndroid Build Coastguard Worker 
176*03ce13f7SAndroid Build Coastguard Worker 	vk::Query *occlusionQuery;
177*03ce13f7SAndroid Build Coastguard Worker 
178*03ce13f7SAndroid Build Coastguard Worker 	DrawData *data;
179*03ce13f7SAndroid Build Coastguard Worker 
180*03ce13f7SAndroid Build Coastguard Worker 	static void processPrimitiveVertices(
181*03ce13f7SAndroid Build Coastguard Worker 	    unsigned int triangleIndicesOut[MaxBatchSize + 1][3],
182*03ce13f7SAndroid Build Coastguard Worker 	    const void *primitiveIndices,
183*03ce13f7SAndroid Build Coastguard Worker 	    VkIndexType indexType,
184*03ce13f7SAndroid Build Coastguard Worker 	    unsigned int start,
185*03ce13f7SAndroid Build Coastguard Worker 	    unsigned int triangleCount,
186*03ce13f7SAndroid Build Coastguard Worker 	    VkPrimitiveTopology topology,
187*03ce13f7SAndroid Build Coastguard Worker 	    VkProvokingVertexModeEXT provokingVertexMode);
188*03ce13f7SAndroid Build Coastguard Worker 
189*03ce13f7SAndroid Build Coastguard Worker 	static int setupSolidTriangles(vk::Device *device, Triangle *triangles, Primitive *primitives, const DrawCall *drawCall, int count);
190*03ce13f7SAndroid Build Coastguard Worker 	static int setupWireframeTriangles(vk::Device *device, Triangle *triangles, Primitive *primitives, const DrawCall *drawCall, int count);
191*03ce13f7SAndroid Build Coastguard Worker 	static int setupPointTriangles(vk::Device *device, Triangle *triangles, Primitive *primitives, const DrawCall *drawCall, int count);
192*03ce13f7SAndroid Build Coastguard Worker 	static int setupLines(vk::Device *device, Triangle *triangles, Primitive *primitives, const DrawCall *drawCall, int count);
193*03ce13f7SAndroid Build Coastguard Worker 	static int setupPoints(vk::Device *device, Triangle *triangles, Primitive *primitives, const DrawCall *drawCall, int count);
194*03ce13f7SAndroid Build Coastguard Worker 
195*03ce13f7SAndroid Build Coastguard Worker 	static bool setupLine(vk::Device *device, Primitive &primitive, Triangle &triangle, const DrawCall &draw);
196*03ce13f7SAndroid Build Coastguard Worker 	static bool setupPoint(vk::Device *device, Primitive &primitive, Triangle &triangle, const DrawCall &draw);
197*03ce13f7SAndroid Build Coastguard Worker };
198*03ce13f7SAndroid Build Coastguard Worker 
199*03ce13f7SAndroid Build Coastguard Worker class alignas(16) Renderer
200*03ce13f7SAndroid Build Coastguard Worker {
201*03ce13f7SAndroid Build Coastguard Worker public:
202*03ce13f7SAndroid Build Coastguard Worker 	Renderer(vk::Device *device);
203*03ce13f7SAndroid Build Coastguard Worker 
204*03ce13f7SAndroid Build Coastguard Worker 	virtual ~Renderer();
205*03ce13f7SAndroid Build Coastguard Worker 
206*03ce13f7SAndroid Build Coastguard Worker 	void *operator new(size_t size);
207*03ce13f7SAndroid Build Coastguard Worker 	void operator delete(void *mem);
208*03ce13f7SAndroid Build Coastguard Worker 
hasOcclusionQuery() const209*03ce13f7SAndroid Build Coastguard Worker 	bool hasOcclusionQuery() const { return occlusionQuery != nullptr; }
210*03ce13f7SAndroid Build Coastguard Worker 
211*03ce13f7SAndroid Build Coastguard Worker 	void draw(const vk::GraphicsPipeline *pipeline, const vk::DynamicState &dynamicState, unsigned int count, int baseVertex,
212*03ce13f7SAndroid Build Coastguard Worker 	          CountedEvent *events, int instanceID, int layer, void *indexBuffer, const VkRect2D &renderArea,
213*03ce13f7SAndroid Build Coastguard Worker 	          const vk::Pipeline::PushConstantStorage &pushConstants, bool update = true);
214*03ce13f7SAndroid Build Coastguard Worker 
215*03ce13f7SAndroid Build Coastguard Worker 	void addQuery(vk::Query *query);
216*03ce13f7SAndroid Build Coastguard Worker 	void removeQuery(vk::Query *query);
217*03ce13f7SAndroid Build Coastguard Worker 
218*03ce13f7SAndroid Build Coastguard Worker 	void synchronize();
219*03ce13f7SAndroid Build Coastguard Worker 
220*03ce13f7SAndroid Build Coastguard Worker private:
221*03ce13f7SAndroid Build Coastguard Worker 	DrawCall::Pool drawCallPool;
222*03ce13f7SAndroid Build Coastguard Worker 	DrawCall::BatchData::Pool batchDataPool;
223*03ce13f7SAndroid Build Coastguard Worker 
224*03ce13f7SAndroid Build Coastguard Worker 	std::atomic<int> nextDrawID = { 0 };
225*03ce13f7SAndroid Build Coastguard Worker 
226*03ce13f7SAndroid Build Coastguard Worker 	vk::Query *occlusionQuery = nullptr;
227*03ce13f7SAndroid Build Coastguard Worker 	marl::Ticket::Queue drawTickets;
228*03ce13f7SAndroid Build Coastguard Worker 	marl::Ticket::Queue clusterQueues[MaxClusterCount];
229*03ce13f7SAndroid Build Coastguard Worker 
230*03ce13f7SAndroid Build Coastguard Worker 	VertexProcessor vertexProcessor;
231*03ce13f7SAndroid Build Coastguard Worker 	PixelProcessor pixelProcessor;
232*03ce13f7SAndroid Build Coastguard Worker 	SetupProcessor setupProcessor;
233*03ce13f7SAndroid Build Coastguard Worker 
234*03ce13f7SAndroid Build Coastguard Worker 	VertexProcessor::State vertexState;
235*03ce13f7SAndroid Build Coastguard Worker 	SetupProcessor::State setupState;
236*03ce13f7SAndroid Build Coastguard Worker 	PixelProcessor::State pixelState;
237*03ce13f7SAndroid Build Coastguard Worker 
238*03ce13f7SAndroid Build Coastguard Worker 	VertexProcessor::RoutineType vertexRoutine;
239*03ce13f7SAndroid Build Coastguard Worker 	SetupProcessor::RoutineType setupRoutine;
240*03ce13f7SAndroid Build Coastguard Worker 	PixelProcessor::RoutineType pixelRoutine;
241*03ce13f7SAndroid Build Coastguard Worker 
242*03ce13f7SAndroid Build Coastguard Worker 	vk::Device *device;
243*03ce13f7SAndroid Build Coastguard Worker };
244*03ce13f7SAndroid Build Coastguard Worker 
245*03ce13f7SAndroid Build Coastguard Worker }  // namespace sw
246*03ce13f7SAndroid Build Coastguard Worker 
247*03ce13f7SAndroid Build Coastguard Worker #endif  // sw_Renderer_hpp
248