|  | // 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_PixelProcessor_hpp | 
|  | #define sw_PixelProcessor_hpp | 
|  |  | 
|  | #include "Context.hpp" | 
|  | #include "RoutineCache.hpp" | 
|  |  | 
|  | namespace sw | 
|  | { | 
|  | class PixelShader; | 
|  | class Rasterizer; | 
|  | struct Texture; | 
|  | struct DrawData; | 
|  |  | 
|  | class PixelProcessor | 
|  | { | 
|  | public: | 
|  | struct States : Memset<States> | 
|  | { | 
|  | States() : Memset(this, 0) {} | 
|  |  | 
|  | uint32_t computeHash(); | 
|  |  | 
|  | int shaderID; | 
|  |  | 
|  | bool depthOverride                        : 1;   // TODO: Eliminate by querying shader. | 
|  | bool shaderContainsKill                   : 1;   // TODO: Eliminate by querying shader. | 
|  |  | 
|  | DepthCompareMode depthCompareMode         : BITS(DEPTH_LAST); | 
|  | AlphaCompareMode alphaCompareMode         : BITS(ALPHA_LAST); | 
|  | bool depthWriteEnable                     : 1; | 
|  | bool quadLayoutDepthBuffer                : 1; | 
|  |  | 
|  | bool stencilActive                        : 1; | 
|  | StencilCompareMode stencilCompareMode     : BITS(STENCIL_LAST); | 
|  | StencilOperation stencilFailOperation     : BITS(OPERATION_LAST); | 
|  | StencilOperation stencilPassOperation     : BITS(OPERATION_LAST); | 
|  | StencilOperation stencilZFailOperation    : BITS(OPERATION_LAST); | 
|  | bool noStencilMask                        : 1; | 
|  | bool noStencilWriteMask                   : 1; | 
|  | bool stencilWriteMasked                   : 1; | 
|  | bool twoSidedStencil                      : 1; | 
|  | StencilCompareMode stencilCompareModeCCW  : BITS(STENCIL_LAST); | 
|  | StencilOperation stencilFailOperationCCW  : BITS(OPERATION_LAST); | 
|  | StencilOperation stencilPassOperationCCW  : BITS(OPERATION_LAST); | 
|  | StencilOperation stencilZFailOperationCCW : BITS(OPERATION_LAST); | 
|  | bool noStencilMaskCCW                     : 1; | 
|  | bool noStencilWriteMaskCCW                : 1; | 
|  | bool stencilWriteMaskedCCW                : 1; | 
|  |  | 
|  | bool depthTestActive                      : 1; | 
|  | bool fogActive                            : 1; | 
|  | FogMode pixelFogMode                      : BITS(FOG_LAST); | 
|  | bool specularAdd                          : 1; | 
|  | bool occlusionEnabled                     : 1; | 
|  | bool wBasedFog                            : 1; | 
|  | bool perspective                          : 1; | 
|  | bool depthClamp                           : 1; | 
|  |  | 
|  | bool alphaBlendActive                     : 1; | 
|  | BlendFactor sourceBlendFactor             : BITS(BLEND_LAST); | 
|  | BlendFactor destBlendFactor               : BITS(BLEND_LAST); | 
|  | BlendOperation blendOperation             : BITS(BLENDOP_LAST); | 
|  | BlendFactor sourceBlendFactorAlpha        : BITS(BLEND_LAST); | 
|  | BlendFactor destBlendFactorAlpha          : BITS(BLEND_LAST); | 
|  | BlendOperation blendOperationAlpha        : BITS(BLENDOP_LAST); | 
|  |  | 
|  | unsigned int colorWriteMask                       : RENDERTARGETS * 4;   // Four component bit masks | 
|  | Format targetFormat[RENDERTARGETS]; | 
|  | bool writeSRGB                                    : 1; | 
|  | unsigned int multiSample                          : 3; | 
|  | unsigned int multiSampleMask                      : 4; | 
|  | TransparencyAntialiasing transparencyAntialiasing : BITS(TRANSPARENCY_LAST); | 
|  | bool centroid                                     : 1; | 
|  | bool frontFaceCCW                                 : 1; | 
|  |  | 
|  | LogicalOperation logicalOperation : BITS(LOGICALOP_LAST); | 
|  |  | 
|  | Sampler::State sampler[TEXTURE_IMAGE_UNITS]; | 
|  | TextureStage::State textureStage[8]; | 
|  |  | 
|  | struct Interpolant | 
|  | { | 
|  | unsigned char component : 4; | 
|  | unsigned char flat : 4; | 
|  | unsigned char project : 2; | 
|  | bool centroid : 1; | 
|  | }; | 
|  |  | 
|  | union | 
|  | { | 
|  | struct | 
|  | { | 
|  | Interpolant color[2]; | 
|  | Interpolant texture[8]; | 
|  | Interpolant fog; | 
|  | }; | 
|  |  | 
|  | Interpolant interpolant[MAX_FRAGMENT_INPUTS]; | 
|  | }; | 
|  | }; | 
|  |  | 
|  | struct State : States | 
|  | { | 
|  | bool operator==(const State &state) const; | 
|  |  | 
|  | int colorWriteActive(int index) const | 
|  | { | 
|  | return (colorWriteMask >> (index * 4)) & 0xF; | 
|  | } | 
|  |  | 
|  | bool alphaTestActive() const | 
|  | { | 
|  | return (alphaCompareMode != ALPHA_ALWAYS) || (transparencyAntialiasing != TRANSPARENCY_NONE); | 
|  | } | 
|  |  | 
|  | bool pixelFogActive() const | 
|  | { | 
|  | return pixelFogMode != FOG_NONE; | 
|  | } | 
|  |  | 
|  | uint32_t hash; | 
|  | }; | 
|  |  | 
|  | struct Stencil | 
|  | { | 
|  | int64_t testMaskQ; | 
|  | int64_t referenceMaskedQ; | 
|  | int64_t referenceMaskedSignedQ; | 
|  | int64_t writeMaskQ; | 
|  | int64_t invWriteMaskQ; | 
|  | int64_t referenceQ; | 
|  |  | 
|  | void set(int reference, int testMask, int writeMask) | 
|  | { | 
|  | referenceQ = replicate(reference); | 
|  | testMaskQ = replicate(testMask); | 
|  | writeMaskQ = replicate(writeMask); | 
|  | invWriteMaskQ = ~writeMaskQ; | 
|  | referenceMaskedQ = referenceQ & testMaskQ; | 
|  | referenceMaskedSignedQ = replicate(((reference & testMask) + 0x80) & 0xFF); | 
|  | } | 
|  |  | 
|  | static int64_t replicate(int b) | 
|  | { | 
|  | int64_t w = b & 0xFF; | 
|  |  | 
|  | return (w << 0) | (w << 8) | (w << 16) | (w << 24) | (w << 32) | (w << 40) | (w << 48) | (w << 56); | 
|  | } | 
|  | }; | 
|  |  | 
|  | struct Fog | 
|  | { | 
|  | float4 scale; | 
|  | float4 offset; | 
|  | word4 color4[3]; | 
|  | float4 colorF[3]; | 
|  | float4 densityE; | 
|  | float4 density2E; | 
|  | }; | 
|  |  | 
|  | struct Factor | 
|  | { | 
|  | word4 textureFactor4[4]; | 
|  |  | 
|  | word4 alphaReference4; | 
|  |  | 
|  | word4 blendConstant4W[4]; | 
|  | float4 blendConstant4F[4]; | 
|  | word4 invBlendConstant4W[4]; | 
|  | float4 invBlendConstant4F[4]; | 
|  | }; | 
|  |  | 
|  | public: | 
|  | typedef void (*RoutinePointer)(const Primitive *primitive, int count, int thread, DrawData *draw); | 
|  |  | 
|  | PixelProcessor(Context *context); | 
|  |  | 
|  | virtual ~PixelProcessor(); | 
|  |  | 
|  | void setFloatConstant(unsigned int index, const float value[4]); | 
|  | void setIntegerConstant(unsigned int index, const int value[4]); | 
|  | void setBooleanConstant(unsigned int index, int boolean); | 
|  |  | 
|  | void setUniformBuffer(int index, sw::Resource* buffer, int offset); | 
|  | void lockUniformBuffers(byte** u, sw::Resource* uniformBuffers[]); | 
|  |  | 
|  | void setRenderTarget(int index, Surface *renderTarget, unsigned int layer = 0); | 
|  | void setDepthBuffer(Surface *depthBuffer, unsigned int layer = 0); | 
|  | void setStencilBuffer(Surface *stencilBuffer, unsigned int layer = 0); | 
|  |  | 
|  | void setTexCoordIndex(unsigned int stage, int texCoordIndex); | 
|  | void setStageOperation(unsigned int stage, TextureStage::StageOperation stageOperation); | 
|  | void setFirstArgument(unsigned int stage, TextureStage::SourceArgument firstArgument); | 
|  | void setSecondArgument(unsigned int stage, TextureStage::SourceArgument secondArgument); | 
|  | void setThirdArgument(unsigned int stage, TextureStage::SourceArgument thirdArgument); | 
|  | void setStageOperationAlpha(unsigned int stage, TextureStage::StageOperation stageOperationAlpha); | 
|  | void setFirstArgumentAlpha(unsigned int stage, TextureStage::SourceArgument firstArgumentAlpha); | 
|  | void setSecondArgumentAlpha(unsigned int stage, TextureStage::SourceArgument secondArgumentAlpha); | 
|  | void setThirdArgumentAlpha(unsigned int stage, TextureStage::SourceArgument thirdArgumentAlpha); | 
|  | void setFirstModifier(unsigned int stage, TextureStage::ArgumentModifier firstModifier); | 
|  | void setSecondModifier(unsigned int stage, TextureStage::ArgumentModifier secondModifier); | 
|  | void setThirdModifier(unsigned int stage, TextureStage::ArgumentModifier thirdModifier); | 
|  | void setFirstModifierAlpha(unsigned int stage, TextureStage::ArgumentModifier firstModifierAlpha); | 
|  | void setSecondModifierAlpha(unsigned int stage, TextureStage::ArgumentModifier secondModifierAlpha); | 
|  | void setThirdModifierAlpha(unsigned int stage, TextureStage::ArgumentModifier thirdModifierAlpha); | 
|  | void setDestinationArgument(unsigned int stage, TextureStage::DestinationArgument destinationArgument); | 
|  | void setConstantColor(unsigned int stage, const Color<float> &constantColor); | 
|  | void setBumpmapMatrix(unsigned int stage, int element, float value); | 
|  | void setLuminanceScale(unsigned int stage, float value); | 
|  | void setLuminanceOffset(unsigned int stage, float value); | 
|  |  | 
|  | void setTextureFilter(unsigned int sampler, FilterType textureFilter); | 
|  | void setMipmapFilter(unsigned int sampler, MipmapType mipmapFilter); | 
|  | void setGatherEnable(unsigned int sampler, bool enable); | 
|  | void setAddressingModeU(unsigned int sampler, AddressingMode addressingMode); | 
|  | void setAddressingModeV(unsigned int sampler, AddressingMode addressingMode); | 
|  | void setAddressingModeW(unsigned int sampler, AddressingMode addressingMode); | 
|  | void setReadSRGB(unsigned int sampler, bool sRGB); | 
|  | void setMipmapLOD(unsigned int sampler, float bias); | 
|  | void setBorderColor(unsigned int sampler, const Color<float> &borderColor); | 
|  | void setMaxAnisotropy(unsigned int sampler, float maxAnisotropy); | 
|  | void setHighPrecisionFiltering(unsigned int sampler, bool highPrecisionFiltering); | 
|  | void setSwizzleR(unsigned int sampler, SwizzleType swizzleR); | 
|  | void setSwizzleG(unsigned int sampler, SwizzleType swizzleG); | 
|  | void setSwizzleB(unsigned int sampler, SwizzleType swizzleB); | 
|  | void setSwizzleA(unsigned int sampler, SwizzleType swizzleA); | 
|  | void setCompareFunc(unsigned int sampler, CompareFunc compare); | 
|  | void setBaseLevel(unsigned int sampler, int baseLevel); | 
|  | void setMaxLevel(unsigned int sampler, int maxLevel); | 
|  | void setMinLod(unsigned int sampler, float minLod); | 
|  | void setMaxLod(unsigned int sampler, float maxLod); | 
|  | void setSyncRequired(unsigned int sampler, bool isSincRequired); | 
|  |  | 
|  | void setWriteSRGB(bool sRGB); | 
|  | void setDepthBufferEnable(bool depthBufferEnable); | 
|  | void setDepthCompare(DepthCompareMode depthCompareMode); | 
|  | void setAlphaCompare(AlphaCompareMode alphaCompareMode); | 
|  | void setDepthWriteEnable(bool depthWriteEnable); | 
|  | void setAlphaTestEnable(bool alphaTestEnable); | 
|  | void setCullMode(CullMode cullMode, bool frontFacingCCW); | 
|  | void setColorWriteMask(int index, int rgbaMask); | 
|  |  | 
|  | void setColorLogicOpEnabled(bool colorLogicOpEnabled); | 
|  | void setLogicalOperation(LogicalOperation logicalOperation); | 
|  |  | 
|  | void setStencilEnable(bool stencilEnable); | 
|  | void setStencilCompare(StencilCompareMode stencilCompareMode); | 
|  | void setStencilReference(int stencilReference); | 
|  | void setStencilMask(int stencilMask); | 
|  | void setStencilFailOperation(StencilOperation stencilFailOperation); | 
|  | void setStencilPassOperation(StencilOperation stencilPassOperation); | 
|  | void setStencilZFailOperation(StencilOperation stencilZFailOperation); | 
|  | void setStencilWriteMask(int stencilWriteMask); | 
|  | void setTwoSidedStencil(bool enable); | 
|  | void setStencilCompareCCW(StencilCompareMode stencilCompareMode); | 
|  | void setStencilReferenceCCW(int stencilReference); | 
|  | void setStencilMaskCCW(int stencilMask); | 
|  | void setStencilFailOperationCCW(StencilOperation stencilFailOperation); | 
|  | void setStencilPassOperationCCW(StencilOperation stencilPassOperation); | 
|  | void setStencilZFailOperationCCW(StencilOperation stencilZFailOperation); | 
|  | void setStencilWriteMaskCCW(int stencilWriteMask); | 
|  |  | 
|  | void setTextureFactor(const Color<float> &textureFactor); | 
|  | void setBlendConstant(const Color<float> &blendConstant); | 
|  |  | 
|  | void setFillMode(FillMode fillMode); | 
|  | void setShadingMode(ShadingMode shadingMode); | 
|  |  | 
|  | void setAlphaBlendEnable(bool alphaBlendEnable); | 
|  | void setSourceBlendFactor(BlendFactor sourceBlendFactor); | 
|  | void setDestBlendFactor(BlendFactor destBlendFactor); | 
|  | void setBlendOperation(BlendOperation blendOperation); | 
|  |  | 
|  | void setSeparateAlphaBlendEnable(bool separateAlphaBlendEnable); | 
|  | void setSourceBlendFactorAlpha(BlendFactor sourceBlendFactorAlpha); | 
|  | void setDestBlendFactorAlpha(BlendFactor destBlendFactorAlpha); | 
|  | void setBlendOperationAlpha(BlendOperation blendOperationAlpha); | 
|  |  | 
|  | void setAlphaReference(float alphaReference); | 
|  |  | 
|  | void setGlobalMipmapBias(float bias); | 
|  |  | 
|  | void setFogStart(float start); | 
|  | void setFogEnd(float end); | 
|  | void setFogColor(Color<float> fogColor); | 
|  | void setFogDensity(float fogDensity); | 
|  | void setPixelFogMode(FogMode fogMode); | 
|  |  | 
|  | void setPerspectiveCorrection(bool perspectiveCorrection); | 
|  |  | 
|  | void setOcclusionEnabled(bool enable); | 
|  |  | 
|  | protected: | 
|  | const State update() const; | 
|  | std::shared_ptr<Routine> routine(const State &state); | 
|  | void setRoutineCacheSize(int routineCacheSize); | 
|  |  | 
|  | // Shader constants | 
|  | word4 cW[8][4]; | 
|  | float4 c[FRAGMENT_UNIFORM_VECTORS]; | 
|  | int4 i[16]; | 
|  | bool b[16]; | 
|  |  | 
|  | // Other semi-constants | 
|  | Stencil stencil; | 
|  | Stencil stencilCCW; | 
|  | Fog fog; | 
|  | Factor factor; | 
|  |  | 
|  | private: | 
|  | struct UniformBufferInfo | 
|  | { | 
|  | UniformBufferInfo(); | 
|  |  | 
|  | Resource* buffer; | 
|  | int offset; | 
|  | }; | 
|  | UniformBufferInfo uniformBufferInfo[MAX_UNIFORM_BUFFER_BINDINGS]; | 
|  |  | 
|  | void setFogRanges(float start, float end); | 
|  |  | 
|  | Context *const context; | 
|  |  | 
|  | RoutineCache<State> *routineCache; | 
|  | }; | 
|  | } | 
|  |  | 
|  | #endif   // sw_PixelProcessor_hpp |