• 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 		float alphaReference;
436 
437 		float depthBias;
438 		float slopeDepthBias;
439 
440 		TextureStage textureStage[8];
441 		Sampler sampler[TOTAL_IMAGE_UNITS];
442 
443 		Format renderTargetInternalFormat(int index);
444 		int colorWriteActive();
445 		int colorWriteActive(int index);
446 		bool colorUsed();
447 
448 		Resource *texture[TOTAL_IMAGE_UNITS];
449 		Stream input[MAX_VERTEX_INPUTS];
450 		Resource *indexBuffer;
451 
452 		bool preTransformed;   // FIXME: Private
453 
454 		float fogStart;
455 		float fogEnd;
456 
457 		void computeIllumination();
458 
459 		bool textureWrapActive;
460 		unsigned char textureWrap[TEXTURE_IMAGE_UNITS];
461 		TexGen texGen[8];
462 		bool localViewer;
463 		bool normalizeNormals;
464 		int textureTransformCount[8];
465 		bool textureTransformProject[8];
466 
467 		Surface *renderTarget[RENDERTARGETS];
468 		unsigned int renderTargetLayer[RENDERTARGETS];
469 		Surface *depthBuffer;
470 		unsigned int depthBufferLayer;
471 		Surface *stencilBuffer;
472 		unsigned int stencilBufferLayer;
473 
474 		// Fog
475 		bool fogEnable;
476 		FogMode pixelFogMode;
477 		FogMode vertexFogMode;
478 		bool wBasedFog;
479 		bool rangeFogEnable;
480 
481 		// Vertex blending
482 		bool indexedVertexBlendEnable;
483 		int vertexBlendMatrixCount;
484 
485 		// Shaders
486 		const PixelShader *pixelShader;
487 		const VertexShader *vertexShader;
488 
489 		// Global mipmap bias
490 		float bias;
491 
492 		// Instancing
493 		int instanceID;
494 
495 		// Fixed-function vertex pipeline state
496 		bool lightingEnable;
497 		bool specularEnable;
498 		bool lightEnable[8];
499 		Point worldLightPosition[8];
500 
501 		MaterialSource ambientMaterialSource;
502 		MaterialSource diffuseMaterialSource;
503 		MaterialSource specularMaterialSource;
504 		MaterialSource emissiveMaterialSource;
505 		bool colorVertexEnable;
506 
507 		bool occlusionEnabled;
508 		bool transformFeedbackQueryEnabled;
509 		uint64_t transformFeedbackEnabled;
510 
511 		// Pixel processor states
512 		bool rasterizerDiscard;
513 		bool depthBufferEnable;
514 		DepthCompareMode depthCompareMode;
515 		bool depthWriteEnable;
516 
517 		bool alphaBlendEnable;
518 		BlendFactor sourceBlendFactorState;
519 		BlendFactor destBlendFactorState;
520 		BlendOperation blendOperationState;
521 
522 		bool separateAlphaBlendEnable;
523 		BlendFactor sourceBlendFactorStateAlpha;
524 		BlendFactor destBlendFactorStateAlpha;
525 		BlendOperation blendOperationStateAlpha;
526 
527 		bool pointSpriteEnable;
528 		bool pointScaleEnable;
529 		float lineWidth;
530 
531 		int colorWriteMask[RENDERTARGETS];   // RGBA
532 		bool writeSRGB;
533 		unsigned int sampleMask;
534 		unsigned int multiSampleMask;
535 
536 		bool colorLogicOpEnabled;
537 		LogicalOperation logicalOperation;
538 	};
539 }
540 
541 #endif   // sw_Context_hpp
542