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