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
