// 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() : 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 *operator new(size_t size); void operator delete(void *mem); 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 &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 &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 &textureFactor); void setBlendConstant(const Color &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 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(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 *routineCache; }; } #endif // sw_PixelProcessor_hpp