// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
|
//
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
// you may not use this file except in compliance with the License.
|
// You may obtain a copy of the License at
|
//
|
// http://www.apache.org/licenses/LICENSE-2.0
|
//
|
// Unless required by applicable law or agreed to in writing, software
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
// See the License for the specific language governing permissions and
|
// limitations under the License.
|
|
#ifndef sw_Context_hpp
|
#define sw_Context_hpp
|
|
#include "Sampler.hpp"
|
#include "TextureStage.hpp"
|
#include "Stream.hpp"
|
#include "Point.hpp"
|
#include "Vertex.hpp"
|
#include "Common/Types.hpp"
|
|
namespace sw
|
{
|
class Sampler;
|
class Surface;
|
class PixelShader;
|
class VertexShader;
|
struct Triangle;
|
struct Primitive;
|
struct Vertex;
|
class Resource;
|
|
enum In // Default input stream semantic
|
{
|
Position = 0,
|
BlendWeight = 1,
|
BlendIndices = 2,
|
Normal = 3,
|
PointSize = 4,
|
Color0 = 5,
|
Color1 = 6,
|
TexCoord0 = 7,
|
TexCoord1 = 8,
|
TexCoord2 = 9,
|
TexCoord3 = 10,
|
TexCoord4 = 11,
|
TexCoord5 = 12,
|
TexCoord6 = 13,
|
TexCoord7 = 14,
|
PositionT = 15
|
};
|
|
enum DrawType ENUM_UNDERLYING_TYPE_UNSIGNED_INT
|
{
|
// These types must stay ordered by vertices per primitive. Also, if these basic types
|
// are modified, verify the value assigned to task->verticesPerPrimitive in Renderer.cpp
|
DRAW_POINTLIST = 0x00,
|
DRAW_LINELIST = 0x01,
|
DRAW_LINESTRIP = 0x02,
|
DRAW_LINELOOP = 0x03,
|
DRAW_TRIANGLELIST = 0x04,
|
DRAW_TRIANGLESTRIP = 0x05,
|
DRAW_TRIANGLEFAN = 0x06,
|
DRAW_QUADLIST = 0x07,
|
|
DRAW_NONINDEXED = 0x00,
|
DRAW_INDEXED8 = 0x10,
|
DRAW_INDEXED16 = 0x20,
|
DRAW_INDEXED32 = 0x30,
|
|
DRAW_INDEXEDPOINTLIST8 = DRAW_POINTLIST | DRAW_INDEXED8,
|
DRAW_INDEXEDLINELIST8 = DRAW_LINELIST | DRAW_INDEXED8,
|
DRAW_INDEXEDLINESTRIP8 = DRAW_LINESTRIP | DRAW_INDEXED8,
|
DRAW_INDEXEDLINELOOP8 = DRAW_LINELOOP | DRAW_INDEXED8,
|
DRAW_INDEXEDTRIANGLELIST8 = DRAW_TRIANGLELIST | DRAW_INDEXED8,
|
DRAW_INDEXEDTRIANGLESTRIP8 = DRAW_TRIANGLESTRIP | DRAW_INDEXED8,
|
DRAW_INDEXEDTRIANGLEFAN8 = DRAW_TRIANGLEFAN | DRAW_INDEXED8,
|
|
DRAW_INDEXEDPOINTLIST16 = DRAW_POINTLIST | DRAW_INDEXED16,
|
DRAW_INDEXEDLINELIST16 = DRAW_LINELIST | DRAW_INDEXED16,
|
DRAW_INDEXEDLINESTRIP16 = DRAW_LINESTRIP | DRAW_INDEXED16,
|
DRAW_INDEXEDLINELOOP16 = DRAW_LINELOOP | DRAW_INDEXED16,
|
DRAW_INDEXEDTRIANGLELIST16 = DRAW_TRIANGLELIST | DRAW_INDEXED16,
|
DRAW_INDEXEDTRIANGLESTRIP16 = DRAW_TRIANGLESTRIP | DRAW_INDEXED16,
|
DRAW_INDEXEDTRIANGLEFAN16 = DRAW_TRIANGLEFAN | DRAW_INDEXED16,
|
|
DRAW_INDEXEDPOINTLIST32 = DRAW_POINTLIST | DRAW_INDEXED32,
|
DRAW_INDEXEDLINELIST32 = DRAW_LINELIST | DRAW_INDEXED32,
|
DRAW_INDEXEDLINESTRIP32 = DRAW_LINESTRIP | DRAW_INDEXED32,
|
DRAW_INDEXEDLINELOOP32 = DRAW_LINELOOP | DRAW_INDEXED32,
|
DRAW_INDEXEDTRIANGLELIST32 = DRAW_TRIANGLELIST | DRAW_INDEXED32,
|
DRAW_INDEXEDTRIANGLESTRIP32 = DRAW_TRIANGLESTRIP | DRAW_INDEXED32,
|
DRAW_INDEXEDTRIANGLEFAN32 = DRAW_TRIANGLEFAN | DRAW_INDEXED32,
|
|
DRAW_LAST = DRAW_INDEXEDTRIANGLEFAN32
|
};
|
|
enum FillMode ENUM_UNDERLYING_TYPE_UNSIGNED_INT
|
{
|
FILL_SOLID,
|
FILL_WIREFRAME,
|
FILL_VERTEX,
|
|
FILL_LAST = FILL_VERTEX
|
};
|
|
enum ShadingMode ENUM_UNDERLYING_TYPE_UNSIGNED_INT
|
{
|
SHADING_FLAT,
|
SHADING_GOURAUD,
|
|
SHADING_LAST = SHADING_GOURAUD
|
};
|
|
enum DepthCompareMode ENUM_UNDERLYING_TYPE_UNSIGNED_INT
|
{
|
DEPTH_ALWAYS,
|
DEPTH_NEVER,
|
DEPTH_EQUAL,
|
DEPTH_NOTEQUAL,
|
DEPTH_LESS,
|
DEPTH_LESSEQUAL,
|
DEPTH_GREATER,
|
DEPTH_GREATEREQUAL,
|
|
DEPTH_LAST = DEPTH_GREATEREQUAL
|
};
|
|
enum StencilCompareMode ENUM_UNDERLYING_TYPE_UNSIGNED_INT
|
{
|
STENCIL_ALWAYS,
|
STENCIL_NEVER,
|
STENCIL_EQUAL,
|
STENCIL_NOTEQUAL,
|
STENCIL_LESS,
|
STENCIL_LESSEQUAL,
|
STENCIL_GREATER,
|
STENCIL_GREATEREQUAL,
|
|
STENCIL_LAST = STENCIL_GREATEREQUAL
|
};
|
|
enum StencilOperation ENUM_UNDERLYING_TYPE_UNSIGNED_INT
|
{
|
OPERATION_KEEP,
|
OPERATION_ZERO,
|
OPERATION_REPLACE,
|
OPERATION_INCRSAT,
|
OPERATION_DECRSAT,
|
OPERATION_INVERT,
|
OPERATION_INCR,
|
OPERATION_DECR,
|
|
OPERATION_LAST = OPERATION_DECR
|
};
|
|
enum AlphaCompareMode ENUM_UNDERLYING_TYPE_UNSIGNED_INT
|
{
|
ALPHA_ALWAYS,
|
ALPHA_NEVER,
|
ALPHA_EQUAL,
|
ALPHA_NOTEQUAL,
|
ALPHA_LESS,
|
ALPHA_LESSEQUAL,
|
ALPHA_GREATER,
|
ALPHA_GREATEREQUAL,
|
|
ALPHA_LAST = ALPHA_GREATEREQUAL
|
};
|
|
enum CullMode ENUM_UNDERLYING_TYPE_UNSIGNED_INT
|
{
|
CULL_NONE,
|
CULL_CLOCKWISE,
|
CULL_COUNTERCLOCKWISE,
|
|
CULL_LAST = CULL_COUNTERCLOCKWISE
|
};
|
|
enum BlendFactor ENUM_UNDERLYING_TYPE_UNSIGNED_INT
|
{
|
BLEND_ZERO,
|
BLEND_ONE,
|
BLEND_SOURCE,
|
BLEND_INVSOURCE,
|
BLEND_DEST,
|
BLEND_INVDEST,
|
BLEND_SOURCEALPHA,
|
BLEND_INVSOURCEALPHA,
|
BLEND_DESTALPHA,
|
BLEND_INVDESTALPHA,
|
BLEND_SRCALPHASAT,
|
BLEND_CONSTANT,
|
BLEND_INVCONSTANT,
|
BLEND_CONSTANTALPHA,
|
BLEND_INVCONSTANTALPHA,
|
|
BLEND_LAST = BLEND_INVCONSTANTALPHA
|
};
|
|
enum BlendOperation ENUM_UNDERLYING_TYPE_UNSIGNED_INT
|
{
|
BLENDOP_ADD,
|
BLENDOP_SUB,
|
BLENDOP_INVSUB,
|
BLENDOP_MIN,
|
BLENDOP_MAX,
|
|
BLENDOP_SOURCE, // Copy source
|
BLENDOP_DEST, // Copy dest
|
BLENDOP_NULL, // Nullify result
|
|
BLENDOP_LAST = BLENDOP_NULL
|
};
|
|
enum LogicalOperation ENUM_UNDERLYING_TYPE_UNSIGNED_INT
|
{
|
LOGICALOP_CLEAR,
|
LOGICALOP_SET,
|
LOGICALOP_COPY,
|
LOGICALOP_COPY_INVERTED,
|
LOGICALOP_NOOP,
|
LOGICALOP_INVERT,
|
LOGICALOP_AND,
|
LOGICALOP_NAND,
|
LOGICALOP_OR,
|
LOGICALOP_NOR,
|
LOGICALOP_XOR,
|
LOGICALOP_EQUIV,
|
LOGICALOP_AND_REVERSE,
|
LOGICALOP_AND_INVERTED,
|
LOGICALOP_OR_REVERSE,
|
LOGICALOP_OR_INVERTED,
|
|
LOGICALOP_LAST = LOGICALOP_OR_INVERTED
|
};
|
|
enum MaterialSource ENUM_UNDERLYING_TYPE_UNSIGNED_INT
|
{
|
MATERIAL_MATERIAL,
|
MATERIAL_COLOR1,
|
MATERIAL_COLOR2,
|
|
MATERIAL_LAST = MATERIAL_COLOR2
|
};
|
|
enum FogMode ENUM_UNDERLYING_TYPE_UNSIGNED_INT
|
{
|
FOG_NONE,
|
FOG_LINEAR,
|
FOG_EXP,
|
FOG_EXP2,
|
|
FOG_LAST = FOG_EXP2
|
};
|
|
enum TexGen ENUM_UNDERLYING_TYPE_UNSIGNED_INT
|
{
|
TEXGEN_PASSTHRU,
|
TEXGEN_NORMAL,
|
TEXGEN_POSITION,
|
TEXGEN_REFLECTION,
|
TEXGEN_SPHEREMAP,
|
TEXGEN_NONE,
|
|
TEXGEN_LAST = TEXGEN_NONE
|
};
|
|
enum TransparencyAntialiasing ENUM_UNDERLYING_TYPE_UNSIGNED_INT
|
{
|
TRANSPARENCY_NONE,
|
TRANSPARENCY_ALPHA_TO_COVERAGE,
|
|
TRANSPARENCY_LAST = TRANSPARENCY_ALPHA_TO_COVERAGE
|
};
|
|
class Context
|
{
|
public:
|
Context();
|
|
~Context();
|
|
void *operator new(size_t bytes);
|
void operator delete(void *pointer, size_t bytes);
|
|
bool isDrawPoint(bool fillModeAware = false) const;
|
bool isDrawLine(bool fillModeAware = false) const;
|
bool isDrawTriangle(bool fillModeAware = false) const;
|
|
void init();
|
|
const float &exp2Bias(); // NOTE: Needs address for JIT
|
|
const Point &getLightPosition(int light);
|
|
void setGlobalMipmapBias(float bias);
|
|
// Set fixed-function vertex pipeline states
|
void setLightingEnable(bool lightingEnable);
|
void setSpecularEnable(bool specularEnable);
|
void setLightEnable(int light, bool lightEnable);
|
void setLightPosition(int light, Point worldLightPosition);
|
|
void setColorVertexEnable(bool colorVertexEnable);
|
void setAmbientMaterialSource(MaterialSource ambientMaterialSource);
|
void setDiffuseMaterialSource(MaterialSource diffuseMaterialSource);
|
void setSpecularMaterialSource(MaterialSource specularMaterialSource);
|
void setEmissiveMaterialSource(MaterialSource emissiveMaterialSource);
|
|
void setPointSpriteEnable(bool pointSpriteEnable);
|
void setPointScaleEnable(bool pointScaleEnable);
|
|
// Set fixed-function pixel pipeline states, return true when modified
|
bool setDepthBufferEnable(bool depthBufferEnable);
|
|
bool setAlphaBlendEnable(bool alphaBlendEnable);
|
bool setSourceBlendFactor(BlendFactor sourceBlendFactor);
|
bool setDestBlendFactor(BlendFactor destBlendFactor);
|
bool setBlendOperation(BlendOperation blendOperation);
|
|
bool setSeparateAlphaBlendEnable(bool separateAlphaBlendEnable);
|
bool setSourceBlendFactorAlpha(BlendFactor sourceBlendFactorAlpha);
|
bool setDestBlendFactorAlpha(BlendFactor destBlendFactorAlpha);
|
bool setBlendOperationAlpha(BlendOperation blendOperationAlpha);
|
|
bool setColorWriteMask(int index, int colorWriteMask);
|
bool setWriteSRGB(bool sRGB);
|
|
bool setColorLogicOpEnabled(bool colorLogicOpEnabled);
|
bool setLogicalOperation(LogicalOperation logicalOperation);
|
|
// Active fixed-function pixel pipeline states
|
bool fogActive();
|
bool pointSizeActive();
|
FogMode pixelFogActive();
|
bool depthWriteActive();
|
bool alphaTestActive();
|
bool depthBufferActive();
|
bool stencilActive();
|
|
bool perspectiveActive();
|
|
// Active fixed-function vertex pipeline states
|
bool vertexLightingActive();
|
bool texCoordActive(int coordinate, int component);
|
bool texCoordActive(int coordinate);
|
bool isProjectionComponent(unsigned int coordinate, int component);
|
bool vertexSpecularInputActive();
|
bool vertexSpecularActive();
|
bool vertexNormalActive();
|
bool vertexLightActive();
|
bool vertexLightActive(int i);
|
MaterialSource vertexDiffuseMaterialSourceActive();
|
MaterialSource vertexSpecularMaterialSourceActive();
|
MaterialSource vertexAmbientMaterialSourceActive();
|
MaterialSource vertexEmissiveMaterialSourceActive();
|
|
bool pointSpriteActive();
|
bool pointScaleActive();
|
|
bool alphaBlendActive();
|
BlendFactor sourceBlendFactor();
|
BlendFactor destBlendFactor();
|
BlendOperation blendOperation();
|
|
BlendFactor sourceBlendFactorAlpha();
|
BlendFactor destBlendFactorAlpha();
|
BlendOperation blendOperationAlpha();
|
|
LogicalOperation colorLogicOp();
|
LogicalOperation indexLogicOp();
|
|
bool indexedVertexBlendActive();
|
int vertexBlendMatrixCountActive();
|
bool localViewerActive();
|
bool normalizeNormalsActive();
|
FogMode vertexFogModeActive();
|
bool rangeFogActive();
|
|
TexGen texGenActive(int stage);
|
int textureTransformCountActive(int stage);
|
int texCoordIndexActive(int stage);
|
|
// Active context states
|
bool diffuseUsed(); // Used by pixel processor but not provided by vertex processor
|
bool diffuseUsed(int component); // Used by pixel processor but not provided by vertex processor
|
bool diffuseActive();
|
bool diffuseActive(int component);
|
bool specularUsed();
|
bool specularUsed(int component);
|
bool specularActive();
|
bool specularActive(int component);
|
bool colorActive(int color, int component);
|
bool textureActive();
|
bool textureActive(int coordinate);
|
bool textureActive(int coordinate, int component);
|
|
unsigned short pixelShaderModel() const;
|
unsigned short vertexShaderModel() const;
|
|
int getMultiSampleCount() const;
|
int getSuperSampleCount() const;
|
|
DrawType drawType;
|
|
bool stencilEnable;
|
StencilCompareMode stencilCompareMode;
|
int stencilReference;
|
int stencilMask;
|
StencilOperation stencilFailOperation;
|
StencilOperation stencilPassOperation;
|
StencilOperation stencilZFailOperation;
|
int stencilWriteMask;
|
|
bool twoSidedStencil;
|
StencilCompareMode stencilCompareModeCCW;
|
int stencilReferenceCCW;
|
int stencilMaskCCW;
|
StencilOperation stencilFailOperationCCW;
|
StencilOperation stencilPassOperationCCW;
|
StencilOperation stencilZFailOperationCCW;
|
int stencilWriteMaskCCW;
|
|
// Pixel processor states
|
AlphaCompareMode alphaCompareMode;
|
bool alphaTestEnable;
|
FillMode fillMode;
|
ShadingMode shadingMode;
|
|
CullMode cullMode;
|
bool frontFacingCCW;
|
float alphaReference;
|
|
float depthBias;
|
float slopeDepthBias;
|
|
TextureStage textureStage[8];
|
Sampler sampler[TOTAL_IMAGE_UNITS];
|
|
Format renderTargetInternalFormat(int index);
|
bool colorWriteActive();
|
int colorWriteActive(int index);
|
bool colorUsed();
|
|
Resource *texture[TOTAL_IMAGE_UNITS];
|
Stream input[MAX_VERTEX_INPUTS];
|
Resource *indexBuffer;
|
|
bool preTransformed; // FIXME: Private
|
|
float fogStart;
|
float fogEnd;
|
|
bool textureWrapActive;
|
unsigned char textureWrap[TEXTURE_IMAGE_UNITS];
|
TexGen texGen[8];
|
bool localViewer;
|
bool normalizeNormals;
|
int textureTransformCount[8];
|
bool textureTransformProject[8];
|
|
Surface *renderTarget[RENDERTARGETS];
|
unsigned int renderTargetLayer[RENDERTARGETS];
|
Surface *depthBuffer;
|
unsigned int depthBufferLayer;
|
Surface *stencilBuffer;
|
unsigned int stencilBufferLayer;
|
|
// Fog
|
bool fogEnable;
|
FogMode pixelFogMode;
|
FogMode vertexFogMode;
|
bool wBasedFog;
|
bool rangeFogEnable;
|
|
// Vertex blending
|
bool indexedVertexBlendEnable;
|
int vertexBlendMatrixCount;
|
|
// Shaders
|
const PixelShader *pixelShader;
|
const VertexShader *vertexShader;
|
|
// Global mipmap bias
|
float bias;
|
|
// Instancing
|
int instanceID;
|
|
// Fixed-function vertex pipeline state
|
bool lightingEnable;
|
bool specularEnable;
|
bool lightEnable[8];
|
Point worldLightPosition[8];
|
|
MaterialSource ambientMaterialSource;
|
MaterialSource diffuseMaterialSource;
|
MaterialSource specularMaterialSource;
|
MaterialSource emissiveMaterialSource;
|
bool colorVertexEnable;
|
|
bool occlusionEnabled;
|
bool transformFeedbackQueryEnabled;
|
uint64_t transformFeedbackEnabled;
|
|
// Pixel processor states
|
bool rasterizerDiscard;
|
bool depthBufferEnable;
|
DepthCompareMode depthCompareMode;
|
bool depthWriteEnable;
|
|
bool alphaBlendEnable;
|
BlendFactor sourceBlendFactorState;
|
BlendFactor destBlendFactorState;
|
BlendOperation blendOperationState;
|
|
bool separateAlphaBlendEnable;
|
BlendFactor sourceBlendFactorStateAlpha;
|
BlendFactor destBlendFactorStateAlpha;
|
BlendOperation blendOperationStateAlpha;
|
|
bool pointSpriteEnable;
|
bool pointScaleEnable;
|
float lineWidth;
|
|
int colorWriteMask[RENDERTARGETS]; // RGBA
|
bool writeSRGB;
|
unsigned int sampleMask;
|
unsigned int multiSampleMask;
|
|
bool colorLogicOpEnabled;
|
LogicalOperation logicalOperation;
|
};
|
}
|
|
#endif // sw_Context_hpp
|