Home | History | Annotate | Download | only in Renderer
      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