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