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 | |