blob: bfa34763b111729383fbe7051fcb9b9292f5afd7 [file] [log] [blame]
Nicolas Capens0bac2852016-05-07 06:09:58 -04001// 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
21namespace 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];
Nicolas Capens3b4c93f2016-05-18 12:51:37 -0400105 Interpolant fog;
Nicolas Capens0bac2852016-05-07 06:09:58 -0400106 };
107
Nicolas Capens3b4c93f2016-05-18 12:51:37 -0400108 Interpolant interpolant[MAX_FRAGMENT_INPUTS];
Nicolas Capens0bac2852016-05-07 06:09:58 -0400109 };
Nicolas Capens0bac2852016-05-07 06:09:58 -0400110 };
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);
Nicolas Capens3b4c93f2016-05-18 12:51:37 -0400273
Nicolas Capens0bac2852016-05-07 06:09:58 -0400274 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