10bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
20bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens//
30bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Licensed under the Apache License, Version 2.0 (the "License");
40bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// you may not use this file except in compliance with the License.
50bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// You may obtain a copy of the License at
60bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens//
70bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens//    http://www.apache.org/licenses/LICENSE-2.0
80bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens//
90bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Unless required by applicable law or agreed to in writing, software
100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// distributed under the License is distributed on an "AS IS" BASIS,
110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// See the License for the specific language governing permissions and
130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// limitations under the License.
140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#ifndef sw_PixelProcessor_hpp
160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#define sw_PixelProcessor_hpp
170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "Context.hpp"
190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "RoutineCache.hpp"
200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensnamespace sw
220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{
230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	class PixelShader;
240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	class Rasterizer;
250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	struct Texture;
260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	struct DrawData;
270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	class PixelProcessor
290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	{
300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	public:
310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens		struct States
320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens		{
330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			unsigned int computeHash();
340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			int shaderID;
360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			bool depthOverride                        : 1;
380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			bool shaderContainsKill                   : 1;
390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			DepthCompareMode depthCompareMode         : BITS(DEPTH_LAST);
410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			AlphaCompareMode alphaCompareMode         : BITS(ALPHA_LAST);
420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			bool depthWriteEnable                     : 1;
430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			bool quadLayoutDepthBuffer                : 1;
440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			bool stencilActive                        : 1;
460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			StencilCompareMode stencilCompareMode     : BITS(STENCIL_LAST);
470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			StencilOperation stencilFailOperation     : BITS(OPERATION_LAST);
480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			StencilOperation stencilPassOperation     : BITS(OPERATION_LAST);
490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			StencilOperation stencilZFailOperation    : BITS(OPERATION_LAST);
500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			bool noStencilMask                        : 1;
510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			bool noStencilWriteMask                   : 1;
520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			bool stencilWriteMasked                   : 1;
530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			bool twoSidedStencil                      : 1;
540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			StencilCompareMode stencilCompareModeCCW  : BITS(STENCIL_LAST);
550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			StencilOperation stencilFailOperationCCW  : BITS(OPERATION_LAST);
560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			StencilOperation stencilPassOperationCCW  : BITS(OPERATION_LAST);
570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			StencilOperation stencilZFailOperationCCW : BITS(OPERATION_LAST);
580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			bool noStencilMaskCCW                     : 1;
590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			bool noStencilWriteMaskCCW                : 1;
600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			bool stencilWriteMaskedCCW                : 1;
610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			bool depthTestActive                      : 1;
630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			bool fogActive                            : 1;
640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			FogMode pixelFogMode                      : BITS(FOG_LAST);
650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			bool specularAdd                          : 1;
660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			bool occlusionEnabled                     : 1;
670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			bool wBasedFog                            : 1;
680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			bool perspective                          : 1;
690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			bool alphaBlendActive                     : 1;
710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			BlendFactor sourceBlendFactor             : BITS(BLEND_LAST);
720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			BlendFactor destBlendFactor               : BITS(BLEND_LAST);
730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			BlendOperation blendOperation             : BITS(BLENDOP_LAST);
740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			BlendFactor sourceBlendFactorAlpha        : BITS(BLEND_LAST);
750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			BlendFactor destBlendFactorAlpha          : BITS(BLEND_LAST);
760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			BlendOperation blendOperationAlpha        : BITS(BLENDOP_LAST);
770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			unsigned int colorWriteMask                       : RENDERTARGETS * 4;   // Four component bit masks
790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			Format targetFormat[RENDERTARGETS];
800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			bool writeSRGB                                    : 1;
810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			unsigned int multiSample                          : 3;
820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			unsigned int multiSampleMask                      : 4;
830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			TransparencyAntialiasing transparencyAntialiasing : BITS(TRANSPARENCY_LAST);
840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			bool centroid                                     : 1;
850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			LogicalOperation logicalOperation : BITS(LOGICALOP_LAST);
870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			Sampler::State sampler[TEXTURE_IMAGE_UNITS];
890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			TextureStage::State textureStage[8];
900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			struct Interpolant
920bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			{
930bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens				unsigned char component : 4;
940bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens				unsigned char flat : 4;
950bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens				unsigned char project : 2;
960bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens				bool centroid : 1;
970bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			};
980bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
990bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			union
1000bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			{
1010bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens				struct
1020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens				{
1030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens					Interpolant color[2];
1040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens					Interpolant texture[8];
1053b4c93fea93733b5ab29902ce2b3c864e40d156cNicolas Capens					Interpolant fog;
1060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens				};
1070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1083b4c93fea93733b5ab29902ce2b3c864e40d156cNicolas Capens				Interpolant interpolant[MAX_FRAGMENT_INPUTS];
1090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			};
1100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens		};
1110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens		struct State : States
1130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens		{
1140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			State();
1150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			bool operator==(const State &state) const;
1170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			int colorWriteActive(int index) const
1190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			{
1200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens				return (colorWriteMask >> (index * 4)) & 0xF;
1210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			}
1220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			bool alphaTestActive() const
1240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			{
125a9beed30dd4b2e26452479bc722a35039ce0fb42Alexis Hetu				return (alphaCompareMode != ALPHA_ALWAYS) || (transparencyAntialiasing != TRANSPARENCY_NONE);
1260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			}
1270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			bool pixelFogActive() const
1290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			{
1300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens				return pixelFogMode != FOG_NONE;
1310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			}
1320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			unsigned int hash;
1340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens		};
1350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens		struct Stencil
1370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens		{
1380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			int64_t testMaskQ;
1390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			int64_t referenceMaskedQ;
1400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			int64_t referenceMaskedSignedQ;
1410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			int64_t writeMaskQ;
1420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			int64_t invWriteMaskQ;
1430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			int64_t referenceQ;
1440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			void set(int reference, int testMask, int writeMask)
1460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			{
1470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens				referenceQ = replicate(reference);
1480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens				testMaskQ = replicate(testMask);
1490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens				writeMaskQ = replicate(writeMask);
1500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens				invWriteMaskQ = ~writeMaskQ;
1510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens				referenceMaskedQ = referenceQ & testMaskQ;
1520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens				referenceMaskedSignedQ = replicate((reference + 0x80) & 0xFF & testMask);
1530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			}
1540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			static int64_t replicate(int b)
1560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			{
1570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens				int64_t w = b & 0xFF;
1580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens				return (w << 0) | (w << 8) | (w << 16) | (w << 24) | (w << 32) | (w << 40) | (w << 48) | (w << 56);
1600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			}
1610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens		};
1620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens		struct Fog
1640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens		{
1650bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			float4 scale;
1660bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			float4 offset;
1670bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			word4 color4[3];
1680bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			float4 colorF[3];
1690bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			float4 densityE;
1700bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			float4 density2E;
1710bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens		};
1720bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1730bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens		struct Factor
1740bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens		{
1750bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			word4 textureFactor4[4];
1760bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1770bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			word4 alphaReference4;
1780bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1790bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			word4 blendConstant4W[4];
1800bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			float4 blendConstant4F[4];
1810bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			word4 invBlendConstant4W[4];
1820bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			float4 invBlendConstant4F[4];
1830bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens		};
1840bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1850bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	public:
1860bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens		typedef void (*RoutinePointer)(const Primitive *primitive, int count, int thread, DrawData *draw);
1870bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1880bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens		PixelProcessor(Context *context);
1890bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
1900bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens		virtual ~PixelProcessor();
1910bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
192c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setFloatConstant(unsigned int index, const float value[4]);
193c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setIntegerConstant(unsigned int index, const int value[4]);
194c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setBooleanConstant(unsigned int index, int boolean);
195c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu
196c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setUniformBuffer(int index, sw::Resource* buffer, int offset);
197c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void lockUniformBuffers(byte** u, sw::Resource* uniformBuffers[]);
198c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu
199c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setRenderTarget(int index, Surface *renderTarget);
200c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setDepthBuffer(Surface *depthBuffer);
201c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setStencilBuffer(Surface *stencilBuffer);
202c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu
203c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setTexCoordIndex(unsigned int stage, int texCoordIndex);
204c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setStageOperation(unsigned int stage, TextureStage::StageOperation stageOperation);
205c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setFirstArgument(unsigned int stage, TextureStage::SourceArgument firstArgument);
206c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setSecondArgument(unsigned int stage, TextureStage::SourceArgument secondArgument);
207c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setThirdArgument(unsigned int stage, TextureStage::SourceArgument thirdArgument);
208c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setStageOperationAlpha(unsigned int stage, TextureStage::StageOperation stageOperationAlpha);
209c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setFirstArgumentAlpha(unsigned int stage, TextureStage::SourceArgument firstArgumentAlpha);
210c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setSecondArgumentAlpha(unsigned int stage, TextureStage::SourceArgument secondArgumentAlpha);
211c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setThirdArgumentAlpha(unsigned int stage, TextureStage::SourceArgument thirdArgumentAlpha);
212c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setFirstModifier(unsigned int stage, TextureStage::ArgumentModifier firstModifier);
213c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setSecondModifier(unsigned int stage, TextureStage::ArgumentModifier secondModifier);
214c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setThirdModifier(unsigned int stage, TextureStage::ArgumentModifier thirdModifier);
215c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setFirstModifierAlpha(unsigned int stage, TextureStage::ArgumentModifier firstModifierAlpha);
216c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setSecondModifierAlpha(unsigned int stage, TextureStage::ArgumentModifier secondModifierAlpha);
217c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setThirdModifierAlpha(unsigned int stage, TextureStage::ArgumentModifier thirdModifierAlpha);
218c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setDestinationArgument(unsigned int stage, TextureStage::DestinationArgument destinationArgument);
219c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setConstantColor(unsigned int stage, const Color<float> &constantColor);
220c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setBumpmapMatrix(unsigned int stage, int element, float value);
221c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setLuminanceScale(unsigned int stage, float value);
222c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setLuminanceOffset(unsigned int stage, float value);
223c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu
224c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setTextureFilter(unsigned int sampler, FilterType textureFilter);
225c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setMipmapFilter(unsigned int sampler, MipmapType mipmapFilter);
226c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setGatherEnable(unsigned int sampler, bool enable);
227c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setAddressingModeU(unsigned int sampler, AddressingMode addressingMode);
228c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setAddressingModeV(unsigned int sampler, AddressingMode addressingMode);
229c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setAddressingModeW(unsigned int sampler, AddressingMode addressingMode);
230c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setReadSRGB(unsigned int sampler, bool sRGB);
231c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setMipmapLOD(unsigned int sampler, float bias);
232c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setBorderColor(unsigned int sampler, const Color<float> &borderColor);
233c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setMaxAnisotropy(unsigned int sampler, float maxAnisotropy);
234010a464878f32daed863edee3fc6ad21920d605bAlexis Hetu		void setHighPrecisionFiltering(unsigned int sampler, bool highPrecisionFiltering);
235c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setSwizzleR(unsigned int sampler, SwizzleType swizzleR);
236c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setSwizzleG(unsigned int sampler, SwizzleType swizzleG);
237c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setSwizzleB(unsigned int sampler, SwizzleType swizzleB);
238c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setSwizzleA(unsigned int sampler, SwizzleType swizzleA);
239c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setBaseLevel(unsigned int sampler, int baseLevel);
240c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setMaxLevel(unsigned int sampler, int maxLevel);
241c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setMinLod(unsigned int sampler, float minLod);
242c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setMaxLod(unsigned int sampler, float maxLod);
243c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu
244c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setWriteSRGB(bool sRGB);
245c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setDepthBufferEnable(bool depthBufferEnable);
246c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setDepthCompare(DepthCompareMode depthCompareMode);
247c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setAlphaCompare(AlphaCompareMode alphaCompareMode);
248c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setDepthWriteEnable(bool depthWriteEnable);
249c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setAlphaTestEnable(bool alphaTestEnable);
250c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setCullMode(CullMode cullMode);
251c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setColorWriteMask(int index, int rgbaMask);
252c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu
253c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setColorLogicOpEnabled(bool colorLogicOpEnabled);
254c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setLogicalOperation(LogicalOperation logicalOperation);
255c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu
256c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setStencilEnable(bool stencilEnable);
257c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setStencilCompare(StencilCompareMode stencilCompareMode);
258c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setStencilReference(int stencilReference);
259c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setStencilMask(int stencilMask);
260c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setStencilFailOperation(StencilOperation stencilFailOperation);
261c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setStencilPassOperation(StencilOperation stencilPassOperation);
262c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setStencilZFailOperation(StencilOperation stencilZFailOperation);
263c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setStencilWriteMask(int stencilWriteMask);
264c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setTwoSidedStencil(bool enable);
265c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setStencilCompareCCW(StencilCompareMode stencilCompareMode);
266c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setStencilReferenceCCW(int stencilReference);
267c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setStencilMaskCCW(int stencilMask);
268c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setStencilFailOperationCCW(StencilOperation stencilFailOperation);
269c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setStencilPassOperationCCW(StencilOperation stencilPassOperation);
270c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setStencilZFailOperationCCW(StencilOperation stencilZFailOperation);
271c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setStencilWriteMaskCCW(int stencilWriteMask);
272c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu
273c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setTextureFactor(const Color<float> &textureFactor);
274c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setBlendConstant(const Color<float> &blendConstant);
275c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu
276c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setFillMode(FillMode fillMode);
277c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setShadingMode(ShadingMode shadingMode);
278c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu
279c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setAlphaBlendEnable(bool alphaBlendEnable);
280c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setSourceBlendFactor(BlendFactor sourceBlendFactor);
281c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setDestBlendFactor(BlendFactor destBlendFactor);
282c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setBlendOperation(BlendOperation blendOperation);
283c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu
284c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setSeparateAlphaBlendEnable(bool separateAlphaBlendEnable);
285c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setSourceBlendFactorAlpha(BlendFactor sourceBlendFactorAlpha);
286c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setDestBlendFactorAlpha(BlendFactor destBlendFactorAlpha);
287c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setBlendOperationAlpha(BlendOperation blendOperationAlpha);
288c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu
289c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setAlphaReference(float alphaReference);
290c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu
291c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setGlobalMipmapBias(float bias);
292c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu
293c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setFogStart(float start);
294c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setFogEnd(float end);
295c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setFogColor(Color<float> fogColor);
296c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setFogDensity(float fogDensity);
297c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setPixelFogMode(FogMode fogMode);
298c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu
299c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setPerspectiveCorrection(bool perspectiveCorrection);
300c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu
301c634fb611ee155fb87d6274c26796856e631c9beAlexis Hetu		void setOcclusionEnabled(bool enable);
3020bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
3030bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	protected:
3040bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens		const State update() const;
3050bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens		Routine *routine(const State &state);
3060bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens		void setRoutineCacheSize(int routineCacheSize);
3070bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
3080bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens		// Shader constants
3090bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens		word4 cW[8][4];
3100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens		float4 c[FRAGMENT_UNIFORM_VECTORS];
3110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens		int4 i[16];
3120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens		bool b[16];
3130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
3140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens		// Other semi-constants
3150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens		Stencil stencil;
3160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens		Stencil stencilCCW;
3170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens		Fog fog;
3180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens		Factor factor;
3190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
3200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	private:
3210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens		struct UniformBufferInfo
3220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens		{
3230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			UniformBufferInfo();
3240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
3250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			Resource* buffer;
3260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens			int offset;
3270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens		};
3280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens		UniformBufferInfo uniformBufferInfo[MAX_UNIFORM_BUFFER_BINDINGS];
3290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
3300bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens		void setFogRanges(float start, float end);
3310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
3320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens		Context *const context;
3330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
3340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens		RoutineCache<State> *routineCache;
3350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens	};
3360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens}
3370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens
3380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#endif   // sw_PixelProcessor_hpp
339