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 
colorWriteActivesw::PixelProcessor::State118 			int colorWriteActive(int index) const
119 			{
120 				return (colorWriteMask >> (index * 4)) & 0xF;
121 			}
122 
alphaTestActivesw::PixelProcessor::State123 			bool alphaTestActive() const
124 			{
125 				return alphaCompareMode != ALPHA_ALWAYS;
126 			}
127 
pixelFogActivesw::PixelProcessor::State128 			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 
setsw::PixelProcessor::Stencil145 			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 
replicatesw::PixelProcessor::Stencil155 			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