Home | History | Annotate | Download | only in Renderer
      1 // 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 
     18 #include "VertexProcessor.hpp"
     19 #include "PixelProcessor.hpp"
     20 #include "SetupProcessor.hpp"
     21 #include "Plane.hpp"
     22 #include "Blitter.hpp"
     23 #include "Common/MutexLock.hpp"
     24 #include "Common/Thread.hpp"
     25 #include "Main/Config.hpp"
     26 
     27 #include <list>
     28 
     29 namespace sw
     30 {
     31 	class Clipper;
     32 	class PixelShader;
     33 	class VertexShader;
     34 	class SwiftConfig;
     35 	struct Task;
     36 	class Resource;
     37 	class Renderer;
     38 	struct Constants;
     39 
     40 	extern int batchSize;
     41 	extern int threadCount;
     42 	extern int unitCount;
     43 	extern int clusterCount;
     44 
     45 	enum TranscendentalPrecision
     46 	{
     47 		APPROXIMATE,
     48 		PARTIAL,	// 2^-10
     49 		ACCURATE,
     50 		WHQL,		// 2^-21
     51 		IEEE		// 2^-23
     52 	};
     53 
     54 	extern TranscendentalPrecision logPrecision;
     55 	extern TranscendentalPrecision expPrecision;
     56 	extern TranscendentalPrecision rcpPrecision;
     57 	extern TranscendentalPrecision rsqPrecision;
     58 	extern bool perspectiveCorrection;
     59 
     60 	struct Conventions
     61 	{
     62 		bool halfIntegerCoordinates;
     63 		bool symmetricNormalizedDepth;
     64 		bool booleanFaceRegister;
     65 		bool fullPixelPositionRegister;
     66 		bool leadingVertexFirst;
     67 		bool secondaryColor;
     68 		bool colorsDefaultToZero;
     69 	};
     70 
     71 	static const Conventions OpenGL =
     72 	{
     73 		true,    // halfIntegerCoordinates
     74 		true,    // symmetricNormalizedDepth
     75 		true,    // booleanFaceRegister
     76 		true,    // fullPixelPositionRegister
     77 		false,   // leadingVertexFirst
     78 		false,   // secondaryColor
     79 		true,    // colorsDefaultToZero
     80 	};
     81 
     82 	static const Conventions Direct3D =
     83 	{
     84 		false,   // halfIntegerCoordinates
     85 		false,   // symmetricNormalizedDepth
     86 		false,   // booleanFaceRegister
     87 		false,   // fullPixelPositionRegister
     88 		true,    // leadingVertexFirst
     89 		true,    // secondardyColor
     90 		false,   // colorsDefaultToZero
     91 	};
     92 
     93 	struct Query
     94 	{
     95 		enum Type { FRAGMENTS_PASSED, TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN };
     96 
     97 		Query(Type type) : building(false), reference(0), data(0), type(type)
     98 		{
     99 		}
    100 
    101 		void begin()
    102 		{
    103 			building = true;
    104 			data = 0;
    105 		}
    106 
    107 		void end()
    108 		{
    109 			building = false;
    110 		}
    111 
    112 		bool building;
    113 		volatile int reference;
    114 		volatile unsigned int data;
    115 
    116 		const Type type;
    117 	};
    118 
    119 	struct DrawData
    120 	{
    121 		const Constants *constants;
    122 
    123 		const void *input[MAX_VERTEX_INPUTS];
    124 		unsigned int stride[MAX_VERTEX_INPUTS];
    125 		Texture mipmap[TOTAL_IMAGE_UNITS];
    126 		const void *indices;
    127 
    128 		struct VS
    129 		{
    130 			float4 c[VERTEX_UNIFORM_VECTORS + 1];   // One extra for indices out of range, c[VERTEX_UNIFORM_VECTORS] = {0, 0, 0, 0}
    131 			byte* u[MAX_UNIFORM_BUFFER_BINDINGS];
    132 			byte* t[MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS];
    133 			unsigned int reg[MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS]; // Offset used when reading from registers, in components
    134 			unsigned int row[MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS]; // Number of rows to read
    135 			unsigned int col[MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS]; // Number of columns to read
    136 			unsigned int str[MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS]; // Number of components between each varying in output buffer
    137 			int4 i[16];
    138 			bool b[16];
    139 		};
    140 
    141 		struct PS
    142 		{
    143 			word4 cW[8][4];
    144 			float4 c[FRAGMENT_UNIFORM_VECTORS];
    145 			byte* u[MAX_UNIFORM_BUFFER_BINDINGS];
    146 			int4 i[16];
    147 			bool b[16];
    148 		};
    149 
    150 		union
    151 		{
    152 			VS vs;
    153 			VertexProcessor::FixedFunction ff;
    154 		};
    155 
    156 		PS ps;
    157 
    158 		int instanceID;
    159 
    160 		VertexProcessor::PointSprite point;
    161 		float lineWidth;
    162 
    163 		PixelProcessor::Stencil stencil[2];   // clockwise, counterclockwise
    164 		PixelProcessor::Stencil stencilCCW;
    165 		PixelProcessor::Fog fog;
    166 		PixelProcessor::Factor factor;
    167 		unsigned int occlusion[16];   // Number of pixels passing depth test
    168 
    169 		#if PERF_PROFILE
    170 			int64_t cycles[PERF_TIMERS][16];
    171 		#endif
    172 
    173 		TextureStage::Uniforms textureStage[8];
    174 
    175 		float4 Wx16;
    176 		float4 Hx16;
    177 		float4 X0x16;
    178 		float4 Y0x16;
    179 		float4 XXXX;
    180 		float4 YYYY;
    181 		float4 halfPixelX;
    182 		float4 halfPixelY;
    183 		float viewportHeight;
    184 		float slopeDepthBias;
    185 		float depthRange;
    186 		float depthNear;
    187 		Plane clipPlane[6];
    188 
    189 		unsigned int *colorBuffer[RENDERTARGETS];
    190 		int colorPitchB[RENDERTARGETS];
    191 		int colorSliceB[RENDERTARGETS];
    192 		float *depthBuffer;
    193 		int depthPitchB;
    194 		int depthSliceB;
    195 		unsigned char *stencilBuffer;
    196 		int stencilPitchB;
    197 		int stencilSliceB;
    198 
    199 		int scissorX0;
    200 		int scissorX1;
    201 		int scissorY0;
    202 		int scissorY1;
    203 
    204 		float4 a2c0;
    205 		float4 a2c1;
    206 		float4 a2c2;
    207 		float4 a2c3;
    208 	};
    209 
    210 	struct DrawCall
    211 	{
    212 		DrawCall();
    213 
    214 		~DrawCall();
    215 
    216 		DrawType drawType;
    217 		int batchSize;
    218 
    219 		Routine *vertexRoutine;
    220 		Routine *setupRoutine;
    221 		Routine *pixelRoutine;
    222 
    223 		VertexProcessor::RoutinePointer vertexPointer;
    224 		SetupProcessor::RoutinePointer setupPointer;
    225 		PixelProcessor::RoutinePointer pixelPointer;
    226 
    227 		int (Renderer::*setupPrimitives)(int batch, int count);
    228 		SetupProcessor::State setupState;
    229 
    230 		Resource *vertexStream[MAX_VERTEX_INPUTS];
    231 		Resource *indexBuffer;
    232 		Surface *renderTarget[RENDERTARGETS];
    233 		Surface *depthBuffer;
    234 		Surface *stencilBuffer;
    235 		Resource *texture[TOTAL_IMAGE_UNITS];
    236 		Resource* pUniformBuffers[MAX_UNIFORM_BUFFER_BINDINGS];
    237 		Resource* vUniformBuffers[MAX_UNIFORM_BUFFER_BINDINGS];
    238 		Resource* transformFeedbackBuffers[MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS];
    239 
    240 		unsigned int vsDirtyConstF;
    241 		unsigned int vsDirtyConstI;
    242 		unsigned int vsDirtyConstB;
    243 
    244 		unsigned int psDirtyConstF;
    245 		unsigned int psDirtyConstI;
    246 		unsigned int psDirtyConstB;
    247 
    248 		std::list<Query*> *queries;
    249 
    250 		int clipFlags;
    251 
    252 		volatile int primitive;    // Current primitive to enter pipeline
    253 		volatile int count;        // Number of primitives to render
    254 		volatile int references;   // Remaining references to this draw call, 0 when done drawing, -1 when resources unlocked and slot is free
    255 
    256 		DrawData *data;
    257 	};
    258 
    259 	struct Viewport
    260 	{
    261 		float x0;
    262 		float y0;
    263 		float width;
    264 		float height;
    265 		float minZ;
    266 		float maxZ;
    267 	};
    268 
    269 	class Renderer : public VertexProcessor, public PixelProcessor, public SetupProcessor
    270 	{
    271 		struct Task
    272 		{
    273 			enum Type
    274 			{
    275 				PRIMITIVES,
    276 				PIXELS,
    277 
    278 				RESUME,
    279 				SUSPEND
    280 			};
    281 
    282 			volatile Type type;
    283 			volatile int primitiveUnit;
    284 			volatile int pixelCluster;
    285 		};
    286 
    287 		struct PrimitiveProgress
    288 		{
    289 			void init()
    290 			{
    291 				drawCall = 0;
    292 				firstPrimitive = 0;
    293 				primitiveCount = 0;
    294 				visible = 0;
    295 				references = 0;
    296 			}
    297 
    298 			volatile int drawCall;
    299 			volatile int firstPrimitive;
    300 			volatile int primitiveCount;
    301 			volatile int visible;
    302 			volatile int references;
    303 		};
    304 
    305 		struct PixelProgress
    306 		{
    307 			void init()
    308 			{
    309 				drawCall = 0;
    310 				processedPrimitives = 0;
    311 				executing = false;
    312 			}
    313 
    314 			volatile int drawCall;
    315 			volatile int processedPrimitives;
    316 			volatile bool executing;
    317 		};
    318 
    319 	public:
    320 		Renderer(Context *context, Conventions conventions, bool exactColorRounding);
    321 
    322 		virtual ~Renderer();
    323 
    324 		void *operator new(size_t size);
    325 		void operator delete(void * mem);
    326 
    327 		void draw(DrawType drawType, unsigned int indexOffset, unsigned int count, bool update = true);
    328 
    329 		void clear(void *value, Format format, Surface *dest, const Rect &rect, unsigned int rgbaMask);
    330 		void blit(Surface *source, const SliceRect &sRect, Surface *dest, const SliceRect &dRect, bool filter, bool isStencil = false);
    331 		void blit3D(Surface *source, Surface *dest);
    332 
    333 		void setIndexBuffer(Resource *indexBuffer);
    334 
    335 		void setMultiSampleMask(unsigned int mask);
    336 		void setTransparencyAntialiasing(TransparencyAntialiasing transparencyAntialiasing);
    337 
    338 		void setTextureResource(unsigned int sampler, Resource *resource);
    339 		void setTextureLevel(unsigned int sampler, unsigned int face, unsigned int level, Surface *surface, TextureType type);
    340 
    341 		void setTextureFilter(SamplerType type, int sampler, FilterType textureFilter);
    342 		void setMipmapFilter(SamplerType type, int sampler, MipmapType mipmapFilter);
    343 		void setGatherEnable(SamplerType type, int sampler, bool enable);
    344 		void setAddressingModeU(SamplerType type, int sampler, AddressingMode addressingMode);
    345 		void setAddressingModeV(SamplerType type, int sampler, AddressingMode addressingMode);
    346 		void setAddressingModeW(SamplerType type, int sampler, AddressingMode addressingMode);
    347 		void setReadSRGB(SamplerType type, int sampler, bool sRGB);
    348 		void setMipmapLOD(SamplerType type, int sampler, float bias);
    349 		void setBorderColor(SamplerType type, int sampler, const Color<float> &borderColor);
    350 		void setMaxAnisotropy(SamplerType type, int sampler, float maxAnisotropy);
    351 		void setHighPrecisionFiltering(SamplerType type, int sampler, bool highPrecisionFiltering);
    352 		void setSwizzleR(SamplerType type, int sampler, SwizzleType swizzleR);
    353 		void setSwizzleG(SamplerType type, int sampler, SwizzleType swizzleG);
    354 		void setSwizzleB(SamplerType type, int sampler, SwizzleType swizzleB);
    355 		void setSwizzleA(SamplerType type, int sampler, SwizzleType swizzleA);
    356 		void setBaseLevel(SamplerType type, int sampler, int baseLevel);
    357 		void setMaxLevel(SamplerType type, int sampler, int maxLevel);
    358 		void setMinLod(SamplerType type, int sampler, float minLod);
    359 		void setMaxLod(SamplerType type, int sampler, float maxLod);
    360 
    361 		void setPointSpriteEnable(bool pointSpriteEnable);
    362 		void setPointScaleEnable(bool pointScaleEnable);
    363 		void setLineWidth(float width);
    364 
    365 		void setDepthBias(float bias);
    366 		void setSlopeDepthBias(float slopeBias);
    367 
    368 		void setRasterizerDiscard(bool rasterizerDiscard);
    369 
    370 		// Programmable pipelines
    371 		void setPixelShader(const PixelShader *shader);
    372 		void setVertexShader(const VertexShader *shader);
    373 
    374 		void setPixelShaderConstantF(unsigned int index, const float value[4], unsigned int count = 1);
    375 		void setPixelShaderConstantI(unsigned int index, const int value[4], unsigned int count = 1);
    376 		void setPixelShaderConstantB(unsigned int index, const int *boolean, unsigned int count = 1);
    377 
    378 		void setVertexShaderConstantF(unsigned int index, const float value[4], unsigned int count = 1);
    379 		void setVertexShaderConstantI(unsigned int index, const int value[4], unsigned int count = 1);
    380 		void setVertexShaderConstantB(unsigned int index, const int *boolean, unsigned int count = 1);
    381 
    382 		// Viewport & Clipper
    383 		void setViewport(const Viewport &viewport);
    384 		void setScissor(const Rect &scissor);
    385 		void setClipFlags(int flags);
    386 		void setClipPlane(unsigned int index, const float plane[4]);
    387 
    388 		// Partial transform
    389 		void setModelMatrix(const Matrix &M, int i = 0);
    390 		void setViewMatrix(const Matrix &V);
    391 		void setBaseMatrix(const Matrix &B);
    392 		void setProjectionMatrix(const Matrix &P);
    393 
    394 		void addQuery(Query *query);
    395 		void removeQuery(Query *query);
    396 
    397 		void synchronize();
    398 
    399 		#if PERF_HUD
    400 			// Performance timers
    401 			int getThreadCount();
    402 			int64_t getVertexTime(int thread);
    403 			int64_t getSetupTime(int thread);
    404 			int64_t getPixelTime(int thread);
    405 			void resetTimers();
    406 		#endif
    407 
    408 	private:
    409 		static void threadFunction(void *parameters);
    410 		void threadLoop(int threadIndex);
    411 		void taskLoop(int threadIndex);
    412 		void findAvailableTasks();
    413 		void scheduleTask(int threadIndex);
    414 		void executeTask(int threadIndex);
    415 		void finishRendering(Task &pixelTask);
    416 
    417 		void processPrimitiveVertices(int unit, unsigned int start, unsigned int count, unsigned int loop, int thread);
    418 
    419 		int setupSolidTriangles(int batch, int count);
    420 		int setupWireframeTriangle(int batch, int count);
    421 		int setupVertexTriangle(int batch, int count);
    422 		int setupLines(int batch, int count);
    423 		int setupPoints(int batch, int count);
    424 
    425 		bool setupLine(Primitive &primitive, Triangle &triangle, const DrawCall &draw);
    426 		bool setupPoint(Primitive &primitive, Triangle &triangle, const DrawCall &draw);
    427 
    428 		bool isReadWriteTexture(int sampler);
    429 		void updateClipper();
    430 		void updateConfiguration(bool initialUpdate = false);
    431 		void initializeThreads();
    432 		void terminateThreads();
    433 
    434 		void loadConstants(const VertexShader *vertexShader);
    435 		void loadConstants(const PixelShader *pixelShader);
    436 
    437 		Context *context;
    438 		Clipper *clipper;
    439 		Blitter *blitter;
    440 		Viewport viewport;
    441 		Rect scissor;
    442 		int clipFlags;
    443 
    444 		Triangle *triangleBatch[16];
    445 		Primitive *primitiveBatch[16];
    446 
    447 		// User-defined clipping planes
    448 		Plane userPlane[MAX_CLIP_PLANES];
    449 		Plane clipPlane[MAX_CLIP_PLANES];   // Tranformed to clip space
    450 		bool updateClipPlanes;
    451 
    452 		volatile bool exitThreads;
    453 		volatile int threadsAwake;
    454 		Thread *worker[16];
    455 		Event *resume[16];         // Events for resuming threads
    456 		Event *suspend[16];        // Events for suspending threads
    457 		Event *resumeApp;          // Event for resuming the application thread
    458 
    459 		PrimitiveProgress primitiveProgress[16];
    460 		PixelProgress pixelProgress[16];
    461 		Task task[16];   // Current tasks for threads
    462 
    463 		enum {DRAW_COUNT = 16};   // Number of draw calls buffered
    464 		DrawCall *drawCall[DRAW_COUNT];
    465 		DrawCall *drawList[DRAW_COUNT];
    466 
    467 		volatile int currentDraw;
    468 		volatile int nextDraw;
    469 
    470 		Task taskQueue[32];
    471 		unsigned int qHead;
    472 		unsigned int qSize;
    473 
    474 		MutexLock schedulerMutex;
    475 
    476 		#if PERF_HUD
    477 			int64_t vertexTime[16];
    478 			int64_t setupTime[16];
    479 			int64_t pixelTime[16];
    480 		#endif
    481 
    482 		VertexTask *vertexTask[16];
    483 
    484 		SwiftConfig *swiftConfig;
    485 
    486 		std::list<Query*> queries;
    487 		Resource *sync;
    488 
    489 		VertexProcessor::State vertexState;
    490 		SetupProcessor::State setupState;
    491 		PixelProcessor::State pixelState;
    492 
    493 		Routine *vertexRoutine;
    494 		Routine *setupRoutine;
    495 		Routine *pixelRoutine;
    496 	};
    497 }
    498 
    499 #endif   // sw_Renderer_hpp
    500