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