• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_Context_hpp
16  #define sw_Context_hpp
17  
18  #include "Sampler.hpp"
19  #include "TextureStage.hpp"
20  #include "Stream.hpp"
21  #include "Point.hpp"
22  #include "Vertex.hpp"
23  #include "Common/Types.hpp"
24  
25  namespace sw
26  {
27  	class Sampler;
28  	class Surface;
29  	class PixelShader;
30  	class VertexShader;
31  	struct Triangle;
32  	struct Primitive;
33  	struct Vertex;
34  	class Resource;
35  
36  	enum In   // Default input stream semantic
37  	{
38  		Position = 0,
39  		BlendWeight = 1,
40  		BlendIndices = 2,
41  		Normal = 3,
42  		PointSize = 4,
43  		Color0 = 5,
44  		Color1 = 6,
45  		TexCoord0 = 7,
46  		TexCoord1 = 8,
47  		TexCoord2 = 9,
48  		TexCoord3 = 10,
49  		TexCoord4 = 11,
50  		TexCoord5 = 12,
51  		TexCoord6 = 13,
52  		TexCoord7 = 14,
53  		PositionT = 15
54  	};
55  
56  	enum DrawType ENUM_UNDERLYING_TYPE_UNSIGNED_INT
57  	{
58  		// These types must stay ordered by vertices per primitive. Also, if these basic types
59  		// are modified, verify the value assigned to task->verticesPerPrimitive in Renderer.cpp
60  		DRAW_POINTLIST     = 0x00,
61  		DRAW_LINELIST      = 0x01,
62  		DRAW_LINESTRIP     = 0x02,
63  		DRAW_LINELOOP      = 0x03,
64  		DRAW_TRIANGLELIST  = 0x04,
65  		DRAW_TRIANGLESTRIP = 0x05,
66  		DRAW_TRIANGLEFAN   = 0x06,
67  		DRAW_QUADLIST      = 0x07,
68  
69  		DRAW_NONINDEXED = 0x00,
70  		DRAW_INDEXED8   = 0x10,
71  		DRAW_INDEXED16  = 0x20,
72  		DRAW_INDEXED32  = 0x30,
73  
74  		DRAW_INDEXEDPOINTLIST8 = DRAW_POINTLIST | DRAW_INDEXED8,
75  		DRAW_INDEXEDLINELIST8  = DRAW_LINELIST  | DRAW_INDEXED8,
76  		DRAW_INDEXEDLINESTRIP8 = DRAW_LINESTRIP | DRAW_INDEXED8,
77  		DRAW_INDEXEDLINELOOP8  = DRAW_LINELOOP  | DRAW_INDEXED8,
78  		DRAW_INDEXEDTRIANGLELIST8  = DRAW_TRIANGLELIST  | DRAW_INDEXED8,
79  		DRAW_INDEXEDTRIANGLESTRIP8 = DRAW_TRIANGLESTRIP | DRAW_INDEXED8,
80  		DRAW_INDEXEDTRIANGLEFAN8   = DRAW_TRIANGLEFAN   | DRAW_INDEXED8,
81  
82  		DRAW_INDEXEDPOINTLIST16 = DRAW_POINTLIST | DRAW_INDEXED16,
83  		DRAW_INDEXEDLINELIST16  = DRAW_LINELIST  | DRAW_INDEXED16,
84  		DRAW_INDEXEDLINESTRIP16 = DRAW_LINESTRIP | DRAW_INDEXED16,
85  		DRAW_INDEXEDLINELOOP16  = DRAW_LINELOOP  | DRAW_INDEXED16,
86  		DRAW_INDEXEDTRIANGLELIST16  = DRAW_TRIANGLELIST  | DRAW_INDEXED16,
87  		DRAW_INDEXEDTRIANGLESTRIP16 = DRAW_TRIANGLESTRIP | DRAW_INDEXED16,
88  		DRAW_INDEXEDTRIANGLEFAN16   = DRAW_TRIANGLEFAN   | DRAW_INDEXED16,
89  
90  		DRAW_INDEXEDPOINTLIST32 = DRAW_POINTLIST | DRAW_INDEXED32,
91  		DRAW_INDEXEDLINELIST32  = DRAW_LINELIST  | DRAW_INDEXED32,
92  		DRAW_INDEXEDLINESTRIP32 = DRAW_LINESTRIP | DRAW_INDEXED32,
93  		DRAW_INDEXEDLINELOOP32  = DRAW_LINELOOP  | DRAW_INDEXED32,
94  		DRAW_INDEXEDTRIANGLELIST32  = DRAW_TRIANGLELIST  | DRAW_INDEXED32,
95  		DRAW_INDEXEDTRIANGLESTRIP32 = DRAW_TRIANGLESTRIP | DRAW_INDEXED32,
96  		DRAW_INDEXEDTRIANGLEFAN32   = DRAW_TRIANGLEFAN   | DRAW_INDEXED32,
97  
98  		DRAW_LAST = DRAW_INDEXEDTRIANGLEFAN32
99  	};
100  
101  	enum FillMode ENUM_UNDERLYING_TYPE_UNSIGNED_INT
102  	{
103  		FILL_SOLID,
104  		FILL_WIREFRAME,
105  		FILL_VERTEX,
106  
107  		FILL_LAST = FILL_VERTEX
108  	};
109  
110  	enum ShadingMode ENUM_UNDERLYING_TYPE_UNSIGNED_INT
111  	{
112  		SHADING_FLAT,
113  		SHADING_GOURAUD,
114  
115  		SHADING_LAST = SHADING_GOURAUD
116  	};
117  
118  	enum DepthCompareMode ENUM_UNDERLYING_TYPE_UNSIGNED_INT
119  	{
120  		DEPTH_ALWAYS,
121  		DEPTH_NEVER,
122  		DEPTH_EQUAL,
123  		DEPTH_NOTEQUAL,
124  		DEPTH_LESS,
125  		DEPTH_LESSEQUAL,
126  		DEPTH_GREATER,
127  		DEPTH_GREATEREQUAL,
128  
129  		DEPTH_LAST = DEPTH_GREATEREQUAL
130  	};
131  
132  	enum StencilCompareMode ENUM_UNDERLYING_TYPE_UNSIGNED_INT
133  	{
134  		STENCIL_ALWAYS,
135  		STENCIL_NEVER,
136  		STENCIL_EQUAL,
137  		STENCIL_NOTEQUAL,
138  		STENCIL_LESS,
139  		STENCIL_LESSEQUAL,
140  		STENCIL_GREATER,
141  		STENCIL_GREATEREQUAL,
142  
143  		STENCIL_LAST = STENCIL_GREATEREQUAL
144  	};
145  
146  	enum StencilOperation ENUM_UNDERLYING_TYPE_UNSIGNED_INT
147  	{
148  		OPERATION_KEEP,
149  		OPERATION_ZERO,
150  		OPERATION_REPLACE,
151  		OPERATION_INCRSAT,
152  		OPERATION_DECRSAT,
153  		OPERATION_INVERT,
154  		OPERATION_INCR,
155  		OPERATION_DECR,
156  
157  		OPERATION_LAST = OPERATION_DECR
158  	};
159  
160  	enum AlphaCompareMode ENUM_UNDERLYING_TYPE_UNSIGNED_INT
161  	{
162  		ALPHA_ALWAYS,
163  		ALPHA_NEVER,
164  		ALPHA_EQUAL,
165  		ALPHA_NOTEQUAL,
166  		ALPHA_LESS,
167  		ALPHA_LESSEQUAL,
168  		ALPHA_GREATER,
169  		ALPHA_GREATEREQUAL,
170  
171  		ALPHA_LAST = ALPHA_GREATEREQUAL
172  	};
173  
174  	enum CullMode ENUM_UNDERLYING_TYPE_UNSIGNED_INT
175  	{
176  		CULL_NONE,
177  		CULL_CLOCKWISE,
178  		CULL_COUNTERCLOCKWISE,
179  
180  		CULL_LAST = CULL_COUNTERCLOCKWISE
181  	};
182  
183  	enum BlendFactor ENUM_UNDERLYING_TYPE_UNSIGNED_INT
184  	{
185  		BLEND_ZERO,
186  		BLEND_ONE,
187  		BLEND_SOURCE,
188  		BLEND_INVSOURCE,
189  		BLEND_DEST,
190  		BLEND_INVDEST,
191  		BLEND_SOURCEALPHA,
192  		BLEND_INVSOURCEALPHA,
193  		BLEND_DESTALPHA,
194  		BLEND_INVDESTALPHA,
195  		BLEND_SRCALPHASAT,
196  		BLEND_CONSTANT,
197  		BLEND_INVCONSTANT,
198  		BLEND_CONSTANTALPHA,
199  		BLEND_INVCONSTANTALPHA,
200  
201  		BLEND_LAST = BLEND_INVCONSTANTALPHA
202  	};
203  
204  	enum BlendOperation ENUM_UNDERLYING_TYPE_UNSIGNED_INT
205  	{
206  		BLENDOP_ADD,
207  		BLENDOP_SUB,
208  		BLENDOP_INVSUB,
209  		BLENDOP_MIN,
210  		BLENDOP_MAX,
211  
212  		BLENDOP_SOURCE,   // Copy source
213  		BLENDOP_DEST,     // Copy dest
214  		BLENDOP_NULL,     // Nullify result
215  
216  		BLENDOP_LAST = BLENDOP_NULL
217  	};
218  
219  	enum LogicalOperation ENUM_UNDERLYING_TYPE_UNSIGNED_INT
220  	{
221  		LOGICALOP_CLEAR,
222  		LOGICALOP_SET,
223  		LOGICALOP_COPY,
224  		LOGICALOP_COPY_INVERTED,
225  		LOGICALOP_NOOP,
226  		LOGICALOP_INVERT,
227  		LOGICALOP_AND,
228  		LOGICALOP_NAND,
229  		LOGICALOP_OR,
230  		LOGICALOP_NOR,
231  		LOGICALOP_XOR,
232  		LOGICALOP_EQUIV,
233  		LOGICALOP_AND_REVERSE,
234  		LOGICALOP_AND_INVERTED,
235  		LOGICALOP_OR_REVERSE,
236  		LOGICALOP_OR_INVERTED,
237  
238  		LOGICALOP_LAST = LOGICALOP_OR_INVERTED
239  	};
240  
241  	enum MaterialSource ENUM_UNDERLYING_TYPE_UNSIGNED_INT
242  	{
243  		MATERIAL_MATERIAL,
244  		MATERIAL_COLOR1,
245  		MATERIAL_COLOR2,
246  
247  		MATERIAL_LAST = MATERIAL_COLOR2
248  	};
249  
250  	enum FogMode ENUM_UNDERLYING_TYPE_UNSIGNED_INT
251  	{
252  		FOG_NONE,
253  		FOG_LINEAR,
254  		FOG_EXP,
255  		FOG_EXP2,
256  
257  		FOG_LAST = FOG_EXP2
258  	};
259  
260  	enum TexGen ENUM_UNDERLYING_TYPE_UNSIGNED_INT
261  	{
262  		TEXGEN_PASSTHRU,
263  		TEXGEN_NORMAL,
264  		TEXGEN_POSITION,
265  		TEXGEN_REFLECTION,
266  		TEXGEN_SPHEREMAP,
267  		TEXGEN_NONE,
268  
269  		TEXGEN_LAST = TEXGEN_NONE
270  	};
271  
272  	enum TransparencyAntialiasing ENUM_UNDERLYING_TYPE_UNSIGNED_INT
273  	{
274  		TRANSPARENCY_NONE,
275  		TRANSPARENCY_ALPHA_TO_COVERAGE,
276  
277  		TRANSPARENCY_LAST = TRANSPARENCY_ALPHA_TO_COVERAGE
278  	};
279  
280  	class Context
281  	{
282  	public:
283  		Context();
284  
285  		~Context();
286  
287  		void *operator new(size_t bytes);
288  		void operator delete(void *pointer, size_t bytes);
289  
290  		bool isDrawPoint(bool fillModeAware = false) const;
291  		bool isDrawLine(bool fillModeAware = false) const;
292  		bool isDrawTriangle(bool fillModeAware = false) const;
293  
294  		void init();
295  
296  		const float &exp2Bias();   // NOTE: Needs address for JIT
297  
298  		const Point &getLightPosition(int light);
299  
300  		void setGlobalMipmapBias(float bias);
301  
302  		// Set fixed-function vertex pipeline states
303  		void setLightingEnable(bool lightingEnable);
304  		void setSpecularEnable(bool specularEnable);
305  		void setLightEnable(int light, bool lightEnable);
306  		void setLightPosition(int light, Point worldLightPosition);
307  
308  		void setColorVertexEnable(bool colorVertexEnable);
309  		void setAmbientMaterialSource(MaterialSource ambientMaterialSource);
310  		void setDiffuseMaterialSource(MaterialSource diffuseMaterialSource);
311  		void setSpecularMaterialSource(MaterialSource specularMaterialSource);
312  		void setEmissiveMaterialSource(MaterialSource emissiveMaterialSource);
313  
314  		void setPointSpriteEnable(bool pointSpriteEnable);
315  		void setPointScaleEnable(bool pointScaleEnable);
316  
317  		// Set fixed-function pixel pipeline states, return true when modified
318  		bool setDepthBufferEnable(bool depthBufferEnable);
319  
320  		bool setAlphaBlendEnable(bool alphaBlendEnable);
321  		bool setSourceBlendFactor(BlendFactor sourceBlendFactor);
322  		bool setDestBlendFactor(BlendFactor destBlendFactor);
323  		bool setBlendOperation(BlendOperation blendOperation);
324  
325  		bool setSeparateAlphaBlendEnable(bool separateAlphaBlendEnable);
326  		bool setSourceBlendFactorAlpha(BlendFactor sourceBlendFactorAlpha);
327  		bool setDestBlendFactorAlpha(BlendFactor destBlendFactorAlpha);
328  		bool setBlendOperationAlpha(BlendOperation blendOperationAlpha);
329  
330  		bool setColorWriteMask(int index, int colorWriteMask);
331  		bool setWriteSRGB(bool sRGB);
332  
333  		bool setColorLogicOpEnabled(bool colorLogicOpEnabled);
334  		bool setLogicalOperation(LogicalOperation logicalOperation);
335  
336  		// Active fixed-function pixel pipeline states
337  		bool fogActive();
338  		bool pointSizeActive();
339  		FogMode pixelFogActive();
340  		bool depthWriteActive();
341  		bool alphaTestActive();
342  		bool depthBufferActive();
343  		bool stencilActive();
344  
345  		bool perspectiveActive();
346  
347  		// Active fixed-function vertex pipeline states
348  		bool vertexLightingActive();
349  		bool texCoordActive(int coordinate, int component);
350  		bool texCoordActive(int coordinate);
351  		bool isProjectionComponent(unsigned int coordinate, int component);
352  		bool vertexSpecularInputActive();
353  		bool vertexSpecularActive();
354  		bool vertexNormalActive();
355  		bool vertexLightActive();
356  		bool vertexLightActive(int i);
357  		MaterialSource vertexDiffuseMaterialSourceActive();
358  		MaterialSource vertexSpecularMaterialSourceActive();
359  		MaterialSource vertexAmbientMaterialSourceActive();
360  		MaterialSource vertexEmissiveMaterialSourceActive();
361  
362  		bool pointSpriteActive();
363  		bool pointScaleActive();
364  
365  		bool alphaBlendActive();
366  		BlendFactor sourceBlendFactor();
367  		BlendFactor destBlendFactor();
368  		BlendOperation blendOperation();
369  
370  		BlendFactor sourceBlendFactorAlpha();
371  		BlendFactor destBlendFactorAlpha();
372  		BlendOperation blendOperationAlpha();
373  
374  		LogicalOperation colorLogicOp();
375  		LogicalOperation indexLogicOp();
376  
377  		bool indexedVertexBlendActive();
378  		int vertexBlendMatrixCountActive();
379  		bool localViewerActive();
380  		bool normalizeNormalsActive();
381  		FogMode vertexFogModeActive();
382  		bool rangeFogActive();
383  
384  		TexGen texGenActive(int stage);
385  		int textureTransformCountActive(int stage);
386  		int texCoordIndexActive(int stage);
387  
388  		// Active context states
389  		bool diffuseUsed();     // Used by pixel processor but not provided by vertex processor
390  		bool diffuseUsed(int component);     // Used by pixel processor but not provided by vertex processor
391  		bool diffuseActive();
392  		bool diffuseActive(int component);
393  		bool specularUsed();
394  		bool specularUsed(int component);
395  		bool specularActive();
396  		bool specularActive(int component);
397  		bool colorActive(int color, int component);
398  		bool textureActive();
399  		bool textureActive(int coordinate);
400  		bool textureActive(int coordinate, int component);
401  
402  		unsigned short pixelShaderModel() const;
403  		unsigned short vertexShaderModel() const;
404  
405  		int getMultiSampleCount() const;
406  		int getSuperSampleCount() const;
407  
408  		DrawType drawType;
409  
410  		bool stencilEnable;
411  		StencilCompareMode stencilCompareMode;
412  		int stencilReference;
413  		int stencilMask;
414  		StencilOperation stencilFailOperation;
415  		StencilOperation stencilPassOperation;
416  		StencilOperation stencilZFailOperation;
417  		int stencilWriteMask;
418  
419  		bool twoSidedStencil;
420  		StencilCompareMode stencilCompareModeCCW;
421  		int stencilReferenceCCW;
422  		int stencilMaskCCW;
423  		StencilOperation stencilFailOperationCCW;
424  		StencilOperation stencilPassOperationCCW;
425  		StencilOperation stencilZFailOperationCCW;
426  		int stencilWriteMaskCCW;
427  
428  		// Pixel processor states
429  		AlphaCompareMode alphaCompareMode;
430  		bool alphaTestEnable;
431  		FillMode fillMode;
432  		ShadingMode shadingMode;
433  
434  		CullMode cullMode;
435  		bool frontFacingCCW;
436  		float alphaReference;
437  
438  		float depthBias;
439  		float slopeDepthBias;
440  
441  		TextureStage textureStage[8];
442  		Sampler sampler[TOTAL_IMAGE_UNITS];
443  
444  		Format renderTargetInternalFormat(int index);
445  		bool colorWriteActive();
446  		int colorWriteActive(int index);
447  		bool colorUsed();
448  
449  		Resource *texture[TOTAL_IMAGE_UNITS];
450  		Stream input[MAX_VERTEX_INPUTS];
451  		Resource *indexBuffer;
452  
453  		bool preTransformed;   // FIXME: Private
454  
455  		float fogStart;
456  		float fogEnd;
457  
458  		bool textureWrapActive;
459  		unsigned char textureWrap[TEXTURE_IMAGE_UNITS];
460  		TexGen texGen[8];
461  		bool localViewer;
462  		bool normalizeNormals;
463  		int textureTransformCount[8];
464  		bool textureTransformProject[8];
465  
466  		Surface *renderTarget[RENDERTARGETS];
467  		unsigned int renderTargetLayer[RENDERTARGETS];
468  		Surface *depthBuffer;
469  		unsigned int depthBufferLayer;
470  		Surface *stencilBuffer;
471  		unsigned int stencilBufferLayer;
472  
473  		// Fog
474  		bool fogEnable;
475  		FogMode pixelFogMode;
476  		FogMode vertexFogMode;
477  		bool wBasedFog;
478  		bool rangeFogEnable;
479  
480  		// Vertex blending
481  		bool indexedVertexBlendEnable;
482  		int vertexBlendMatrixCount;
483  
484  		// Shaders
485  		const PixelShader *pixelShader;
486  		const VertexShader *vertexShader;
487  
488  		// Global mipmap bias
489  		float bias;
490  
491  		// Instancing
492  		int instanceID;
493  
494  		// Fixed-function vertex pipeline state
495  		bool lightingEnable;
496  		bool specularEnable;
497  		bool lightEnable[8];
498  		Point worldLightPosition[8];
499  
500  		MaterialSource ambientMaterialSource;
501  		MaterialSource diffuseMaterialSource;
502  		MaterialSource specularMaterialSource;
503  		MaterialSource emissiveMaterialSource;
504  		bool colorVertexEnable;
505  
506  		bool occlusionEnabled;
507  		bool transformFeedbackQueryEnabled;
508  		uint64_t transformFeedbackEnabled;
509  
510  		// Pixel processor states
511  		bool rasterizerDiscard;
512  		bool depthBufferEnable;
513  		DepthCompareMode depthCompareMode;
514  		bool depthWriteEnable;
515  
516  		bool alphaBlendEnable;
517  		BlendFactor sourceBlendFactorState;
518  		BlendFactor destBlendFactorState;
519  		BlendOperation blendOperationState;
520  
521  		bool separateAlphaBlendEnable;
522  		BlendFactor sourceBlendFactorStateAlpha;
523  		BlendFactor destBlendFactorStateAlpha;
524  		BlendOperation blendOperationStateAlpha;
525  
526  		bool pointSpriteEnable;
527  		bool pointScaleEnable;
528  		float lineWidth;
529  
530  		int colorWriteMask[RENDERTARGETS];   // RGBA
531  		bool writeSRGB;
532  		unsigned int sampleMask;
533  		unsigned int multiSampleMask;
534  
535  		bool colorLogicOpEnabled;
536  		LogicalOperation logicalOperation;
537  	};
538  }
539  
540  #endif   // sw_Context_hpp
541