Apply the Apache 2.0 license.

Change-Id: I4a7aeefedcd2d891093520d5a10ebefadcddb5be
Reviewed-on: https://swiftshader-review.googlesource.com/5320
Reviewed-by: Nicolas Capens <capn@google.com>
Tested-by: Nicolas Capens <capn@google.com>
diff --git a/src/Renderer/PixelProcessor.hpp b/src/Renderer/PixelProcessor.hpp
index 104f377..88fd654 100644
--- a/src/Renderer/PixelProcessor.hpp
+++ b/src/Renderer/PixelProcessor.hpp
@@ -1,331 +1,334 @@
-// SwiftShader Software Renderer

-//

-// Copyright(c) 2005-2012 TransGaming Inc.

-//

-// All rights reserved. No part of this software may be copied, distributed, transmitted,

-// transcribed, stored in a retrieval system, translated into any human or computer

-// language by any means, or disclosed to third parties without the explicit written

-// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express

-// or implied, including but not limited to any patent rights, are granted to you.

-//

-

-#ifndef sw_PixelProcessor_hpp

-#define sw_PixelProcessor_hpp

-

-#include "Context.hpp"

-#include "RoutineCache.hpp"

-

-namespace sw

-{

-	class PixelShader;

-	class Rasterizer;

-	struct Texture;

-	struct DrawData;

-

-	class PixelProcessor

-	{

-	public:

-		struct States

-		{

-			unsigned int computeHash();

-

-			int shaderID;

-

-			bool depthOverride                        : 1;

-			bool shaderContainsKill                   : 1;

-

-			DepthCompareMode depthCompareMode         : BITS(DEPTH_LAST);

-			AlphaCompareMode alphaCompareMode         : BITS(ALPHA_LAST);

-			bool depthWriteEnable                     : 1;

-			bool quadLayoutDepthBuffer                : 1;

-

-			bool stencilActive                        : 1;

-			StencilCompareMode stencilCompareMode     : BITS(STENCIL_LAST);

-			StencilOperation stencilFailOperation     : BITS(OPERATION_LAST);

-			StencilOperation stencilPassOperation     : BITS(OPERATION_LAST);

-			StencilOperation stencilZFailOperation    : BITS(OPERATION_LAST);

-			bool noStencilMask                        : 1;

-			bool noStencilWriteMask                   : 1;

-			bool stencilWriteMasked                   : 1;

-			bool twoSidedStencil                      : 1;

-			StencilCompareMode stencilCompareModeCCW  : BITS(STENCIL_LAST);

-			StencilOperation stencilFailOperationCCW  : BITS(OPERATION_LAST);

-			StencilOperation stencilPassOperationCCW  : BITS(OPERATION_LAST);

-			StencilOperation stencilZFailOperationCCW : BITS(OPERATION_LAST);

-			bool noStencilMaskCCW                     : 1;

-			bool noStencilWriteMaskCCW                : 1;

-			bool stencilWriteMaskedCCW                : 1;

-

-			bool depthTestActive                      : 1;

-			bool fogActive                            : 1;

-			FogMode pixelFogMode                      : BITS(FOG_LAST);

-			bool specularAdd                          : 1;

-			bool occlusionEnabled                     : 1;

-			bool wBasedFog                            : 1;

-			bool perspective                          : 1;

-

-			bool alphaBlendActive                     : 1;

-			BlendFactor sourceBlendFactor             : BITS(BLEND_LAST);

-			BlendFactor destBlendFactor               : BITS(BLEND_LAST);

-			BlendOperation blendOperation             : BITS(BLENDOP_LAST);

-			BlendFactor sourceBlendFactorAlpha        : BITS(BLEND_LAST);

-			BlendFactor destBlendFactorAlpha          : BITS(BLEND_LAST);

-			BlendOperation blendOperationAlpha        : BITS(BLENDOP_LAST);

-

-			unsigned int colorWriteMask                       : RENDERTARGETS * 4;   // Four component bit masks

-			Format targetFormat[RENDERTARGETS];

-			bool writeSRGB                                    : 1;

-			unsigned int multiSample                          : 3;

-			unsigned int multiSampleMask                      : 4;

-			TransparencyAntialiasing transparencyAntialiasing : BITS(TRANSPARENCY_LAST);

-			bool centroid                                     : 1;

-

-			LogicalOperation logicalOperation : BITS(LOGICALOP_LAST);

-

-			Sampler::State sampler[TEXTURE_IMAGE_UNITS];

-			TextureStage::State textureStage[8];

-

-			struct Interpolant

-			{

-				unsigned char component : 4;

-				unsigned char flat : 4;

-				unsigned char project : 2;

-				bool centroid : 1;

-			};

-

-			union

-			{

-				struct

-				{

-					Interpolant color[2];

-					Interpolant texture[8];

-				};

-

-				Interpolant interpolant[10];

-			};

-

-			Interpolant fog;

-		};

-

-		struct State : States

-		{

-			State();

-

-			bool operator==(const State &state) const;

-

-			int colorWriteActive(int index) const

-			{

-				return (colorWriteMask >> (index * 4)) & 0xF;

-			}

-

-			bool alphaTestActive() const

-			{

-				return alphaCompareMode != ALPHA_ALWAYS;

-			}

-

-			bool pixelFogActive() const

-			{

-				return pixelFogMode != FOG_NONE;

-			}

-

-			unsigned int hash;

-		};

-

-		struct Stencil

-		{

-			int64_t testMaskQ;

-			int64_t referenceMaskedQ;

-			int64_t referenceMaskedSignedQ;

-			int64_t writeMaskQ;

-			int64_t invWriteMaskQ;

-			int64_t referenceQ;

-

-			void set(int reference, int testMask, int writeMask)

-			{

-				referenceQ = replicate(reference);

-				testMaskQ = replicate(testMask);

-				writeMaskQ = replicate(writeMask);

-				invWriteMaskQ = ~writeMaskQ;

-				referenceMaskedQ = referenceQ & testMaskQ;

-				referenceMaskedSignedQ = replicate((reference + 0x80) & 0xFF & testMask);

-			}

-

-			static int64_t replicate(int b)

-			{

-				int64_t w = b & 0xFF;

-

-				return (w << 0) | (w << 8) | (w << 16) | (w << 24) | (w << 32) | (w << 40) | (w << 48) | (w << 56);

-			}

-		};

-

-		struct Fog

-		{

-			float4 scale;

-			float4 offset;

-			word4 color4[3];

-			float4 colorF[3];

-			float4 densityE;

-			float4 density2E;

-		};

-

-		struct Factor

-		{

-			word4 textureFactor4[4];

-

-			word4 alphaReference4;

-

-			word4 blendConstant4W[4];

-			float4 blendConstant4F[4];

-			word4 invBlendConstant4W[4];

-			float4 invBlendConstant4F[4];

-		};

-

-	public:

-		typedef void (*RoutinePointer)(const Primitive *primitive, int count, int thread, DrawData *draw);

-

-		PixelProcessor(Context *context);

-

-		virtual ~PixelProcessor();

-

-		virtual void setFloatConstant(unsigned int index, const float value[4]);

-		virtual void setIntegerConstant(unsigned int index, const int value[4]);

-		virtual void setBooleanConstant(unsigned int index, int boolean);

-

-		virtual void setUniformBuffer(int index, sw::Resource* buffer, int offset);

-		virtual void lockUniformBuffers(byte** u, sw::Resource* uniformBuffers[]);

-

-		virtual void setRenderTarget(int index, Surface *renderTarget);

-		virtual void setDepthBuffer(Surface *depthBuffer);

-		virtual void setStencilBuffer(Surface *stencilBuffer);

-

-		virtual void setTexCoordIndex(unsigned int stage, int texCoordIndex);

-		virtual void setStageOperation(unsigned int stage, TextureStage::StageOperation stageOperation);

-		virtual void setFirstArgument(unsigned int stage, TextureStage::SourceArgument firstArgument);

-		virtual void setSecondArgument(unsigned int stage, TextureStage::SourceArgument secondArgument);

-		virtual void setThirdArgument(unsigned int stage, TextureStage::SourceArgument thirdArgument);

-		virtual void setStageOperationAlpha(unsigned int stage, TextureStage::StageOperation stageOperationAlpha);

-		virtual void setFirstArgumentAlpha(unsigned int stage, TextureStage::SourceArgument firstArgumentAlpha);

-		virtual void setSecondArgumentAlpha(unsigned int stage, TextureStage::SourceArgument secondArgumentAlpha);

-		virtual void setThirdArgumentAlpha(unsigned int stage, TextureStage::SourceArgument thirdArgumentAlpha);

-		virtual void setFirstModifier(unsigned int stage, TextureStage::ArgumentModifier firstModifier);

-		virtual void setSecondModifier(unsigned int stage, TextureStage::ArgumentModifier secondModifier);

-		virtual void setThirdModifier(unsigned int stage, TextureStage::ArgumentModifier thirdModifier);

-		virtual void setFirstModifierAlpha(unsigned int stage, TextureStage::ArgumentModifier firstModifierAlpha);

-		virtual void setSecondModifierAlpha(unsigned int stage, TextureStage::ArgumentModifier secondModifierAlpha);

-		virtual void setThirdModifierAlpha(unsigned int stage, TextureStage::ArgumentModifier thirdModifierAlpha);

-		virtual void setDestinationArgument(unsigned int stage, TextureStage::DestinationArgument destinationArgument);

-		virtual void setConstantColor(unsigned int stage, const Color<float> &constantColor);

-		virtual void setBumpmapMatrix(unsigned int stage, int element, float value);

-		virtual void setLuminanceScale(unsigned int stage, float value);

-		virtual void setLuminanceOffset(unsigned int stage, float value);

-

-		virtual void setTextureFilter(unsigned int sampler, FilterType textureFilter);

-		virtual void setMipmapFilter(unsigned int sampler, MipmapType mipmapFilter);

-		virtual void setGatherEnable(unsigned int sampler, bool enable);

-		virtual void setAddressingModeU(unsigned int sampler, AddressingMode addressingMode);

-		virtual void setAddressingModeV(unsigned int sampler, AddressingMode addressingMode);

-		virtual void setAddressingModeW(unsigned int sampler, AddressingMode addressingMode);

-		virtual void setReadSRGB(unsigned int sampler, bool sRGB);

-		virtual void setMipmapLOD(unsigned int sampler, float bias);

-		virtual void setBorderColor(unsigned int sampler, const Color<float> &borderColor);

-		virtual void setMaxAnisotropy(unsigned int sampler, float maxAnisotropy);

-		virtual void setSwizzleR(unsigned int sampler, SwizzleType swizzleR);

-		virtual void setSwizzleG(unsigned int sampler, SwizzleType swizzleG);

-		virtual void setSwizzleB(unsigned int sampler, SwizzleType swizzleB);

-		virtual void setSwizzleA(unsigned int sampler, SwizzleType swizzleA);

-

-		virtual void setWriteSRGB(bool sRGB);

-		virtual void setDepthBufferEnable(bool depthBufferEnable);

-		virtual void setDepthCompare(DepthCompareMode depthCompareMode);

-		virtual void setAlphaCompare(AlphaCompareMode alphaCompareMode);

-		virtual void setDepthWriteEnable(bool depthWriteEnable);

-		virtual void setAlphaTestEnable(bool alphaTestEnable);

-		virtual void setCullMode(CullMode cullMode);

-		virtual void setColorWriteMask(int index, int rgbaMask);

-

-		virtual void setColorLogicOpEnabled(bool colorLogicOpEnabled);

-		virtual void setLogicalOperation(LogicalOperation logicalOperation);

-

-		virtual void setStencilEnable(bool stencilEnable);

-		virtual void setStencilCompare(StencilCompareMode stencilCompareMode);

-		virtual void setStencilReference(int stencilReference);

-		virtual void setStencilMask(int stencilMask);

-		virtual void setStencilFailOperation(StencilOperation stencilFailOperation);

-		virtual void setStencilPassOperation(StencilOperation stencilPassOperation);

-		virtual void setStencilZFailOperation(StencilOperation stencilZFailOperation);

-		virtual void setStencilWriteMask(int stencilWriteMask);

-		virtual void setTwoSidedStencil(bool enable);

-		virtual void setStencilCompareCCW(StencilCompareMode stencilCompareMode);

-		virtual void setStencilReferenceCCW(int stencilReference);

-		virtual void setStencilMaskCCW(int stencilMask);

-		virtual void setStencilFailOperationCCW(StencilOperation stencilFailOperation);

-		virtual void setStencilPassOperationCCW(StencilOperation stencilPassOperation);

-		virtual void setStencilZFailOperationCCW(StencilOperation stencilZFailOperation);

-		virtual void setStencilWriteMaskCCW(int stencilWriteMask);

-

-		virtual void setTextureFactor(const Color<float> &textureFactor);

-		virtual void setBlendConstant(const Color<float> &blendConstant);

-

-		virtual void setFillMode(FillMode fillMode);

-		virtual void setShadingMode(ShadingMode shadingMode);

-		

-		virtual void setAlphaBlendEnable(bool alphaBlendEnable);

-		virtual void setSourceBlendFactor(BlendFactor sourceBlendFactor);

-		virtual void setDestBlendFactor(BlendFactor destBlendFactor);

-		virtual void setBlendOperation(BlendOperation blendOperation);

-

-		virtual void setSeparateAlphaBlendEnable(bool separateAlphaBlendEnable);

-		virtual void setSourceBlendFactorAlpha(BlendFactor sourceBlendFactorAlpha);

-		virtual void setDestBlendFactorAlpha(BlendFactor destBlendFactorAlpha);

-		virtual void setBlendOperationAlpha(BlendOperation blendOperationAlpha);

-

-		virtual void setAlphaReference(float alphaReference);

-

-		virtual void setGlobalMipmapBias(float bias);

-

-		virtual void setFogStart(float start);

-		virtual void setFogEnd(float end);

-		virtual void setFogColor(Color<float> fogColor);

-		virtual void setFogDensity(float fogDensity);

-		virtual void setPixelFogMode(FogMode fogMode);

-

-		virtual void setPerspectiveCorrection(bool perspectiveCorrection);

-

-		virtual void setOcclusionEnabled(bool enable);

-

-	protected:

-		const State update() const;

-		Routine *routine(const State &state);

-		void setRoutineCacheSize(int routineCacheSize);

-

-		// Shader constants

-		word4 cW[8][4];

-		float4 c[FRAGMENT_UNIFORM_VECTORS];

-		int4 i[16];

-		bool b[16];

-

-		// Other semi-constants

-		Stencil stencil;

-		Stencil stencilCCW;

-		Fog fog;

-		Factor factor;

-

-	private:

-		struct UniformBufferInfo

-		{

-			UniformBufferInfo();

-

-			Resource* buffer;

-			int offset;

-		};

-		UniformBufferInfo uniformBufferInfo[MAX_UNIFORM_BUFFER_BINDINGS];

-

-		void setFogRanges(float start, float end);

-

-		Context *const context;

-

-		RoutineCache<State> *routineCache;

-	};

-}

