1 // Copyright 2016 The SwiftShader Authors. All Rights Reserved.
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
7 // http://www.apache.org/licenses/LICENSE-2.0
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.
15 #ifndef sw_PixelProcessor_hpp
16 #define sw_PixelProcessor_hpp
18 #include "Context.hpp"
19 #include "RoutineCache.hpp"
33 unsigned int computeHash();
37 bool depthOverride : 1;
38 bool shaderContainsKill : 1;
40 DepthCompareMode depthCompareMode : BITS(DEPTH_LAST);
41 AlphaCompareMode alphaCompareMode : BITS(ALPHA_LAST);
42 bool depthWriteEnable : 1;
43 bool quadLayoutDepthBuffer : 1;
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;
62 bool depthTestActive : 1;
64 FogMode pixelFogMode : BITS(FOG_LAST);
66 bool occlusionEnabled : 1;
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);
78 unsigned int colorWriteMask : RENDERTARGETS * 4; // Four component bit masks
79 Format targetFormat[RENDERTARGETS];
81 unsigned int multiSample : 3;
82 unsigned int multiSampleMask : 4;
83 TransparencyAntialiasing transparencyAntialiasing : BITS(TRANSPARENCY_LAST);
86 LogicalOperation logicalOperation : BITS(LOGICALOP_LAST);
88 Sampler::State sampler[TEXTURE_IMAGE_UNITS];
89 TextureStage::State textureStage[8];
93 unsigned char component : 4;
94 unsigned char flat : 4;
95 unsigned char project : 2;
103 Interpolant color[2];
104 Interpolant texture[8];
108 Interpolant interpolant[MAX_FRAGMENT_INPUTS];
112 struct State : States
116 bool operator==(const State &state) const;
118 int colorWriteActive(int index) const
120 return (colorWriteMask >> (index * 4)) & 0xF;
123 bool alphaTestActive() const
125 return (alphaCompareMode != ALPHA_ALWAYS) || (transparencyAntialiasing != TRANSPARENCY_NONE);
128 bool pixelFogActive() const
130 return pixelFogMode != FOG_NONE;
139 int64_t referenceMaskedQ;
140 int64_t referenceMaskedSignedQ;
142 int64_t invWriteMaskQ;
145 void set(int reference, int testMask, int writeMask)
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);
155 static int64_t replicate(int b)
157 int64_t w = b & 0xFF;
159 return (w << 0) | (w << 8) | (w << 16) | (w << 24) | (w << 32) | (w << 40) | (w << 48) | (w << 56);
175 word4 textureFactor4[4];
177 word4 alphaReference4;
179 word4 blendConstant4W[4];
180 float4 blendConstant4F[4];
181 word4 invBlendConstant4W[4];
182 float4 invBlendConstant4F[4];
186 typedef void (*RoutinePointer)(const Primitive *primitive, int count, int thread, DrawData *draw);
188 PixelProcessor(Context *context);
190 virtual ~PixelProcessor();
192 void setFloatConstant(unsigned int index, const float value[4]);
193 void setIntegerConstant(unsigned int index, const int value[4]);
194 void setBooleanConstant(unsigned int index, int boolean);
196 void setUniformBuffer(int index, sw::Resource* buffer, int offset);
197 void lockUniformBuffers(byte** u, sw::Resource* uniformBuffers[]);
199 void setRenderTarget(int index, Surface *renderTarget);
200 void setDepthBuffer(Surface *depthBuffer);
201 void setStencilBuffer(Surface *stencilBuffer);
203 void setTexCoordIndex(unsigned int stage, int texCoordIndex);
204 void setStageOperation(unsigned int stage, TextureStage::StageOperation stageOperation);
205 void setFirstArgument(unsigned int stage, TextureStage::SourceArgument firstArgument);
206 void setSecondArgument(unsigned int stage, TextureStage::SourceArgument secondArgument);
207 void setThirdArgument(unsigned int stage, TextureStage::SourceArgument thirdArgument);
208 void setStageOperationAlpha(unsigned int stage, TextureStage::StageOperation stageOperationAlpha);
209 void setFirstArgumentAlpha(unsigned int stage, TextureStage::SourceArgument firstArgumentAlpha);
210 void setSecondArgumentAlpha(unsigned int stage, TextureStage::SourceArgument secondArgumentAlpha);
211 void setThirdArgumentAlpha(unsigned int stage, TextureStage::SourceArgument thirdArgumentAlpha);
212 void setFirstModifier(unsigned int stage, TextureStage::ArgumentModifier firstModifier);
213 void setSecondModifier(unsigned int stage, TextureStage::ArgumentModifier secondModifier);
214 void setThirdModifier(unsigned int stage, TextureStage::ArgumentModifier thirdModifier);
215 void setFirstModifierAlpha(unsigned int stage, TextureStage::ArgumentModifier firstModifierAlpha);
216 void setSecondModifierAlpha(unsigned int stage, TextureStage::ArgumentModifier secondModifierAlpha);
217 void setThirdModifierAlpha(unsigned int stage, TextureStage::ArgumentModifier thirdModifierAlpha);
218 void setDestinationArgument(unsigned int stage, TextureStage::DestinationArgument destinationArgument);
219 void setConstantColor(unsigned int stage, const Color<float> &constantColor);
220 void setBumpmapMatrix(unsigned int stage, int element, float value);
221 void setLuminanceScale(unsigned int stage, float value);
222 void setLuminanceOffset(unsigned int stage, float value);
224 void setTextureFilter(unsigned int sampler, FilterType textureFilter);
225 void setMipmapFilter(unsigned int sampler, MipmapType mipmapFilter);
226 void setGatherEnable(unsigned int sampler, bool enable);
227 void setAddressingModeU(unsigned int sampler, AddressingMode addressingMode);
228 void setAddressingModeV(unsigned int sampler, AddressingMode addressingMode);
229 void setAddressingModeW(unsigned int sampler, AddressingMode addressingMode);
230 void setReadSRGB(unsigned int sampler, bool sRGB);
231 void setMipmapLOD(unsigned int sampler, float bias);
232 void setBorderColor(unsigned int sampler, const Color<float> &borderColor);
233 void setMaxAnisotropy(unsigned int sampler, float maxAnisotropy);
234 void setHighPrecisionFiltering(unsigned int sampler, bool highPrecisionFiltering);
235 void setSwizzleR(unsigned int sampler, SwizzleType swizzleR);
236 void setSwizzleG(unsigned int sampler, SwizzleType swizzleG);
237 void setSwizzleB(unsigned int sampler, SwizzleType swizzleB);
238 void setSwizzleA(unsigned int sampler, SwizzleType swizzleA);
239 void setBaseLevel(unsigned int sampler, int baseLevel);
240 void setMaxLevel(unsigned int sampler, int maxLevel);
241 void setMinLod(unsigned int sampler, float minLod);
242 void setMaxLod(unsigned int sampler, float maxLod);
244 void setWriteSRGB(bool sRGB);
245 void setDepthBufferEnable(bool depthBufferEnable);
246 void setDepthCompare(DepthCompareMode depthCompareMode);
247 void setAlphaCompare(AlphaCompareMode alphaCompareMode);
248 void setDepthWriteEnable(bool depthWriteEnable);
249 void setAlphaTestEnable(bool alphaTestEnable);
250 void setCullMode(CullMode cullMode);
251 void setColorWriteMask(int index, int rgbaMask);
253 void setColorLogicOpEnabled(bool colorLogicOpEnabled);
254 void setLogicalOperation(LogicalOperation logicalOperation);
256 void setStencilEnable(bool stencilEnable);
257 void setStencilCompare(StencilCompareMode stencilCompareMode);
258 void setStencilReference(int stencilReference);
259 void setStencilMask(int stencilMask);
260 void setStencilFailOperation(StencilOperation stencilFailOperation);
261 void setStencilPassOperation(StencilOperation stencilPassOperation);
262 void setStencilZFailOperation(StencilOperation stencilZFailOperation);
263 void setStencilWriteMask(int stencilWriteMask);
264 void setTwoSidedStencil(bool enable);
265 void setStencilCompareCCW(StencilCompareMode stencilCompareMode);
266 void setStencilReferenceCCW(int stencilReference);
267 void setStencilMaskCCW(int stencilMask);
268 void setStencilFailOperationCCW(StencilOperation stencilFailOperation);
269 void setStencilPassOperationCCW(StencilOperation stencilPassOperation);
270 void setStencilZFailOperationCCW(StencilOperation stencilZFailOperation);
271 void setStencilWriteMaskCCW(int stencilWriteMask);
273 void setTextureFactor(const Color<float> &textureFactor);
274 void setBlendConstant(const Color<float> &blendConstant);
276 void setFillMode(FillMode fillMode);
277 void setShadingMode(ShadingMode shadingMode);
279 void setAlphaBlendEnable(bool alphaBlendEnable);
280 void setSourceBlendFactor(BlendFactor sourceBlendFactor);
281 void setDestBlendFactor(BlendFactor destBlendFactor);
282 void setBlendOperation(BlendOperation blendOperation);
284 void setSeparateAlphaBlendEnable(bool separateAlphaBlendEnable);
285 void setSourceBlendFactorAlpha(BlendFactor sourceBlendFactorAlpha);
286 void setDestBlendFactorAlpha(BlendFactor destBlendFactorAlpha);
287 void setBlendOperationAlpha(BlendOperation blendOperationAlpha);
289 void setAlphaReference(float alphaReference);
291 void setGlobalMipmapBias(float bias);
293 void setFogStart(float start);
294 void setFogEnd(float end);
295 void setFogColor(Color<float> fogColor);
296 void setFogDensity(float fogDensity);
297 void setPixelFogMode(FogMode fogMode);
299 void setPerspectiveCorrection(bool perspectiveCorrection);
301 void setOcclusionEnabled(bool enable);
304 const State update() const;
305 Routine *routine(const State &state);
306 void setRoutineCacheSize(int routineCacheSize);
310 float4 c[FRAGMENT_UNIFORM_VECTORS];
314 // Other semi-constants
321 struct UniformBufferInfo
328 UniformBufferInfo uniformBufferInfo[MAX_UNIFORM_BUFFER_BINDINGS];
330 void setFogRanges(float start, float end);
332 Context *const context;
334 RoutineCache<State> *routineCache;
338 #endif // sw_PixelProcessor_hpp