blob: 367959fe3e61f2f65788df94fb928c12e02f3e5c [file] [log] [blame]
Nicolas Capens68a82382018-10-02 13:16:55 -04001// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15#ifndef sw_Renderer_hpp
16#define sw_Renderer_hpp
17
Ben Claytonfccfc562019-12-17 20:37:31 +000018#include "Blitter.hpp"
Nicolas Capens68a82382018-10-02 13:16:55 -040019#include "PixelProcessor.hpp"
Ben Claytoncde4dd92019-08-27 13:15:50 +010020#include "Primitive.hpp"
Ben Claytonfccfc562019-12-17 20:37:31 +000021#include "SetupProcessor.hpp"
22#include "VertexProcessor.hpp"
Nicolas Capens1d8c8db2018-11-05 16:30:42 -050023#include "Device/Config.hpp"
Ben Clayton225a1302019-04-02 12:28:22 +010024#include "Vulkan/VkDescriptorSet.hpp"
Nicolas Capens68a82382018-10-02 13:16:55 -040025
Ben Claytone693b622019-09-05 12:48:37 +010026#include "marl/finally.h"
Ben Claytonfccfc562019-12-17 20:37:31 +000027#include "marl/pool.h"
Ben Claytone693b622019-09-05 12:48:37 +010028#include "marl/ticket.h"
Ben Claytoncde4dd92019-08-27 13:15:50 +010029
Alexis Hetu463fab92019-06-12 13:24:48 -040030#include <atomic>
Nicolas Capens68a82382018-10-02 13:16:55 -040031#include <list>
Ben Claytone29e7ba2019-05-21 13:19:32 +010032#include <mutex>
33#include <thread>
Nicolas Capens68a82382018-10-02 13:16:55 -040034
Nicolas Capens157ba262019-12-10 17:49:14 -050035namespace vk {
36
37class DescriptorSet;
38class Device;
39class Query;
Alexis Hetu4f438a52020-06-15 16:13:51 -040040class PipelineLayout;
Nicolas Capens157ba262019-12-10 17:49:14 -050041
42} // namespace vk
43
44namespace sw {
45
46struct DrawCall;
47class PixelShader;
48class VertexShader;
49struct Task;
50class TaskEvents;
51class Resource;
52struct Constants;
53
54static constexpr int MaxBatchSize = 128;
55static constexpr int MaxBatchCount = 16;
56static constexpr int MaxClusterCount = 16;
57static constexpr int MaxDrawCount = 16;
58
59using TriangleBatch = std::array<Triangle, MaxBatchSize>;
60using PrimitiveBatch = std::array<Primitive, MaxBatchSize>;
61
62struct DrawData
Chris Forbesc2968062019-03-19 16:48:03 -070063{
Nicolas Capens157ba262019-12-10 17:49:14 -050064 const Constants *constants;
Chris Forbesc2968062019-03-19 16:48:03 -070065
Nicolas Capens157ba262019-12-10 17:49:14 -050066 vk::DescriptorSet::Bindings descriptorSets = {};
67 vk::DescriptorSet::DynamicOffsets descriptorDynamicOffsets = {};
68
69 const void *input[MAX_INTERFACE_COMPONENTS / 4];
70 unsigned int robustnessSize[MAX_INTERFACE_COMPONENTS / 4];
71 unsigned int stride[MAX_INTERFACE_COMPONENTS / 4];
72 const void *indices;
73
74 int instanceID;
75 int baseVertex;
76 float lineWidth;
77 int viewID;
78
Ben Claytonfccfc562019-12-17 20:37:31 +000079 PixelProcessor::Stencil stencil[2]; // clockwise, counterclockwise
Nicolas Capens157ba262019-12-10 17:49:14 -050080 PixelProcessor::Factor factor;
Ben Claytonfccfc562019-12-17 20:37:31 +000081 unsigned int occlusion[MaxClusterCount]; // Number of pixels passing depth test
Nicolas Capens157ba262019-12-10 17:49:14 -050082
83 float4 WxF;
84 float4 HxF;
85 float4 X0xF;
86 float4 Y0xF;
87 float4 halfPixelX;
88 float4 halfPixelY;
89 float viewportHeight;
90 float slopeDepthBias;
91 float depthRange;
92 float depthNear;
93
94 unsigned int *colorBuffer[RENDERTARGETS];
95 int colorPitchB[RENDERTARGETS];
96 int colorSliceB[RENDERTARGETS];
97 float *depthBuffer;
98 int depthPitchB;
99 int depthSliceB;
100 unsigned char *stencilBuffer;
101 int stencilPitchB;
102 int stencilSliceB;
103
104 int scissorX0;
105 int scissorX1;
106 int scissorY0;
107 int scissorY1;
108
109 float4 a2c0;
110 float4 a2c1;
111 float4 a2c2;
112 float4 a2c3;
113
114 PushConstantStorage pushConstants;
115};
116
117struct DrawCall
Nicolas Capens68a82382018-10-02 13:16:55 -0400118{
Nicolas Capens157ba262019-12-10 17:49:14 -0500119 struct BatchData
Nicolas Capens68a82382018-10-02 13:16:55 -0400120 {
Nicolas Capens157ba262019-12-10 17:49:14 -0500121 using Pool = marl::BoundedPool<BatchData, MaxBatchCount, marl::PoolPolicy::Preserve>;
Nicolas Capens68a82382018-10-02 13:16:55 -0400122
Nicolas Capens157ba262019-12-10 17:49:14 -0500123 TriangleBatch triangles;
124 PrimitiveBatch primitives;
125 VertexTask vertexTask;
126 unsigned int id;
127 unsigned int firstPrimitive;
Ben Claytoncde4dd92019-08-27 13:15:50 +0100128 unsigned int numPrimitives;
Nicolas Capens157ba262019-12-10 17:49:14 -0500129 int numVisible;
130 marl::Ticket clusterTickets[MaxClusterCount];
Ben Claytoncde4dd92019-08-27 13:15:50 +0100131 };
132
Nicolas Capens157ba262019-12-10 17:49:14 -0500133 using Pool = marl::BoundedPool<DrawCall, MaxDrawCount, marl::PoolPolicy::Preserve>;
Ben Claytonfccfc562019-12-17 20:37:31 +0000134 using SetupFunction = int (*)(Triangle *triangles, Primitive *primitives, const DrawCall *drawCall, int count);
Nicolas Capens68a82382018-10-02 13:16:55 -0400135
Nicolas Capens157ba262019-12-10 17:49:14 -0500136 DrawCall();
137 ~DrawCall();
Nicolas Capens68a82382018-10-02 13:16:55 -0400138
Ben Claytonfccfc562019-12-17 20:37:31 +0000139 static void run(const marl::Loan<DrawCall> &draw, marl::Ticket::Queue *tickets, marl::Ticket::Queue clusterQueues[MaxClusterCount]);
140 static void processVertices(DrawCall *draw, BatchData *batch);
141 static void processPrimitives(DrawCall *draw, BatchData *batch);
142 static void processPixels(const marl::Loan<DrawCall> &draw, const marl::Loan<BatchData> &batch, const std::shared_ptr<marl::Finally> &finally);
Nicolas Capens157ba262019-12-10 17:49:14 -0500143 void setup();
144 void teardown();
Alexis Hetu30847682019-09-11 17:18:46 -0400145
Nicolas Capens157ba262019-12-10 17:49:14 -0500146 int id;
Nicolas Capens68a82382018-10-02 13:16:55 -0400147
Nicolas Capens157ba262019-12-10 17:49:14 -0500148 BatchData::Pool *batchDataPool;
149 unsigned int numPrimitives;
150 unsigned int numPrimitivesPerBatch;
151 unsigned int numBatches;
Nicolas Capens68a82382018-10-02 13:16:55 -0400152
Nicolas Capens157ba262019-12-10 17:49:14 -0500153 VkPrimitiveTopology topology;
154 VkProvokingVertexModeEXT provokingVertexMode;
155 VkIndexType indexType;
156 VkLineRasterizationModeEXT lineRasterizationMode;
Nicolas Capens68a82382018-10-02 13:16:55 -0400157
Nicolas Capens157ba262019-12-10 17:49:14 -0500158 VertexProcessor::RoutineType vertexRoutine;
159 SetupProcessor::RoutineType setupRoutine;
160 PixelProcessor::RoutineType pixelRoutine;
Alexis Hetu4f438a52020-06-15 16:13:51 -0400161 bool containsImageWrite;
Nicolas Capens68a82382018-10-02 13:16:55 -0400162
Nicolas Capens157ba262019-12-10 17:49:14 -0500163 SetupFunction setupPrimitives;
164 SetupProcessor::State setupState;
Chris Forbese1cf8632019-03-08 18:17:35 -0800165
Nicolas Capens157ba262019-12-10 17:49:14 -0500166 vk::ImageView *renderTarget[RENDERTARGETS];
167 vk::ImageView *depthBuffer;
168 vk::ImageView *stencilBuffer;
Alexis Hetu4f438a52020-06-15 16:13:51 -0400169 vk::DescriptorSet::Array descriptorSetObjects;
170 const vk::PipelineLayout *pipelineLayout;
Nicolas Capens157ba262019-12-10 17:49:14 -0500171 TaskEvents *events;
Nicolas Capens68a82382018-10-02 13:16:55 -0400172
Ben Claytonfccfc562019-12-17 20:37:31 +0000173 vk::Query *occlusionQuery;
Nicolas Capens68a82382018-10-02 13:16:55 -0400174
Nicolas Capens157ba262019-12-10 17:49:14 -0500175 DrawData *data;
Nicolas Capens68a82382018-10-02 13:16:55 -0400176
Nicolas Capens157ba262019-12-10 17:49:14 -0500177 static void processPrimitiveVertices(
Ben Claytonfccfc562019-12-17 20:37:31 +0000178 unsigned int triangleIndicesOut[MaxBatchSize + 1][3],
179 const void *primitiveIndices,
180 VkIndexType indexType,
181 unsigned int start,
182 unsigned int triangleCount,
183 VkPrimitiveTopology topology,
184 VkProvokingVertexModeEXT provokingVertexMode);
Nicolas Capens68a82382018-10-02 13:16:55 -0400185
Ben Claytonfccfc562019-12-17 20:37:31 +0000186 static int setupSolidTriangles(Triangle *triangles, Primitive *primitives, const DrawCall *drawCall, int count);
187 static int setupWireframeTriangles(Triangle *triangles, Primitive *primitives, const DrawCall *drawCall, int count);
188 static int setupPointTriangles(Triangle *triangles, Primitive *primitives, const DrawCall *drawCall, int count);
Nicolas Capens157ba262019-12-10 17:49:14 -0500189 static int setupLines(Triangle *triangles, Primitive *primitives, const DrawCall *drawCall, int count);
190 static int setupPoints(Triangle *triangles, Primitive *primitives, const DrawCall *drawCall, int count);
Nicolas Capens68a82382018-10-02 13:16:55 -0400191
Nicolas Capens157ba262019-12-10 17:49:14 -0500192 static bool setupLine(Primitive &primitive, Triangle &triangle, const DrawCall &draw);
193 static bool setupPoint(Primitive &primitive, Triangle &triangle, const DrawCall &draw);
194};
Nicolas Capens68a82382018-10-02 13:16:55 -0400195
Ben Claytonbc2af942020-04-14 09:22:14 +0100196class alignas(16) Renderer
Nicolas Capens157ba262019-12-10 17:49:14 -0500197{
198public:
Ben Claytonfccfc562019-12-17 20:37:31 +0000199 Renderer(vk::Device *device);
Alexis Hetu35755502019-07-22 13:51:49 -0400200
Nicolas Capens157ba262019-12-10 17:49:14 -0500201 virtual ~Renderer();
Nicolas Capens68a82382018-10-02 13:16:55 -0400202
Ben Claytonfccfc562019-12-17 20:37:31 +0000203 void *operator new(size_t size);
204 void operator delete(void *mem);
Nicolas Capens157ba262019-12-10 17:49:14 -0500205
206 bool hasOcclusionQuery() const { return occlusionQuery != nullptr; }
207
Ben Claytonfccfc562019-12-17 20:37:31 +0000208 void draw(const sw::Context *context, VkIndexType indexType, unsigned int count, int baseVertex,
209 TaskEvents *events, int instanceID, int viewID, void *indexBuffer, const VkExtent3D &framebufferExtent,
210 PushConstantStorage const &pushConstants, bool update = true);
Nicolas Capens157ba262019-12-10 17:49:14 -0500211
212 // Viewport & Clipper
213 void setViewport(const VkViewport &viewport);
214 void setScissor(const VkRect2D &scissor);
215
Ben Claytonbc2af942020-04-14 09:22:14 +0100216 void setBlendConstant(const float4 &blendConstant);
217
Nicolas Capens157ba262019-12-10 17:49:14 -0500218 void addQuery(vk::Query *query);
219 void removeQuery(vk::Query *query);
220
Ben Claytonfccfc562019-12-17 20:37:31 +0000221 void advanceInstanceAttributes(Stream *inputs);
Nicolas Capens157ba262019-12-10 17:49:14 -0500222
223 void synchronize();
224
225private:
226 VkViewport viewport;
227 VkRect2D scissor;
228
229 DrawCall::Pool drawCallPool;
230 DrawCall::BatchData::Pool batchDataPool;
231
Ben Claytonfccfc562019-12-17 20:37:31 +0000232 std::atomic<int> nextDrawID = { 0 };
Nicolas Capens157ba262019-12-10 17:49:14 -0500233
234 vk::Query *occlusionQuery = nullptr;
235 marl::Ticket::Queue drawTickets;
236 marl::Ticket::Queue clusterQueues[MaxClusterCount];
237
Ben Claytonbc2af942020-04-14 09:22:14 +0100238 VertexProcessor vertexProcessor;
239 PixelProcessor pixelProcessor;
240 SetupProcessor setupProcessor;
241
Nicolas Capens157ba262019-12-10 17:49:14 -0500242 VertexProcessor::State vertexState;
243 SetupProcessor::State setupState;
244 PixelProcessor::State pixelState;
245
246 VertexProcessor::RoutineType vertexRoutine;
247 SetupProcessor::RoutineType setupRoutine;
248 PixelProcessor::RoutineType pixelRoutine;
249
Ben Claytonfccfc562019-12-17 20:37:31 +0000250 vk::Device *device;
Nicolas Capens157ba262019-12-10 17:49:14 -0500251};
252
253} // namespace sw
Nicolas Capens68a82382018-10-02 13:16:55 -0400254
Ben Claytonfccfc562019-12-17 20:37:31 +0000255#endif // sw_Renderer_hpp