-

-#endif   // sw_PixelProcessor_hpp

+// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//    http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef sw_PixelProcessor_hpp
+#define sw_PixelProcessor_hpp
+
+#include "Context.hpp"
+#include "RoutineCache.hpp"
+
+namespace sw
+{
+	class PixelShader;
+	class Rasterizer;
+	struct Texture;
+	struct DrawData;
+
+	class PixelProcessor
+	{
+	public:
+		struct States
+		{
+			unsigned int computeHash();
+
+			int shaderID;
+
+			bool depthOverride                        : 1;
+			bool shaderContainsKill                   : 1;
+
+			DepthCompareMode depthCompareMode         : BITS(DEPTH_LAST);
+			AlphaCompareMode alphaCompareMode         : BITS(ALPHA_LAST);
+			bool depthWriteEnable                     : 1;
+			bool quadLayoutDepthBuffer                : 1;
+
+			bool stencilActive                        : 1;
+			StencilCompareMode stencilCompareMode     : BITS(STENCIL_LAST);
+			StencilOperation stencilFailOperation     : BITS(OPERATION_LAST);
+			StencilOperation stencilPassOperation     : BITS(OPERATION_LAST);
+			StencilOperation stencilZFailOperation    : BITS(OPERATION_LAST);
+			bool noStencilMask                        : 1;
+			bool noStencilWriteMask                   : 1;
+			bool stencilWriteMasked                   : 1;
+			bool twoSidedStencil                      : 1;
+			StencilCompareMode stencilCompareModeCCW  : BITS(STENCIL_LAST);
+			StencilOperation stencilFailOperationCCW  : BITS(OPERATION_LAST);
+			StencilOperation stencilPassOperationCCW  : BITS(OPERATION_LAST);
+			StencilOperation stencilZFailOperationCCW : BITS(OPERATION_LAST);
+			bool noStencilMaskCCW                     : 1;
+			bool noStencilWriteMaskCCW                : 1;
+			bool stencilWriteMaskedCCW                : 1;
+
+			bool depthTestActive                      : 1;
+			bool fogActive                            : 1;
+			FogMode pixelFogMode                      : BITS(FOG_LAST);
+			bool specularAdd                          : 1;
+			bool occlusionEnabled                     : 1;
+			bool wBasedFog                            : 1;
+			bool perspective                          : 1;
+
+			bool alphaBlendActive                     : 1;
+			BlendFactor sourceBlendFactor             : BITS(BLEND_LAST);
+			BlendFactor destBlendFactor               : BITS(BLEND_LAST);
+			BlendOperation blendOperation             : BITS(BLENDOP_LAST);
+			BlendFactor sourceBlendFactorAlpha        : BITS(BLEND_LAST);
+			BlendFactor destBlendFactorAlpha          : BITS(BLEND_LAST);
+			BlendOperation blendOperationAlpha        : BITS(BLENDOP_LAST);
+
+			unsigned int colorWriteMask                       : RENDERTARGETS * 4;   // Four component bit masks
+			Format targetFormat[RENDERTARGETS];
+			bool writeSRGB                                    : 1;
+			unsigned int multiSample                          : 3;
+			unsigned int multiSampleMask                      : 4;
+			TransparencyAntialiasing transparencyAntialiasing : BITS(TRANSPARENCY_LAST);
+			bool centroid                                     : 1;
+
+			LogicalOperation logicalOperation : BITS(LOGICALOP_LAST);
+
+			Sampler::State sampler[TEXTURE_IMAGE_UNITS];
+			TextureStage::State textureStage[8];
+
+			struct Interpolant
+			{
+				unsigned char component : 4;
+				unsigned char flat : 4;
+				unsigned char project : 2;
+				bool centroid : 1;
+			};
+
+			union
+			{
+				struct
+				{
+					Interpolant color[2];
+					Interpolant texture[8];
+				};
+
+				Interpolant interpolant[10];
+			};
+
+			Interpolant fog;
+		};
+
+		struct State : States
+		{
+			State();
+
+			bool operator==(const State &state) const;
+
+			int colorWriteActive(int index) const
+			{
+				return (colorWriteMask >> (index * 4)) & 0xF;
+			}
+
+			bool alphaTestActive() const
+			{
+				return alphaCompareMode != ALPHA_ALWAYS;
+			}
+
+			bool pixelFogActive() const
+			{
+				return pixelFogMode != FOG_NONE;
+			}
+
+			unsigned int hash;
+		};
+
+		struct Stencil
+		{
+			int64_t testMaskQ;
+			int64_t referenceMaskedQ;
+			int64_t referenceMaskedSignedQ;
+			int64_t writeMaskQ;
+			int64_t invWriteMaskQ;
+			int64_t referenceQ;
+
+			void set(int reference, int testMask, int writeMask)
+			{
+				referenceQ = replicate(reference);
+				testMaskQ = replicate(testMask);
+				writeMaskQ = replicate(writeMask);
+				invWriteMaskQ = ~writeMaskQ;
+				referenceMaskedQ = referenceQ & testMaskQ;
+				referenceMaskedSignedQ = replicate((reference + 0x80) & 0xFF & testMask);
+			}
+
+			static int64_t replicate(int b)
+			{
+				int64_t w = b & 0xFF;
+
+				return (w << 0) | (w << 8) | (w << 16) | (w << 24) | (w << 32) | (w << 40) | (w << 48) | (w << 56);
+			}
+		};
+
+		struct Fog
+		{
+			float4 scale;
+			float4 offset;
+			word4 color4[3];
+			float4 colorF[3];
+			float4 densityE;
+			float4 density2E;
+		};
+
+		struct Factor
+		{
+			word4 textureFactor4[4];
+
+			word4 alphaReference4;
+
+			word4 blendConstant4W[4];
+			float4 blendConstant4F[4];
+			word4 invBlendConstant4W[4];
+			float4 invBlendConstant4F[4];
+		};
+
+	public:
+		typedef void (*RoutinePointer)(const Primitive *primitive, int count, int thread, DrawData *draw);
+
+		PixelProcessor(Context *context);
+
+		virtual ~PixelProcessor();
+
+		virtual void setFloatConstant(unsigned int index, const float value[4]);
+		virtual void setIntegerConstant(unsigned int index, const int value[4]);
+		virtual void setBooleanConstant(unsigned int index, int boolean);
+
+		virtual void setUniformBuffer(int index, sw::Resource* buffer, int offset);
+		virtual void lockUniformBuffers(byte** u, sw::Resource* uniformBuffers[]);
+
+		virtual void setRenderTarget(int index, Surface *renderTarget);
+		virtual void setDepthBuffer(Surface *depthBuffer);
+		virtual void setStencilBuffer(Surface *stencilBuffer);
+
+		virtual void setTexCoordIndex(unsigned int stage, int texCoordIndex);
+		virtual void setStageOperation(unsigned int stage, TextureStage::StageOperation stageOperation);
+		virtual void setFirstArgument(unsigned int stage, TextureStage::SourceArgument firstArgument);
+		virtual void setSecondArgument(unsigned int stage, TextureStage::SourceArgument secondArgument);
+		virtual void setThirdArgument(unsigned int stage, TextureStage::SourceArgument thirdArgument);
+		virtual void setStageOperationAlpha(unsigned int stage, TextureStage::StageOperation stageOperationAlpha);
+		virtual void setFirstArgumentAlpha(unsigned int stage, TextureStage::SourceArgument firstArgumentAlpha);
+		virtual void setSecondArgumentAlpha(unsigned int stage, TextureStage::SourceArgument secondArgumentAlpha);
+		virtual void setThirdArgumentAlpha(unsigned int stage, TextureStage::SourceArgument thirdArgumentAlpha);
+		virtual void setFirstModifier(unsigned int stage, TextureStage::ArgumentModifier firstModifier);
+		virtual void setSecondModifier(unsigned int stage, TextureStage::ArgumentModifier secondModifier);
+		virtual void setThirdModifier(unsigned int stage, TextureStage::ArgumentModifier thirdModifier);
+		virtual void setFirstModifierAlpha(unsigned int stage, TextureStage::ArgumentModifier firstModifierAlpha);
+		virtual void setSecondModifierAlpha(unsigned int stage, TextureStage::ArgumentModifier secondModifierAlpha);
+		virtual void setThirdModifierAlpha(unsigned int stage, TextureStage::ArgumentModifier thirdModifierAlpha);
+		virtual void setDestinationArgument(unsigned int stage, TextureStage::DestinationArgument destinationArgument);
+		virtual void setConstantColor(unsigned int stage, const Color<float> &constantColor);
+		virtual void setBumpmapMatrix(unsigned int stage, int element, float value);
+		virtual void setLuminanceScale(unsigned int stage, float value);
+		virtual void setLuminanceOffset(unsigned int stage, float value);
+
+		virtual void setTextureFilter(unsigned int sampler, FilterType textureFilter);
+		virtual void setMipmapFilter(unsigned int sampler, MipmapType mipmapFilter);
+		virtual void setGatherEnable(unsigned int sampler, bool enable);
+		virtual void setAddressingModeU(unsigned int sampler, AddressingMode addressingMode);
+		virtual void setAddressingModeV(unsigned int sampler, AddressingMode addressingMode);
+		virtual void setAddressingModeW(unsigned int sampler, AddressingMode addressingMode);
+		virtual void setReadSRGB(unsigned int sampler, bool sRGB);
+		virtual void setMipmapLOD(unsigned int sampler, float bias);
+		virtual void setBorderColor(unsigned int sampler, const Color<float> &borderColor);
+		virtual void setMaxAnisotropy(unsigned int sampler, float maxAnisotropy);
+		virtual void setSwizzleR(unsigned int sampler, SwizzleType swizzleR);
+		virtual void setSwizzleG(unsigned int sampler, SwizzleType swizzleG);
+		virtual void setSwizzleB(unsigned int sampler, SwizzleType swizzleB);
+		virtual void setSwizzleA(unsigned int sampler, SwizzleType swizzleA);
+
+		virtual void setWriteSRGB(bool sRGB);
+		virtual void setDepthBufferEnable(bool depthBufferEnable);
+		virtual void setDepthCompare(DepthCompareMode depthCompareMode);
+		virtual void setAlphaCompare(AlphaCompareMode alphaCompareMode);
+		virtual void setDepthWriteEnable(bool depthWriteEnable);
+		virtual void setAlphaTestEnable(bool alphaTestEnable);
+		virtual void setCullMode(CullMode cullMode);
+		virtual void setColorWriteMask(int index, int rgbaMask);
+
+		virtual void setColorLogicOpEnabled(bool colorLogicOpEnabled);
+		virtual void setLogicalOperation(LogicalOperation logicalOperation);
+
+		virtual void setStencilEnable(bool stencilEnable);
+		virtual void setStencilCompare(StencilCompareMode stencilCompareMode);
+		virtual void setStencilReference(int stencilReference);
+		virtual void setStencilMask(int stencilMask);
+		virtual void setStencilFailOperation(StencilOperation stencilFailOperation);
+		virtual void setStencilPassOperation(StencilOperation stencilPassOperation);
+		virtual void setStencilZFailOperation(StencilOperation stencilZFailOperation);
+		virtual void setStencilWriteMask(int stencilWriteMask);
+		virtual void setTwoSidedStencil(bool enable);
+		virtual void setStencilCompareCCW(StencilCompareMode stencilCompareMode);
+		virtual void setStencilReferenceCCW(int stencilReference);
+		virtual void setStencilMaskCCW(int stencilMask);
+		virtual void setStencilFailOperationCCW(StencilOperation stencilFailOperation);
+		virtual void setStencilPassOperationCCW(StencilOperation stencilPassOperation);
+		virtual void setStencilZFailOperationCCW(StencilOperation stencilZFailOperation);
+		virtual void setStencilWriteMaskCCW(int stencilWriteMask);
+
+		virtual void setTextureFactor(const Color<float> &textureFactor);
+		virtual void setBlendConstant(const Color<float> &blendConstant);
+
+		virtual void setFillMode(FillMode fillMode);
+		virtual void setShadingMode(ShadingMode shadingMode);
+	
+		virtual void setAlphaBlendEnable(bool alphaBlendEnable);
+		virtual void setSourceBlendFactor(BlendFactor sourceBlendFactor);
+		virtual void setDestBlendFactor(BlendFactor destBlendFactor);
+		virtual void setBlendOperation(BlendOperation blendOperation);
+
+		virtual void setSeparateAlphaBlendEnable(bool separateAlphaBlendEnable);
+		virtual void setSourceBlendFactorAlpha(BlendFactor sourceBlendFactorAlpha);
+		virtual void setDestBlendFactorAlpha(BlendFactor destBlendFactorAlpha);
+		virtual void setBlendOperationAlpha(BlendOperation blendOperationAlpha);
+
+		virtual void setAlphaReference(float alphaReference);
+
+		virtual void setGlobalMipmapBias(float bias);
+
+		virtual void setFogStart(float start);
+		virtual void setFogEnd(float end);
+		virtual void setFogColor(Color<float> fogColor);
+		virtual void setFogDensity(float fogDensity);
+		virtual void setPixelFogMode(FogMode fogMode);
+
+		virtual void setPerspectiveCorrection(bool perspectiveCorrection);
+
+		virtual void setOcclusionEnabled(bool enable);
+
+	protected:
+		const State update() const;
+		Routine *routine(const State &state);
+		void setRoutineCacheSize(int routineCacheSize);
+
+		// Shader constants
+		word4 cW[8][4];
+		float4 c[FRAGMENT_UNIFORM_VECTORS];
+		int4 i[16];
+		bool b[16];
+
+		// Other semi-constants
+		Stencil stencil;
+		Stencil stencilCCW;
+		Fog fog;
+		Factor factor;
+
+	private:
+		struct UniformBufferInfo
+		{
+			UniformBufferInfo();
+
+			Resource* buffer;
+			int offset;
+		};
+		UniformBufferInfo uniformBufferInfo[MAX_UNIFORM_BUFFER_BINDINGS];
+
+		void setFogRanges(float start, float end);
+
+		Context *const context;
+
+		RoutineCache<State> *routineCache;
+	};
+}
+
+#endif   // sw_PixelProcessor_hpp