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_PixelProcessor_hpp 16 #define sw_PixelProcessor_hpp 17 18 #include "Context.hpp" 19 #include "RoutineCache.hpp" 20 21 namespace sw 22 { 23 class PixelShader; 24 class Rasterizer; 25 struct Texture; 26 struct DrawData; 27 28 class PixelProcessor 29 { 30 public: 31 struct States 32 { 33 unsigned int computeHash(); 34 35 int shaderID; 36 37 bool depthOverride : 1; 38 bool shaderContainsKill : 1; 39 40 DepthCompareMode depthCompareMode : BITS(DEPTH_LAST); 41 AlphaCompareMode alphaCompareMode : BITS(ALPHA_LAST); 42 bool depthWriteEnable : 1; 43 bool quadLayoutDepthBuffer : 1; 44 45 bool stencilActive : 1; 46 StencilCompareMode stencilCompareMode : BITS(STENCIL_LAST); 47 StencilOperation stencilFailOperation : BITS(OPERATION_LAST); 48 StencilOperation stencilPassOperation : BITS(OPERATION_LAST); 49 StencilOperation stencilZFailOperation : BITS(OPERATION_LAST); 50 bool noStencilMask : 1; 51 bool noStencilWriteMask : 1; 52 bool stencilWriteMasked : 1; 53 bool twoSidedStencil : 1; 54 StencilCompareMode stencilCompareModeCCW : BITS(STENCIL_LAST); 55 StencilOperation stencilFailOperationCCW : BITS(OPERATION_LAST); 56 StencilOperation stencilPassOperationCCW : BITS(OPERATION_LAST); 57 StencilOperation stencilZFailOperationCCW : BITS(OPERATION_LAST); 58 bool noStencilMaskCCW : 1; 59 bool noStencilWriteMaskCCW : 1; 60 bool stencilWriteMaskedCCW : 1; 61 62 bool depthTestActive : 1; 63 bool fogActive : 1; 64 FogMode pixelFogMode : BITS(FOG_LAST); 65 bool specularAdd : 1; 66 bool occlusionEnabled : 1; 67 bool wBasedFog : 1; 68 bool perspective : 1; 69 70 bool alphaBlendActive : 1; 71 BlendFactor sourceBlendFactor : BITS(BLEND_LAST); 72 BlendFactor destBlendFactor : BITS(BLEND_LAST); 73 BlendOperation blendOperation : BITS(BLENDOP_LAST); 74 BlendFactor sourceBlendFactorAlpha : BITS(BLEND_LAST); 75 BlendFactor destBlendFactorAlpha : BITS(BLEND_LAST); 76 BlendOperation blendOperationAlpha : BITS(BLENDOP_LAST); 77 78 unsigned int colorWriteMask : RENDERTARGETS * 4; // Four component bit masks 79 Format targetFormat[RENDERTARGETS]; 80 bool writeSRGB : 1; 81 unsigned int multiSample : 3; 82 unsigned int multiSampleMask : 4; 83 TransparencyAntialiasing transparencyAntialiasing : BITS(TRANSPARENCY_LAST); 84 bool centroid : 1; 85 86 LogicalOperation logicalOperation : BITS(LOGICALOP_LAST); 87 88 Sampler::State sampler[TEXTURE_IMAGE_UNITS]; 89 TextureStage::State textureStage[8]; 90 91 struct Interpolant 92 { 93 unsigned char component : 4; 94 unsigned char flat : 4; 95 unsigned char project : 2; 96 bool centroid : 1; 97 }; 98 99 union 100 { 101 struct 102 { 103 Interpolant color[2]; 104 Interpolant texture[8]; 105 Interpolant fog; 106 }; 107 108 Interpolant interpolant[MAX_FRAGMENT_INPUTS]; 109 }; 110 }; 111 112 struct State : States 113 { 114 State(); 115 116 bool operator==(const State &state) const; 117 118 int colorWriteActive(int index) const 119 { 120 return (colorWriteMask >> (index * 4)) & 0xF; 121 } 122 123 bool alphaTestActive() const 124 { 125 return alphaCompareMode != ALPHA_ALWAYS; 126 } 127 128 bool pixelFogActive() const 129 { 130 return pixelFogMode != FOG_NONE; 131 } 132 133 unsigned int hash; 134 }; 135 136 struct Stencil 137 { 138 int64_t testMaskQ; 139 int64_t referenceMaskedQ; 140 int64_t referenceMaskedSignedQ; 141 int64_t writeMaskQ; 142 int64_t invWriteMaskQ; 143 int64_t referenceQ; 144 145 void set(int reference, int testMask, int writeMask) 146 { 147 referenceQ = replicate(reference); 148 testMaskQ = replicate(testMask); 149 writeMaskQ = replicate(writeMask); 150 invWriteMaskQ = ~writeMaskQ; 151 referenceMaskedQ = referenceQ & testMaskQ; 152 referenceMaskedSignedQ = replicate((reference + 0x80) & 0xFF & testMask); 153 } 154 155 static int64_t replicate(int b) 156 { 157 int64_t w = b & 0xFF; 158 159 return (w << 0) | (w << 8) | (w << 16) | (w << 24) | (w << 32) | (w << 40) | (w << 48) | (w << 56); 160 } 161 }; 162 163 struct Fog 164 { 165 float4 scale; 166 float4 offset; 167 word4 color4[3]; 168 float4 colorF[3]; 169 float4 densityE; 170 float4 density2E; 171 }; 172 173 struct Factor 174 { 175 word4 textureFactor4[4]; 176 177 word4 alphaReference4; 178 179 word4 blendConstant4W[4]; 180 float4 blendConstant4F[4]; 181 word4 invBlendConstant4W[4]; 182 float4 invBlendConstant4F[4]; 183 }; 184 185 public: 186 typedef void (*RoutinePointer)(const Primitive *primitive, int count, int thread, DrawData *draw); 187 188 PixelProcessor(Context *context); 189 190 virtual ~PixelProcessor(); 191 192 virtual void setFloatConstant(unsigned int index, const float value[4]); 193 virtual void setIntegerConstant(unsigned int index, const int value[4]); 194 virtual void setBooleanConstant(unsigned int index, int boolean); 195 196 virtual void setUniformBuffer(int index, sw::Resource* buffer, int offset); 197 virtual void lockUniformBuffers(byte** u, sw::Resource* uniformBuffers[]); 198 199 virtual void setRenderTarget(int index, Surface *renderTarget); 200 virtual void setDepthBuffer(Surface *depthBuffer); 201 virtual void setStencilBuffer(Surface *stencilBuffer); 202 203 virtual void setTexCoordIndex(unsigned int stage, int texCoordIndex); 204 virtual void setStageOperation(unsigned int stage, TextureStage::StageOperation stageOperation); 205 virtual void setFirstArgument(unsigned int stage, TextureStage::SourceArgument firstArgument); 206 virtual void setSecondArgument(unsigned int stage, TextureStage::SourceArgument secondArgument); 207 virtual void setThirdArgument(unsigned int stage, TextureStage::SourceArgument thirdArgument); 208 virtual void setStageOperationAlpha(unsigned int stage, TextureStage::StageOperation stageOperationAlpha); 209 virtual void setFirstArgumentAlpha(unsigned int stage, TextureStage::SourceArgument firstArgumentAlpha); 210 virtual void setSecondArgumentAlpha(unsigned int stage, TextureStage::SourceArgument secondArgumentAlpha); 211 virtual void setThirdArgumentAlpha(unsigned int stage, TextureStage::SourceArgument thirdArgumentAlpha); 212 virtual void setFirstModifier(unsigned int stage, TextureStage::ArgumentModifier firstModifier); 213 virtual void setSecondModifier(unsigned int stage, TextureStage::ArgumentModifier secondModifier); 214 virtual void setThirdModifier(unsigned int stage, TextureStage::ArgumentModifier thirdModifier); 215 virtual void setFirstModifierAlpha(unsigned int stage, TextureStage::ArgumentModifier firstModifierAlpha); 216 virtual void setSecondModifierAlpha(unsigned int stage, TextureStage::ArgumentModifier secondModifierAlpha); 217 virtual void setThirdModifierAlpha(unsigned int stage, TextureStage::ArgumentModifier thirdModifierAlpha); 218 virtual void setDestinationArgument(unsigned int stage, TextureStage::DestinationArgument destinationArgument); 219 virtual void setConstantColor(unsigned int stage, const Color<float> &constantColor); 220 virtual void setBumpmapMatrix(unsigned int stage, int element, float value); 221 virtual void setLuminanceScale(unsigned int stage, float value); 222 virtual void setLuminanceOffset(unsigned int stage, float value); 223 224 virtual void setTextureFilter(unsigned int sampler, FilterType textureFilter); 225 virtual void setMipmapFilter(unsigned int sampler, MipmapType mipmapFilter); 226 virtual void setGatherEnable(unsigned int sampler, bool enable); 227 virtual void setAddressingModeU(unsigned int sampler, AddressingMode addressingMode); 228 virtual void setAddressingModeV(unsigned int sampler, AddressingMode addressingMode); 229 virtual void setAddressingModeW(unsigned int sampler, AddressingMode addressingMode); 230 virtual void setReadSRGB(unsigned int sampler, bool sRGB); 231 virtual void setMipmapLOD(unsigned int sampler, float bias); 232 virtual void setBorderColor(unsigned int sampler, const Color<float> &borderColor); 233 virtual void setMaxAnisotropy(unsigned int sampler, float maxAnisotropy); 234 virtual void setSwizzleR(unsigned int sampler, SwizzleType swizzleR); 235 virtual void setSwizzleG(unsigned int sampler, SwizzleType swizzleG); 236 virtual void setSwizzleB(unsigned int sampler, SwizzleType swizzleB); 237 virtual void setSwizzleA(unsigned int sampler, SwizzleType swizzleA); 238 239 virtual void setWriteSRGB(bool sRGB); 240 virtual void setDepthBufferEnable(bool depthBufferEnable); 241 virtual void setDepthCompare(DepthCompareMode depthCompareMode); 242 virtual void setAlphaCompare(AlphaCompareMode alphaCompareMode); 243 virtual void setDepthWriteEnable(bool depthWriteEnable); 244 virtual void setAlphaTestEnable(bool alphaTestEnable); 245 virtual void setCullMode(CullMode cullMode); 246 virtual void setColorWriteMask(int index, int rgbaMask); 247 248 virtual void setColorLogicOpEnabled(bool colorLogicOpEnabled); 249 virtual void setLogicalOperation(LogicalOperation logicalOperation); 250 251 virtual void setStencilEnable(bool stencilEnable); 252 virtual void setStencilCompare(StencilCompareMode stencilCompareMode); 253 virtual void setStencilReference(int stencilReference); 254 virtual void setStencilMask(int stencilMask); 255 virtual void setStencilFailOperation(StencilOperation stencilFailOperation); 256 virtual void setStencilPassOperation(StencilOperation stencilPassOperation); 257 virtual void setStencilZFailOperation(StencilOperation stencilZFailOperation); 258 virtual void setStencilWriteMask(int stencilWriteMask); 259 virtual void setTwoSidedStencil(bool enable); 260 virtual void setStencilCompareCCW(StencilCompareMode stencilCompareMode); 261 virtual void setStencilReferenceCCW(int stencilReference); 262 virtual void setStencilMaskCCW(int stencilMask); 263 virtual void setStencilFailOperationCCW(StencilOperation stencilFailOperation); 264 virtual void setStencilPassOperationCCW(StencilOperation stencilPassOperation); 265 virtual void setStencilZFailOperationCCW(StencilOperation stencilZFailOperation); 266 virtual void setStencilWriteMaskCCW(int stencilWriteMask); 267 268 virtual void setTextureFactor(const Color<float> &textureFactor); 269 virtual void setBlendConstant(const Color<float> &blendConstant); 270 271 virtual void setFillMode(FillMode fillMode); 272 virtual void setShadingMode(ShadingMode shadingMode); 273 274 virtual void setAlphaBlendEnable(bool alphaBlendEnable); 275 virtual void setSourceBlendFactor(BlendFactor sourceBlendFactor); 276 virtual void setDestBlendFactor(BlendFactor destBlendFactor); 277 virtual void setBlendOperation(BlendOperation blendOperation); 278 279 virtual void setSeparateAlphaBlendEnable(bool separateAlphaBlendEnable); 280 virtual void setSourceBlendFactorAlpha(BlendFactor sourceBlendFactorAlpha); 281 virtual void setDestBlendFactorAlpha(BlendFactor destBlendFactorAlpha); 282 virtual void setBlendOperationAlpha(BlendOperation blendOperationAlpha); 283 284 virtual void setAlphaReference(float alphaReference); 285 286 virtual void setGlobalMipmapBias(float bias); 287 288 virtual void setFogStart(float start); 289 virtual void setFogEnd(float end); 290 virtual void setFogColor(Color<float> fogColor); 291 virtual void setFogDensity(float fogDensity); 292 virtual void setPixelFogMode(FogMode fogMode); 293 294 virtual void setPerspectiveCorrection(bool perspectiveCorrection); 295 296 virtual void setOcclusionEnabled(bool enable); 297 298 protected: 299 const State update() const; 300 Routine *routine(const State &state); 301 void setRoutineCacheSize(int routineCacheSize); 302 303 // Shader constants 304 word4 cW[8][4]; 305 float4 c[FRAGMENT_UNIFORM_VECTORS]; 306 int4 i[16]; 307 bool b[16]; 308 309 // Other semi-constants 310 Stencil stencil; 311 Stencil stencilCCW; 312 Fog fog; 313 Factor factor; 314 315 private: 316 struct UniformBufferInfo 317 { 318 UniformBufferInfo(); 319 320 Resource* buffer; 321 int offset; 322 }; 323 UniformBufferInfo uniformBufferInfo[MAX_UNIFORM_BUFFER_BINDINGS]; 324 325 void setFogRanges(float start, float end); 326 327 Context *const context; 328 329 RoutineCache<State> *routineCache; 330 }; 331 } 332 333 #endif // sw_PixelProcessor_hpp 334