diff --git a/src/Device/Context.cpp b/src/Device/Context.cpp
index 33f3041..d9bad6b 100644
--- a/src/Device/Context.cpp
+++ b/src/Device/Context.cpp
@@ -63,42 +63,30 @@
 		deallocate(pointer);
 	}
 
-	bool Context::isDrawPoint(bool fillModeAware) const
+	bool Context::isDrawPoint() const
 	{
 		switch(drawType)
 		{
 		case DRAW_POINTLIST:
-		case DRAW_INDEXEDPOINTLIST8:
 		case DRAW_INDEXEDPOINTLIST16:
 		case DRAW_INDEXEDPOINTLIST32:
 			return true;
 		case DRAW_LINELIST:
 		case DRAW_LINESTRIP:
-		case DRAW_LINELOOP:
-		case DRAW_INDEXEDLINELIST8:
-		case DRAW_INDEXEDLINESTRIP8:
-		case DRAW_INDEXEDLINELOOP8:
 		case DRAW_INDEXEDLINELIST16:
 		case DRAW_INDEXEDLINESTRIP16:
-		case DRAW_INDEXEDLINELOOP16:
 		case DRAW_INDEXEDLINELIST32:
 		case DRAW_INDEXEDLINESTRIP32:
-		case DRAW_INDEXEDLINELOOP32:
 			return false;
 		case DRAW_TRIANGLELIST:
 		case DRAW_TRIANGLESTRIP:
 		case DRAW_TRIANGLEFAN:
-		case DRAW_INDEXEDTRIANGLELIST8:
-		case DRAW_INDEXEDTRIANGLESTRIP8:
-		case DRAW_INDEXEDTRIANGLEFAN8:
 		case DRAW_INDEXEDTRIANGLELIST16:
 		case DRAW_INDEXEDTRIANGLESTRIP16:
 		case DRAW_INDEXEDTRIANGLEFAN16:
 		case DRAW_INDEXEDTRIANGLELIST32:
 		case DRAW_INDEXEDTRIANGLESTRIP32:
 		case DRAW_INDEXEDTRIANGLEFAN32:
-			return fillModeAware ? fillMode == FILL_VERTEX : false;
-		case DRAW_QUADLIST:
 			return false;
 		default:
 			ASSERT(false);
@@ -107,42 +95,30 @@
 		return false;
 	}
 
-	bool Context::isDrawLine(bool fillModeAware) const
+	bool Context::isDrawLine() const
 	{
 		switch(drawType)
 		{
 		case DRAW_POINTLIST:
-		case DRAW_INDEXEDPOINTLIST8:
 		case DRAW_INDEXEDPOINTLIST16:
 		case DRAW_INDEXEDPOINTLIST32:
 			return false;
 		case DRAW_LINELIST:
 		case DRAW_LINESTRIP:
-		case DRAW_LINELOOP:
-		case DRAW_INDEXEDLINELIST8:
-		case DRAW_INDEXEDLINESTRIP8:
-		case DRAW_INDEXEDLINELOOP8:
 		case DRAW_INDEXEDLINELIST16:
 		case DRAW_INDEXEDLINESTRIP16:
-		case DRAW_INDEXEDLINELOOP16:
 		case DRAW_INDEXEDLINELIST32:
 		case DRAW_INDEXEDLINESTRIP32:
-		case DRAW_INDEXEDLINELOOP32:
 			return true;
 		case DRAW_TRIANGLELIST:
 		case DRAW_TRIANGLESTRIP:
 		case DRAW_TRIANGLEFAN:
-		case DRAW_INDEXEDTRIANGLELIST8:
-		case DRAW_INDEXEDTRIANGLESTRIP8:
-		case DRAW_INDEXEDTRIANGLEFAN8:
 		case DRAW_INDEXEDTRIANGLELIST16:
 		case DRAW_INDEXEDTRIANGLESTRIP16:
 		case DRAW_INDEXEDTRIANGLEFAN16:
 		case DRAW_INDEXEDTRIANGLELIST32:
 		case DRAW_INDEXEDTRIANGLESTRIP32:
 		case DRAW_INDEXEDTRIANGLEFAN32:
-			return fillModeAware ? fillMode == FILL_WIREFRAME : false;
-		case DRAW_QUADLIST:
 			return false;
 		default:
 			ASSERT(false);
@@ -151,44 +127,31 @@
 		return false;
 	}
 
-	bool Context::isDrawTriangle(bool fillModeAware) const
+	bool Context::isDrawTriangle() const
 	{
 		switch(drawType)
 		{
 		case DRAW_POINTLIST:
-		case DRAW_INDEXEDPOINTLIST8:
 		case DRAW_INDEXEDPOINTLIST16:
 		case DRAW_INDEXEDPOINTLIST32:
 			return false;
 		case DRAW_LINELIST:
 		case DRAW_LINESTRIP:
-		case DRAW_LINELOOP:
-		case DRAW_INDEXEDLINELIST8:
-		case DRAW_INDEXEDLINESTRIP8:
-		case DRAW_INDEXEDLINELOOP8:
 		case DRAW_INDEXEDLINELIST16:
 		case DRAW_INDEXEDLINESTRIP16:
-		case DRAW_INDEXEDLINELOOP16:
 		case DRAW_INDEXEDLINELIST32:
 		case DRAW_INDEXEDLINESTRIP32:
-		case DRAW_INDEXEDLINELOOP32:
 			return false;
 		case DRAW_TRIANGLELIST:
 		case DRAW_TRIANGLESTRIP:
 		case DRAW_TRIANGLEFAN:
-		case DRAW_INDEXEDTRIANGLELIST8:
-		case DRAW_INDEXEDTRIANGLESTRIP8:
-		case DRAW_INDEXEDTRIANGLEFAN8:
 		case DRAW_INDEXEDTRIANGLELIST16:
 		case DRAW_INDEXEDTRIANGLESTRIP16:
 		case DRAW_INDEXEDTRIANGLEFAN16:
 		case DRAW_INDEXEDTRIANGLELIST32:
 		case DRAW_INDEXEDTRIANGLESTRIP32:
 		case DRAW_INDEXEDTRIANGLEFAN32:
-			return fillModeAware ? fillMode == FILL_SOLID : true;
-		case DRAW_QUADLIST:
-			// Quads are broken up into triangles
-			return fillModeAware ? fillMode == FILL_SOLID : true;
+			return true;
 		default:
 			ASSERT(false);
 		}
@@ -198,28 +161,12 @@
 
 	void Context::init()
 	{
-		for(int i = 0; i < 8; i++)
-		{
-			textureStage[i].init(i, &sampler[i], (i >= 1) ? &textureStage[i - 1] : 0);
-		}
-
 		// Set vertex streams to null stream
 		for(int i = 0; i < MAX_VERTEX_INPUTS; i++)
 		{
 			input[i].defaults();
 		}
 
-		fogStart = 0.0f;
-		fogEnd = 1.0f;
-
-		for(int i = 0; i < TEXTURE_IMAGE_UNITS; i++) textureWrap[i] = 0;
-		for(int i = 0; i < 8; i++) texGen[i] = TEXGEN_PASSTHRU;
-		for(int i = 0; i < 8; i++) textureTransformCount[i] = 0;
-		for(int i = 0; i < 8; i++) textureTransformProject[i] = false;
-		textureWrapActive = false;
-		localViewer = true;
-		normalizeNormals = false;
-
 		for(int i = 0; i < RENDERTARGETS; ++i)
 		{
 			renderTarget[i] = nullptr;
@@ -245,17 +192,8 @@
 		stencilZFailOperationCCW = OPERATION_KEEP;
 		stencilWriteMaskCCW = 0xFFFFFFFF;
 
-		setGlobalMipmapBias(0);
-
-		lightingEnable = true;
-		specularEnable = false;
-		for(int i = 0; i < 8; i++) lightEnable[i] = false;
-		for(int i = 0; i < 8; i++) worldLightPosition[i] = 0;
-
 		alphaCompareMode = ALPHA_ALWAYS;
 		alphaTestEnable = false;
-		fillMode = FILL_SOLID;
-		shadingMode = SHADING_GOURAUD;
 
 		rasterizerDiscard = false;
 
@@ -285,23 +223,8 @@
 			colorWriteMask[i] = 0x0000000F;
 		}
 
-		ambientMaterialSource = MATERIAL_MATERIAL;
-		diffuseMaterialSource = MATERIAL_COLOR1;
-		specularMaterialSource = MATERIAL_COLOR2;
-		emissiveMaterialSource = MATERIAL_MATERIAL;
-		colorVertexEnable = true;
-
-		fogEnable = false;
-		pixelFogMode = FOG_NONE;
-		vertexFogMode = FOG_NONE;
-		wBasedFog = false;
-		rangeFogEnable = false;
-
-		indexedVertexBlendEnable = false;
-		vertexBlendMatrixCount = 0;
-
-		pixelShader = 0;
-		vertexShader = 0;
+		pixelShader = nullptr;
+		vertexShader = nullptr;
 
 		instanceID = 0;
 
@@ -309,8 +232,6 @@
 		transformFeedbackQueryEnabled = false;
 		transformFeedbackEnabled = 0;
 
-		pointSpriteEnable = false;
-		pointScaleEnable = false;
 		lineWidth = 1.0f;
 
 		writeSRGB = false;
@@ -320,71 +241,6 @@
 		logicalOperation = LOGICALOP_COPY;
 	}
 
-	const float &Context::exp2Bias()
-	{
-		return bias;
-	}
-
-	const Point &Context::getLightPosition(int light)
-	{
-		return worldLightPosition[light];
-	}
-
-	void Context::setGlobalMipmapBias(float bias)
-	{
-		this->bias = exp2(bias + 0.5f);
-	}
-
-	void Context::setLightingEnable(bool lightingEnable)
-	{
-		this->lightingEnable = lightingEnable;
-	}
-
-	void Context::setSpecularEnable(bool specularEnable)
-	{
-		Context::specularEnable = specularEnable;
-	}
-
-	void Context::setLightEnable(int light, bool lightEnable)
-	{
-		Context::lightEnable[light] = lightEnable;
-	}
-
-	void Context::setLightPosition(int light, Point worldLightPosition)
-	{
-		Context::worldLightPosition[light] = worldLightPosition;
-	}
-
-	void Context::setAmbientMaterialSource(MaterialSource ambientMaterialSource)
-	{
-		Context::ambientMaterialSource = ambientMaterialSource;
-	}
-
-	void Context::setDiffuseMaterialSource(MaterialSource diffuseMaterialSource)
-	{
-		Context::diffuseMaterialSource = diffuseMaterialSource;
-	}
-
-	void Context::setSpecularMaterialSource(MaterialSource specularMaterialSource)
-	{
-		Context::specularMaterialSource = specularMaterialSource;
-	}
-
-	void Context::setEmissiveMaterialSource(MaterialSource emissiveMaterialSource)
-	{
-		Context::emissiveMaterialSource = emissiveMaterialSource;
-	}
-
-	void Context::setPointSpriteEnable(bool pointSpriteEnable)
-	{
-		Context::pointSpriteEnable = pointSpriteEnable;
-	}
-
-	void Context::setPointScaleEnable(bool pointScaleEnable)
-	{
-		Context::pointScaleEnable = pointScaleEnable;
-	}
-
 	bool Context::setDepthBufferEnable(bool depthBufferEnable)
 	{
 		bool modified = (Context::depthBufferEnable != depthBufferEnable);
@@ -476,40 +332,6 @@
 		return modified;
 	}
 
-	void Context::setColorVertexEnable(bool colorVertexEnable)
-	{
-		Context::colorVertexEnable = colorVertexEnable;
-	}
-
-	bool Context::fogActive()
-	{
-		if(!colorUsed()) return false;
-
-		if(pixelShaderModel() >= 0x0300) return false;
-
-		return fogEnable;
-	}
-
-	bool Context::pointSizeActive()
-	{
-		if(vertexShader)
-		{
-			return false;
-		}
-
-		return isDrawPoint(true) && (input[PointSize] || (!preTransformed && pointScaleActive()));
-	}
-
-	FogMode Context::pixelFogActive()
-	{
-		if(fogActive())
-		{
-			return pixelFogMode;
-		}
-
-		return FOG_NONE;
-	}
-
 	bool Context::depthWriteActive()
 	{
 		if(!depthBufferActive()) return false;
@@ -537,213 +359,6 @@
 		return stencilBuffer && stencilEnable;
 	}
 
-	bool Context::vertexLightingActive()
-	{
-		if(vertexShader)
-		{
-			return false;
-		}
-
-		return lightingEnable && !preTransformed;
-	}
-
-	bool Context::texCoordActive(int coordinate, int component)
-	{
-		bool hasTexture = pointSpriteActive();
-
-		if(vertexShader)
-		{
-			if(!preTransformed)
-			{
-				if(vertexShader->getOutput(T0 + coordinate, component).usage == Shader::USAGE_TEXCOORD)
-				{
-					hasTexture = true;
-				}
-			}
-			else
-			{
-				hasTexture = true;   // FIXME: Check vertex buffer streams
-			}
-		}
-		else
-		{
-			switch(texGen[coordinate])
-			{
-			case TEXGEN_NONE:
-				hasTexture = true;
-				break;
-			case TEXGEN_PASSTHRU:
-				hasTexture = hasTexture || (component < input[TexCoord0 + textureStage[coordinate].texCoordIndex].count);
-				break;
-			case TEXGEN_NORMAL:
-				hasTexture = hasTexture || (component <= 2);
-				break;
-			case TEXGEN_POSITION:
-				hasTexture = hasTexture || (component <= 2);
-				break;
-			case TEXGEN_REFLECTION:
-				hasTexture = hasTexture || (component <= 2);
-				break;
-			case TEXGEN_SPHEREMAP:
-				hasTexture = hasTexture || (component <= 1);
-				break;
-			default:
-				ASSERT(false);
-			}
-		}
-
-		bool project = isProjectionComponent(coordinate, component);
-		bool usesTexture = false;
-
-		if(pixelShader)
-		{
-			usesTexture = pixelShader->usesTexture(coordinate, component) || project;
-		}
-		else
-		{
-			usesTexture = textureStage[coordinate].usesTexture() || project;
-		}
-
-		return hasTexture && usesTexture;
-	}
-
-	bool Context::texCoordActive(int coordinate)
-	{
-		return texCoordActive(coordinate, 0) ||
-		       texCoordActive(coordinate, 1) ||
-		       texCoordActive(coordinate, 2) ||
-		       texCoordActive(coordinate, 3);
-	}
-
-	bool Context::isProjectionComponent(unsigned int coordinate, int component)
-	{
-		if(pixelShaderModel() <= 0x0103 && coordinate < 8 && textureTransformProject[coordinate])
-		{
-			if(textureTransformCount[coordinate] == 2)
-			{
-				if(component == 1) return true;
-			}
-			else if(textureTransformCount[coordinate] == 3)
-			{
-				if(component == 2) return true;
-			}
-			else if(textureTransformCount[coordinate] == 4 || textureTransformCount[coordinate] == 0)
-			{
-				if(component == 3) return true;
-			}
-		}
-
-		return false;
-	}
-
-	bool Context::vertexSpecularActive()
-	{
-		return vertexLightingActive() && specularEnable && vertexNormalActive();
-	}
-
-	bool Context::vertexNormalActive()
-	{
-		if(vertexShader)
-		{
-			return false;
-		}
-
-		return input[Normal];
-	}
-
-	bool Context::vertexLightActive(int i)
-	{
-		if(vertexShader)
-		{
-			return false;
-		}
-
-		return lightingEnable && lightEnable[i];
-	}
-
-	MaterialSource Context::vertexDiffuseMaterialSourceActive()
-	{
-		if(vertexShader)
-		{
-			return MATERIAL_MATERIAL;
-		}
-
-		if(diffuseMaterialSource == MATERIAL_MATERIAL || !colorVertexEnable ||
-		   (diffuseMaterialSource == MATERIAL_COLOR1 && !input[Color0]) ||
-		   (diffuseMaterialSource == MATERIAL_COLOR2 && !input[Color1]))
-		{
-			return MATERIAL_MATERIAL;
-		}
-
-		return diffuseMaterialSource;
-	}
-
-	MaterialSource Context::vertexSpecularMaterialSourceActive()
-	{
-		if(vertexShader)
-		{
-			return MATERIAL_MATERIAL;
-		}
-
-		if(!colorVertexEnable ||
-		   (specularMaterialSource == MATERIAL_COLOR1 && !input[Color0]) ||
-		   (specularMaterialSource == MATERIAL_COLOR2 && !input[Color1]))
-		{
-			return MATERIAL_MATERIAL;
-		}
-
-		return specularMaterialSource;
-	}
-
-	MaterialSource Context::vertexAmbientMaterialSourceActive()
-	{
-		if(vertexShader)
-		{
-			return MATERIAL_MATERIAL;
-		}
-
-		if(!colorVertexEnable ||
-		   (ambientMaterialSource == MATERIAL_COLOR1 && !input[Color0]) ||
-		   (ambientMaterialSource == MATERIAL_COLOR2 && !input[Color1]))
-		{
-			return MATERIAL_MATERIAL;
-		}
-
-		return ambientMaterialSource;
-	}
-
-	MaterialSource Context::vertexEmissiveMaterialSourceActive()
-	{
-		if(vertexShader)
-		{
-			return MATERIAL_MATERIAL;
-		}
-
-		if(!colorVertexEnable ||
-		   (emissiveMaterialSource == MATERIAL_COLOR1 && !input[Color0]) ||
-		   (emissiveMaterialSource == MATERIAL_COLOR2 && !input[Color1]))
-		{
-			return MATERIAL_MATERIAL;
-		}
-
-		return emissiveMaterialSource;
-	}
-
-	bool Context::pointSpriteActive()
-	{
-		return isDrawPoint(true) && pointSpriteEnable;
-	}
-
-	bool Context::pointScaleActive()
-	{
-		if(vertexShader)
-		{
-			return false;
-		}
-
-		return isDrawPoint(true) && pointScaleEnable;
-	}
-
 	bool Context::alphaBlendActive()
 	{
 		if(!alphaBlendEnable)
@@ -1090,96 +705,6 @@
 		}
 	}
 
-	bool Context::indexedVertexBlendActive()
-	{
-		if(vertexShader)
-		{
-			return false;
-		}
-
-		return indexedVertexBlendEnable;
-	}
-
-	int Context::vertexBlendMatrixCountActive()
-	{
-		if(vertexShader)
-		{
-			return 0;
-		}
-
-		return vertexBlendMatrixCount;
-	}
-
-	bool Context::localViewerActive()
-	{
-		if(vertexShader)
-		{
-			return false;
-		}
-
-		return localViewer;
-	}
-
-	bool Context::normalizeNormalsActive()
-	{
-		if(vertexShader)
-		{
-			return false;
-		}
-
-		return normalizeNormals;
-	}
-
-	FogMode Context::vertexFogModeActive()
-	{
-		if(vertexShader || !fogActive())
-		{
-			return FOG_NONE;
-		}
-
-		return vertexFogMode;
-	}
-
-	bool Context::rangeFogActive()
-	{
-		if(vertexShader || !fogActive())
-		{
-			return false;
-		}
-
-		return rangeFogEnable;
-	}
-
-	TexGen Context::texGenActive(int stage)
-	{
-		if(vertexShader || !texCoordActive(stage))
-		{
-			return TEXGEN_PASSTHRU;
-		}
-
-		return texGen[stage];
-	}
-
-	int Context::textureTransformCountActive(int stage)
-	{
-		if(vertexShader || !texCoordActive(stage))
-		{
-			return 0;
-		}
-
-		return textureTransformCount[stage];
-	}
-
-	int Context::texCoordIndexActive(int stage)
-	{
-		if(vertexShader || !texCoordActive(stage))
-		{
-			return stage;
-		}
-
-		return textureStage[stage].texCoordIndex;
-	}
-
 	bool Context::perspectiveActive()
 	{
 		if(!colorUsed())
@@ -1192,7 +717,7 @@
 			return false;
 		}
 
-		if(isDrawPoint(true))
+		if(isDrawPoint())
 		{
 			return false;
 		}
@@ -1200,242 +725,6 @@
 		return true;
 	}
 
-	bool Context::diffuseUsed()
-	{
-		return diffuseUsed(0) || diffuseUsed(1) || diffuseUsed(2) || diffuseUsed(3);
-	}
-
-	bool Context::diffuseUsed(int component)
-	{
-		if(!colorUsed())
-		{
-			return false;
-		}
-
-		if(pixelShader)
-		{
-			return pixelShader->usesDiffuse(component);
-		}
-
-		// Directly using the diffuse input color
-		for(int i = 0; i < 8; i++)
-		{
-			if(textureStage[i].isStageDisabled())
-			{
-				break;
-			}
-
-			if(textureStage[i].usesDiffuse())
-			{
-				return true;
-			}
-		}
-
-		// Using the current color (initialized to diffuse) before it's overwritten
-		for(int i = 0; i < 8; i++)
-		{
-			if(textureStage[i].usesCurrent() || textureStage[i].isStageDisabled())   // Current color contains diffuse before being overwritten
-			{
-				return true;
-			}
-
-			if(textureStage[i].writesCurrent())
-			{
-				return false;
-			}
-		}
-
-		return true;
-	}
-
-	bool Context::diffuseActive()
-	{
-		return diffuseActive(0) || diffuseActive(1) || diffuseActive(2) || diffuseActive(3);
-	}
-
-	bool Context::diffuseActive(int component)
-	{
-		if(!colorUsed())
-		{
-			return false;
-		}
-
-		// Vertex processor provides diffuse component
-		bool vertexDiffuse;
-
-		if(vertexShader)
-		{
-			vertexDiffuse = vertexShader->getOutput(C0, component).active();
-		}
-		else if(!preTransformed)
-		{
-			vertexDiffuse = input[Color0] || lightingEnable;
-		}
-		else
-		{
-			vertexDiffuse = input[Color0];
-		}
-
-		// Pixel processor requires diffuse component
-		bool pixelDiffuse = diffuseUsed(component);
-
-		return vertexDiffuse && pixelDiffuse;
-	}
-
-	bool Context::specularUsed()
-	{
-		return Context::specularUsed(0) || Context::specularUsed(1) || Context::specularUsed(2) || Context::specularUsed(3);
-	}
-
-	bool Context::specularUsed(int component)
-	{
-		if(!colorUsed())
-		{
-			return false;
-		}
-
-		if(pixelShader)
-		{
-			return pixelShader->usesSpecular(component);
-		}
-
-		bool pixelSpecular = specularEnable;
-
-		for(int i = 0; i < 8; i++)
-		{
-			if(textureStage[i].isStageDisabled()) break;
-
-			pixelSpecular = pixelSpecular || textureStage[i].usesSpecular();
-		}
-
-		return pixelSpecular;
-	}
-
-	bool Context::specularActive()
-	{
-		return specularActive(0) || specularActive(1) || specularActive(2) || specularActive(3);
-	}
-
-	bool Context::specularActive(int component)
-	{
-		if(!colorUsed())
-		{
-			return false;
-		}
-
-		// Vertex processor provides specular component
-		bool vertexSpecular;
-
-		if(!vertexShader)
-		{
-			vertexSpecular = input[Color1] || (lightingEnable && specularEnable);
-		}
-		else
-		{
-			vertexSpecular = vertexShader->getOutput(C1, component).active();
-		}
-
-		// Pixel processor requires specular component
-		bool pixelSpecular = specularUsed(component);
-
-		return vertexSpecular && pixelSpecular;
-	}
-
-	bool Context::colorActive(int color, int component)
-	{
-		if(color == 0)
-		{
-			return diffuseActive(component);
-		}
-		else
-		{
-			return specularActive(component);
-		}
-	}
-
-	bool Context::textureActive()
-	{
-		for(int i = 0; i < 8; i++)
-		{
-			if(textureActive(i))
-			{
-				return true;
-			}
-		}
-
-		return false;
-	}
-
-	bool Context::textureActive(int coordinate)
-	{
-		return textureActive(coordinate, 0) || textureActive(coordinate, 1) || textureActive(coordinate, 2) || textureActive(coordinate, 3);
-	}
-
-	bool Context::textureActive(int coordinate, int component)
-	{
-		if(!colorUsed())
-		{
-			return false;
-		}
-
-		if(!texCoordActive(coordinate, component))
-		{
-			return false;
-		}
-
-		if(textureTransformProject[coordinate] && pixelShaderModel() <= 0x0103)
-		{
-			if(textureTransformCount[coordinate] == 2)
-			{
-				if(component == 1) return true;
-			}
-			else if(textureTransformCount[coordinate] == 3)
-			{
-				if(component == 2) return true;
-			}
-			else if(textureTransformCount[coordinate] == 4 || textureTransformCount[coordinate] == 0)
-			{
-				if(component == 3) return true;
-			}
-		}
-
-		if(!pixelShader)
-		{
-			bool texture = textureStage[coordinate].usesTexture();
-			bool cube = sampler[coordinate].hasCubeTexture();
-			bool volume = sampler[coordinate].hasVolumeTexture();
-
-			if(texture)
-			{
-				for(int i = coordinate; i >= 0; i--)
-				{
-					if(textureStage[i].stageOperation == TextureStage::STAGE_DISABLE)
-					{
-						return false;
-					}
-				}
-			}
-
-			switch(component)
-			{
-			case 0:
-				return texture;
-			case 1:
-				return texture;
-			case 2:
-				return (texture && (cube || volume));
-			case 3:
-				return false;
-			}
-		}
-		else
-		{
-			return pixelShader->usesTexture(coordinate, component);
-		}
-
-		return false;
-	}
-
 	unsigned short Context::pixelShaderModel() const
 	{
 		return pixelShader ? pixelShader->getShaderModel() : 0x0000;
@@ -1451,11 +740,6 @@
 		return renderTarget[0] ? renderTarget[0]->getMultiSampleCount() : 1;
 	}
 
-	int Context::getSuperSampleCount() const
-	{
-		return renderTarget[0] ? renderTarget[0]->getSuperSampleCount() : 1;
-	}
-
 	Format Context::renderTargetInternalFormat(int index)
 	{
 		if(renderTarget[index])
diff --git a/src/Device/Context.hpp b/src/Device/Context.hpp
index 6ad2aef..64bd0d5 100644
--- a/src/Device/Context.hpp
+++ b/src/Device/Context.hpp
@@ -16,7 +16,6 @@
 #define sw_Context_hpp
 
 #include "Sampler.hpp"
-#include "TextureStage.hpp"
 #include "Stream.hpp"
 #include "Point.hpp"
 #include "Vertex.hpp"
@@ -60,29 +59,17 @@
 		DRAW_POINTLIST     = 0x00,
 		DRAW_LINELIST      = 0x01,
 		DRAW_LINESTRIP     = 0x02,
-		DRAW_LINELOOP      = 0x03,
-		DRAW_TRIANGLELIST  = 0x04,
-		DRAW_TRIANGLESTRIP = 0x05,
-		DRAW_TRIANGLEFAN   = 0x06,
-		DRAW_QUADLIST      = 0x07,
+		DRAW_TRIANGLELIST  = 0x03,
+		DRAW_TRIANGLESTRIP = 0x04,
+		DRAW_TRIANGLEFAN   = 0x05,
 
 		DRAW_NONINDEXED = 0x00,
-		DRAW_INDEXED8   = 0x10,
 		DRAW_INDEXED16  = 0x20,
 		DRAW_INDEXED32  = 0x30,
 
-		DRAW_INDEXEDPOINTLIST8 = DRAW_POINTLIST | DRAW_INDEXED8,
-		DRAW_INDEXEDLINELIST8  = DRAW_LINELIST  | DRAW_INDEXED8,
-		DRAW_INDEXEDLINESTRIP8 = DRAW_LINESTRIP | DRAW_INDEXED8,
-		DRAW_INDEXEDLINELOOP8  = DRAW_LINELOOP  | DRAW_INDEXED8,
-		DRAW_INDEXEDTRIANGLELIST8  = DRAW_TRIANGLELIST  | DRAW_INDEXED8,
-		DRAW_INDEXEDTRIANGLESTRIP8 = DRAW_TRIANGLESTRIP | DRAW_INDEXED8,
-		DRAW_INDEXEDTRIANGLEFAN8   = DRAW_TRIANGLEFAN   | DRAW_INDEXED8,
-
 		DRAW_INDEXEDPOINTLIST16 = DRAW_POINTLIST | DRAW_INDEXED16,
 		DRAW_INDEXEDLINELIST16  = DRAW_LINELIST  | DRAW_INDEXED16,
 		DRAW_INDEXEDLINESTRIP16 = DRAW_LINESTRIP | DRAW_INDEXED16,
-		DRAW_INDEXEDLINELOOP16  = DRAW_LINELOOP  | DRAW_INDEXED16,
 		DRAW_INDEXEDTRIANGLELIST16  = DRAW_TRIANGLELIST  | DRAW_INDEXED16,
 		DRAW_INDEXEDTRIANGLESTRIP16 = DRAW_TRIANGLESTRIP | DRAW_INDEXED16,
 		DRAW_INDEXEDTRIANGLEFAN16   = DRAW_TRIANGLEFAN   | DRAW_INDEXED16,
@@ -90,7 +77,6 @@
 		DRAW_INDEXEDPOINTLIST32 = DRAW_POINTLIST | DRAW_INDEXED32,
 		DRAW_INDEXEDLINELIST32  = DRAW_LINELIST  | DRAW_INDEXED32,
 		DRAW_INDEXEDLINESTRIP32 = DRAW_LINESTRIP | DRAW_INDEXED32,
-		DRAW_INDEXEDLINELOOP32  = DRAW_LINELOOP  | DRAW_INDEXED32,
 		DRAW_INDEXEDTRIANGLELIST32  = DRAW_TRIANGLELIST  | DRAW_INDEXED32,
 		DRAW_INDEXEDTRIANGLESTRIP32 = DRAW_TRIANGLESTRIP | DRAW_INDEXED32,
 		DRAW_INDEXEDTRIANGLEFAN32   = DRAW_TRIANGLEFAN   | DRAW_INDEXED32,
@@ -98,23 +84,6 @@
 		DRAW_LAST = DRAW_INDEXEDTRIANGLEFAN32
 	};
 
-	enum FillMode ENUM_UNDERLYING_TYPE_UNSIGNED_INT
-	{
-		FILL_SOLID,
-		FILL_WIREFRAME,
-		FILL_VERTEX,
-
-		FILL_LAST = FILL_VERTEX
-	};
-
-	enum ShadingMode ENUM_UNDERLYING_TYPE_UNSIGNED_INT
-	{
-		SHADING_FLAT,
-		SHADING_GOURAUD,
-
-		SHADING_LAST = SHADING_GOURAUD
-	};
-
 	enum DepthCompareMode ENUM_UNDERLYING_TYPE_UNSIGNED_INT
 	{
 		DEPTH_ALWAYS,
@@ -238,37 +207,6 @@
 		LOGICALOP_LAST = LOGICALOP_OR_INVERTED
 	};
 
-	enum MaterialSource ENUM_UNDERLYING_TYPE_UNSIGNED_INT
-	{
-		MATERIAL_MATERIAL,
-		MATERIAL_COLOR1,
-		MATERIAL_COLOR2,
-
-		MATERIAL_LAST = MATERIAL_COLOR2
-	};
-
-	enum FogMode ENUM_UNDERLYING_TYPE_UNSIGNED_INT
-	{
-		FOG_NONE,
-		FOG_LINEAR,
-		FOG_EXP,
-		FOG_EXP2,
-
-		FOG_LAST = FOG_EXP2
-	};
-
-	enum TexGen ENUM_UNDERLYING_TYPE_UNSIGNED_INT
-	{
-		TEXGEN_PASSTHRU,
-		TEXGEN_NORMAL,
-		TEXGEN_POSITION,
-		TEXGEN_REFLECTION,
-		TEXGEN_SPHEREMAP,
-		TEXGEN_NONE,
-
-		TEXGEN_LAST = TEXGEN_NONE
-	};
-
 	enum TransparencyAntialiasing ENUM_UNDERLYING_TYPE_UNSIGNED_INT
 	{
 		TRANSPARENCY_NONE,
@@ -287,34 +225,12 @@
 		void *operator new(size_t bytes);
 		void operator delete(void *pointer, size_t bytes);
 
-		bool isDrawPoint(bool fillModeAware = false) const;
-		bool isDrawLine(bool fillModeAware = false) const;
-		bool isDrawTriangle(bool fillModeAware = false) const;
-
 		void init();
 
-		const float &exp2Bias();   // NOTE: Needs address for JIT
+		bool isDrawPoint() const;
+		bool isDrawLine() const;
+		bool isDrawTriangle() const;
 
-		const Point &getLightPosition(int light);
-
-		void setGlobalMipmapBias(float bias);
-
-		// Set fixed-function vertex pipeline states
-		void setLightingEnable(bool lightingEnable);
-		void setSpecularEnable(bool specularEnable);
-		void setLightEnable(int light, bool lightEnable);
-		void setLightPosition(int light, Point worldLightPosition);
-
-		void setColorVertexEnable(bool colorVertexEnable);
-		void setAmbientMaterialSource(MaterialSource ambientMaterialSource);
-		void setDiffuseMaterialSource(MaterialSource diffuseMaterialSource);
-		void setSpecularMaterialSource(MaterialSource specularMaterialSource);
-		void setEmissiveMaterialSource(MaterialSource emissiveMaterialSource);
-
-		void setPointSpriteEnable(bool pointSpriteEnable);
-		void setPointScaleEnable(bool pointScaleEnable);
-
-		// Set fixed-function pixel pipeline states, return true when modified
 		bool setDepthBufferEnable(bool depthBufferEnable);
 
 		bool setAlphaBlendEnable(bool alphaBlendEnable);
@@ -333,10 +249,6 @@
 		bool setColorLogicOpEnabled(bool colorLogicOpEnabled);
 		bool setLogicalOperation(LogicalOperation logicalOperation);
 
-		// Active fixed-function pixel pipeline states
-		bool fogActive();
-		bool pointSizeActive();
-		FogMode pixelFogActive();
 		bool depthWriteActive();
 		bool alphaTestActive();
 		bool depthBufferActive();
@@ -344,24 +256,6 @@
 
 		bool perspectiveActive();
 
-		// Active fixed-function vertex pipeline states
-		bool vertexLightingActive();
-		bool texCoordActive(int coordinate, int component);
-		bool texCoordActive(int coordinate);
-		bool isProjectionComponent(unsigned int coordinate, int component);
-		bool vertexSpecularInputActive();
-		bool vertexSpecularActive();
-		bool vertexNormalActive();
-		bool vertexLightActive();
-		bool vertexLightActive(int i);
-		MaterialSource vertexDiffuseMaterialSourceActive();
-		MaterialSource vertexSpecularMaterialSourceActive();
-		MaterialSource vertexAmbientMaterialSourceActive();
-		MaterialSource vertexEmissiveMaterialSourceActive();
-
-		bool pointSpriteActive();
-		bool pointScaleActive();
-
 		bool alphaBlendActive();
 		BlendFactor sourceBlendFactor();
 		BlendFactor destBlendFactor();
@@ -372,38 +266,11 @@
 		BlendOperation blendOperationAlpha();
 
 		LogicalOperation colorLogicOp();
-		LogicalOperation indexLogicOp();
-
-		bool indexedVertexBlendActive();
-		int vertexBlendMatrixCountActive();
-		bool localViewerActive();
-		bool normalizeNormalsActive();
-		FogMode vertexFogModeActive();
-		bool rangeFogActive();
-
-		TexGen texGenActive(int stage);
-		int textureTransformCountActive(int stage);
-		int texCoordIndexActive(int stage);
-
-		// Active context states
-		bool diffuseUsed();     // Used by pixel processor but not provided by vertex processor
-		bool diffuseUsed(int component);     // Used by pixel processor but not provided by vertex processor
-		bool diffuseActive();
-		bool diffuseActive(int component);
-		bool specularUsed();
-		bool specularUsed(int component);
-		bool specularActive();
-		bool specularActive(int component);
-		bool colorActive(int color, int component);
-		bool textureActive();
-		bool textureActive(int coordinate);
-		bool textureActive(int coordinate, int component);
 
 		unsigned short pixelShaderModel() const;
 		unsigned short vertexShaderModel() const;
 
 		int getMultiSampleCount() const;
-		int getSuperSampleCount() const;
 
 		DrawType drawType;
 
@@ -428,8 +295,6 @@
 		// Pixel processor states
 		AlphaCompareMode alphaCompareMode;
 		bool alphaTestEnable;
-		FillMode fillMode;
-		ShadingMode shadingMode;
 
 		CullMode cullMode;
 		bool frontFacingCCW;
@@ -438,7 +303,6 @@
 		float depthBias;
 		float slopeDepthBias;
 
-		TextureStage textureStage[8];
 		Sampler sampler[TOTAL_IMAGE_UNITS];
 
 		Format renderTargetInternalFormat(int index);
@@ -450,21 +314,6 @@
 		Stream input[MAX_VERTEX_INPUTS];
 		Resource *indexBuffer;
 
-		bool preTransformed;   // FIXME: Private
-
-		float fogStart;
-		float fogEnd;
-
-		void computeIllumination();
-
-		bool textureWrapActive;
-		unsigned char textureWrap[TEXTURE_IMAGE_UNITS];
-		TexGen texGen[8];
-		bool localViewer;
-		bool normalizeNormals;
-		int textureTransformCount[8];
-		bool textureTransformProject[8];
-
 		Surface *renderTarget[RENDERTARGETS];
 		unsigned int renderTargetLayer[RENDERTARGETS];
 		Surface *depthBuffer;
@@ -472,39 +321,13 @@
 		Surface *stencilBuffer;
 		unsigned int stencilBufferLayer;
 
-		// Fog
-		bool fogEnable;
-		FogMode pixelFogMode;
-		FogMode vertexFogMode;
-		bool wBasedFog;
-		bool rangeFogEnable;
-
-		// Vertex blending
-		bool indexedVertexBlendEnable;
-		int vertexBlendMatrixCount;
-
 		// Shaders
 		const PixelShader *pixelShader;
 		const VertexShader *vertexShader;
 
-		// Global mipmap bias
-		float bias;
-
 		// Instancing
 		int instanceID;
 
-		// Fixed-function vertex pipeline state
-		bool lightingEnable;
-		bool specularEnable;
-		bool lightEnable[8];
-		Point worldLightPosition[8];
-
-		MaterialSource ambientMaterialSource;
-		MaterialSource diffuseMaterialSource;
-		MaterialSource specularMaterialSource;
-		MaterialSource emissiveMaterialSource;
-		bool colorVertexEnable;
-
 		bool occlusionEnabled;
 		bool transformFeedbackQueryEnabled;
 		uint64_t transformFeedbackEnabled;
@@ -525,8 +348,6 @@
 		BlendFactor destBlendFactorStateAlpha;
 		BlendOperation blendOperationStateAlpha;
 
-		bool pointSpriteEnable;
-		bool pointScaleEnable;
 		float lineWidth;
 
 		int colorWriteMask[RENDERTARGETS];   // RGBA
diff --git a/src/Device/PixelProcessor.cpp b/src/Device/PixelProcessor.cpp
index 4ee287d..79d3d63 100644
--- a/src/Device/PixelProcessor.cpp
+++ b/src/Device/PixelProcessor.cpp
@@ -16,7 +16,6 @@
 
 #include "Surface.hpp"
 #include "Primitive.hpp"
-#include "Pipeline/PixelPipeline.hpp"
 #include "Pipeline/PixelProgram.hpp"
 #include "Pipeline/PixelShader.hpp"
 #include "Pipeline/Constants.hpp"
@@ -68,18 +67,14 @@
 
 	PixelProcessor::PixelProcessor(Context *context) : context(context)
 	{
-		setGlobalMipmapBias(0.0f);   // Round to highest LOD [0.5, 1.0]: -0.5
-		                             // Round to nearest LOD [0.7, 1.4]:  0.0
-		                             // Round to lowest LOD  [1.0, 2.0]:  0.5
-
-		routineCache = 0;
+		routineCache = nullptr;
 		setRoutineCacheSize(1024);
 	}
 
 	PixelProcessor::~PixelProcessor()
 	{
 		delete routineCache;
-		routineCache = 0;
+		routineCache = nullptr;
 	}
 
 	void PixelProcessor::setFloatConstant(unsigned int index, const float value[4])
@@ -92,35 +87,6 @@
 			c[index][3] = value[3];
 		}
 		else ASSERT(false);
-
-		if(index < 8)   // ps_1_x constants
-		{
-			// FIXME: Compact into generic function
-			short x = iround(4095 * clamp(value[0], -1.0f, 1.0f));
-			short y = iround(4095 * clamp(value[1], -1.0f, 1.0f));
-			short z = iround(4095 * clamp(value[2], -1.0f, 1.0f));
-			short w = iround(4095 * clamp(value[3], -1.0f, 1.0f));
-
-			cW[index][0][0] = x;
-			cW[index][0][1] = x;
-			cW[index][0][2] = x;
-			cW[index][0][3] = x;
-
-			cW[index][1][0] = y;
-			cW[index][1][1] = y;
-			cW[index][1][2] = y;
-			cW[index][1][3] = y;
-
-			cW[index][2][0] = z;
-			cW[index][2][1] = z;
-			cW[index][2][2] = z;
-			cW[index][2][3] = z;
-
-			cW[index][3][0] = w;
-			cW[index][3][1] = w;
-			cW[index][3][2] = w;
-			cW[index][3][3] = w;
-		}
 	}
 
 	void PixelProcessor::setIntegerConstant(unsigned int index, const int value[4])
@@ -177,186 +143,6 @@
 		context->stencilBufferLayer = layer;
 	}
 
-	void PixelProcessor::setTexCoordIndex(unsigned int stage, int texCoordIndex)
-	{
-		if(stage < 8)
-		{
-			context->textureStage[stage].setTexCoordIndex(texCoordIndex);
-		}
-		else ASSERT(false);
-	}
-
-	void PixelProcessor::setStageOperation(unsigned int stage, TextureStage::StageOperation stageOperation)
-	{
-		if(stage < 8)
-		{
-			context->textureStage[stage].setStageOperation(stageOperation);
-		}
-		else ASSERT(false);
-	}
-
-	void PixelProcessor::setFirstArgument(unsigned int stage, TextureStage::SourceArgument firstArgument)
-	{
-		if(stage < 8)
-		{
-			context->textureStage[stage].setFirstArgument(firstArgument);
-		}
-		else ASSERT(false);
-	}
-
-	void PixelProcessor::setSecondArgument(unsigned int stage, TextureStage::SourceArgument secondArgument)
-	{
-		if(stage < 8)
-		{
-			context->textureStage[stage].setSecondArgument(secondArgument);
-		}
-		else ASSERT(false);
-	}
-
-	void PixelProcessor::setThirdArgument(unsigned int stage, TextureStage::SourceArgument thirdArgument)
-	{
-		if(stage < 8)
-		{
-			context->textureStage[stage].setThirdArgument(thirdArgument);
-		}
-		else ASSERT(false);
-	}
-
-	void PixelProcessor::setStageOperationAlpha(unsigned int stage, TextureStage::StageOperation stageOperationAlpha)
-	{
-		if(stage < 8)
-		{
-			context->textureStage[stage].setStageOperationAlpha(stageOperationAlpha);
-		}
-		else ASSERT(false);
-	}
-
-	void PixelProcessor::setFirstArgumentAlpha(unsigned int stage, TextureStage::SourceArgument firstArgumentAlpha)
-	{
-		if(stage < 8)
-		{
-			context->textureStage[stage].setFirstArgumentAlpha(firstArgumentAlpha);
-		}
-		else ASSERT(false);
-	}
-
-	void PixelProcessor::setSecondArgumentAlpha(unsigned int stage, TextureStage::SourceArgument secondArgumentAlpha)
-	{
-		if(stage < 8)
-		{
-			context->textureStage[stage].setSecondArgumentAlpha(secondArgumentAlpha);
-		}
-		else ASSERT(false);
-	}
-
-	void PixelProcessor::setThirdArgumentAlpha(unsigned int stage, TextureStage::SourceArgument thirdArgumentAlpha)
-	{
-		if(stage < 8)
-		{
-			context->textureStage[stage].setThirdArgumentAlpha(thirdArgumentAlpha);
-		}
-		else ASSERT(false);
-	}
-
-	void PixelProcessor::setFirstModifier(unsigned int stage, TextureStage::ArgumentModifier firstModifier)
-	{
-		if(stage < 8)
-		{
-			context->textureStage[stage].setFirstModifier(firstModifier);
-		}
-		else ASSERT(false);
-	}
-
-	void PixelProcessor::setSecondModifier(unsigned int stage, TextureStage::ArgumentModifier secondModifier)
-	{
-		if(stage < 8)
-		{
-			context->textureStage[stage].setSecondModifier(secondModifier);
-		}
-		else ASSERT(false);
-	}
-
-	void PixelProcessor::setThirdModifier(unsigned int stage, TextureStage::ArgumentModifier thirdModifier)
-	{
-		if(stage < 8)
-		{
-			context->textureStage[stage].setThirdModifier(thirdModifier);
-		}
-		else ASSERT(false);
-	}
-
-	void PixelProcessor::setFirstModifierAlpha(unsigned int stage, TextureStage::ArgumentModifier firstModifierAlpha)
-	{
-		if(stage < 8)
-		{
-			context->textureStage[stage].setFirstModifierAlpha(firstModifierAlpha);
-		}
-		else ASSERT(false);
-	}
-
-	void PixelProcessor::setSecondModifierAlpha(unsigned int stage, TextureStage::ArgumentModifier secondModifierAlpha)
-	{
-		if(stage < 8)
-		{
-			context->textureStage[stage].setSecondModifierAlpha(secondModifierAlpha);
-		}
-		else ASSERT(false);
-	}
-
-	void PixelProcessor::setThirdModifierAlpha(unsigned int stage, TextureStage::ArgumentModifier thirdModifierAlpha)
-	{
-		if(stage < 8)
-		{
-			context->textureStage[stage].setThirdModifierAlpha(thirdModifierAlpha);
-		}
-		else ASSERT(false);
-	}
-
-	void PixelProcessor::setDestinationArgument(unsigned int stage, TextureStage::DestinationArgument destinationArgument)
-	{
-		if(stage < 8)
-		{
-			context->textureStage[stage].setDestinationArgument(destinationArgument);
-		}
-		else ASSERT(false);
-	}
-
-	void PixelProcessor::setConstantColor(unsigned int stage, const Color<float> &constantColor)
-	{
-		if(stage < 8)
-		{
-			context->textureStage[stage].setConstantColor(constantColor);
-		}
-		else ASSERT(false);
-	}
-
-	void PixelProcessor::setBumpmapMatrix(unsigned int stage, int element, float value)
-	{
-		if(stage < 8)
-		{
-			context->textureStage[stage].setBumpmapMatrix(element, value);
-		}
-		else ASSERT(false);
-	}
-
-	void PixelProcessor::setLuminanceScale(unsigned int stage, float value)
-	{
-		if(stage < 8)
-		{
-			context->textureStage[stage].setLuminanceScale(value);
-		}
-		else ASSERT(false);
-	}
-
-	void PixelProcessor::setLuminanceOffset(unsigned int stage, float value)
-	{
-		if(stage < 8)
-		{
-			context->textureStage[stage].setLuminanceOffset(value);
-		}
-		else ASSERT(false);
-	}
-
 	void PixelProcessor::setTextureFilter(unsigned int sampler, FilterType textureFilter)
 	{
 		if(sampler < TEXTURE_IMAGE_UNITS)
@@ -537,15 +323,6 @@
 		else ASSERT(false);
 	}
 
-	void PixelProcessor::setSyncRequired(unsigned int sampler, bool isSincRequired)
-	{
-		if(sampler < TEXTURE_IMAGE_UNITS)
-		{
-			context->sampler[sampler].setSyncRequired(isSincRequired);
-		}
-		else ASSERT(false);
-	}
-
 	void PixelProcessor::setWriteSRGB(bool sRGB)
 	{
 		context->setWriteSRGB(sRGB);
@@ -683,35 +460,6 @@
 		context->stencilZFailOperationCCW = stencilZFailOperation;
 	}
 
-	void PixelProcessor::setTextureFactor(const Color<float> &textureFactor)
-	{
-		// FIXME: Compact into generic function   // FIXME: Clamp
-		short textureFactorR = iround(4095 * textureFactor.r);
-		short textureFactorG = iround(4095 * textureFactor.g);
-		short textureFactorB = iround(4095 * textureFactor.b);
-		short textureFactorA = iround(4095 * textureFactor.a);
-
-		factor.textureFactor4[0][0] = textureFactorR;
-		factor.textureFactor4[0][1] = textureFactorR;
-		factor.textureFactor4[0][2] = textureFactorR;
-		factor.textureFactor4[0][3] = textureFactorR;
-
-		factor.textureFactor4[1][0] = textureFactorG;
-		factor.textureFactor4[1][1] = textureFactorG;
-		factor.textureFactor4[1][2] = textureFactorG;
-		factor.textureFactor4[1][3] = textureFactorG;
-
-		factor.textureFactor4[2][0] = textureFactorB;
-		factor.textureFactor4[2][1] = textureFactorB;
-		factor.textureFactor4[2][2] = textureFactorB;
-		factor.textureFactor4[2][3] = textureFactorB;
-
-		factor.textureFactor4[3][0] = textureFactorA;
-		factor.textureFactor4[3][1] = textureFactorA;
-		factor.textureFactor4[3][2] = textureFactorA;
-		factor.textureFactor4[3][3] = textureFactorA;
-	}
-
 	void PixelProcessor::setBlendConstant(const Color<float> &blendConstant)
 	{
 		// FIXME: Compact into generic function   // FIXME: Clamp
@@ -807,16 +555,6 @@
 		factor.invBlendConstant4F[3][3] = 1 - blendConstant.a;
 	}
 
-	void PixelProcessor::setFillMode(FillMode fillMode)
-	{
-		context->fillMode = fillMode;
-	}
-
-	void PixelProcessor::setShadingMode(ShadingMode shadingMode)
-	{
-		context->shadingMode = shadingMode;
-	}
-
 	void PixelProcessor::setAlphaBlendEnable(bool alphaBlendEnable)
 	{
 		context->setAlphaBlendEnable(alphaBlendEnable);
@@ -867,59 +605,6 @@
 		factor.alphaReference4[3] = (word)iround(alphaReference * 0x1000 / 0xFF);
 	}
 
-	void PixelProcessor::setGlobalMipmapBias(float bias)
-	{
-		context->setGlobalMipmapBias(bias);
-	}
-
-	void PixelProcessor::setFogStart(float start)
-	{
-		setFogRanges(start, context->fogEnd);
-	}
-
-	void PixelProcessor::setFogEnd(float end)
-	{
-		setFogRanges(context->fogStart, end);
-	}
-
-	void PixelProcessor::setFogColor(Color<float> fogColor)
-	{
-		// TODO: Compact into generic function
-		word fogR = (unsigned short)(65535 * fogColor.r);
-		word fogG = (unsigned short)(65535 * fogColor.g);
-		word fogB = (unsigned short)(65535 * fogColor.b);
-
-		fog.color4[0][0] = fogR;
-		fog.color4[0][1] = fogR;
-		fog.color4[0][2] = fogR;
-		fog.color4[0][3] = fogR;
-
-		fog.color4[1][0] = fogG;
-		fog.color4[1][1] = fogG;
-		fog.color4[1][2] = fogG;
-		fog.color4[1][3] = fogG;
-
-		fog.color4[2][0] = fogB;
-		fog.color4[2][1] = fogB;
-		fog.color4[2][2] = fogB;
-		fog.color4[2][3] = fogB;
-
-		fog.colorF[0] = replicate(fogColor.r);
-		fog.colorF[1] = replicate(fogColor.g);
-		fog.colorF[2] = replicate(fogColor.b);
-	}
-
-	void PixelProcessor::setFogDensity(float fogDensity)
-	{
-		fog.densityE = replicate(-fogDensity * 1.442695f);   // 1/e^x = 2^(-x*1.44)
-		fog.density2E = replicate(-fogDensity * fogDensity * 1.442695f);
-	}
-
-	void PixelProcessor::setPixelFogMode(FogMode fogMode)
-	{
-		context->pixelFogMode = fogMode;
-	}
-
 	void PixelProcessor::setPerspectiveCorrection(bool perspectiveEnable)
 	{
 		perspectiveCorrection = perspectiveEnable;
@@ -936,23 +621,6 @@
 		routineCache = new RoutineCache<State>(clamp(cacheSize, 1, 65536), precachePixel ? "sw-pixel" : 0);
 	}
 
-	void PixelProcessor::setFogRanges(float start, float end)
-	{
-		context->fogStart = start;
-		context->fogEnd = end;
-
-		if(start == end)
-		{
-			end += 0.001f;   // Hack: ensure there is a small range
-		}
-
-		float fogScale = -1.0f / (end - start);
-		float fogOffset = end * -fogScale;
-
-		fog.scale = replicate(fogScale);
-		fog.offset = replicate(fogOffset);
-	}
-
 	const PixelProcessor::State PixelProcessor::update() const
 	{
 		State state;
@@ -1008,9 +676,6 @@
 
 		state.occlusionEnabled = context->occlusionEnabled;
 
-		state.fogActive = context->fogActive();
-		state.pixelFogMode = context->pixelFogActive();
-		state.wBasedFog = context->wBasedFog && context->pixelFogActive() != FOG_NONE;
 		state.perspective = context->perspectiveActive();
 		state.depthClamp = (context->depthBias != 0.0f) || (context->slopeDepthBias != 0.0f);
 
@@ -1044,15 +709,6 @@
 
 		state.frontFaceCCW = context->frontFacingCCW;
 
-		if(!context->pixelShader)
-		{
-			for(unsigned int i = 0; i < 8; i++)
-			{
-				state.textureStage[i] = context->textureStage[i].textureStageState();
-			}
-
-			state.specularAdd = context->specularActive() && context->specularEnable;
-		}
 
 		for(unsigned int i = 0; i < 16; i++)
 		{
@@ -1063,104 +719,31 @@
 					state.sampler[i] = context->sampler[i].samplerState();
 				}
 			}
-			else
-			{
-				if(i < 8 && state.textureStage[i].stageOperation != TextureStage::STAGE_DISABLE)
-				{
-					state.sampler[i] = context->sampler[i].samplerState();
-				}
-				else break;
-			}
 		}
 
-		const bool point = context->isDrawPoint(true);
-		const bool sprite = context->pointSpriteActive();
-		const bool flatShading = (context->shadingMode == SHADING_FLAT) || point;
+		const bool point = context->isDrawPoint();
 
-		if(context->pixelShaderModel() < 0x0300)
+		for(int interpolant = 0; interpolant < MAX_FRAGMENT_INPUTS; interpolant++)
 		{
-			for(int coordinate = 0; coordinate < 8; coordinate++)
+			for(int component = 0; component < 4; component++)
 			{
-				for(int component = 0; component < 4; component++)
+				const Shader::Semantic &semantic = context->pixelShader->getInput(interpolant, component);
+
+				if(semantic.active())
 				{
-					if(context->textureActive(coordinate, component))
-					{
-						state.texture[coordinate].component |= 1 << component;
+					bool flat = point;
 
-						if(point && !sprite)
-						{
-							state.texture[coordinate].flat |= 1 << component;
-						}
+					switch(semantic.usage)
+					{
+					case Shader::USAGE_TEXCOORD: flat = false;                  break;
+					case Shader::USAGE_COLOR:    flat = semantic.flat || point; break;
 					}
-				}
 
-				if(context->textureTransformProject[coordinate] && context->pixelShaderModel() <= 0x0103)
-				{
-					if(context->textureTransformCount[coordinate] == 2)
+					state.interpolant[interpolant].component |= 1 << component;
+
+					if(flat)
 					{
-						state.texture[coordinate].project = 1;
-					}
-					else if(context->textureTransformCount[coordinate] == 3)
-					{
-						state.texture[coordinate].project = 2;
-					}
-					else if(context->textureTransformCount[coordinate] == 4 || context->textureTransformCount[coordinate] == 0)
-					{
-						state.texture[coordinate].project = 3;
-					}
-				}
-			}
-
-			for(int color = 0; color < 2; color++)
-			{
-				for(int component = 0; component < 4; component++)
-				{
-					if(context->colorActive(color, component))
-					{
-						state.color[color].component |= 1 << component;
-
-						if(point || flatShading)
-						{
-							state.color[color].flat |= 1 << component;
-						}
-					}
-				}
-			}
-
-			if(context->fogActive())
-			{
-				state.fog.component = true;
-
-				if(point)
-				{
-					state.fog.flat = true;
-				}
-			}
-		}
-		else
-		{
-			for(int interpolant = 0; interpolant < MAX_FRAGMENT_INPUTS; interpolant++)
-			{
-				for(int component = 0; component < 4; component++)
-				{
-					const Shader::Semantic &semantic = context->pixelShader->getInput(interpolant, component);
-
-					if(semantic.active())
-					{
-						bool flat = point;
-
-						switch(semantic.usage)
-						{
-						case Shader::USAGE_TEXCOORD: flat = point && !sprite;             break;
-						case Shader::USAGE_COLOR:    flat = semantic.flat || flatShading; break;
-						}
-
-						state.interpolant[interpolant].component |= 1 << component;
-
-						if(flat)
-						{
-							state.interpolant[interpolant].flat |= 1 << component;
-						}
+						state.interpolant[interpolant].flat |= 1 << component;
 					}
 				}
 			}
@@ -1189,17 +772,7 @@
 		if(!routine)
 		{
 			const bool integerPipeline = (context->pixelShaderModel() <= 0x0104);
-			QuadRasterizer *generator = nullptr;
-
-			if(integerPipeline)
-			{
-				generator = new PixelPipeline(state, context->pixelShader);
-			}
-			else
-			{
-				generator = new PixelProgram(state, context->pixelShader);
-			}
-
+			QuadRasterizer *generator = new PixelProgram(state, context->pixelShader);
 			generator->generate();
 			routine = (*generator)(L"PixelRoutine_%0.8X", state.shaderID);
 			delete generator;
diff --git a/src/Device/PixelProcessor.hpp b/src/Device/PixelProcessor.hpp
index 98300de..d8645b8 100644
--- a/src/Device/PixelProcessor.hpp
+++ b/src/Device/PixelProcessor.hpp
@@ -60,11 +60,7 @@
 			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 depthClamp                           : 1;
 
@@ -88,7 +84,6 @@
 			LogicalOperation logicalOperation : BITS(LOGICALOP_LAST);
 
 			Sampler::State sampler[TEXTURE_IMAGE_UNITS];
-			TextureStage::State textureStage[8];
 
 			struct Interpolant
 			{
@@ -127,11 +122,6 @@
 				return (alphaCompareMode != ALPHA_ALWAYS) || (transparencyAntialiasing != TRANSPARENCY_NONE);
 			}
 
-			bool pixelFogActive() const
-			{
-				return pixelFogMode != FOG_NONE;
-			}
-
 			unsigned int hash;
 		};
 
@@ -162,20 +152,8 @@
 			}
 		};
 
-		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];
@@ -203,21 +181,6 @@
 		void setStencilBuffer(Surface *stencilBuffer, unsigned int layer = 0);
 
 		void setTexCoordIndex(unsigned int stage, int texCoordIndex);
-		void setStageOperation(unsigned int stage, TextureStage::StageOperation stageOperation);
-		void setFirstArgument(unsigned int stage, TextureStage::SourceArgument firstArgument);
-		void setSecondArgument(unsigned int stage, TextureStage::SourceArgument secondArgument);
-		void setThirdArgument(unsigned int stage, TextureStage::SourceArgument thirdArgument);
-		void setStageOperationAlpha(unsigned int stage, TextureStage::StageOperation stageOperationAlpha);
-		void setFirstArgumentAlpha(unsigned int stage, TextureStage::SourceArgument firstArgumentAlpha);
-		void setSecondArgumentAlpha(unsigned int stage, TextureStage::SourceArgument secondArgumentAlpha);
-		void setThirdArgumentAlpha(unsigned int stage, TextureStage::SourceArgument thirdArgumentAlpha);
-		void setFirstModifier(unsigned int stage, TextureStage::ArgumentModifier firstModifier);
-		void setSecondModifier(unsigned int stage, TextureStage::ArgumentModifier secondModifier);
-		void setThirdModifier(unsigned int stage, TextureStage::ArgumentModifier thirdModifier);
-		void setFirstModifierAlpha(unsigned int stage, TextureStage::ArgumentModifier firstModifierAlpha);
-		void setSecondModifierAlpha(unsigned int stage, TextureStage::ArgumentModifier secondModifierAlpha);
-		void setThirdModifierAlpha(unsigned int stage, TextureStage::ArgumentModifier thirdModifierAlpha);
-		void setDestinationArgument(unsigned int stage, TextureStage::DestinationArgument destinationArgument);
 		void setConstantColor(unsigned int stage, const Color<float> &constantColor);
 		void setBumpmapMatrix(unsigned int stage, int element, float value);
 		void setLuminanceScale(unsigned int stage, float value);
@@ -243,7 +206,6 @@
 		void setMaxLevel(unsigned int sampler, int maxLevel);
 		void setMinLod(unsigned int sampler, float minLod);
 		void setMaxLod(unsigned int sampler, float maxLod);
-		void setSyncRequired(unsigned int sampler, bool isSincRequired);
 
 		void setWriteSRGB(bool sRGB);
 		void setDepthBufferEnable(bool depthBufferEnable);
@@ -274,12 +236,8 @@
 		void setStencilZFailOperationCCW(StencilOperation stencilZFailOperation);
 		void setStencilWriteMaskCCW(int stencilWriteMask);
 
-		void setTextureFactor(const Color<float> &textureFactor);
 		void setBlendConstant(const Color<float> &blendConstant);
 
-		void setFillMode(FillMode fillMode);
-		void setShadingMode(ShadingMode shadingMode);
-
 		void setAlphaBlendEnable(bool alphaBlendEnable);
 		void setSourceBlendFactor(BlendFactor sourceBlendFactor);
 		void setDestBlendFactor(BlendFactor destBlendFactor);
@@ -292,14 +250,6 @@
 
 		void setAlphaReference(float alphaReference);
 
-		void setGlobalMipmapBias(float bias);
-
-		void setFogStart(float start);
-		void setFogEnd(float end);
-		void setFogColor(Color<float> fogColor);
-		void setFogDensity(float fogDensity);
-		void setPixelFogMode(FogMode fogMode);
-
 		void setPerspectiveCorrection(bool perspectiveCorrection);
 
 		void setOcclusionEnabled(bool enable);
@@ -310,7 +260,6 @@
 		void setRoutineCacheSize(int routineCacheSize);
 
 		// Shader constants
-		word4 cW[8][4];
 		float4 c[FRAGMENT_UNIFORM_VECTORS];
 		int4 i[16];
 		bool b[16];
@@ -318,7 +267,6 @@
 		// Other semi-constants
 		Stencil stencil;
 		Stencil stencilCCW;
-		Fog fog;
 		Factor factor;
 
 	private:
diff --git a/src/Device/Renderer.cpp b/src/Device/Renderer.cpp
index 71b22a5..6df648e 100644
--- a/src/Device/Renderer.cpp
+++ b/src/Device/Renderer.cpp
@@ -125,13 +125,10 @@
 	{
 		setGlobalRenderingSettings(conventions, exactColorRounding);
 
-		setRenderTarget(0, 0);
+		setRenderTarget(0, nullptr);
 		clipper = new Clipper(symmetricNormalizedDepth);
 		blitter = new Blitter;
 
-		updateViewMatrix = true;
-		updateBaseMatrix = true;
-		updateProjectionMatrix = true;
 		updateClipPlanes = true;
 
 		#if PERF_HUD
@@ -140,11 +137,11 @@
 
 		for(int i = 0; i < 16; i++)
 		{
-			vertexTask[i] = 0;
+			vertexTask[i] = nullptr;
 
-			worker[i] = 0;
-			resume[i] = 0;
-			suspend[i] = 0;
+			worker[i] = nullptr;
+			resume[i] = nullptr;
+			suspend[i] = nullptr;
 		}
 
 		threadsAwake = 0;
@@ -158,8 +155,8 @@
 
 		for(int i = 0; i < 16; i++)
 		{
-			triangleBatch[i] = 0;
-			primitiveBatch[i] = 0;
+			triangleBatch[i] = nullptr;
+			primitiveBatch[i] = nullptr;
 		}
 
 		for(int draw = 0; draw < DRAW_COUNT; draw++)
@@ -233,472 +230,371 @@
 		updateConfiguration();
 		updateClipper();
 
-		int ss = context->getSuperSampleCount();
 		int ms = context->getMultiSampleCount();
-		bool requiresSync = false;
+		unsigned int oldMultiSampleMask = context->multiSampleMask;
+		context->multiSampleMask = context->sampleMask & ((unsigned)0xFFFFFFFF >> (32 - ms));
 
-		for(int q = 0; q < ss; q++)
+		if(!context->multiSampleMask)
 		{
-			unsigned int oldMultiSampleMask = context->multiSampleMask;
-			context->multiSampleMask = (context->sampleMask >> (ms * q)) & ((unsigned)0xFFFFFFFF >> (32 - ms));
+			return;
+		}
 
-			if(!context->multiSampleMask)
+		sync->lock(sw::PRIVATE);
+
+		if(update || oldMultiSampleMask != context->multiSampleMask)
+		{
+			vertexState = VertexProcessor::update(drawType);
+			setupState = SetupProcessor::update();
+			pixelState = PixelProcessor::update();
+
+			vertexRoutine = VertexProcessor::routine(vertexState);
+			setupRoutine = SetupProcessor::routine(setupState);
+			pixelRoutine = PixelProcessor::routine(pixelState);
+		}
+
+		int batch = batchSize / ms;
+
+		int (Renderer::*setupPrimitives)(int batch, int count);
+
+		if(context->isDrawTriangle())
+		{
+			setupPrimitives = &Renderer::setupTriangles;
+		}
+		else if(context->isDrawLine())
+		{
+			setupPrimitives = &Renderer::setupLines;
+		}
+		else   // Point draw
+		{
+			setupPrimitives = &Renderer::setupPoints;
+		}
+
+		DrawCall *draw = nullptr;
+
+		do
+		{
+			for(int i = 0; i < DRAW_COUNT; i++)
 			{
-				continue;
-			}
-
-			sync->lock(sw::PRIVATE);
-
-			if(update || oldMultiSampleMask != context->multiSampleMask)
-			{
-				vertexState = VertexProcessor::update(drawType);
-				setupState = SetupProcessor::update();
-				pixelState = PixelProcessor::update();
-
-				vertexRoutine = VertexProcessor::routine(vertexState);
-				setupRoutine = SetupProcessor::routine(setupState);
-				pixelRoutine = PixelProcessor::routine(pixelState);
-			}
-
-			int batch = batchSize / ms;
-
-			int (Renderer::*setupPrimitives)(int batch, int count);
-
-			if(context->isDrawTriangle())
-			{
-				switch(context->fillMode)
+				if(drawCall[i]->references == -1)
 				{
-				case FILL_SOLID:
-					setupPrimitives = &Renderer::setupSolidTriangles;
+					draw = drawCall[i];
+					drawList[nextDraw & DRAW_COUNT_BITS] = draw;
+
 					break;
-				case FILL_WIREFRAME:
-					setupPrimitives = &Renderer::setupWireframeTriangle;
-					batch = 1;
-					break;
-				case FILL_VERTEX:
-					setupPrimitives = &Renderer::setupVertexTriangle;
-					batch = 1;
-					break;
-				default:
-					ASSERT(false);
-					return;
-				}
-			}
-			else if(context->isDrawLine())
-			{
-				setupPrimitives = &Renderer::setupLines;
-			}
-			else   // Point draw
-			{
-				setupPrimitives = &Renderer::setupPoints;
-			}
-
-			DrawCall *draw = nullptr;
-
-			do
-			{
-				for(int i = 0; i < DRAW_COUNT; i++)
-				{
-					if(drawCall[i]->references == -1)
-					{
-						draw = drawCall[i];
-						drawList[nextDraw & DRAW_COUNT_BITS] = draw;
-
-						break;
-					}
-				}
-
-				if(!draw)
-				{
-					resumeApp->wait();
-				}
-			}
-			while(!draw);
-
-			DrawData *data = draw->data;
-
-			if(queries.size() != 0)
-			{
-				draw->queries = new std::list<Query*>();
-				bool includePrimitivesWrittenQueries = vertexState.transformFeedbackQueryEnabled && vertexState.transformFeedbackEnabled;
-				for(auto &query : queries)
-				{
-					if(includePrimitivesWrittenQueries || (query->type != Query::TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN))
-					{
-						++query->reference; // Atomic
-						draw->queries->push_back(query);
-					}
 				}
 			}
 
-			draw->drawType = drawType;
-			draw->batchSize = batch;
-
-			vertexRoutine->bind();
-			setupRoutine->bind();
-			pixelRoutine->bind();
-
-			draw->vertexRoutine = vertexRoutine;
-			draw->setupRoutine = setupRoutine;
-			draw->pixelRoutine = pixelRoutine;
-			draw->vertexPointer = (VertexProcessor::RoutinePointer)vertexRoutine->getEntry();
-			draw->setupPointer = (SetupProcessor::RoutinePointer)setupRoutine->getEntry();
-			draw->pixelPointer = (PixelProcessor::RoutinePointer)pixelRoutine->getEntry();
-			draw->setupPrimitives = setupPrimitives;
-			draw->setupState = setupState;
-
-			for(int i = 0; i < MAX_VERTEX_INPUTS; i++)
+			if(!draw)
 			{
-				draw->vertexStream[i] = context->input[i].resource;
-				data->input[i] = context->input[i].buffer;
-				data->stride[i] = context->input[i].stride;
-
-				if(draw->vertexStream[i])
-				{
-					draw->vertexStream[i]->lock(PUBLIC, PRIVATE);
-				}
+				resumeApp->wait();
 			}
+		}
+		while(!draw);
 
-			if(context->indexBuffer)
+		DrawData *data = draw->data;
+
+		if(queries.size() != 0)
+		{
+			draw->queries = new std::list<Query*>();
+			bool includePrimitivesWrittenQueries = vertexState.transformFeedbackQueryEnabled && vertexState.transformFeedbackEnabled;
+			for(auto &query : queries)
 			{
-				data->indices = (unsigned char*)context->indexBuffer->lock(PUBLIC, PRIVATE) + indexOffset;
-			}
-
-			draw->indexBuffer = context->indexBuffer;
-
-			for(int sampler = 0; sampler < TOTAL_IMAGE_UNITS; sampler++)
-			{
-				draw->texture[sampler] = 0;
-			}
-
-			for(int sampler = 0; sampler < TEXTURE_IMAGE_UNITS; sampler++)
-			{
-				if(pixelState.sampler[sampler].textureType != TEXTURE_NULL)
+				if(includePrimitivesWrittenQueries || (query->type != Query::TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN))
 				{
-					draw->texture[sampler] = context->texture[sampler];
-					draw->texture[sampler]->lock(PUBLIC, isReadWriteTexture(sampler) ? MANAGED : PRIVATE);   // If the texure is both read and written, use the same read/write lock as render targets
-
-					data->mipmap[sampler] = context->sampler[sampler].getTextureData();
-
-					requiresSync |= context->sampler[sampler].requiresSync();
-				}
-			}
-
-			if(context->pixelShader)
-			{
-				if(draw->psDirtyConstF)
-				{
-					memcpy(&data->ps.cW, PixelProcessor::cW, sizeof(word4) * 4 * (draw->psDirtyConstF < 8 ? draw->psDirtyConstF : 8));
-					memcpy(&data->ps.c, PixelProcessor::c, sizeof(float4) * draw->psDirtyConstF);
-					draw->psDirtyConstF = 0;
-				}
-
-				if(draw->psDirtyConstI)
-				{
-					memcpy(&data->ps.i, PixelProcessor::i, sizeof(int4) * draw->psDirtyConstI);
-					draw->psDirtyConstI = 0;
-				}
-
-				if(draw->psDirtyConstB)
-				{
-					memcpy(&data->ps.b, PixelProcessor::b, sizeof(bool) * draw->psDirtyConstB);
-					draw->psDirtyConstB = 0;
-				}
-
-				PixelProcessor::lockUniformBuffers(data->ps.u, draw->pUniformBuffers);
-			}
-			else
-			{
-				for(int i = 0; i < MAX_UNIFORM_BUFFER_BINDINGS; i++)
-				{
-					draw->pUniformBuffers[i] = nullptr;
-				}
-			}
-
-			if(context->pixelShaderModel() <= 0x0104)
-			{
-				for(int stage = 0; stage < 8; stage++)
-				{
-					if(pixelState.textureStage[stage].stageOperation != TextureStage::STAGE_DISABLE || context->pixelShader)
-					{
-						data->textureStage[stage] = context->textureStage[stage].uniforms;
-					}
-					else break;
-				}
-			}
-
-			if(context->vertexShader)
-			{
-				if(context->vertexShader->getShaderModel() >= 0x0300)
-				{
-					for(int sampler = 0; sampler < VERTEX_TEXTURE_IMAGE_UNITS; sampler++)
-					{
-						if(vertexState.sampler[sampler].textureType != TEXTURE_NULL)
-						{
-							draw->texture[TEXTURE_IMAGE_UNITS + sampler] = context->texture[TEXTURE_IMAGE_UNITS + sampler];
-							draw->texture[TEXTURE_IMAGE_UNITS + sampler]->lock(PUBLIC, PRIVATE);
-
-							data->mipmap[TEXTURE_IMAGE_UNITS + sampler] = context->sampler[TEXTURE_IMAGE_UNITS + sampler].getTextureData();
-
-							requiresSync |= context->sampler[TEXTURE_IMAGE_UNITS + sampler].requiresSync();
-						}
-					}
-				}
-
-				if(draw->vsDirtyConstF)
-				{
-					memcpy(&data->vs.c, VertexProcessor::c, sizeof(float4) * draw->vsDirtyConstF);
-					draw->vsDirtyConstF = 0;
-				}
-
-				if(draw->vsDirtyConstI)
-				{
-					memcpy(&data->vs.i, VertexProcessor::i, sizeof(int4) * draw->vsDirtyConstI);
-					draw->vsDirtyConstI = 0;
-				}
-
-				if(draw->vsDirtyConstB)
-				{
-					memcpy(&data->vs.b, VertexProcessor::b, sizeof(bool) * draw->vsDirtyConstB);
-					draw->vsDirtyConstB = 0;
-				}
-
-				if(context->vertexShader->isInstanceIdDeclared())
-				{
-					data->instanceID = context->instanceID;
-				}
-
-				VertexProcessor::lockUniformBuffers(data->vs.u, draw->vUniformBuffers);
-				VertexProcessor::lockTransformFeedbackBuffers(data->vs.t, data->vs.reg, data->vs.row, data->vs.col, data->vs.str, draw->transformFeedbackBuffers);
-			}
-			else
-			{
-				data->ff = ff;
-
-				draw->vsDirtyConstF = VERTEX_UNIFORM_VECTORS + 1;
-				draw->vsDirtyConstI = 16;
-				draw->vsDirtyConstB = 16;
-
-				for(int i = 0; i < MAX_UNIFORM_BUFFER_BINDINGS; i++)
-				{
-					draw->vUniformBuffers[i] = nullptr;
-				}
-
-				for(int i = 0; i < MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS; i++)
-				{
-					draw->transformFeedbackBuffers[i] = nullptr;
-				}
-			}
-
-			if(pixelState.stencilActive)
-			{
-				data->stencil[0] = stencil;
-				data->stencil[1] = stencilCCW;
-			}
-
-			if(pixelState.fogActive)
-			{
-				data->fog = fog;
-			}
-
-			if(setupState.isDrawPoint)
-			{
-				data->point = point;
-			}
-
-			data->lineWidth = context->lineWidth;
-
-			data->factor = factor;
-
-			if(pixelState.transparencyAntialiasing == TRANSPARENCY_ALPHA_TO_COVERAGE)
-			{
-				float ref = context->alphaReference * (1.0f / 255.0f);
-				float margin = sw::min(ref, 1.0f - ref);
-
-				if(ms == 4)
-				{
-					data->a2c0 = replicate(ref - margin * 0.6f);
-					data->a2c1 = replicate(ref - margin * 0.2f);
-					data->a2c2 = replicate(ref + margin * 0.2f);
-					data->a2c3 = replicate(ref + margin * 0.6f);
-				}
-				else if(ms == 2)
-				{
-					data->a2c0 = replicate(ref - margin * 0.3f);
-					data->a2c1 = replicate(ref + margin * 0.3f);
-				}
-				else ASSERT(false);
-			}
-
-			if(pixelState.occlusionEnabled)
-			{
-				for(int cluster = 0; cluster < clusterCount; cluster++)
-				{
-					data->occlusion[cluster] = 0;
-				}
-			}
-
-			#if PERF_PROFILE
-				for(int cluster = 0; cluster < clusterCount; cluster++)
-				{
-					for(int i = 0; i < PERF_TIMERS; i++)
-					{
-						data->cycles[i][cluster] = 0;
-					}
-				}
-			#endif
-
-			// Viewport
-			{
-				float W = 0.5f * viewport.width;
-				float H = 0.5f * viewport.height;
-				float X0 = viewport.x0 + W;
-				float Y0 = viewport.y0 + H;
-				float N = viewport.minZ;
-				float F = viewport.maxZ;
-				float Z = F - N;
-
-				if(context->isDrawTriangle(false))
-				{
-					N += context->depthBias;
-				}
-
-				if(complementaryDepthBuffer)
-				{
-					Z = -Z;
-					N = 1 - N;
-				}
-
-				static const float X[5][16] =   // Fragment offsets
-				{
-					{+0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f},   // 1 sample
-					{-0.2500f, +0.2500f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f},   // 2 samples
-					{-0.3000f, +0.1000f, +0.3000f, -0.1000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f},   // 4 samples
-					{+0.1875f, -0.3125f, +0.3125f, -0.4375f, -0.0625f, +0.4375f, +0.0625f, -0.1875f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f},   // 8 samples
-					{+0.2553f, -0.1155f, +0.1661f, -0.1828f, +0.2293f, -0.4132f, -0.1773f, -0.0577f, +0.3891f, -0.4656f, +0.4103f, +0.4248f, -0.2109f, +0.3966f, -0.2664f, -0.3872f}    // 16 samples
-				};
-
-				static const float Y[5][16] =   // Fragment offsets
-				{
-					{+0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f},   // 1 sample
-					{-0.2500f, +0.2500f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f},   // 2 samples
-					{-0.1000f, -0.3000f, +0.1000f, +0.3000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f},   // 4 samples
-					{-0.4375f, -0.3125f, -0.1875f, -0.0625f, +0.0625f, +0.1875f, +0.3125f, +0.4375f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f, +0.0000f},   // 8 samples
-					{-0.4503f, +0.1883f, +0.3684f, -0.4668f, -0.0690f, -0.1315f, +0.4999f, +0.0728f, +0.1070f, -0.3086f, +0.3725f, -0.1547f, -0.1102f, -0.3588f, +0.1789f, +0.0269f}    // 16 samples
-				};
-
-				int s = sw::log2(ss);
-
-				data->Wx16 = replicate(W * 16);
-				data->Hx16 = replicate(H * 16);
-				data->X0x16 = replicate(X0 * 16 - 8);
-				data->Y0x16 = replicate(Y0 * 16 - 8);
-				data->XXXX = replicate(X[s][q] / W);
-				data->YYYY = replicate(Y[s][q] / H);
-				data->halfPixelX = replicate(0.5f / W);
-				data->halfPixelY = replicate(0.5f / H);
-				data->viewportHeight = abs(viewport.height);
-				data->slopeDepthBias = context->slopeDepthBias;
-				data->depthRange = Z;
-				data->depthNear = N;
-				draw->clipFlags = clipFlags;
-
-				if(clipFlags)
-				{
-					if(clipFlags & Clipper::CLIP_PLANE0) data->clipPlane[0] = clipPlane[0];
-					if(clipFlags & Clipper::CLIP_PLANE1) data->clipPlane[1] = clipPlane[1];
-					if(clipFlags & Clipper::CLIP_PLANE2) data->clipPlane[2] = clipPlane[2];
-					if(clipFlags & Clipper::CLIP_PLANE3) data->clipPlane[3] = clipPlane[3];
-					if(clipFlags & Clipper::CLIP_PLANE4) data->clipPlane[4] = clipPlane[4];
-					if(clipFlags & Clipper::CLIP_PLANE5) data->clipPlane[5] = clipPlane[5];
-				}
-			}
-
-			// Target
-			{
-				for(int index = 0; index < RENDERTARGETS; index++)
-				{
-					draw->renderTarget[index] = context->renderTarget[index];
-
-					if(draw->renderTarget[index])
-					{
-						unsigned int layer = context->renderTargetLayer[index];
-						requiresSync |= context->renderTarget[index]->requiresSync();
-						data->colorBuffer[index] = (unsigned int*)context->renderTarget[index]->lockInternal(0, 0, layer, LOCK_READWRITE, MANAGED);
-						data->colorBuffer[index] += q * ms * context->renderTarget[index]->getSliceB(true);
-						data->colorPitchB[index] = context->renderTarget[index]->getInternalPitchB();
-						data->colorSliceB[index] = context->renderTarget[index]->getInternalSliceB();
-					}
-				}
-
-				draw->depthBuffer = context->depthBuffer;
-				draw->stencilBuffer = context->stencilBuffer;
-
-				if(draw->depthBuffer)
-				{
-					unsigned int layer = context->depthBufferLayer;
-					requiresSync |= context->depthBuffer->requiresSync();
-					data->depthBuffer = (float*)context->depthBuffer->lockInternal(0, 0, layer, LOCK_READWRITE, MANAGED);
-					data->depthBuffer += q * ms * context->depthBuffer->getSliceB(true);
-					data->depthPitchB = context->depthBuffer->getInternalPitchB();
-					data->depthSliceB = context->depthBuffer->getInternalSliceB();
-				}
-
-				if(draw->stencilBuffer)
-				{
-					unsigned int layer = context->stencilBufferLayer;
-					requiresSync |= context->stencilBuffer->requiresSync();
-					data->stencilBuffer = (unsigned char*)context->stencilBuffer->lockStencil(0, 0, layer, MANAGED);
-					data->stencilBuffer += q * ms * context->stencilBuffer->getSliceB(true);
-					data->stencilPitchB = context->stencilBuffer->getStencilPitchB();
-					data->stencilSliceB = context->stencilBuffer->getStencilSliceB();
-				}
-			}
-
-			// Scissor
-			{
-				data->scissorX0 = scissor.x0;
-				data->scissorX1 = scissor.x1;
-				data->scissorY0 = scissor.y0;
-				data->scissorY1 = scissor.y1;
-			}
-
-			draw->primitive = 0;
-			draw->count = count;
-
-			draw->references = (count + batch - 1) / batch;
-
-			schedulerMutex.lock();
-			++nextDraw; // Atomic
-			schedulerMutex.unlock();
-
-			#ifndef NDEBUG
-			if(threadCount == 1)   // Use main thread for draw execution
-			{
-				threadsAwake = 1;
-				task[0].type = Task::RESUME;
-
-				taskLoop(0);
-			}
-			else
-			#endif
-			{
-				if(!threadsAwake)
-				{
-					suspend[0]->wait();
-
-					threadsAwake = 1;
-					task[0].type = Task::RESUME;
-
-					resume[0]->signal();
+					++query->reference; // Atomic
+					draw->queries->push_back(query);
 				}
 			}
 		}
 
-		// TODO(sugoi): This is a temporary brute-force workaround to ensure IOSurface synchronization.
-		if(requiresSync)
+		draw->drawType = drawType;
+		draw->batchSize = batch;
+
+		vertexRoutine->bind();
+		setupRoutine->bind();
+		pixelRoutine->bind();
+
+		draw->vertexRoutine = vertexRoutine;
+		draw->setupRoutine = setupRoutine;
+		draw->pixelRoutine = pixelRoutine;
+		draw->vertexPointer = (VertexProcessor::RoutinePointer)vertexRoutine->getEntry();
+		draw->setupPointer = (SetupProcessor::RoutinePointer)setupRoutine->getEntry();
+		draw->pixelPointer = (PixelProcessor::RoutinePointer)pixelRoutine->getEntry();
+		draw->setupPrimitives = setupPrimitives;
+		draw->setupState = setupState;
+
+		for(int i = 0; i < MAX_VERTEX_INPUTS; i++)
 		{
-			synchronize();
+			draw->vertexStream[i] = context->input[i].resource;
+			data->input[i] = context->input[i].buffer;
+			data->stride[i] = context->input[i].stride;
+
+			if(draw->vertexStream[i])
+			{
+				draw->vertexStream[i]->lock(PUBLIC, PRIVATE);
+			}
+		}
+
+		if(context->indexBuffer)
+		{
+			data->indices = (unsigned char*)context->indexBuffer->lock(PUBLIC, PRIVATE) + indexOffset;
+		}
+
+		draw->indexBuffer = context->indexBuffer;
+
+		for(int sampler = 0; sampler < TOTAL_IMAGE_UNITS; sampler++)
+		{
+			draw->texture[sampler] = 0;
+		}
+
+		for(int sampler = 0; sampler < TEXTURE_IMAGE_UNITS; sampler++)
+		{
+			if(pixelState.sampler[sampler].textureType != TEXTURE_NULL)
+			{
+				draw->texture[sampler] = context->texture[sampler];
+				draw->texture[sampler]->lock(PUBLIC, isReadWriteTexture(sampler) ? MANAGED : PRIVATE);   // If the texure is both read and written, use the same read/write lock as render targets
+
+				data->mipmap[sampler] = context->sampler[sampler].getTextureData();
+			}
+		}
+
+		if(context->pixelShader)
+		{
+			if(draw->psDirtyConstF)
+			{
+				memcpy(&data->ps.c, PixelProcessor::c, sizeof(float4) * draw->psDirtyConstF);
+				draw->psDirtyConstF = 0;
+			}
+
+			if(draw->psDirtyConstI)
+			{
+				memcpy(&data->ps.i, PixelProcessor::i, sizeof(int4) * draw->psDirtyConstI);
+				draw->psDirtyConstI = 0;
+			}
+
+			if(draw->psDirtyConstB)
+			{
+				memcpy(&data->ps.b, PixelProcessor::b, sizeof(bool) * draw->psDirtyConstB);
+				draw->psDirtyConstB = 0;
+			}
+
+			PixelProcessor::lockUniformBuffers(data->ps.u, draw->pUniformBuffers);
+		}
+		else
+		{
+			for(int i = 0; i < MAX_UNIFORM_BUFFER_BINDINGS; i++)
+			{
+				draw->pUniformBuffers[i] = nullptr;
+			}
+		}
+
+		for(int sampler = 0; sampler < VERTEX_TEXTURE_IMAGE_UNITS; sampler++)
+		{
+			if(vertexState.sampler[sampler].textureType != TEXTURE_NULL)
+			{
+				draw->texture[TEXTURE_IMAGE_UNITS + sampler] = context->texture[TEXTURE_IMAGE_UNITS + sampler];
+				draw->texture[TEXTURE_IMAGE_UNITS + sampler]->lock(PUBLIC, PRIVATE);
+
+				data->mipmap[TEXTURE_IMAGE_UNITS + sampler] = context->sampler[TEXTURE_IMAGE_UNITS + sampler].getTextureData();
+			}
+		}
+
+		if(draw->vsDirtyConstF)
+		{
+			memcpy(&data->vs.c, VertexProcessor::c, sizeof(float4) * draw->vsDirtyConstF);
+			draw->vsDirtyConstF = 0;
+		}
+
+		if(draw->vsDirtyConstI)
+		{
+			memcpy(&data->vs.i, VertexProcessor::i, sizeof(int4) * draw->vsDirtyConstI);
+			draw->vsDirtyConstI = 0;
+		}
+
+		if(draw->vsDirtyConstB)
+		{
+			memcpy(&data->vs.b, VertexProcessor::b, sizeof(bool) * draw->vsDirtyConstB);
+			draw->vsDirtyConstB = 0;
+		}
+
+		if(context->vertexShader->isInstanceIdDeclared())
+		{
+			data->instanceID = context->instanceID;
+		}
+
+		VertexProcessor::lockUniformBuffers(data->vs.u, draw->vUniformBuffers);
+		VertexProcessor::lockTransformFeedbackBuffers(data->vs.t, data->vs.reg, data->vs.row, data->vs.col, data->vs.str, draw->transformFeedbackBuffers);
+
+		if(pixelState.stencilActive)
+		{
+			data->stencil[0] = stencil;
+			data->stencil[1] = stencilCCW;
+		}
+
+		if(setupState.isDrawPoint)
+		{
+			data->pointSizeMin = pointSizeMin;
+			data->pointSizeMax = pointSizeMax;
+		}
+
+		data->lineWidth = context->lineWidth;
+
+		data->factor = factor;
+
+		if(pixelState.transparencyAntialiasing == TRANSPARENCY_ALPHA_TO_COVERAGE)
+		{
+			float ref = context->alphaReference * (1.0f / 255.0f);
+			float margin = sw::min(ref, 1.0f - ref);
+
+			if(ms == 4)
+			{
+				data->a2c0 = replicate(ref - margin * 0.6f);
+				data->a2c1 = replicate(ref - margin * 0.2f);
+				data->a2c2 = replicate(ref + margin * 0.2f);
+				data->a2c3 = replicate(ref + margin * 0.6f);
+			}
+			else if(ms == 2)
+			{
+				data->a2c0 = replicate(ref - margin * 0.3f);
+				data->a2c1 = replicate(ref + margin * 0.3f);
+			}
+			else ASSERT(false);
+		}
+
+		if(pixelState.occlusionEnabled)
+		{
+			for(int cluster = 0; cluster < clusterCount; cluster++)
+			{
+				data->occlusion[cluster] = 0;
+			}
+		}
+
+		#if PERF_PROFILE
+			for(int cluster = 0; cluster < clusterCount; cluster++)
+			{
+				for(int i = 0; i < PERF_TIMERS; i++)
+				{
+					data->cycles[i][cluster] = 0;
+				}
+			}
+		#endif
+
+		// Viewport
+		{
+			float W = 0.5f * viewport.width;
+			float H = 0.5f * viewport.height;
+			float X0 = viewport.x0 + W;
+			float Y0 = viewport.y0 + H;
+			float N = viewport.minZ;
+			float F = viewport.maxZ;
+			float Z = F - N;
+
+			if(context->isDrawTriangle())
+			{
+				N += context->depthBias;
+			}
+
+			if(complementaryDepthBuffer)
+			{
+				Z = -Z;
+				N = 1 - N;
+			}
+
+			data->Wx16 = replicate(W * 16);
+			data->Hx16 = replicate(H * 16);
+			data->X0x16 = replicate(X0 * 16 - 8);
+			data->Y0x16 = replicate(Y0 * 16 - 8);
+			data->halfPixelX = replicate(0.5f / W);
+			data->halfPixelY = replicate(0.5f / H);
+			data->viewportHeight = abs(viewport.height);
+			data->slopeDepthBias = context->slopeDepthBias;
+			data->depthRange = Z;
+			data->depthNear = N;
+			draw->clipFlags = clipFlags;
+
+			if(clipFlags)
+			{
+				if(clipFlags & Clipper::CLIP_PLANE0) data->clipPlane[0] = clipPlane[0];
+				if(clipFlags & Clipper::CLIP_PLANE1) data->clipPlane[1] = clipPlane[1];
+				if(clipFlags & Clipper::CLIP_PLANE2) data->clipPlane[2] = clipPlane[2];
+				if(clipFlags & Clipper::CLIP_PLANE3) data->clipPlane[3] = clipPlane[3];
+				if(clipFlags & Clipper::CLIP_PLANE4) data->clipPlane[4] = clipPlane[4];
+				if(clipFlags & Clipper::CLIP_PLANE5) data->clipPlane[5] = clipPlane[5];
+			}
+		}
+
+		// Target
+		{
+			for(int index = 0; index < RENDERTARGETS; index++)
+			{
+				draw->renderTarget[index] = context->renderTarget[index];
+
+				if(draw->renderTarget[index])
+				{
+					unsigned int layer = context->renderTargetLayer[index];
+					data->colorBuffer[index] = (unsigned int*)context->renderTarget[index]->lockInternal(0, 0, layer, LOCK_READWRITE, MANAGED);
+					data->colorPitchB[index] = context->renderTarget[index]->getInternalPitchB();
+					data->colorSliceB[index] = context->renderTarget[index]->getInternalSliceB();
+				}
+			}
+
+			draw->depthBuffer = context->depthBuffer;
+			draw->stencilBuffer = context->stencilBuffer;
+
+			if(draw->depthBuffer)
+			{
+				unsigned int layer = context->depthBufferLayer;
+				data->depthBuffer = (float*)context->depthBuffer->lockInternal(0, 0, layer, LOCK_READWRITE, MANAGED);
+				data->depthPitchB = context->depthBuffer->getInternalPitchB();
+				data->depthSliceB = context->depthBuffer->getInternalSliceB();
+			}
+
+			if(draw->stencilBuffer)
+			{
+				unsigned int layer = context->stencilBufferLayer;
+				data->stencilBuffer = (unsigned char*)context->stencilBuffer->lockStencil(0, 0, layer, MANAGED);
+				data->stencilPitchB = context->stencilBuffer->getStencilPitchB();
+				data->stencilSliceB = context->stencilBuffer->getStencilSliceB();
+			}
+		}
+
+		// Scissor
+		{
+			data->scissorX0 = scissor.x0;
+			data->scissorX1 = scissor.x1;
+			data->scissorY0 = scissor.y0;
+			data->scissorY1 = scissor.y1;
+		}
+
+		draw->primitive = 0;
+		draw->count = count;
+
+		draw->references = (count + batch - 1) / batch;
+
+		schedulerMutex.lock();
+		++nextDraw; // Atomic
+		schedulerMutex.unlock();
+
+		#ifndef NDEBUG
+		if(threadCount == 1)   // Use main thread for draw execution
+		{
+			threadsAwake = 1;
+			task[0].type = Task::RESUME;
+
+			taskLoop(0);
+		}
+		else
+		#endif
+		{
+			if(!threadsAwake)
+			{
+				suspend[0]->wait();
+
+				threadsAwake = 1;
+				task[0].type = Task::RESUME;
+
+				resume[0]->signal();
+			}
 		}
 	}
 
@@ -1156,20 +1052,6 @@
 				}
 			}
 			break;
-		case DRAW_LINELOOP:
-			{
-				unsigned int index = start;
-
-				for(unsigned int i = 0; i < triangleCount; i++)
-				{
-					batch[i][0] = (index + 0) % loop;
-					batch[i][1] = (index + 1) % loop;
-					batch[i][2] = (index + 1) % loop;
-
-					index += 1;
-				}
-			}
-			break;
 		case DRAW_TRIANGLELIST:
 			{
 				unsigned int index = 3 * start;
@@ -1230,20 +1112,6 @@
 				}
 			}
 			break;
-		case DRAW_INDEXEDPOINTLIST8:
-			{
-				const unsigned char *index = (const unsigned char*)indices + start;
-
-				for(unsigned int i = 0; i < triangleCount; i++)
-				{
-					batch[i][0] = *index;
-					batch[i][1] = *index;
-					batch[i][2] = *index;
-
-					index += 1;
-				}
-			}
-			break;
 		case DRAW_INDEXEDPOINTLIST16:
 			{
 				const unsigned short *index = (const unsigned short*)indices + start;
@@ -1272,20 +1140,6 @@
 				}
 			}
 			break;
-		case DRAW_INDEXEDLINELIST8:
-			{
-				const unsigned char *index = (const unsigned char*)indices + 2 * start;
-
-				for(unsigned int i = 0; i < triangleCount; i++)
-				{
-					batch[i][0] = index[0];
-					batch[i][1] = index[1];
-					batch[i][2] = index[1];
-
-					index += 2;
-				}
-			}
-			break;
 		case DRAW_INDEXEDLINELIST16:
 			{
 				const unsigned short *index = (const unsigned short*)indices + 2 * start;
@@ -1314,20 +1168,6 @@
 				}
 			}
 			break;
-		case DRAW_INDEXEDLINESTRIP8:
-			{
-				const unsigned char *index = (const unsigned char*)indices + start;
-
-				for(unsigned int i = 0; i < triangleCount; i++)
-				{
-					batch[i][0] = index[0];
-					batch[i][1] = index[1];
-					batch[i][2] = index[1];
-
-					index += 1;
-				}
-			}
-			break;
 		case DRAW_INDEXEDLINESTRIP16:
 			{
 				const unsigned short *index = (const unsigned short*)indices + start;
@@ -1356,56 +1196,6 @@
 				}
 			}
 			break;
-		case DRAW_INDEXEDLINELOOP8:
-			{
-				const unsigned char *index = (const unsigned char*)indices;
-
-				for(unsigned int i = 0; i < triangleCount; i++)
-				{
-					batch[i][0] = index[(start + i + 0) % loop];
-					batch[i][1] = index[(start + i + 1) % loop];
-					batch[i][2] = index[(start + i + 1) % loop];
-				}
-			}
-			break;
-		case DRAW_INDEXEDLINELOOP16:
-			{
-				const unsigned short *index = (const unsigned short*)indices;
-
-				for(unsigned int i = 0; i < triangleCount; i++)
-				{
-					batch[i][0] = index[(start + i + 0) % loop];
-					batch[i][1] = index[(start + i + 1) % loop];
-					batch[i][2] = index[(start + i + 1) % loop];
-				}
-			}
-			break;
-		case DRAW_INDEXEDLINELOOP32:
-			{
-				const unsigned int *index = (const unsigned int*)indices;
-
-				for(unsigned int i = 0; i < triangleCount; i++)
-				{
-					batch[i][0] = index[(start + i + 0) % loop];
-					batch[i][1] = index[(start + i + 1) % loop];
-					batch[i][2] = index[(start + i + 1) % loop];
-				}
-			}
-			break;
-		case DRAW_INDEXEDTRIANGLELIST8:
-			{
-				const unsigned char *index = (const unsigned char*)indices + 3 * start;
-
-				for(unsigned int i = 0; i < triangleCount; i++)
-				{
-					batch[i][0] = index[0];
-					batch[i][1] = index[1];
-					batch[i][2] = index[2];
-
-					index += 3;
-				}
-			}
-			break;
 		case DRAW_INDEXEDTRIANGLELIST16:
 			{
 				const unsigned short *index = (const unsigned short*)indices + 3 * start;
@@ -1434,20 +1224,6 @@
 				}
 			}
 			break;
-		case DRAW_INDEXEDTRIANGLESTRIP8:
-			{
-				const unsigned char *index = (const unsigned char*)indices + start;
-
-				for(unsigned int i = 0; i < triangleCount; i++)
-				{
-					batch[i][0] = index[0];
-					batch[i][1] = index[((start + i) & 1) + 1];
-					batch[i][2] = index[(~(start + i) & 1) + 1];
-
-					index += 1;
-				}
-			}
-			break;
 		case DRAW_INDEXEDTRIANGLESTRIP16:
 			{
 				const unsigned short *index = (const unsigned short*)indices + start;
@@ -1476,18 +1252,6 @@
 				}
 			}
 			break;
-		case DRAW_INDEXEDTRIANGLEFAN8:
-			{
-				const unsigned char *index = (const unsigned char*)indices;
-
-				for(unsigned int i = 0; i < triangleCount; i++)
-				{
-					batch[i][0] = index[start + i + 1];
-					batch[i][1] = index[start + i + 2];
-					batch[i][2] = index[0];
-				}
-			}
-			break;
 		case DRAW_INDEXEDTRIANGLEFAN16:
 			{
 				const unsigned short *index = (const unsigned short*)indices;
@@ -1512,24 +1276,6 @@
 				}
 			}
 			break;
-		case DRAW_QUADLIST:
-			{
-				unsigned int index = 4 * start / 2;
-
-				for(unsigned int i = 0; i < triangleCount; i += 2)
-				{
-					batch[i+0][0] = index + 0;
-					batch[i+0][1] = index + 1;
-					batch[i+0][2] = index + 2;
-
-					batch[i+1][0] = index + 0;
-					batch[i+1][1] = index + 2;
-					batch[i+1][2] = index + 3;
-
-					index += 4;
-				}
-			}
-			break;
 		default:
 			ASSERT(false);
 			return;
@@ -1540,7 +1286,7 @@
 		vertexRoutine(&triangle->v0, (unsigned int*)&batch, task, data);
 	}
 
-	int Renderer::setupSolidTriangles(int unit, int count)
+	int Renderer::setupTriangles(int unit, int count)
 	{
 		Triangle *triangle = triangleBatch[unit];
 		Primitive *primitive = primitiveBatch[unit];
@@ -1585,107 +1331,6 @@
 		return visible;
 	}
 
-	int Renderer::setupWireframeTriangle(int unit, int count)
-	{
-		Triangle *triangle = triangleBatch[unit];
-		Primitive *primitive = primitiveBatch[unit];
-		int visible = 0;
-
-		DrawCall &draw = *drawList[primitiveProgress[unit].drawCall & DRAW_COUNT_BITS];
-		SetupProcessor::State &state = draw.setupState;
-
-		const Vertex &v0 = triangle[0].v0;
-		const Vertex &v1 = triangle[0].v1;
-		const Vertex &v2 = triangle[0].v2;
-
-		float d = (v0.y * v1.x - v0.x * v1.y) * v2.w + (v0.x * v2.y - v0.y * v2.x) * v1.w + (v2.x * v1.y - v1.x * v2.y) * v0.w;
-
-		if(state.cullMode == CULL_CLOCKWISE)
-		{
-			if(d >= 0) return 0;
-		}
-		else if(state.cullMode == CULL_COUNTERCLOCKWISE)
-		{
-			if(d <= 0) return 0;
-		}
-
-		// Copy attributes
-		triangle[1].v0 = v1;
-		triangle[1].v1 = v2;
-		triangle[2].v0 = v2;
-		triangle[2].v1 = v0;
-
-		if(state.color[0][0].flat)   // FIXME
-		{
-			for(int i = 0; i < 2; i++)
-			{
-				triangle[1].v0.C[i] = triangle[0].v0.C[i];
-				triangle[1].v1.C[i] = triangle[0].v0.C[i];
-				triangle[2].v0.C[i] = triangle[0].v0.C[i];
-				triangle[2].v1.C[i] = triangle[0].v0.C[i];
-			}
-		}
-
-		for(int i = 0; i < 3; i++)
-		{
-			if(setupLine(*primitive, *triangle, draw))
-			{
-				primitive->area = 0.5f * d;
-
-				primitive++;
-				visible++;
-			}
-
-			triangle++;
-		}
-
-		return visible;
-	}
-
-	int Renderer::setupVertexTriangle(int unit, int count)
-	{
-		Triangle *triangle = triangleBatch[unit];
-		Primitive *primitive = primitiveBatch[unit];
-		int visible = 0;
-
-		DrawCall &draw = *drawList[primitiveProgress[unit].drawCall & DRAW_COUNT_BITS];
-		SetupProcessor::State &state = draw.setupState;
-
-		const Vertex &v0 = triangle[0].v0;
-		const Vertex &v1 = triangle[0].v1;
-		const Vertex &v2 = triangle[0].v2;
-
-		float d = (v0.y * v1.x - v0.x * v1.y) * v2.w + (v0.x * v2.y - v0.y * v2.x) * v1.w + (v2.x * v1.y - v1.x * v2.y) * v0.w;
-
-		if(state.cullMode == CULL_CLOCKWISE)
-		{
-			if(d >= 0) return 0;
-		}
-		else if(state.cullMode == CULL_COUNTERCLOCKWISE)
-		{
-			if(d <= 0) return 0;
-		}
-
-		// Copy attributes
-		triangle[1].v0 = v1;
-		triangle[2].v0 = v2;
-
-		for(int i = 0; i < 3; i++)
-		{
-			if(setupPoint(*primitive, *triangle, draw))
-			{
-				primitive->area = 0.5f * d;
-
-				primitive++;
-				visible++;
-			}
-
-			triangle++;
-		}
-
-		return visible;
-	}
-
 	int Renderer::setupLines(int unit, int count)
 	{
 		Triangle *triangle = triangleBatch[unit];
@@ -1950,10 +1595,10 @@
 		}
 		else
 		{
-			pSize = data.point.pointSize[0];
+			pSize = 1.0f;
 		}
 
-		pSize = clamp(pSize, data.point.pointSizeMin, data.point.pointSizeMax);
+		pSize = clamp(pSize, data.pointSizeMin, data.pointSizeMax);
 
 		float4 P[4];
 		int C[4];
@@ -2082,8 +1727,6 @@
 
 	void Renderer::loadConstants(const VertexShader *vertexShader)
 	{
-		if(!vertexShader) return;
-
 		size_t count = vertexShader->getLength();
 
 		for(size_t i = 0; i < count; i++)
@@ -2205,26 +1848,12 @@
 	{
 		if(updateClipPlanes)
 		{
-			if(VertexProcessor::isFixedFunction())   // User plane in world space
-			{
-				const Matrix &scissorWorld = getViewTransform();
-
-				if(clipFlags & Clipper::CLIP_PLANE0) clipPlane[0] = scissorWorld * userPlane[0];
-				if(clipFlags & Clipper::CLIP_PLANE1) clipPlane[1] = scissorWorld * userPlane[1];
-				if(clipFlags & Clipper::CLIP_PLANE2) clipPlane[2] = scissorWorld * userPlane[2];
-				if(clipFlags & Clipper::CLIP_PLANE3) clipPlane[3] = scissorWorld * userPlane[3];
-				if(clipFlags & Clipper::CLIP_PLANE4) clipPlane[4] = scissorWorld * userPlane[4];
-				if(clipFlags & Clipper::CLIP_PLANE5) clipPlane[5] = scissorWorld * userPlane[5];
-			}
-			else   // User plane in clip space
-			{
-				if(clipFlags & Clipper::CLIP_PLANE0) clipPlane[0] = userPlane[0];
-				if(clipFlags & Clipper::CLIP_PLANE1) clipPlane[1] = userPlane[1];
-				if(clipFlags & Clipper::CLIP_PLANE2) clipPlane[2] = userPlane[2];
-				if(clipFlags & Clipper::CLIP_PLANE3) clipPlane[3] = userPlane[3];
-				if(clipFlags & Clipper::CLIP_PLANE4) clipPlane[4] = userPlane[4];
-				if(clipFlags & Clipper::CLIP_PLANE5) clipPlane[5] = userPlane[5];
-			}
+			if(clipFlags & Clipper::CLIP_PLANE0) clipPlane[0] = userPlane[0];
+			if(clipFlags & Clipper::CLIP_PLANE1) clipPlane[1] = userPlane[1];
+			if(clipFlags & Clipper::CLIP_PLANE2) clipPlane[2] = userPlane[2];
+			if(clipFlags & Clipper::CLIP_PLANE3) clipPlane[3] = userPlane[3];
+			if(clipFlags & Clipper::CLIP_PLANE4) clipPlane[4] = userPlane[4];
+			if(clipFlags & Clipper::CLIP_PLANE5) clipPlane[5] = userPlane[5];
 
 			updateClipPlanes = false;
 		}
@@ -2484,28 +2113,6 @@
 		}
 	}
 
-	void Renderer::setSyncRequired(SamplerType type, int sampler, bool syncRequired)
-	{
-		if(type == SAMPLER_PIXEL)
-		{
-			PixelProcessor::setSyncRequired(sampler, syncRequired);
-		}
-		else
-		{
-			VertexProcessor::setSyncRequired(sampler, syncRequired);
-		}
-	}
-
-	void Renderer::setPointSpriteEnable(bool pointSpriteEnable)
-	{
-		context->setPointSpriteEnable(pointSpriteEnable);
-	}
-
-	void Renderer::setPointScaleEnable(bool pointScaleEnable)
-	{
-		context->setPointScaleEnable(pointScaleEnable);
-	}
-
 	void Renderer::setLineWidth(float width)
 	{
 		context->lineWidth = width;
@@ -2642,29 +2249,6 @@
 		}
 	}
 
-	void Renderer::setModelMatrix(const Matrix &M, int i)
-	{
-		VertexProcessor::setModelMatrix(M, i);
-	}
-
-	void Renderer::setViewMatrix(const Matrix &V)
-	{
-		VertexProcessor::setViewMatrix(V);
-		updateClipPlanes = true;
-	}
-
-	void Renderer::setBaseMatrix(const Matrix &B)
-	{
-		VertexProcessor::setBaseMatrix(B);
-		updateClipPlanes = true;
-	}
-
-	void Renderer::setProjectionMatrix(const Matrix &P)
-	{
-		VertexProcessor::setProjectionMatrix(P);
-		updateClipPlanes = true;
-	}
-
 	void Renderer::addQuery(Query *query)
 	{
 		queries.push_back(query);
diff --git a/src/Device/Renderer.hpp b/src/Device/Renderer.hpp
index 2f5e23f..539a48d 100644
--- a/src/Device/Renderer.hpp
+++ b/src/Device/Renderer.hpp
@@ -135,29 +135,23 @@
 
 		struct PS
 		{
-			word4 cW[8][4];
 			float4 c[FRAGMENT_UNIFORM_VECTORS];
 			byte* u[MAX_UNIFORM_BUFFER_BINDINGS];
 			int4 i[16];
 			bool b[16];
 		};
 
-		union
-		{
-			VS vs;
-			VertexProcessor::FixedFunction ff;
-		};
-
+		VS vs;
 		PS ps;
 
 		int instanceID;
 
-		VertexProcessor::PointSprite point;
+		float pointSizeMin;
+		float pointSizeMax;
 		float lineWidth;
 
 		PixelProcessor::Stencil stencil[2];   // clockwise, counterclockwise
 		PixelProcessor::Stencil stencilCCW;
-		PixelProcessor::Fog fog;
 		PixelProcessor::Factor factor;
 		unsigned int occlusion[16];   // Number of pixels passing depth test
 
@@ -165,14 +159,10 @@
 			int64_t cycles[PERF_TIMERS][16];
 		#endif
 
-		TextureStage::Uniforms textureStage[8];
-
 		float4 Wx16;
 		float4 Hx16;
 		float4 X0x16;
 		float4 Y0x16;
-		float4 XXXX;
-		float4 YYYY;
 		float4 halfPixelX;
 		float4 halfPixelY;
 		float viewportHeight;
@@ -304,10 +294,7 @@
 		void setMaxLevel(SamplerType type, int sampler, int maxLevel);
 		void setMinLod(SamplerType type, int sampler, float minLod);
 		void setMaxLod(SamplerType type, int sampler, float maxLod);
-		void setSyncRequired(SamplerType type, int sampler, bool syncRequired);
 
-		void setPointSpriteEnable(bool pointSpriteEnable);
-		void setPointScaleEnable(bool pointScaleEnable);
 		void setLineWidth(float width);
 
 		void setDepthBias(float bias);
@@ -366,9 +353,7 @@
 
 		void processPrimitiveVertices(int unit, unsigned int start, unsigned int count, unsigned int loop, int thread);
 
-		int setupSolidTriangles(int batch, int count);
-		int setupWireframeTriangle(int batch, int count);
-		int setupVertexTriangle(int batch, int count);
+		int setupTriangles(int batch, int count);
 		int setupLines(int batch, int count);
 		int setupPoints(int batch, int count);
 
diff --git a/src/Device/Sampler.cpp b/src/Device/Sampler.cpp
index f0bd1a8..2f33684 100644
--- a/src/Device/Sampler.cpp
+++ b/src/Device/Sampler.cpp
@@ -401,16 +401,6 @@
 		return textureType == TEXTURE_3D || textureType == TEXTURE_2D_ARRAY;
 	}
 
-	void Sampler::setSyncRequired(bool isSyncRequired)
-	{
-		syncRequired = isSyncRequired;
-	}
-
-	bool Sampler::requiresSync() const
-	{
-		return syncRequired;
-	}
-
 	const Texture &Sampler::getTextureData()
 	{
 		return texture;
diff --git a/src/Device/Sampler.hpp b/src/Device/Sampler.hpp
index c6fc90c..81b308d 100644
--- a/src/Device/Sampler.hpp
+++ b/src/Device/Sampler.hpp
@@ -193,7 +193,6 @@
 		void setMaxLevel(int maxLevel);
 		void setMinLod(float minLod);
 		void setMaxLod(float maxLod);
-		void setSyncRequired(bool isSincRequired);
 
 		static void setFilterQuality(FilterType maximumFilterQuality);
 		static void setMipmapQuality(MipmapType maximumFilterQuality);
@@ -203,7 +202,6 @@
 		bool hasUnsignedTexture() const;
 		bool hasCubeTexture() const;
 		bool hasVolumeTexture() const;
-		bool requiresSync() const;
 
 		const Texture &getTextureData();
 
@@ -228,7 +226,6 @@
 		bool sRGB;
 		bool gather;
 		bool highPrecisionFiltering;
-		bool syncRequired;
 		int border;
 
 		SwizzleType swizzleR;
diff --git a/src/Device/SetupProcessor.cpp b/src/Device/SetupProcessor.cpp
index dffff48..029fb1a 100644
--- a/src/Device/SetupProcessor.cpp
+++ b/src/Device/SetupProcessor.cpp
@@ -59,14 +59,14 @@
 
 	SetupProcessor::SetupProcessor(Context *context) : context(context)
 	{
-		routineCache = 0;
+		routineCache = nullptr;
 		setRoutineCacheSize(1024);
 	}
 
 	SetupProcessor::~SetupProcessor()
 	{
 		delete routineCache;
-		routineCache = 0;
+		routineCache = nullptr;
 	}
 
 	SetupProcessor::State SetupProcessor::update() const
@@ -75,14 +75,12 @@
 
 		bool vPosZW = (context->pixelShader && context->pixelShader->isVPosDeclared() && fullPixelPositionRegister);
 
-		state.isDrawPoint = context->isDrawPoint(true);
-		state.isDrawLine = context->isDrawLine(true);
-		state.isDrawTriangle = context->isDrawTriangle(false);
-		state.isDrawSolidTriangle = context->isDrawTriangle(true);
-		state.interpolateZ = context->depthBufferActive() || context->pixelFogActive() != FOG_NONE || vPosZW;
+		state.isDrawPoint = context->isDrawPoint();
+		state.isDrawLine = context->isDrawLine();
+		state.isDrawTriangle = context->isDrawTriangle();
+		state.interpolateZ = context->depthBufferActive() || vPosZW;
 		state.interpolateW = context->perspectiveActive() || vPosZW;
 		state.perspective = context->perspectiveActive();
-		state.pointSprite = context->pointSpriteActive();
 		state.cullMode = context->cullMode;
 		state.twoSidedStencil = context->stencilActive() && context->twoSidedStencil;
 		state.slopeDepthBias = context->slopeDepthBias != 0.0f;
@@ -94,15 +92,8 @@
 		state.multiSample = context->getMultiSampleCount();
 		state.rasterizerDiscard = context->rasterizerDiscard;
 
-		if(context->vertexShader)
-		{
-			state.positionRegister = context->vertexShader->getPositionRegister();
-			state.pointSizeRegister = context->vertexShader->getPointSizeRegister();
-		}
-		else if(context->pointSizeActive())
-		{
-			state.pointSizeRegister = Pts;
-		}
+		state.positionRegister = context->vertexShader->getPositionRegister();
+		state.pointSizeRegister = context->vertexShader->getPointSizeRegister();
 
 		for(int interpolant = 0; interpolant < MAX_FRAGMENT_INPUTS; interpolant++)
 		{
@@ -114,109 +105,39 @@
 			}
 		}
 
-		state.fog.attribute = Unused;
-		state.fog.flat = false;
-		state.fog.wrap = false;
+		const bool point = context->isDrawPoint();
 
-		const bool point = context->isDrawPoint(true);
-		const bool sprite = context->pointSpriteActive();
-		const bool flatShading = (context->shadingMode == SHADING_FLAT) || point;
-
-		if(context->vertexShader && context->pixelShader)
+		for(int interpolant = 0; interpolant < MAX_FRAGMENT_INPUTS; interpolant++)
 		{
-			for(int interpolant = 0; interpolant < MAX_FRAGMENT_INPUTS; interpolant++)
+			for(int component = 0; component < 4; component++)
 			{
-				for(int component = 0; component < 4; component++)
-				{
-					int project = context->isProjectionComponent(interpolant - 2, component) ? 1 : 0;
-					const Shader::Semantic& semantic = context->pixelShader->getInput(interpolant, component - project);
+				const Shader::Semantic& semantic = context->pixelShader->getInput(interpolant, component);
 
-					if(semantic.active())
+				if(semantic.active())
+				{
+					int input = interpolant;
+					for(int i = 0; i < MAX_VERTEX_OUTPUTS; i++)
 					{
-						int input = interpolant;
-						for(int i = 0; i < MAX_VERTEX_OUTPUTS; i++)
+						if(semantic == context->vertexShader->getOutput(i, component))
 						{
-							if(semantic == context->vertexShader->getOutput(i, component - project))
-							{
-								input = i;
-								break;
-							}
+							input = i;
+							break;
 						}
-
-						bool flat = point;
-
-						switch(semantic.usage)
-						{
-						case Shader::USAGE_TEXCOORD: flat = point && !sprite;             break;
-						case Shader::USAGE_COLOR:    flat = semantic.flat || flatShading; break;
-						}
-
-						state.gradient[interpolant][component].attribute = input;
-						state.gradient[interpolant][component].flat = flat;
 					}
-				}
-			}
-		}
-		else if(context->preTransformed && context->pixelShader)
-		{
-			for(int interpolant = 0; interpolant < MAX_FRAGMENT_INPUTS; interpolant++)
-			{
-				for(int component = 0; component < 4; component++)
-				{
-					const Shader::Semantic& semantic = context->pixelShader->getInput(interpolant, component);
+
+					bool flat = point;
 
 					switch(semantic.usage)
 					{
-					case 0xFF:
-						break;
-					case Shader::USAGE_TEXCOORD:
-						state.gradient[interpolant][component].attribute = T0 + semantic.index;
-						state.gradient[interpolant][component].flat = semantic.flat || (point && !sprite);
-						break;
-					case Shader::USAGE_COLOR:
-						state.gradient[interpolant][component].attribute = C0 + semantic.index;
-						state.gradient[interpolant][component].flat = semantic.flat || flatShading;
-						break;
-					default:
-						ASSERT(false);
+					case Shader::USAGE_TEXCOORD: flat = false;                  break;
+					case Shader::USAGE_COLOR:    flat = semantic.flat || point; break;
 					}
-				}
-			}
-		}
-		else if(context->pixelShaderModel() < 0x0300)
-		{
-			for(int coordinate = 0; coordinate < 8; coordinate++)
-			{
-				for(int component = 0; component < 4; component++)
-				{
-					if(context->textureActive(coordinate, component))
-					{
-						state.texture[coordinate][component].attribute = T0 + coordinate;
-						state.texture[coordinate][component].flat = point && !sprite;
-						state.texture[coordinate][component].wrap = (context->textureWrap[coordinate] & (1 << component)) != 0;
-					}
-				}
-			}
 
-			for(int color = 0; color < 2; color++)
-			{
-				for(int component = 0; component < 4; component++)
-				{
-					if(context->colorActive(color, component))
-					{
-						state.color[color][component].attribute = C0 + color;
-						state.color[color][component].flat = flatShading;
-					}
+					state.gradient[interpolant][component].attribute = input;
+					state.gradient[interpolant][component].flat = flat;
 				}
 			}
 		}
-		else ASSERT(false);
-
-		if(context->fogActive())
-		{
-			state.fog.attribute = Fog;
-			state.fog.flat = point;
-		}
 
 		state.hash = state.computeHash();
 
diff --git a/src/Device/SetupProcessor.hpp b/src/Device/SetupProcessor.hpp
index 4e080dd..622a053 100644
--- a/src/Device/SetupProcessor.hpp
+++ b/src/Device/SetupProcessor.hpp
@@ -40,11 +40,9 @@
 			bool isDrawPoint               : 1;
 			bool isDrawLine                : 1;
 			bool isDrawTriangle            : 1;
-			bool isDrawSolidTriangle       : 1;
 			bool interpolateZ              : 1;
 			bool interpolateW              : 1;
 			bool perspective               : 1;
-			bool pointSprite               : 1;
 			unsigned int positionRegister  : BITS(VERTEX_OUTPUT_LAST);
 			unsigned int pointSizeRegister : BITS(VERTEX_OUTPUT_LAST);
 			CullMode cullMode              : BITS(CULL_LAST);
@@ -61,17 +59,7 @@
 				bool wrap               : 1;
 			};
 
-			union
-			{
-				struct
-				{
-					Gradient color[2][4];
-					Gradient texture[8][4];
-					Gradient fog;
-				};
-
-				Gradient gradient[MAX_FRAGMENT_INPUTS][4];
-			};
+			Gradient gradient[MAX_FRAGMENT_INPUTS][4];
 		};
 
 		struct State : States
diff --git a/src/Device/TextureStage.cpp b/src/Device/TextureStage.cpp
deleted file mode 100644
index 0327478..0000000
--- a/src/Device/TextureStage.cpp
+++ /dev/null
@@ -1,412 +0,0 @@
-// 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.
-
-#include "TextureStage.hpp"
-
-#include "Sampler.hpp"
-#include "Common/Debug.hpp"
-
-#include <string.h>
-
-namespace sw
-{
-	TextureStage::State::State()
-	{
-		memset(this, 0, sizeof(State));
-	}
-
-	TextureStage::TextureStage() : sampler(0), previousStage(0)
-	{
-	}
-
-	TextureStage::~TextureStage()
-	{
-	}
-
-	void TextureStage::init(int stage, const Sampler *sampler, const TextureStage *previousStage)
-	{
-		this->stage = stage;
-
-		stageOperation = (stage == 0 ? STAGE_MODULATE : STAGE_DISABLE);
-		firstArgument = SOURCE_TEXTURE;
-		secondArgument = SOURCE_CURRENT;
-		thirdArgument = SOURCE_CURRENT;
-		stageOperationAlpha = (stage == 0 ? STAGE_SELECTARG1 : STAGE_DISABLE);
-		firstArgumentAlpha = SOURCE_DIFFUSE;
-		secondArgumentAlpha = SOURCE_CURRENT;
-		thirdArgumentAlpha = SOURCE_CURRENT;
-		firstModifier = MODIFIER_COLOR;
-		secondModifier = MODIFIER_COLOR;
-		thirdModifier = MODIFIER_COLOR;
-	    firstModifierAlpha = MODIFIER_COLOR;
-		secondModifierAlpha = MODIFIER_COLOR;
-		thirdModifierAlpha = MODIFIER_COLOR;
-		destinationArgument = DESTINATION_CURRENT;
-
-		texCoordIndex = stage;
-		this->sampler = sampler;
-		this->previousStage = previousStage;
-	}
-
-	TextureStage::State TextureStage::textureStageState() const
-	{
-		State state;
-
-		if(!isStageDisabled())
-		{
-			state.stageOperation = stageOperation;
-			state.firstArgument = firstArgument;
-			state.secondArgument = secondArgument;
-			state.thirdArgument = thirdArgument;
-			state.stageOperationAlpha = stageOperationAlpha;
-			state.firstArgumentAlpha = firstArgumentAlpha;
-			state.secondArgumentAlpha = secondArgumentAlpha;
-			state.thirdArgumentAlpha = thirdArgumentAlpha;
-			state.firstModifier = firstModifier;
-			state.secondModifier = secondModifier;
-			state.thirdModifier = thirdModifier;
-			state.firstModifierAlpha = firstModifierAlpha;
-			state.secondModifierAlpha = secondModifierAlpha;
-			state.thirdModifierAlpha = thirdModifierAlpha;
-			state.destinationArgument = destinationArgument;
-			state.texCoordIndex = texCoordIndex;
-
-			state.cantUnderflow = sampler->hasUnsignedTexture() || !usesTexture();
-			state.usesTexture = usesTexture();
-		}
-
-		return state;
-	}
-
-	void TextureStage::setConstantColor(const Color<float> &constantColor)
-	{
-		// FIXME: Compact into generic function   // FIXME: Clamp
-		short r = iround(4095 * constantColor.r);
-		short g = iround(4095 * constantColor.g);
-		short b = iround(4095 * constantColor.b);
-		short a = iround(4095 * constantColor.a);
-
-		uniforms.constantColor4[0][0] = uniforms.constantColor4[0][1] = uniforms.constantColor4[0][2] = uniforms.constantColor4[0][3] = r;
-		uniforms.constantColor4[1][0] = uniforms.constantColor4[1][1] = uniforms.constantColor4[1][2] = uniforms.constantColor4[1][3] = g;
-		uniforms.constantColor4[2][0] = uniforms.constantColor4[2][1] = uniforms.constantColor4[2][2] = uniforms.constantColor4[2][3] = b;
-		uniforms.constantColor4[3][0] = uniforms.constantColor4[3][1] = uniforms.constantColor4[3][2] = uniforms.constantColor4[3][3] = a;
-	}
-
-	void TextureStage::setBumpmapMatrix(int element, float value)
-	{
-		uniforms.bumpmapMatrix4F[element / 2][element % 2][0] = value;
-		uniforms.bumpmapMatrix4F[element / 2][element % 2][1] = value;
-		uniforms.bumpmapMatrix4F[element / 2][element % 2][2] = value;
-		uniforms.bumpmapMatrix4F[element / 2][element % 2][3] = value;
-
-		uniforms.bumpmapMatrix4W[element / 2][element % 2][0] = iround(4095 * value);
-		uniforms.bumpmapMatrix4W[element / 2][element % 2][1] = iround(4095 * value);
-		uniforms.bumpmapMatrix4W[element / 2][element % 2][2] = iround(4095 * value);
-		uniforms.bumpmapMatrix4W[element / 2][element % 2][3] = iround(4095 * value);
-	}
-
-	void TextureStage::setLuminanceScale(float value)
-	{
-		short scale = iround(4095 * value);
-
-		uniforms.luminanceScale4[0] = uniforms.luminanceScale4[1] = uniforms.luminanceScale4[2] = uniforms.luminanceScale4[3] = scale;
-	}
-
-	void TextureStage::setLuminanceOffset(float value)
-	{
-		short offset = iround(4095 * value);
-
-		uniforms.luminanceOffset4[0] = uniforms.luminanceOffset4[1] = uniforms.luminanceOffset4[2] = uniforms.luminanceOffset4[3] = offset;
-	}
-
-	void TextureStage::setTexCoordIndex(unsigned int texCoordIndex)
-	{
-		ASSERT(texCoordIndex < 8);
-
-		this->texCoordIndex = texCoordIndex;
-	}
-
-	void TextureStage::setStageOperation(StageOperation stageOperation)
-	{
-		this->stageOperation = stageOperation;
-	}
-
-	void TextureStage::setFirstArgument(SourceArgument firstArgument)
-	{
-		this->firstArgument = firstArgument;
-	}
-
-	void TextureStage::setSecondArgument(SourceArgument secondArgument)
-	{
-		this->secondArgument = secondArgument;
-	}
-
-	void TextureStage::setThirdArgument(SourceArgument thirdArgument)
-	{
-		this->thirdArgument = thirdArgument;
-	}
-
-	void TextureStage::setStageOperationAlpha(StageOperation stageOperationAlpha)
-	{
-		this->stageOperationAlpha = stageOperationAlpha;
-	}
-
-	void TextureStage::setFirstArgumentAlpha(SourceArgument firstArgumentAlpha)
-	{
-		this->firstArgumentAlpha = firstArgumentAlpha;
-	}
-
-	void TextureStage::setSecondArgumentAlpha(SourceArgument secondArgumentAlpha)
-	{
-		this->secondArgumentAlpha = secondArgumentAlpha;
-	}
-
-	void TextureStage::setThirdArgumentAlpha(SourceArgument thirdArgumentAlpha)
-	{
-		this->thirdArgumentAlpha= thirdArgumentAlpha;
-	}
-
-	void TextureStage::setFirstModifier(ArgumentModifier firstModifier)
-	{
-		this->firstModifier = firstModifier;
-	}
-
-	void TextureStage::setSecondModifier(ArgumentModifier secondModifier)
-	{
-		this->secondModifier = secondModifier;
-	}
-
-	void TextureStage::setThirdModifier(ArgumentModifier thirdModifier)
-	{
-		this->thirdModifier = thirdModifier;
-	}
-
-	void TextureStage::setFirstModifierAlpha(ArgumentModifier firstModifierAlpha)
-	{
-		this->firstModifierAlpha = firstModifierAlpha;
-	}
-
-	void TextureStage::setSecondModifierAlpha(ArgumentModifier secondModifierAlpha)
-	{
-		this->secondModifierAlpha = secondModifierAlpha;
-	}
-
-	void TextureStage::setThirdModifierAlpha(ArgumentModifier thirdModifierAlpha)
-	{
-		this->thirdModifierAlpha = thirdModifierAlpha;
-	}
-
-	void TextureStage::setDestinationArgument(DestinationArgument destinationArgument)
-	{
-		this->destinationArgument = destinationArgument;
-	}
-
-	bool TextureStage::usesColor(SourceArgument source) const
-	{
-		// One argument
-		if(stageOperation == STAGE_SELECTARG1 || stageOperation == STAGE_PREMODULATE)
-		{
-			return firstArgument == source;
-		}
-		else if(stageOperation == STAGE_SELECTARG2)
-		{
-			return secondArgument == source;
-		}
-		else if(stageOperation == STAGE_SELECTARG3)
-		{
-			return thirdArgument == source;
-		}
-		else
-		{
-			// Two arguments or more
-			if(firstArgument == source || secondArgument == source)
-			{
-				return true;
-			}
-
-			// Three arguments
-			if(stageOperation == STAGE_MULTIPLYADD || stageOperation == STAGE_LERP)
-			{
-				return thirdArgument == source;
-			}
-		}
-	
-		return false;
-	}
-
-	bool TextureStage::usesAlpha(SourceArgument source) const
-	{
-		if(stageOperationAlpha == STAGE_DISABLE)
-		{
-			return false;
-		}
-
-		if(source == SOURCE_TEXTURE)
-		{
-			if(stageOperation == STAGE_BLENDTEXTUREALPHA ||	stageOperation == STAGE_BLENDTEXTUREALPHAPM)
-			{
-				return true;
-			}
-		}
-		else if(source == SOURCE_CURRENT)
-		{
-			if(stageOperation == STAGE_BLENDCURRENTALPHA)
-			{
-				return true;
-			}
-		}
-		else if(source == SOURCE_DIFFUSE)
-		{
-			if(stageOperation == STAGE_BLENDDIFFUSEALPHA)
-			{
-				return true;
-			}
-		}
-		else if(source == SOURCE_TFACTOR)
-		{
-			if(stageOperation == STAGE_BLENDFACTORALPHA)
-			{
-				return true;
-			}
-		}
-
-		// One argument
-		if(stageOperation == STAGE_SELECTARG1 || stageOperation == STAGE_PREMODULATE)
-		{
-			if(firstArgument == source && (firstModifier == MODIFIER_ALPHA || firstModifier == MODIFIER_INVALPHA))
-			{
-				return true;
-			}
-		}
-		else if(stageOperation == STAGE_SELECTARG2)
-		{
-			if(secondArgument == source && (secondModifier == MODIFIER_ALPHA || secondModifier == MODIFIER_INVALPHA))
-			{
-				return true;
-			}
-		}
-		else if(stageOperation == STAGE_SELECTARG3)
-		{
-			if(thirdArgument == source && (thirdModifier == MODIFIER_ALPHA || thirdModifier == MODIFIER_INVALPHA))
-			{
-				return true;
-			}
-		}
-		else
-		{
-			// Two arguments or more
-			if(firstArgument == source || secondArgument == source)
-			{
-				if(firstArgument == source && (firstModifier == MODIFIER_ALPHA || firstModifier == MODIFIER_INVALPHA))
-				{
-					return true;
-				}
-
-				if(secondArgument == source && (secondModifier == MODIFIER_ALPHA || secondModifier == MODIFIER_INVALPHA))
-				{
-					return true;
-				}
-			}
-
-			// Three arguments
-			if(stageOperation == STAGE_MULTIPLYADD || stageOperation == STAGE_LERP)
-			{
-				if(thirdArgument == source && (thirdModifier == MODIFIER_ALPHA || thirdModifier == MODIFIER_INVALPHA))
-				{
-					return true;
-				}
-			}
-		}
-
-		// One argument
-		if(stageOperationAlpha == STAGE_SELECTARG1 || stageOperationAlpha == STAGE_PREMODULATE)
-		{
-			return firstArgumentAlpha == source;
-		}
-		else if(stageOperationAlpha == STAGE_SELECTARG2)
-		{
-			return secondArgumentAlpha == source;
-		}
-		else if(stageOperationAlpha == STAGE_SELECTARG3)
-		{
-			return thirdArgumentAlpha == source;
-		}
-		else
-		{
-			// Two arguments or more
-			if(firstArgumentAlpha == source || secondArgumentAlpha == source)
-			{
-				return true;
-			}
-
-			// Three arguments
-			if(stageOperationAlpha == STAGE_MULTIPLYADD || stageOperationAlpha == STAGE_LERP)
-			{
-				return thirdArgumentAlpha == source;
-			}
-		}
-		
-		return false;
-	}
-
-	bool TextureStage::uses(SourceArgument source) const
-	{
-		return usesColor(source) || usesAlpha(source);
-	}
-
-	bool TextureStage::usesCurrent() const
-	{
-		return uses(SOURCE_CURRENT) || (stageOperation == STAGE_BLENDCURRENTALPHA || stageOperationAlpha == STAGE_BLENDCURRENTALPHA);
-	}
-
-	bool TextureStage::usesDiffuse() const
-	{
-		return uses(SOURCE_DIFFUSE) || (stageOperation == STAGE_BLENDDIFFUSEALPHA || stageOperationAlpha == STAGE_BLENDDIFFUSEALPHA);
-	}
-
-	bool TextureStage::usesSpecular() const
-	{
-		return uses(SOURCE_SPECULAR);
-	}
-
-	bool TextureStage::usesTexture() const
-	{
-		return uses(SOURCE_TEXTURE) ||
-		       stageOperation == STAGE_BLENDTEXTUREALPHA ||
-		       stageOperationAlpha == STAGE_BLENDTEXTUREALPHA ||
-		       stageOperation == STAGE_BLENDTEXTUREALPHAPM ||
-		       stageOperationAlpha == STAGE_BLENDTEXTUREALPHAPM ||
-		       (previousStage && previousStage->stageOperation == STAGE_PREMODULATE) ||
-		       (previousStage && previousStage->stageOperationAlpha == STAGE_PREMODULATE);
-	}
-
-	bool TextureStage::isStageDisabled() const
-	{
-		bool disabled = (stageOperation == STAGE_DISABLE) || (!sampler->hasTexture() && usesTexture());
-
-		if(!previousStage || disabled)
-		{
-			return disabled;
-		}
-		else
-		{
-			return previousStage->isStageDisabled();
-		}
-	}
-
-	bool TextureStage::writesCurrent() const
-	{
-		return !isStageDisabled() && destinationArgument == DESTINATION_CURRENT && stageOperation != STAGE_BUMPENVMAP && stageOperation != STAGE_BUMPENVMAPLUMINANCE;
-	}
-}
diff --git a/src/Device/TextureStage.hpp b/src/Device/TextureStage.hpp
deleted file mode 100644
index 8e71b25..0000000
--- a/src/Device/TextureStage.hpp
+++ /dev/null
@@ -1,198 +0,0 @@
-// 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_TextureStage_hpp
-#define sw_TextureStage_hpp
-
-#include "System/Types.hpp"
-#include "System/Math.hpp"
-#include "Device/Color.hpp"
-
-namespace sw
-{
-	class Sampler;
-	class PixelRoutine;
-	class Context;
-
-	class TextureStage
-	{
-		friend class Context;   // FIXME
-
-	public:
-		enum StageOperation
-		{
-			STAGE_DISABLE,
-			STAGE_SELECTARG1,
-			STAGE_SELECTARG2,
-			STAGE_SELECTARG3,
-			STAGE_MODULATE,
-			STAGE_MODULATE2X,
-			STAGE_MODULATE4X,
-			STAGE_ADD,
-			STAGE_ADDSIGNED,
-			STAGE_ADDSIGNED2X,
-			STAGE_SUBTRACT,
-			STAGE_ADDSMOOTH,
-			STAGE_MULTIPLYADD,
-			STAGE_LERP,
-			STAGE_DOT3,
-			STAGE_BLENDCURRENTALPHA,
-			STAGE_BLENDDIFFUSEALPHA,
-			STAGE_BLENDFACTORALPHA,
-			STAGE_BLENDTEXTUREALPHA,
-			STAGE_BLENDTEXTUREALPHAPM,
-			STAGE_PREMODULATE,
-			STAGE_MODULATEALPHA_ADDCOLOR,
-			STAGE_MODULATECOLOR_ADDALPHA,
-			STAGE_MODULATEINVALPHA_ADDCOLOR,
-			STAGE_MODULATEINVCOLOR_ADDALPHA,
-			STAGE_BUMPENVMAP,
-			STAGE_BUMPENVMAPLUMINANCE,
-
-			STAGE_LAST = STAGE_BUMPENVMAPLUMINANCE
-		};
-
-		enum SourceArgument
-		{
-			SOURCE_TEXTURE,
-			SOURCE_CONSTANT,
-			SOURCE_CURRENT,
-			SOURCE_DIFFUSE,
-			SOURCE_SPECULAR,
-			SOURCE_TEMP,
-			SOURCE_TFACTOR,
-
-			SOURCE_LAST = SOURCE_TFACTOR
-		};
-
-		enum DestinationArgument
-		{
-			DESTINATION_CURRENT,
-			DESTINATION_TEMP,
-
-			DESTINATION_LAST = DESTINATION_TEMP
-		};
-
-		enum ArgumentModifier
-		{
-			MODIFIER_COLOR,
-			MODIFIER_INVCOLOR,
-			MODIFIER_ALPHA,
-			MODIFIER_INVALPHA,
-
-			MODIFIER_LAST = MODIFIER_INVALPHA
-		};
-
-		struct State
-		{
-			State();
-
-			unsigned int stageOperation			: BITS(STAGE_LAST);
-			unsigned int firstArgument			: BITS(SOURCE_LAST);
-			unsigned int secondArgument			: BITS(SOURCE_LAST);
-			unsigned int thirdArgument			: BITS(SOURCE_LAST);
-			unsigned int stageOperationAlpha	: BITS(STAGE_LAST);
-			unsigned int firstArgumentAlpha		: BITS(SOURCE_LAST);
-			unsigned int secondArgumentAlpha	: BITS(SOURCE_LAST);
-			unsigned int thirdArgumentAlpha		: BITS(SOURCE_LAST);
-			unsigned int firstModifier			: BITS(MODIFIER_LAST);
-			unsigned int secondModifier			: BITS(MODIFIER_LAST);
-			unsigned int thirdModifier			: BITS(MODIFIER_LAST);
-			unsigned int firstModifierAlpha		: BITS(MODIFIER_LAST);
-			unsigned int secondModifierAlpha	: BITS(MODIFIER_LAST);
-			unsigned int thirdModifierAlpha		: BITS(MODIFIER_LAST);
-			unsigned int destinationArgument	: BITS(DESTINATION_LAST);
-			unsigned int texCoordIndex			: BITS(7);
-
-			unsigned int cantUnderflow			: 1;
-			unsigned int usesTexture			: 1;
-		};
-
-		struct Uniforms
-		{
-			word4 constantColor4[4];
-			float4 bumpmapMatrix4F[2][2];
-			word4 bumpmapMatrix4W[2][2];
-			word4 luminanceScale4;
-			word4 luminanceOffset4;
-		};
-
-		TextureStage();
-
-		~TextureStage();
-
-		void init(int stage, const Sampler *sampler, const TextureStage *previousStage);
-
-		State textureStageState() const;
-
-		void setConstantColor(const Color<float> &constantColor);
-		void setBumpmapMatrix(int element, float value);
-		void setLuminanceScale(float value);
-		void setLuminanceOffset(float value);
-
-		void setTexCoordIndex(unsigned int texCoordIndex);
-		void setStageOperation(StageOperation stageOperation);
-		void setFirstArgument(SourceArgument firstArgument);
-		void setSecondArgument(SourceArgument secondArgument);
-		void setThirdArgument(SourceArgument thirdArgument);
-		void setStageOperationAlpha(StageOperation stageOperationAlpha);
-		void setFirstArgumentAlpha(SourceArgument firstArgumentAlpha);
-		void setSecondArgumentAlpha(SourceArgument secondArgumentAlpha);
-		void setThirdArgumentAlpha(SourceArgument thirdArgumentAlpha);
-		void setFirstModifier(ArgumentModifier firstModifier);
-		void setSecondModifier(ArgumentModifier secondModifier);
-		void setThirdModifier(ArgumentModifier thirdModifier);
-		void setFirstModifierAlpha(ArgumentModifier firstModifierAlpha);
-		void setSecondModifierAlpha(ArgumentModifier secondModifierAlpha);
-		void setThirdModifierAlpha(ArgumentModifier thirdModifierAlpha);
-		void setDestinationArgument(DestinationArgument destinationArgument);
-
-		Uniforms uniforms;   // FIXME: Private
-
-	private:
-		bool usesColor(SourceArgument source) const;
-		bool usesAlpha(SourceArgument source) const;
-		bool uses(SourceArgument source) const;
-		bool usesCurrent() const;
-		bool usesDiffuse() const;
-		bool usesSpecular() const;
-		bool usesTexture() const;
-		bool isStageDisabled() const;
-		bool writesCurrent() const;
-
-		int stage;
-
-		StageOperation stageOperation;
-		SourceArgument firstArgument;
-		SourceArgument secondArgument;
-		SourceArgument thirdArgument;
-		StageOperation stageOperationAlpha;
-		SourceArgument firstArgumentAlpha;
-		SourceArgument secondArgumentAlpha;
-		SourceArgument thirdArgumentAlpha;
-		ArgumentModifier firstModifier;
-		ArgumentModifier secondModifier;
-		ArgumentModifier thirdModifier;
-		ArgumentModifier firstModifierAlpha;
-		ArgumentModifier secondModifierAlpha;
-		ArgumentModifier thirdModifierAlpha;
-		DestinationArgument destinationArgument;
-
-		int texCoordIndex;
-		const Sampler *sampler;
-		const TextureStage *previousStage;
-	};
-}
-
-#endif  // sw_TextureStage_hpp
diff --git a/src/Device/VertexProcessor.cpp b/src/Device/VertexProcessor.cpp
index 5c5e1fd..9fc7308 100644
--- a/src/Device/VertexProcessor.cpp
+++ b/src/Device/VertexProcessor.cpp
@@ -14,7 +14,6 @@
 
 #include "VertexProcessor.hpp"
 
-#include "Pipeline/VertexPipeline.hpp"
 #include "Pipeline/VertexProgram.hpp"
 #include "Pipeline/VertexShader.hpp"
 #include "Pipeline/PixelShader.hpp"
@@ -82,50 +81,14 @@
 
 	VertexProcessor::VertexProcessor(Context *context) : context(context)
 	{
-		for(int i = 0; i < 12; i++)
-		{
-			M[i] = 1;
-		}
-
-		V = 1;
-		B = 1;
-		P = 0;
-		PB = 0;
-		PBV = 0;
-
-		for(int i = 0; i < 12; i++)
-		{
-			PBVM[i] = 0;
-		}
-
-		setLightingEnable(true);
-		setSpecularEnable(false);
-
-		for(int i = 0; i < 8; i++)
-		{
-			setLightEnable(i, false);
-			setLightPosition(i, 0);
-		}
-
-		updateMatrix = true;
-		updateViewMatrix = true;
-		updateBaseMatrix = true;
-		updateProjectionMatrix = true;
-		updateLighting = true;
-
-		for(int i = 0; i < 12; i++)
-		{
-			updateModelMatrix[i] = true;
-		}
-
-		routineCache = 0;
+		routineCache = nullptr;
 		setRoutineCacheSize(1024);
 	}
 
 	VertexProcessor::~VertexProcessor()
 	{
 		delete routineCache;
-		routineCache = 0;
+		routineCache = nullptr;
 	}
 
 	void VertexProcessor::setInputStream(int index, const Stream &stream)
@@ -133,14 +96,12 @@
 		context->input[index] = stream;
 	}
 
-	void VertexProcessor::resetInputStreams(bool preTransformed)
+	void VertexProcessor::resetInputStreams()
 	{
 		for(int i = 0; i < MAX_VERTEX_INPUTS; i++)
 		{
 			context->input[i].defaults();
 		}
-
-		context->preTransformed = preTransformed;
 	}
 
 	void VertexProcessor::setFloatConstant(unsigned int index, const float value[4])
@@ -214,304 +175,11 @@
 		}
 	}
 
-	void VertexProcessor::setModelMatrix(const Matrix &M, int i)
-	{
-		if(i < 12)
-		{
-			this->M[i] = M;
-
-			updateMatrix = true;
-			updateModelMatrix[i] = true;
-			updateLighting = true;
-		}
-		else ASSERT(false);
-	}
-
-	void VertexProcessor::setViewMatrix(const Matrix &V)
-	{
-		this->V = V;
-
-		updateMatrix = true;
-		updateViewMatrix = true;
-	}
-
-	void VertexProcessor::setBaseMatrix(const Matrix &B)
-	{
-		this->B = B;
-
-		updateMatrix = true;
-		updateBaseMatrix = true;
-	}
-
-	void VertexProcessor::setProjectionMatrix(const Matrix &P)
-	{
-		this->P = P;
-		context->wBasedFog = (P[3][0] != 0.0f) || (P[3][1] != 0.0f) || (P[3][2] != 0.0f) || (P[3][3] != 1.0f);
-
-		updateMatrix = true;
-		updateProjectionMatrix = true;
-	}
-
-	void VertexProcessor::setLightingEnable(bool lightingEnable)
-	{
-		context->setLightingEnable(lightingEnable);
-
-		updateLighting = true;
-	}
-
-	void VertexProcessor::setLightEnable(unsigned int light, bool lightEnable)
-	{
-		if(light < 8)
-		{
-			context->setLightEnable(light, lightEnable);
-		}
-		else ASSERT(false);
-
-		updateLighting = true;
-	}
-
-	void VertexProcessor::setSpecularEnable(bool specularEnable)
-	{
-		context->setSpecularEnable(specularEnable);
-
-		updateLighting = true;
-	}
-
-	void VertexProcessor::setLightPosition(unsigned int light, const Point &lightPosition)
-	{
-		if(light < 8)
-		{
-			context->setLightPosition(light, lightPosition);
-		}
-		else ASSERT(false);
-
-		updateLighting = true;
-	}
-
-	void VertexProcessor::setLightDiffuse(unsigned int light, const Color<float> &lightDiffuse)
-	{
-		if(light < 8)
-		{
-			ff.lightDiffuse[light][0] = lightDiffuse.r;
-			ff.lightDiffuse[light][1] = lightDiffuse.g;
-			ff.lightDiffuse[light][2] = lightDiffuse.b;
-			ff.lightDiffuse[light][3] = lightDiffuse.a;
-		}
-		else ASSERT(false);
-	}
-
-	void VertexProcessor::setLightSpecular(unsigned int light, const Color<float> &lightSpecular)
-	{
-		if(light < 8)
-		{
-			ff.lightSpecular[light][0] = lightSpecular.r;
-			ff.lightSpecular[light][1] = lightSpecular.g;
-			ff.lightSpecular[light][2] = lightSpecular.b;
-			ff.lightSpecular[light][3] = lightSpecular.a;
-		}
-		else ASSERT(false);
-	}
-
-	void VertexProcessor::setLightAmbient(unsigned int light, const Color<float> &lightAmbient)
-	{
-		if(light < 8)
-		{
-			ff.lightAmbient[light][0] = lightAmbient.r;
-			ff.lightAmbient[light][1] = lightAmbient.g;
-			ff.lightAmbient[light][2] = lightAmbient.b;
-			ff.lightAmbient[light][3] = lightAmbient.a;
-		}
-		else ASSERT(false);
-	}
-
-	void VertexProcessor::setLightAttenuation(unsigned int light, float constant, float linear, float quadratic)
-	{
-		if(light < 8)
-		{
-			ff.attenuationConstant[light] = replicate(constant);
-			ff.attenuationLinear[light] = replicate(linear);
-			ff.attenuationQuadratic[light] = replicate(quadratic);
-		}
-		else ASSERT(false);
-	}
-
-	void VertexProcessor::setLightRange(unsigned int light, float lightRange)
-	{
-		if(light < 8)
-		{
-			ff.lightRange[light] = lightRange;
-		}
-		else ASSERT(false);
-	}
-
-	void VertexProcessor::setFogEnable(bool fogEnable)
-	{
-		context->fogEnable = fogEnable;
-	}
-
-	void VertexProcessor::setVertexFogMode(FogMode fogMode)
-	{
-		context->vertexFogMode = fogMode;
-	}
-
 	void VertexProcessor::setInstanceID(int instanceID)
 	{
 		context->instanceID = instanceID;
 	}
 
-	void VertexProcessor::setColorVertexEnable(bool colorVertexEnable)
-	{
-		context->setColorVertexEnable(colorVertexEnable);
-	}
-
-	void VertexProcessor::setDiffuseMaterialSource(MaterialSource diffuseMaterialSource)
-	{
-		context->setDiffuseMaterialSource(diffuseMaterialSource);
-	}
-
-	void VertexProcessor::setSpecularMaterialSource(MaterialSource specularMaterialSource)
-	{
-		context->setSpecularMaterialSource(specularMaterialSource);
-	}
-
-	void VertexProcessor::setAmbientMaterialSource(MaterialSource ambientMaterialSource)
-	{
-		context->setAmbientMaterialSource(ambientMaterialSource);
-	}
-
-	void VertexProcessor::setEmissiveMaterialSource(MaterialSource emissiveMaterialSource)
-	{
-		context->setEmissiveMaterialSource(emissiveMaterialSource);
-	}
-
-	void VertexProcessor::setGlobalAmbient(const Color<float> &globalAmbient)
-	{
-		ff.globalAmbient[0] = globalAmbient.r;
-		ff.globalAmbient[1] = globalAmbient.g;
-		ff.globalAmbient[2] = globalAmbient.b;
-		ff.globalAmbient[3] = globalAmbient.a;
-	}
-
-	void VertexProcessor::setMaterialEmission(const Color<float> &emission)
-	{
-		ff.materialEmission[0] = emission.r;
-		ff.materialEmission[1] = emission.g;
-		ff.materialEmission[2] = emission.b;
-		ff.materialEmission[3] = emission.a;
-	}
-
-	void VertexProcessor::setMaterialAmbient(const Color<float> &materialAmbient)
-	{
-		ff.materialAmbient[0] = materialAmbient.r;
-		ff.materialAmbient[1] = materialAmbient.g;
-		ff.materialAmbient[2] = materialAmbient.b;
-		ff.materialAmbient[3] = materialAmbient.a;
-	}
-
-	void VertexProcessor::setMaterialDiffuse(const Color<float> &diffuseColor)
-	{
-		ff.materialDiffuse[0] = diffuseColor.r;
-		ff.materialDiffuse[1] = diffuseColor.g;
-		ff.materialDiffuse[2] = diffuseColor.b;
-		ff.materialDiffuse[3] = diffuseColor.a;
-	}
-
-	void VertexProcessor::setMaterialSpecular(const Color<float> &specularColor)
-	{
-		ff.materialSpecular[0] = specularColor.r;
-		ff.materialSpecular[1] = specularColor.g;
-		ff.materialSpecular[2] = specularColor.b;
-		ff.materialSpecular[3] = specularColor.a;
-	}
-
-	void VertexProcessor::setMaterialShininess(float specularPower)
-	{
-		ff.materialShininess = specularPower;
-	}
-
-	void VertexProcessor::setLightViewPosition(unsigned int light, const Point &P)
-	{
-		if(light < 8)
-		{
-			ff.lightPosition[light][0] = P.x;
-			ff.lightPosition[light][1] = P.y;
-			ff.lightPosition[light][2] = P.z;
-			ff.lightPosition[light][3] = 1;
-		}
-		else ASSERT(false);
-	}
-
-	void VertexProcessor::setRangeFogEnable(bool enable)
-	{
-		context->rangeFogEnable = enable;
-	}
-
-	void VertexProcessor::setIndexedVertexBlendEnable(bool indexedVertexBlendEnable)
-	{
-		context->indexedVertexBlendEnable = indexedVertexBlendEnable;
-	}
-
-	void VertexProcessor::setVertexBlendMatrixCount(unsigned int vertexBlendMatrixCount)
-	{
-		if(vertexBlendMatrixCount <= 4)
-		{
-			context->vertexBlendMatrixCount = vertexBlendMatrixCount;
-		}
-		else ASSERT(false);
-	}
-
-	void VertexProcessor::setTextureWrap(unsigned int stage, int mask)
-	{
-		if(stage < TEXTURE_IMAGE_UNITS)
-		{
-			context->textureWrap[stage] = mask;
-		}
-		else ASSERT(false);
-
-		context->textureWrapActive = false;
-
-		for(int i = 0; i < TEXTURE_IMAGE_UNITS; i++)
-		{
-			context->textureWrapActive |= (context->textureWrap[i] != 0x00);
-		}
-	}
-
-	void VertexProcessor::setTexGen(unsigned int stage, TexGen texGen)
-	{
-		if(stage < 8)
-		{
-			context->texGen[stage] = texGen;
-		}
-		else ASSERT(false);
-	}
-
-	void VertexProcessor::setLocalViewer(bool localViewer)
-	{
-		context->localViewer = localViewer;
-	}
-
-	void VertexProcessor::setNormalizeNormals(bool normalizeNormals)
-	{
-		context->normalizeNormals = normalizeNormals;
-	}
-
-	void VertexProcessor::setTextureMatrix(int stage, const Matrix &T)
-	{
-		for(int i = 0; i < 4; i++)
-		{
-			for(int j = 0; j < 4; j++)
-			{
-				ff.textureTransform[stage][i][j] = T[i][j];
-			}
-		}
-	}
-
-	void VertexProcessor::setTextureTransform(int stage, int count, bool project)
-	{
-		context->textureTransformCount[stage] = count;
-		context->textureTransformProject[stage] = project;
-	}
-
 	void VertexProcessor::setTextureFilter(unsigned int sampler, FilterType textureFilter)
 	{
 		if(sampler < VERTEX_TEXTURE_IMAGE_UNITS)
@@ -692,43 +360,14 @@
 		else ASSERT(false);
 	}
 
-	void VertexProcessor::setSyncRequired(unsigned int sampler, bool isSincRequired)
-	{
-		if(sampler < TEXTURE_IMAGE_UNITS)
-		{
-			context->sampler[sampler].setSyncRequired(isSincRequired);
-		}
-		else ASSERT(false);
-	}
-
-	void VertexProcessor::setPointSize(float pointSize)
-	{
-		point.pointSize = replicate(pointSize);
-	}
-
 	void VertexProcessor::setPointSizeMin(float pointSizeMin)
 	{
-		point.pointSizeMin = pointSizeMin;
+		this->pointSizeMin = pointSizeMin;
 	}
 
 	void VertexProcessor::setPointSizeMax(float pointSizeMax)
 	{
-		point.pointSizeMax = pointSizeMax;
-	}
-
-	void VertexProcessor::setPointScaleA(float pointScaleA)
-	{
-		point.pointScaleA = pointScaleA;
-	}
-
-	void VertexProcessor::setPointScaleB(float pointScaleB)
-	{
-		point.pointScaleB = pointScaleB;
-	}
-
-	void VertexProcessor::setPointScaleC(float pointScaleC)
-	{
-		point.pointScaleC = pointScaleC;
+		this->pointSizeMax = pointSizeMax;
 	}
 
 	void VertexProcessor::setTransformFeedbackQueryEnabled(bool enable)
@@ -741,161 +380,6 @@
 		context->transformFeedbackEnabled = enable;
 	}
 
-	const Matrix &VertexProcessor::getModelTransform(int i)
-	{
-		updateTransform();
-		return PBVM[i];
-	}
-
-	const Matrix &VertexProcessor::getViewTransform()
-	{
-		updateTransform();
-		return PBV;
-	}
-
-	bool VertexProcessor::isFixedFunction()
-	{
-		return !context->vertexShader;
-	}
-
-	void VertexProcessor::setTransform(const Matrix &M, int i)
-	{
-		ff.transformT[i][0][0] = M[0][0];
-		ff.transformT[i][0][1] = M[1][0];
-		ff.transformT[i][0][2] = M[2][0];
-		ff.transformT[i][0][3] = M[3][0];
-
-		ff.transformT[i][1][0] = M[0][1];
-		ff.transformT[i][1][1] = M[1][1];
-		ff.transformT[i][1][2] = M[2][1];
-		ff.transformT[i][1][3] = M[3][1];
-
-		ff.transformT[i][2][0] = M[0][2];
-		ff.transformT[i][2][1] = M[1][2];
-		ff.transformT[i][2][2] = M[2][2];
-		ff.transformT[i][2][3] = M[3][2];
-
-		ff.transformT[i][3][0] = M[0][3];
-		ff.transformT[i][3][1] = M[1][3];
-		ff.transformT[i][3][2] = M[2][3];
-		ff.transformT[i][3][3] = M[3][3];
-	}
-
-	void VertexProcessor::setCameraTransform(const Matrix &M, int i)
-	{
-		ff.cameraTransformT[i][0][0] = M[0][0];
-		ff.cameraTransformT[i][0][1] = M[1][0];
-		ff.cameraTransformT[i][0][2] = M[2][0];
-		ff.cameraTransformT[i][0][3] = M[3][0];
-
-		ff.cameraTransformT[i][1][0] = M[0][1];
-		ff.cameraTransformT[i][1][1] = M[1][1];
-		ff.cameraTransformT[i][1][2] = M[2][1];
-		ff.cameraTransformT[i][1][3] = M[3][1];
-
-		ff.cameraTransformT[i][2][0] = M[0][2];
-		ff.cameraTransformT[i][2][1] = M[1][2];
-		ff.cameraTransformT[i][2][2] = M[2][2];
-		ff.cameraTransformT[i][2][3] = M[3][2];
-
-		ff.cameraTransformT[i][3][0] = M[0][3];
-		ff.cameraTransformT[i][3][1] = M[1][3];
-		ff.cameraTransformT[i][3][2] = M[2][3];
-		ff.cameraTransformT[i][3][3] = M[3][3];
-	}
-
-	void VertexProcessor::setNormalTransform(const Matrix &M, int i)
-	{
-		ff.normalTransformT[i][0][0] = M[0][0];
-		ff.normalTransformT[i][0][1] = M[1][0];
-		ff.normalTransformT[i][0][2] = M[2][0];
-		ff.normalTransformT[i][0][3] = M[3][0];
-
-		ff.normalTransformT[i][1][0] = M[0][1];
-		ff.normalTransformT[i][1][1] = M[1][1];
-		ff.normalTransformT[i][1][2] = M[2][1];
-		ff.normalTransformT[i][1][3] = M[3][1];
-
-		ff.normalTransformT[i][2][0] = M[0][2];
-		ff.normalTransformT[i][2][1] = M[1][2];
-		ff.normalTransformT[i][2][2] = M[2][2];
-		ff.normalTransformT[i][2][3] = M[3][2];
-
-		ff.normalTransformT[i][3][0] = M[0][3];
-		ff.normalTransformT[i][3][1] = M[1][3];
-		ff.normalTransformT[i][3][2] = M[2][3];
-		ff.normalTransformT[i][3][3] = M[3][3];
-	}
-
-	void VertexProcessor::updateTransform()
-	{
-		if(!updateMatrix) return;
-
-		int activeMatrices = context->indexedVertexBlendEnable ? 12 : max(context->vertexBlendMatrixCount, 1);
-
-		if(updateProjectionMatrix)
-		{
-			PB = P * B;
-			PBV = PB * V;
-
-			for(int i = 0; i < activeMatrices; i++)
-			{
-				PBVM[i] = PBV * M[i];
-				updateModelMatrix[i] = false;
-			}
-
-			updateProjectionMatrix = false;
-			updateBaseMatrix = false;
-			updateViewMatrix = false;
-		}
-
-		if(updateBaseMatrix)
-		{
-			PB = P * B;
-			PBV = PB * V;
-
-			for(int i = 0; i < activeMatrices; i++)
-			{
-				PBVM[i] = PBV * M[i];
-				updateModelMatrix[i] = false;
-			}
-
-			updateBaseMatrix = false;
-			updateViewMatrix = false;
-		}
-
-		if(updateViewMatrix)
-		{
-			PBV = PB * V;
-
-			for(int i = 0; i < activeMatrices; i++)
-			{
-				PBVM[i] = PBV * M[i];
-				updateModelMatrix[i] = false;
-			}
-
-			updateViewMatrix = false;
-		}
-
-		for(int i = 0; i < activeMatrices; i++)
-		{
-			if(updateModelMatrix[i])
-			{
-				PBVM[i] = PBV * M[i];
-				updateModelMatrix[i] = false;
-			}
-		}
-
-		for(int i = 0; i < activeMatrices; i++)
-		{
-			setTransform(PBVM[i], i);
-			setCameraTransform(B * V * M[i], i);
-			setNormalTransform(~!(B * V * M[i]), i);
-		}
-
-		updateMatrix = false;
-	}
-
 	void VertexProcessor::setRoutineCacheSize(int cacheSize)
 	{
 		delete routineCache;
@@ -904,72 +388,15 @@
 
 	const VertexProcessor::State VertexProcessor::update(DrawType drawType)
 	{
-		if(isFixedFunction())
-		{
-			updateTransform();
-
-			if(updateLighting)
-			{
-				for(int i = 0; i < 8; i++)
-				{
-					if(context->vertexLightActive(i))
-					{
-						// Light position in camera coordinates
-						setLightViewPosition(i, B * V * context->getLightPosition(i));
-					}
-				}
-
-				updateLighting = false;
-			}
-		}
-
 		State state;
 
-		if(context->vertexShader)
-		{
-			state.shaderID = context->vertexShader->getSerialID();
-		}
-		else
-		{
-			state.shaderID = 0;
-		}
+		state.shaderID = context->vertexShader->getSerialID();
 
 		state.fixedFunction = !context->vertexShader && context->pixelShaderModel() < 0x0300;
 		state.textureSampling = context->vertexShader ? context->vertexShader->containsTextureSampling() : false;
 		state.positionRegister = context->vertexShader ? context->vertexShader->getPositionRegister() : Pos;
 		state.pointSizeRegister = context->vertexShader ? context->vertexShader->getPointSizeRegister() : Pts;
 
-		state.vertexBlendMatrixCount = context->vertexBlendMatrixCountActive();
-		state.indexedVertexBlendEnable = context->indexedVertexBlendActive();
-		state.vertexNormalActive = context->vertexNormalActive();
-		state.normalizeNormals = context->normalizeNormalsActive();
-		state.vertexLightingActive = context->vertexLightingActive();
-		state.diffuseActive = context->diffuseActive();
-		state.specularActive = context->specularActive();
-		state.vertexSpecularActive = context->vertexSpecularActive();
-
-		state.vertexLightActive = context->vertexLightActive(0) << 0 |
-		                          context->vertexLightActive(1) << 1 |
-		                          context->vertexLightActive(2) << 2 |
-		                          context->vertexLightActive(3) << 3 |
-		                          context->vertexLightActive(4) << 4 |
-		                          context->vertexLightActive(5) << 5 |
-		                          context->vertexLightActive(6) << 6 |
-		                          context->vertexLightActive(7) << 7;
-
-		state.vertexDiffuseMaterialSourceActive = context->vertexDiffuseMaterialSourceActive();
-		state.vertexSpecularMaterialSourceActive = context->vertexSpecularMaterialSourceActive();
-		state.vertexAmbientMaterialSourceActive = context->vertexAmbientMaterialSourceActive();
-		state.vertexEmissiveMaterialSourceActive = context->vertexEmissiveMaterialSourceActive();
-		state.fogActive = context->fogActive();
-		state.vertexFogMode = context->vertexFogModeActive();
-		state.rangeFogActive = context->rangeFogActive();
-		state.localViewerActive = context->localViewerActive();
-		state.pointSizeActive = context->pointSizeActive();
-		state.pointScaleActive = context->pointScaleActive();
-
-		state.preTransformed = context->preTransformed;
-		state.superSampling = context->getSuperSampleCount() > 1;
 		state.multiSampling = context->getMultiSampleCount() > 1;
 
 		state.transformFeedbackQueryEnabled = context->transformFeedbackQueryEnabled;
@@ -988,24 +415,11 @@
 			state.input[i].attribType = context->vertexShader ? context->vertexShader->getAttribType(i) : VertexShader::ATTRIBTYPE_FLOAT;
 		}
 
-		if(!context->vertexShader)
+		for(unsigned int i = 0; i < VERTEX_TEXTURE_IMAGE_UNITS; i++)
 		{
-			for(int i = 0; i < 8; i++)
+			if(context->vertexShader->usesSampler(i))
 			{
-			//	state.textureState[i].vertexTextureActive = context->vertexTextureActive(i, 0);
-				state.textureState[i].texGenActive = context->texGenActive(i);
-				state.textureState[i].textureTransformCountActive = context->textureTransformCountActive(i);
-				state.textureState[i].texCoordIndexActive = context->texCoordIndexActive(i);
-			}
-		}
-		else
-		{
-			for(unsigned int i = 0; i < VERTEX_TEXTURE_IMAGE_UNITS; i++)
-			{
-				if(context->vertexShader->usesSampler(i))
-				{
-					state.sampler[i] = context->sampler[TEXTURE_IMAGE_UNITS + i].samplerState();
-				}
+				state.sampler[i] = context->sampler[TEXTURE_IMAGE_UNITS + i].samplerState();
 			}
 		}
 
@@ -1019,70 +433,6 @@
 				state.output[i].wWrite = context->vertexShader->getOutput(i, 3).active();
 			}
 		}
-		else if(!context->preTransformed || context->pixelShaderModel() < 0x0300)
-		{
-			state.output[Pos].write = 0xF;
-
-			if(context->diffuseActive() && (context->lightingEnable || context->input[Color0]))
-			{
-				state.output[C0].write = 0xF;
-			}
-
-			if(context->specularActive())
-			{
-				state.output[C1].write = 0xF;
-			}
-
-			for(int stage = 0; stage < 8; stage++)
-			{
-				if(context->texCoordActive(stage, 0)) state.output[T0 + stage].write |= 0x01;
-				if(context->texCoordActive(stage, 1)) state.output[T0 + stage].write |= 0x02;
-				if(context->texCoordActive(stage, 2)) state.output[T0 + stage].write |= 0x04;
-				if(context->texCoordActive(stage, 3)) state.output[T0 + stage].write |= 0x08;
-			}
-
-			if(context->fogActive())
-			{
-				state.output[Fog].xWrite = true;
-			}
-
-			if(context->pointSizeActive())
-			{
-				state.output[Pts].yWrite = true;
-			}
-		}
-		else
-		{
-			state.output[Pos].write = 0xF;
-
-			for(int i = 0; i < 2; i++)
-			{
-				if(context->input[Color0 + i])
-				{
-					state.output[C0 + i].write = 0xF;
-				}
-			}
-
-			for(int i = 0; i < 8; i++)
-			{
-				if(context->input[TexCoord0 + i])
-				{
-					state.output[T0 + i].write = 0xF;
-				}
-			}
-
-			if(context->input[PointSize])
-			{
-				state.output[Pts].yWrite = true;
-			}
-		}
-
-		if(context->vertexShaderModel() < 0x0300)
-		{
-			state.output[C0].clamp = 0xF;
-			state.output[C1].clamp = 0xF;
-			state.output[Fog].xClamp = true;
-		}
 
 		state.hash = state.computeHash();
 
@@ -1095,17 +445,7 @@
 
 		if(!routine)   // Create one
 		{
-			VertexRoutine *generator = nullptr;
-
-			if(state.fixedFunction)
-			{
-				generator = new VertexPipeline(state);
-			}
-			else
-			{
-				generator = new VertexProgram(state, context->vertexShader);
-			}
-
+			VertexRoutine *generator = new VertexProgram(state, context->vertexShader);
 			generator->generate();
 			routine = (*generator)(L"VertexRoutine_%0.8X", state.shaderID);
 			delete generator;
diff --git a/src/Device/VertexProcessor.hpp b/src/Device/VertexProcessor.hpp
index cfb90b8..83383e3 100644
--- a/src/Device/VertexProcessor.hpp
+++ b/src/Device/VertexProcessor.hpp
@@ -55,42 +55,12 @@
 			unsigned int positionRegister  : BITS(MAX_VERTEX_OUTPUTS);   // TODO: Eliminate by querying shader.
 			unsigned int pointSizeRegister : BITS(MAX_VERTEX_OUTPUTS);   // TODO: Eliminate by querying shader.
 
-			unsigned int vertexBlendMatrixCount               : 3;
-			bool indexedVertexBlendEnable                     : 1;
-			bool vertexNormalActive                           : 1;
-			bool normalizeNormals                             : 1;
-			bool vertexLightingActive                         : 1;
-			bool diffuseActive                                : 1;
-			bool specularActive                               : 1;
-			bool vertexSpecularActive                         : 1;
-			unsigned int vertexLightActive                    : 8;
-			MaterialSource vertexDiffuseMaterialSourceActive  : BITS(MATERIAL_LAST);
-			MaterialSource vertexSpecularMaterialSourceActive : BITS(MATERIAL_LAST);
-			MaterialSource vertexAmbientMaterialSourceActive  : BITS(MATERIAL_LAST);
-			MaterialSource vertexEmissiveMaterialSourceActive : BITS(MATERIAL_LAST);
-			bool fogActive                                    : 1;
-			FogMode vertexFogMode                             : BITS(FOG_LAST);
-			bool rangeFogActive                               : 1;
-			bool localViewerActive                            : 1;
-			bool pointSizeActive                              : 1;
-			bool pointScaleActive                             : 1;
 			bool transformFeedbackQueryEnabled                : 1;
 			uint64_t transformFeedbackEnabled                 : 64;
 			unsigned char verticesPerPrimitive                : 2; // 1 (points), 2 (lines) or 3 (triangles)
 
-			bool preTransformed : 1;
-			bool superSampling  : 1;
 			bool multiSampling  : 1;
 
-			struct TextureState
-			{
-				TexGen texGenActive                       : BITS(TEXGEN_LAST);
-				unsigned char textureTransformCountActive : 3;
-				unsigned char texCoordIndexActive         : 3;
-			};
-
-			TextureState textureState[8];
-
 			Sampler::State sampler[VERTEX_TEXTURE_IMAGE_UNITS];
 
 			struct Input
@@ -148,39 +118,6 @@
 			unsigned int hash;
 		};
 
-		struct FixedFunction
-		{
-			float4 transformT[12][4];
-			float4 cameraTransformT[12][4];
-			float4 normalTransformT[12][4];
-			float4 textureTransform[8][4];
-
-			float4 lightPosition[8];
-			float4 lightAmbient[8];
-			float4 lightSpecular[8];
-			float4 lightDiffuse[8];
-			float4 attenuationConstant[8];
-			float4 attenuationLinear[8];
-			float4 attenuationQuadratic[8];
-			float lightRange[8];
-			float4 materialDiffuse;
-			float4 materialSpecular;
-			float materialShininess;
-			float4 globalAmbient;
-			float4 materialEmission;
-			float4 materialAmbient;
-		};
-
-		struct PointSprite
-		{
-			float4 pointSize;
-			float pointSizeMin;
-			float pointSizeMax;
-			float pointScaleA;
-			float pointScaleB;
-			float pointScaleC;
-		};
-
 		typedef void (*RoutinePointer)(Vertex *output, unsigned int *batch, VertexTask *vertexTask, DrawData *draw);
 
 		VertexProcessor(Context *context);
@@ -188,7 +125,7 @@
 		virtual ~VertexProcessor();
 
 		void setInputStream(int index, const Stream &stream);
-		void resetInputStreams(bool preTransformed);
+		void resetInputStreams();
 
 		void setFloatConstant(unsigned int index, const float value[4]);
 		void setIntegerConstant(unsigned int index, const int integer[4]);
@@ -200,54 +137,8 @@
 		void setTransformFeedbackBuffer(int index, sw::Resource* transformFeedbackBuffer, int offset, unsigned int reg, unsigned int row, unsigned int col, unsigned int stride);
 		void lockTransformFeedbackBuffers(byte** t, unsigned int* v, unsigned int* r, unsigned int* c, unsigned int* s, sw::Resource* transformFeedbackBuffers[]);
 
-		// Transformations
-		void setModelMatrix(const Matrix &M, int i = 0);
-		void setViewMatrix(const Matrix &V);
-		void setBaseMatrix(const Matrix &B);
-		void setProjectionMatrix(const Matrix &P);
-
-		// Lighting
-		void setLightingEnable(bool lightingEnable);
-		void setLightEnable(unsigned int light, bool lightEnable);
-		void setSpecularEnable(bool specularEnable);
-
-		void setGlobalAmbient(const Color<float> &globalAmbient);
-		void setLightPosition(unsigned int light, const Point &lightPosition);
-		void setLightViewPosition(unsigned int light, const Point &lightPosition);
-		void setLightDiffuse(unsigned int light, const Color<float> &lightDiffuse);
-		void setLightSpecular(unsigned int light, const Color<float> &lightSpecular);
-		void setLightAmbient(unsigned int light, const Color<float> &lightAmbient);
-		void setLightAttenuation(unsigned int light, float constant, float linear, float quadratic);
-		void setLightRange(unsigned int light, float lightRange);
-
 		void setInstanceID(int instanceID);
 
-		void setFogEnable(bool fogEnable);
-		void setVertexFogMode(FogMode fogMode);
-		void setRangeFogEnable(bool enable);
-
-		void setColorVertexEnable(bool colorVertexEnable);
-		void setDiffuseMaterialSource(MaterialSource diffuseMaterialSource);
-		void setSpecularMaterialSource(MaterialSource specularMaterialSource);
-		void setAmbientMaterialSource(MaterialSource ambientMaterialSource);
-		void setEmissiveMaterialSource(MaterialSource emissiveMaterialSource);
-
-		void setMaterialEmission(const Color<float> &emission);
-		void setMaterialAmbient(const Color<float> &materialAmbient);
-		void setMaterialDiffuse(const Color<float> &diffuseColor);
-		void setMaterialSpecular(const Color<float> &specularColor);
-		void setMaterialShininess(float specularPower);
-
-		void setIndexedVertexBlendEnable(bool indexedVertexBlendEnable);
-		void setVertexBlendMatrixCount(unsigned int vertexBlendMatrixCount);
-
-		void setTextureWrap(unsigned int stage, int mask);
-		void setTexGen(unsigned int stage, TexGen texGen);
-		void setLocalViewer(bool localViewer);
-		void setNormalizeNormals(bool normalizeNormals);
-		void setTextureMatrix(int stage, const Matrix &T);
-		void setTextureTransform(int stage, int count, bool project);
-
 		void setTextureFilter(unsigned int sampler, FilterType textureFilter);
 		void setMipmapFilter(unsigned int sampler, MipmapType mipmapFilter);
 		void setGatherEnable(unsigned int sampler, bool enable);
@@ -268,26 +159,17 @@
 		void setMaxLevel(unsigned int sampler, int maxLevel);
 		void setMinLod(unsigned int sampler, float minLod);
 		void setMaxLod(unsigned int sampler, float maxLod);
-		void setSyncRequired(unsigned int sampler, bool isSincRequired);
 
-		void setPointSize(float pointSize);
 		void setPointSizeMin(float pointSizeMin);
 		void setPointSizeMax(float pointSizeMax);
-		void setPointScaleA(float pointScaleA);
-		void setPointScaleB(float pointScaleB);
-		void setPointScaleC(float pointScaleC);
 
 		void setTransformFeedbackQueryEnabled(bool enable);
 		void enableTransformFeedback(uint64_t enable);
 
 	protected:
-		const Matrix &getModelTransform(int i);
-		const Matrix &getViewTransform();
-
 		const State update(DrawType drawType);
 		Routine *routine(const State &state);
 
-		bool isFixedFunction();
 		void setRoutineCacheSize(int cacheSize);
 
 		// Shader constants
@@ -295,8 +177,8 @@
 		int4 i[16];
 		bool b[16];
 
-		PointSprite point;
-		FixedFunction ff;
+		float pointSizeMin;
+		float pointSizeMax;
 
 	private:
 		struct UniformBufferInfo
@@ -321,31 +203,9 @@
 		};
 		TransformFeedbackInfo transformFeedbackInfo[MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS];
 
-		void updateTransform();
-		void setTransform(const Matrix &M, int i);
-		void setCameraTransform(const Matrix &M, int i);
-		void setNormalTransform(const Matrix &M, int i);
-
 		Context *const context;
 
 		RoutineCache<State> *routineCache;
-
-	protected:
-		Matrix M[12];      // Model/Geometry/World matrix
-		Matrix V;          // View/Camera/Eye matrix
-		Matrix B;          // Base matrix
-		Matrix P;          // Projection matrix
-		Matrix PB;         // P * B
-		Matrix PBV;        // P * B * V
-		Matrix PBVM[12];   // P * B * V * M
-
-		// Update hierarchy
-		bool updateMatrix;
-		bool updateModelMatrix[12];
-		bool updateViewMatrix;
-		bool updateBaseMatrix;
-		bool updateProjectionMatrix;
-		bool updateLighting;
 	};
 }
 
diff --git a/src/Pipeline/PixelPipeline.cpp b/src/Pipeline/PixelPipeline.cpp
deleted file mode 100644
index d4faebd..0000000
--- a/src/Pipeline/PixelPipeline.cpp
+++ /dev/null
@@ -1,1959 +0,0 @@
-// 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.
-
-#include "PixelPipeline.hpp"
-#include "SamplerCore.hpp"
-#include "Renderer/Renderer.hpp"
-
-namespace sw
-{
-	extern bool postBlendSRGB;
-
-	void PixelPipeline::setBuiltins(Int &x, Int &y, Float4(&z)[4], Float4 &w)
-	{
-		if(state.color[0].component & 0x1) diffuse.x = convertFixed12(v[0].x); else diffuse.x = Short4(0x1000);
-		if(state.color[0].component & 0x2) diffuse.y = convertFixed12(v[0].y); else diffuse.y = Short4(0x1000);
-		if(state.color[0].component & 0x4) diffuse.z = convertFixed12(v[0].z); else diffuse.z = Short4(0x1000);
-		if(state.color[0].component & 0x8) diffuse.w = convertFixed12(v[0].w); else diffuse.w = Short4(0x1000);
-
-		if(state.color[1].component & 0x1) specular.x = convertFixed12(v[1].x); else specular.x = Short4(0x0000);
-		if(state.color[1].component & 0x2) specular.y = convertFixed12(v[1].y); else specular.y = Short4(0x0000);
-		if(state.color[1].component & 0x4) specular.z = convertFixed12(v[1].z); else specular.z = Short4(0x0000);
-		if(state.color[1].component & 0x8) specular.w = convertFixed12(v[1].w); else specular.w = Short4(0x0000);
-	}
-
-	void PixelPipeline::fixedFunction()
-	{
-		current = diffuse;
-		Vector4s temp(0x0000, 0x0000, 0x0000, 0x0000);
-
-		for(int stage = 0; stage < 8; stage++)
-		{
-			if(state.textureStage[stage].stageOperation == TextureStage::STAGE_DISABLE)
-			{
-				break;
-			}
-
-			Vector4s texture;
-
-			if(state.textureStage[stage].usesTexture)
-			{
-				texture = sampleTexture(stage, stage);
-			}
-
-			blendTexture(temp, texture, stage);
-		}
-
-		specularPixel(current, specular);
-	}
-
-	void PixelPipeline::applyShader(Int cMask[4])
-	{
-		if(!shader)
-		{
-			fixedFunction();
-			return;
-		}
-
-		int pad = 0;        // Count number of texm3x3pad instructions
-		Vector4s dPairing;   // Destination for first pairing instruction
-
-		for(size_t i = 0; i < shader->getLength(); i++)
-		{
-			const Shader::Instruction *instruction = shader->getInstruction(i);
-			Shader::Opcode opcode = instruction->opcode;
-
-			//	#ifndef NDEBUG   // FIXME: Centralize debug output control
-			//		shader->printInstruction(i, "debug.txt");
-			//	#endif
-
-			if(opcode == Shader::OPCODE_DCL || opcode == Shader::OPCODE_DEF || opcode == Shader::OPCODE_DEFI || opcode == Shader::OPCODE_DEFB)
-			{
-				continue;
-			}
-
-			const Dst &dst = instruction->dst;
-			const Src &src0 = instruction->src[0];
-			const Src &src1 = instruction->src[1];
-			const Src &src2 = instruction->src[2];
-
-			unsigned short shaderModel = shader->getShaderModel();
-			bool pairing = i + 1 < shader->getLength() && shader->getInstruction(i + 1)->coissue;   // First instruction of pair
-			bool coissue = instruction->coissue;                                                              // Second instruction of pair
-
-			Vector4s d;
-			Vector4s s0;
-			Vector4s s1;
-			Vector4s s2;
-
-			if(src0.type != Shader::PARAMETER_VOID) s0 = fetchRegister(src0);
-			if(src1.type != Shader::PARAMETER_VOID) s1 = fetchRegister(src1);
-			if(src2.type != Shader::PARAMETER_VOID) s2 = fetchRegister(src2);
-
-			Float4 x = shaderModel < 0x0104 ? v[2 + dst.index].x : v[2 + src0.index].x;
-			Float4 y = shaderModel < 0x0104 ? v[2 + dst.index].y : v[2 + src0.index].y;
-			Float4 z = shaderModel < 0x0104 ? v[2 + dst.index].z : v[2 + src0.index].z;
-			Float4 w = shaderModel < 0x0104 ? v[2 + dst.index].w : v[2 + src0.index].w;
-
-			switch(opcode)
-			{
-			case Shader::OPCODE_PS_1_0: break;
-			case Shader::OPCODE_PS_1_1: break;
-			case Shader::OPCODE_PS_1_2: break;
-			case Shader::OPCODE_PS_1_3: break;
-			case Shader::OPCODE_PS_1_4: break;
-
-			case Shader::OPCODE_DEF:    break;
-
-			case Shader::OPCODE_NOP:    break;
-			case Shader::OPCODE_MOV: MOV(d, s0);         break;
-			case Shader::OPCODE_ADD: ADD(d, s0, s1);     break;
-			case Shader::OPCODE_SUB: SUB(d, s0, s1);     break;
-			case Shader::OPCODE_MAD: MAD(d, s0, s1, s2); break;
-			case Shader::OPCODE_MUL: MUL(d, s0, s1);     break;
-			case Shader::OPCODE_DP3: DP3(d, s0, s1);     break;
-			case Shader::OPCODE_DP4: DP4(d, s0, s1);     break;
-			case Shader::OPCODE_LRP: LRP(d, s0, s1, s2); break;
-			case Shader::OPCODE_TEXCOORD:
-				if(shaderModel < 0x0104)
-				{
-					TEXCOORD(d, x, y, z, dst.index);
-			}
-				else
-				{
-					if((src0.swizzle & 0x30) == 0x20)   // .xyz
-					{
-						TEXCRD(d, x, y, z, src0.index, src0.modifier == Shader::MODIFIER_DZ || src0.modifier == Shader::MODIFIER_DW);
-					}
-					else   // .xwy
-					{
-						TEXCRD(d, x, y, w, src0.index, src0.modifier == Shader::MODIFIER_DZ || src0.modifier == Shader::MODIFIER_DW);
-					}
-				}
-				break;
-			case Shader::OPCODE_TEXKILL:
-				if(shaderModel < 0x0104)
-				{
-					TEXKILL(cMask, x, y, z);
-				}
-				else if(shaderModel == 0x0104)
-				{
-					if(dst.type == Shader::PARAMETER_TEXTURE)
-					{
-						TEXKILL(cMask, x, y, z);
-					}
-					else
-					{
-						TEXKILL(cMask, rs[dst.index]);
-					}
-				}
-				else ASSERT(false);
-				break;
-			case Shader::OPCODE_TEX:
-				if(shaderModel < 0x0104)
-				{
-					TEX(d, x, y, z, dst.index, false);
-				}
-				else if(shaderModel == 0x0104)
-				{
-					if(src0.type == Shader::PARAMETER_TEXTURE)
-					{
-						if((src0.swizzle & 0x30) == 0x20)   // .xyz
-						{
-							TEX(d, x, y, z, dst.index, src0.modifier == Shader::MODIFIER_DZ || src0.modifier == Shader::MODIFIER_DW);
-						}
-						else   // .xyw
-						{
-							TEX(d, x, y, w, dst.index, src0.modifier == Shader::MODIFIER_DZ || src0.modifier == Shader::MODIFIER_DW);
-						}
-					}
-					else
-					{
-						TEXLD(d, s0, dst.index, src0.modifier == Shader::MODIFIER_DZ || src0.modifier == Shader::MODIFIER_DW);
-					}
-				}
-				else ASSERT(false);
-				break;
-			case Shader::OPCODE_TEXBEM:       TEXBEM(d, s0, x, y, z, dst.index);                                             break;
-			case Shader::OPCODE_TEXBEML:      TEXBEML(d, s0, x, y, z, dst.index);                                            break;
-			case Shader::OPCODE_TEXREG2AR:    TEXREG2AR(d, s0, dst.index);                                                   break;
-			case Shader::OPCODE_TEXREG2GB:    TEXREG2GB(d, s0, dst.index);                                                   break;
-			case Shader::OPCODE_TEXM3X2PAD:   TEXM3X2PAD(x, y, z, s0, 0, src0.modifier == Shader::MODIFIER_SIGN);            break;
-			case Shader::OPCODE_TEXM3X2TEX:   TEXM3X2TEX(d, x, y, z, dst.index, s0, src0.modifier == Shader::MODIFIER_SIGN); break;
-			case Shader::OPCODE_TEXM3X3PAD:   TEXM3X3PAD(x, y, z, s0, pad++ % 2, src0.modifier == Shader::MODIFIER_SIGN);    break;
-			case Shader::OPCODE_TEXM3X3TEX:   TEXM3X3TEX(d, x, y, z, dst.index, s0, src0.modifier == Shader::MODIFIER_SIGN); break;
-			case Shader::OPCODE_TEXM3X3SPEC:  TEXM3X3SPEC(d, x, y, z, dst.index, s0, s1);                                    break;
-			case Shader::OPCODE_TEXM3X3VSPEC: TEXM3X3VSPEC(d, x, y, z, dst.index, s0);                                       break;
-			case Shader::OPCODE_CND:          CND(d, s0, s1, s2);                                                            break;
-			case Shader::OPCODE_TEXREG2RGB:   TEXREG2RGB(d, s0, dst.index);                                                  break;
-			case Shader::OPCODE_TEXDP3TEX:    TEXDP3TEX(d, x, y, z, dst.index, s0);                                          break;
-			case Shader::OPCODE_TEXM3X2DEPTH: TEXM3X2DEPTH(d, x, y, z, s0, src0.modifier == Shader::MODIFIER_SIGN);          break;
-			case Shader::OPCODE_TEXDP3:       TEXDP3(d, x, y, z, s0);                                                        break;
-			case Shader::OPCODE_TEXM3X3:      TEXM3X3(d, x, y, z, s0, src0.modifier == Shader::MODIFIER_SIGN);               break;
-			case Shader::OPCODE_TEXDEPTH:     TEXDEPTH();                                                                    break;
-			case Shader::OPCODE_CMP0:         CMP(d, s0, s1, s2);                                                            break;
-			case Shader::OPCODE_BEM:          BEM(d, s0, s1, dst.index);                                                     break;
-			case Shader::OPCODE_PHASE:                                                                                       break;
-			case Shader::OPCODE_END:                                                                                         break;
-			default:
-				ASSERT(false);
-			}
-
-			if(dst.type != Shader::PARAMETER_VOID && opcode != Shader::OPCODE_TEXKILL)
-			{
-				if(dst.shift > 0)
-				{
-					if(dst.mask & 0x1) { d.x = AddSat(d.x, d.x); if(dst.shift > 1) d.x = AddSat(d.x, d.x); if(dst.shift > 2) d.x = AddSat(d.x, d.x); }
-					if(dst.mask & 0x2) { d.y = AddSat(d.y, d.y); if(dst.shift > 1) d.y = AddSat(d.y, d.y); if(dst.shift > 2) d.y = AddSat(d.y, d.y); }
-					if(dst.mask & 0x4) { d.z = AddSat(d.z, d.z); if(dst.shift > 1) d.z = AddSat(d.z, d.z); if(dst.shift > 2) d.z = AddSat(d.z, d.z); }
-					if(dst.mask & 0x8) { d.w = AddSat(d.w, d.w); if(dst.shift > 1) d.w = AddSat(d.w, d.w); if(dst.shift > 2) d.w = AddSat(d.w, d.w); }
-				}
-				else if(dst.shift < 0)
-				{
-					if(dst.mask & 0x1) d.x = d.x >> -dst.shift;
-					if(dst.mask & 0x2) d.y = d.y >> -dst.shift;
-					if(dst.mask & 0x4) d.z = d.z >> -dst.shift;
-					if(dst.mask & 0x8) d.w = d.w >> -dst.shift;
-				}
-
-				if(dst.saturate)
-				{
-					if(dst.mask & 0x1) { d.x = Min(d.x, Short4(0x1000)); d.x = Max(d.x, Short4(0x0000)); }
-					if(dst.mask & 0x2) { d.y = Min(d.y, Short4(0x1000)); d.y = Max(d.y, Short4(0x0000)); }
-					if(dst.mask & 0x4) { d.z = Min(d.z, Short4(0x1000)); d.z = Max(d.z, Short4(0x0000)); }
-					if(dst.mask & 0x8) { d.w = Min(d.w, Short4(0x1000)); d.w = Max(d.w, Short4(0x0000)); }
-				}
-
-				if(pairing)
-				{
-					if(dst.mask & 0x1) dPairing.x = d.x;
-					if(dst.mask & 0x2) dPairing.y = d.y;
-					if(dst.mask & 0x4) dPairing.z = d.z;
-					if(dst.mask & 0x8) dPairing.w = d.w;
-				}
-
-				if(coissue)
-				{
-					const Dst &dst = shader->getInstruction(i - 1)->dst;
-
-					writeDestination(dPairing, dst);
-				}
-
-				if(!pairing)
-				{
-					writeDestination(d, dst);
-				}
-			}
-		}
-
-		current.x = Min(current.x, Short4(0x0FFF)); current.x = Max(current.x, Short4(0x0000));
-		current.y = Min(current.y, Short4(0x0FFF)); current.y = Max(current.y, Short4(0x0000));
-		current.z = Min(current.z, Short4(0x0FFF)); current.z = Max(current.z, Short4(0x0000));
-		current.w = Min(current.w, Short4(0x0FFF)); current.w = Max(current.w, Short4(0x0000));
-	}
-
-	Bool PixelPipeline::alphaTest(Int cMask[4])
-	{
-		if(!state.alphaTestActive())
-		{
-			return true;
-		}
-
-		Int aMask;
-
-		if(state.transparencyAntialiasing == TRANSPARENCY_NONE)
-		{
-			PixelRoutine::alphaTest(aMask, current.w);
-
-			for(unsigned int q = 0; q < state.multiSample; q++)
-			{
-				cMask[q] &= aMask;
-			}
-		}
-		else if(state.transparencyAntialiasing == TRANSPARENCY_ALPHA_TO_COVERAGE)
-		{
-			Float4 alpha = Float4(current.w) * Float4(1.0f / 0x1000);
-
-			alphaToCoverage(cMask, alpha);
-		}
-		else ASSERT(false);
-
-		Int pass = cMask[0];
-
-		for(unsigned int q = 1; q < state.multiSample; q++)
-		{
-			pass = pass | cMask[q];
-		}
-
-		return pass != 0x0;
-	}
-
-	void PixelPipeline::rasterOperation(Float4 &fog, Pointer<Byte> cBuffer[4], Int &x, Int sMask[4], Int zMask[4], Int cMask[4])
-	{
-		if(!state.colorWriteActive(0))
-		{
-			return;
-		}
-
-		Vector4f oC;
-
-		switch(state.targetFormat[0])
-		{
-		case FORMAT_R5G6B5:
-		case FORMAT_X8R8G8B8:
-		case FORMAT_X8B8G8R8:
-		case FORMAT_A8R8G8B8:
-		case FORMAT_A8B8G8R8:
-		case FORMAT_A8:
-		case FORMAT_G16R16:
-		case FORMAT_A16B16G16R16:
-			if(!postBlendSRGB && state.writeSRGB)
-			{
-				linearToSRGB12_16(current);
-			}
-			else
-			{
-				current.x <<= 4;
-				current.y <<= 4;
-				current.z <<= 4;
-				current.w <<= 4;
-			}
-
-			if(state.targetFormat[0] == FORMAT_R5G6B5)
-			{
-				current.x &= Short4(0xF800u);
-				current.y &= Short4(0xFC00u);
-				current.z &= Short4(0xF800u);
-			}
-
-			fogBlend(current, fog);
-
-			for(unsigned int q = 0; q < state.multiSample; q++)
-			{
-				Pointer<Byte> buffer = cBuffer[0] + q * *Pointer<Int>(data + OFFSET(DrawData, colorSliceB[0]));
-				Vector4s color = current;
-
-				if(state.multiSampleMask & (1 << q))
-				{
-					alphaBlend(0, buffer, color, x);
-					logicOperation(0, buffer, color, x);
-					writeColor(0, buffer, x, color, sMask[q], zMask[q], cMask[q]);
-				}
-			}
-			break;
-		case FORMAT_R32F:
-		case FORMAT_G32R32F:
-		case FORMAT_X32B32G32R32F:
-		case FORMAT_A32B32G32R32F:
-	//	case FORMAT_X32B32G32R32F_UNSIGNED:   // Not renderable in any fixed-function API.
-			convertSigned12(oC, current);
-			PixelRoutine::fogBlend(oC, fog);
-
-			for(unsigned int q = 0; q < state.multiSample; q++)
-			{
-				Pointer<Byte> buffer = cBuffer[0] + q * *Pointer<Int>(data + OFFSET(DrawData, colorSliceB[0]));
-				Vector4f color = oC;
-
-				if(state.multiSampleMask & (1 << q))
-				{
-					alphaBlend(0, buffer, color, x);
-					writeColor(0, buffer, x, color, sMask[q], zMask[q], cMask[q]);
-				}
-			}
-			break;
-		default:
-			ASSERT(false);
-		}
-	}
-
-	void PixelPipeline::blendTexture(Vector4s &temp, Vector4s &texture, int stage)
-	{
-		Vector4s *arg1 = nullptr;
-		Vector4s *arg2 = nullptr;
-		Vector4s *arg3 = nullptr;
-		Vector4s res;
-
-		Vector4s constant;
-		Vector4s tfactor;
-
-		const TextureStage::State &textureStage = state.textureStage[stage];
-
-		if(textureStage.firstArgument == TextureStage::SOURCE_CONSTANT ||
-		   textureStage.firstArgumentAlpha == TextureStage::SOURCE_CONSTANT ||
-		   textureStage.secondArgument == TextureStage::SOURCE_CONSTANT ||
-		   textureStage.secondArgumentAlpha == TextureStage::SOURCE_CONSTANT ||
-		   textureStage.thirdArgument == TextureStage::SOURCE_CONSTANT ||
-		   textureStage.thirdArgumentAlpha == TextureStage::SOURCE_CONSTANT)
-		{
-			constant.x = *Pointer<Short4>(data + OFFSET(DrawData, textureStage[stage].constantColor4[0]));
-			constant.y = *Pointer<Short4>(data + OFFSET(DrawData, textureStage[stage].constantColor4[1]));
-			constant.z = *Pointer<Short4>(data + OFFSET(DrawData, textureStage[stage].constantColor4[2]));
-			constant.w = *Pointer<Short4>(data + OFFSET(DrawData, textureStage[stage].constantColor4[3]));
-		}
-
-		if(textureStage.firstArgument == TextureStage::SOURCE_TFACTOR ||
-		   textureStage.firstArgumentAlpha == TextureStage::SOURCE_TFACTOR ||
-		   textureStage.secondArgument == TextureStage::SOURCE_TFACTOR ||
-		   textureStage.secondArgumentAlpha == TextureStage::SOURCE_TFACTOR ||
-		   textureStage.thirdArgument == TextureStage::SOURCE_TFACTOR ||
-		   textureStage.thirdArgumentAlpha == TextureStage::SOURCE_TFACTOR)
-		{
-			tfactor.x = *Pointer<Short4>(data + OFFSET(DrawData, factor.textureFactor4[0]));
-			tfactor.y = *Pointer<Short4>(data + OFFSET(DrawData, factor.textureFactor4[1]));
-			tfactor.z = *Pointer<Short4>(data + OFFSET(DrawData, factor.textureFactor4[2]));
-			tfactor.w = *Pointer<Short4>(data + OFFSET(DrawData, factor.textureFactor4[3]));
-		}
-
-		// Premodulate
-		if(stage > 0 && textureStage.usesTexture)
-		{
-			if(state.textureStage[stage - 1].stageOperation == TextureStage::STAGE_PREMODULATE)
-			{
-				current.x = MulHigh(current.x, texture.x) << 4;
-				current.y = MulHigh(current.y, texture.y) << 4;
-				current.z = MulHigh(current.z, texture.z) << 4;
-			}
-
-			if(state.textureStage[stage - 1].stageOperationAlpha == TextureStage::STAGE_PREMODULATE)
-			{
-				current.w = MulHigh(current.w, texture.w) << 4;
-			}
-		}
-
-		if(luminance)
-		{
-			texture.x = MulHigh(texture.x, L) << 4;
-			texture.y = MulHigh(texture.y, L) << 4;
-			texture.z = MulHigh(texture.z, L) << 4;
-
-			luminance = false;
-		}
-
-		switch(textureStage.firstArgument)
-		{
-		case TextureStage::SOURCE_TEXTURE:	arg1 = &texture;    break;
-		case TextureStage::SOURCE_CONSTANT:	arg1 = &constant;   break;
-		case TextureStage::SOURCE_CURRENT:	arg1 = &current;  break;
-		case TextureStage::SOURCE_DIFFUSE:	arg1 = &diffuse;  break;
-		case TextureStage::SOURCE_SPECULAR:	arg1 = &specular; break;
-		case TextureStage::SOURCE_TEMP:		arg1 = &temp;       break;
-		case TextureStage::SOURCE_TFACTOR:	arg1 = &tfactor;    break;
-		default:
-			ASSERT(false);
-		}
-
-		switch(textureStage.secondArgument)
-		{
-		case TextureStage::SOURCE_TEXTURE:	arg2 = &texture;    break;
-		case TextureStage::SOURCE_CONSTANT:	arg2 = &constant;   break;
-		case TextureStage::SOURCE_CURRENT:	arg2 = &current;  break;
-		case TextureStage::SOURCE_DIFFUSE:	arg2 = &diffuse;  break;
-		case TextureStage::SOURCE_SPECULAR:	arg2 = &specular; break;
-		case TextureStage::SOURCE_TEMP:		arg2 = &temp;       break;
-		case TextureStage::SOURCE_TFACTOR:	arg2 = &tfactor;    break;
-		default:
-			ASSERT(false);
-		}
-
-		switch(textureStage.thirdArgument)
-		{
-		case TextureStage::SOURCE_TEXTURE:	arg3 = &texture;    break;
-		case TextureStage::SOURCE_CONSTANT:	arg3 = &constant;   break;
-		case TextureStage::SOURCE_CURRENT:	arg3 = &current;  break;
-		case TextureStage::SOURCE_DIFFUSE:	arg3 = &diffuse;  break;
-		case TextureStage::SOURCE_SPECULAR:	arg3 = &specular; break;
-		case TextureStage::SOURCE_TEMP:		arg3 = &temp;       break;
-		case TextureStage::SOURCE_TFACTOR:	arg3 = &tfactor;    break;
-		default:
-			ASSERT(false);
-		}
-
-		Vector4s mod1;
-		Vector4s mod2;
-		Vector4s mod3;
-
-		switch(textureStage.firstModifier)
-		{
-		case TextureStage::MODIFIER_COLOR:
-			break;
-		case TextureStage::MODIFIER_INVCOLOR:
-			mod1.x = SubSat(Short4(0x1000), arg1->x);
-			mod1.y = SubSat(Short4(0x1000), arg1->y);
-			mod1.z = SubSat(Short4(0x1000), arg1->z);
-			mod1.w = SubSat(Short4(0x1000), arg1->w);
-
-			arg1 = &mod1;
-			break;
-		case TextureStage::MODIFIER_ALPHA:
-			mod1.x = arg1->w;
-			mod1.y = arg1->w;
-			mod1.z = arg1->w;
-			mod1.w = arg1->w;
-
-			arg1 = &mod1;
-			break;
-		case TextureStage::MODIFIER_INVALPHA:
-			mod1.x = SubSat(Short4(0x1000), arg1->w);
-			mod1.y = SubSat(Short4(0x1000), arg1->w);
-			mod1.z = SubSat(Short4(0x1000), arg1->w);
-			mod1.w = SubSat(Short4(0x1000), arg1->w);
-
-			arg1 = &mod1;
-			break;
-		default:
-			ASSERT(false);
-		}
-
-		switch(textureStage.secondModifier)
-		{
-		case TextureStage::MODIFIER_COLOR:
-			break;
-		case TextureStage::MODIFIER_INVCOLOR:
-			mod2.x = SubSat(Short4(0x1000), arg2->x);
-			mod2.y = SubSat(Short4(0x1000), arg2->y);
-			mod2.z = SubSat(Short4(0x1000), arg2->z);
-			mod2.w = SubSat(Short4(0x1000), arg2->w);
-
-			arg2 = &mod2;
-			break;
-		case TextureStage::MODIFIER_ALPHA:
-			mod2.x = arg2->w;
-			mod2.y = arg2->w;
-			mod2.z = arg2->w;
-			mod2.w = arg2->w;
-
-			arg2 = &mod2;
-			break;
-		case TextureStage::MODIFIER_INVALPHA:
-			mod2.x = SubSat(Short4(0x1000), arg2->w);
-			mod2.y = SubSat(Short4(0x1000), arg2->w);
-			mod2.z = SubSat(Short4(0x1000), arg2->w);
-			mod2.w = SubSat(Short4(0x1000), arg2->w);
-
-			arg2 = &mod2;
-			break;
-		default:
-			ASSERT(false);
-		}
-
-		switch(textureStage.thirdModifier)
-		{
-		case TextureStage::MODIFIER_COLOR:
-			break;
-		case TextureStage::MODIFIER_INVCOLOR:
-			mod3.x = SubSat(Short4(0x1000), arg3->x);
-			mod3.y = SubSat(Short4(0x1000), arg3->y);
-			mod3.z = SubSat(Short4(0x1000), arg3->z);
-			mod3.w = SubSat(Short4(0x1000), arg3->w);
-
-			arg3 = &mod3;
-			break;
-		case TextureStage::MODIFIER_ALPHA:
-			mod3.x = arg3->w;
-			mod3.y = arg3->w;
-			mod3.z = arg3->w;
-			mod3.w = arg3->w;
-
-			arg3 = &mod3;
-			break;
-		case TextureStage::MODIFIER_INVALPHA:
-			mod3.x = SubSat(Short4(0x1000), arg3->w);
-			mod3.y = SubSat(Short4(0x1000), arg3->w);
-			mod3.z = SubSat(Short4(0x1000), arg3->w);
-			mod3.w = SubSat(Short4(0x1000), arg3->w);
-
-			arg3 = &mod3;
-			break;
-		default:
-			ASSERT(false);
-		}
-
-		switch(textureStage.stageOperation)
-		{
-		case TextureStage::STAGE_DISABLE:
-			break;
-		case TextureStage::STAGE_SELECTARG1: // Arg1
-			res.x = arg1->x;
-			res.y = arg1->y;
-			res.z = arg1->z;
-			break;
-		case TextureStage::STAGE_SELECTARG2: // Arg2
-			res.x = arg2->x;
-			res.y = arg2->y;
-			res.z = arg2->z;
-			break;
-		case TextureStage::STAGE_SELECTARG3: // Arg3
-			res.x = arg3->x;
-			res.y = arg3->y;
-			res.z = arg3->z;
-			break;
-		case TextureStage::STAGE_MODULATE: // Arg1 * Arg2
-			res.x = MulHigh(arg1->x, arg2->x) << 4;
-			res.y = MulHigh(arg1->y, arg2->y) << 4;
-			res.z = MulHigh(arg1->z, arg2->z) << 4;
-			break;
-		case TextureStage::STAGE_MODULATE2X: // Arg1 * Arg2 * 2
-			res.x = MulHigh(arg1->x, arg2->x) << 5;
-			res.y = MulHigh(arg1->y, arg2->y) << 5;
-			res.z = MulHigh(arg1->z, arg2->z) << 5;
-			break;
-		case TextureStage::STAGE_MODULATE4X: // Arg1 * Arg2 * 4
-			res.x = MulHigh(arg1->x, arg2->x) << 6;
-			res.y = MulHigh(arg1->y, arg2->y) << 6;
-			res.z = MulHigh(arg1->z, arg2->z) << 6;
-			break;
-		case TextureStage::STAGE_ADD: // Arg1 + Arg2
-			res.x = AddSat(arg1->x, arg2->x);
-			res.y = AddSat(arg1->y, arg2->y);
-			res.z = AddSat(arg1->z, arg2->z);
-			break;
-		case TextureStage::STAGE_ADDSIGNED: // Arg1 + Arg2 - 0.5
-			res.x = AddSat(arg1->x, arg2->x);
-			res.y = AddSat(arg1->y, arg2->y);
-			res.z = AddSat(arg1->z, arg2->z);
-
-			res.x = SubSat(res.x, Short4(0x0800));
-			res.y = SubSat(res.y, Short4(0x0800));
-			res.z = SubSat(res.z, Short4(0x0800));
-			break;
-		case TextureStage::STAGE_ADDSIGNED2X: // (Arg1 + Arg2 - 0.5) << 1
-			res.x = AddSat(arg1->x, arg2->x);
-			res.y = AddSat(arg1->y, arg2->y);
-			res.z = AddSat(arg1->z, arg2->z);
-
-			res.x = SubSat(res.x, Short4(0x0800));
-			res.y = SubSat(res.y, Short4(0x0800));
-			res.z = SubSat(res.z, Short4(0x0800));
-
-			res.x = AddSat(res.x, res.x);
-			res.y = AddSat(res.y, res.y);
-			res.z = AddSat(res.z, res.z);
-			break;
-		case TextureStage::STAGE_SUBTRACT: // Arg1 - Arg2
-			res.x = SubSat(arg1->x, arg2->x);
-			res.y = SubSat(arg1->y, arg2->y);
-			res.z = SubSat(arg1->z, arg2->z);
-			break;
-		case TextureStage::STAGE_ADDSMOOTH: // Arg1 + Arg2 - Arg1 * Arg2
-			{
-				Short4 tmp;
-
-				tmp = MulHigh(arg1->x, arg2->x) << 4; res.x = AddSat(arg1->x, arg2->x); res.x = SubSat(res.x, tmp);
-				tmp = MulHigh(arg1->y, arg2->y) << 4; res.y = AddSat(arg1->y, arg2->y); res.y = SubSat(res.y, tmp);
-				tmp = MulHigh(arg1->z, arg2->z) << 4; res.z = AddSat(arg1->z, arg2->z); res.z = SubSat(res.z, tmp);
-			}
-			break;
-		case TextureStage::STAGE_MULTIPLYADD: // Arg3 + Arg1 * Arg2
-			res.x = MulHigh(arg1->x, arg2->x) << 4; res.x = AddSat(res.x, arg3->x);
-			res.y = MulHigh(arg1->y, arg2->y) << 4; res.y = AddSat(res.y, arg3->y);
-			res.z = MulHigh(arg1->z, arg2->z) << 4; res.z = AddSat(res.z, arg3->z);
-			break;
-		case TextureStage::STAGE_LERP: // Arg3 * (Arg1 - Arg2) + Arg2
-			res.x = SubSat(arg1->x, arg2->x); res.x = MulHigh(res.x, arg3->x) << 4; res.x = AddSat(res.x, arg2->x);
-			res.y = SubSat(arg1->y, arg2->y); res.y = MulHigh(res.y, arg3->y) << 4; res.y = AddSat(res.y, arg2->y);
-			res.z = SubSat(arg1->z, arg2->z); res.z = MulHigh(res.z, arg3->z) << 4; res.z = AddSat(res.z, arg2->z);
-			break;
-		case TextureStage::STAGE_DOT3: // 2 * (Arg1.x - 0.5) * 2 * (Arg2.x - 0.5) + 2 * (Arg1.y - 0.5) * 2 * (Arg2.y - 0.5) + 2 * (Arg1.z - 0.5) * 2 * (Arg2.z - 0.5)
-			{
-				Short4 tmp;
-
-				res.x = SubSat(arg1->x, Short4(0x0800)); tmp = SubSat(arg2->x, Short4(0x0800)); res.x = MulHigh(res.x, tmp);
-				res.y = SubSat(arg1->y, Short4(0x0800)); tmp = SubSat(arg2->y, Short4(0x0800)); res.y = MulHigh(res.y, tmp);
-				res.z = SubSat(arg1->z, Short4(0x0800)); tmp = SubSat(arg2->z, Short4(0x0800)); res.z = MulHigh(res.z, tmp);
-
-				res.x = res.x << 6;
-				res.y = res.y << 6;
-				res.z = res.z << 6;
-
-				res.x = AddSat(res.x, res.y);
-				res.x = AddSat(res.x, res.z);
-
-				// Clamp to [0, 1]
-				res.x = Max(res.x, Short4(0x0000));
-				res.x = Min(res.x, Short4(0x1000));
-
-				res.y = res.x;
-				res.z = res.x;
-				res.w = res.x;
-			}
-			break;
-		case TextureStage::STAGE_BLENDCURRENTALPHA: // Alpha * (Arg1 - Arg2) + Arg2
-			res.x = SubSat(arg1->x, arg2->x); res.x = MulHigh(res.x, current.w) << 4; res.x = AddSat(res.x, arg2->x);
-			res.y = SubSat(arg1->y, arg2->y); res.y = MulHigh(res.y, current.w) << 4; res.y = AddSat(res.y, arg2->y);
-			res.z = SubSat(arg1->z, arg2->z); res.z = MulHigh(res.z, current.w) << 4; res.z = AddSat(res.z, arg2->z);
-			break;
-		case TextureStage::STAGE_BLENDDIFFUSEALPHA: // Alpha * (Arg1 - Arg2) + Arg2
-			res.x = SubSat(arg1->x, arg2->x); res.x = MulHigh(res.x, diffuse.w) << 4; res.x = AddSat(res.x, arg2->x);
-			res.y = SubSat(arg1->y, arg2->y); res.y = MulHigh(res.y, diffuse.w) << 4; res.y = AddSat(res.y, arg2->y);
-			res.z = SubSat(arg1->z, arg2->z); res.z = MulHigh(res.z, diffuse.w) << 4; res.z = AddSat(res.z, arg2->z);
-			break;
-		case TextureStage::STAGE_BLENDFACTORALPHA: // Alpha * (Arg1 - Arg2) + Arg2
-			res.x = SubSat(arg1->x, arg2->x); res.x = MulHigh(res.x, *Pointer<Short4>(data + OFFSET(DrawData, factor.textureFactor4[3]))) << 4; res.x = AddSat(res.x, arg2->x);
-			res.y = SubSat(arg1->y, arg2->y); res.y = MulHigh(res.y, *Pointer<Short4>(data + OFFSET(DrawData, factor.textureFactor4[3]))) << 4; res.y = AddSat(res.y, arg2->y);
-			res.z = SubSat(arg1->z, arg2->z); res.z = MulHigh(res.z, *Pointer<Short4>(data + OFFSET(DrawData, factor.textureFactor4[3]))) << 4; res.z = AddSat(res.z, arg2->z);
-			break;
-		case TextureStage::STAGE_BLENDTEXTUREALPHA: // Alpha * (Arg1 - Arg2) + Arg2
-			res.x = SubSat(arg1->x, arg2->x); res.x = MulHigh(res.x, texture.w) << 4; res.x = AddSat(res.x, arg2->x);
-			res.y = SubSat(arg1->y, arg2->y); res.y = MulHigh(res.y, texture.w) << 4; res.y = AddSat(res.y, arg2->y);
-			res.z = SubSat(arg1->z, arg2->z); res.z = MulHigh(res.z, texture.w) << 4; res.z = AddSat(res.z, arg2->z);
-			break;
-		case TextureStage::STAGE_BLENDTEXTUREALPHAPM: // Arg1 + Arg2 * (1 - Alpha)
-			res.x = SubSat(Short4(0x1000), texture.w); res.x = MulHigh(res.x, arg2->x) << 4; res.x = AddSat(res.x, arg1->x);
-			res.y = SubSat(Short4(0x1000), texture.w); res.y = MulHigh(res.y, arg2->y) << 4; res.y = AddSat(res.y, arg1->y);
-			res.z = SubSat(Short4(0x1000), texture.w); res.z = MulHigh(res.z, arg2->z) << 4; res.z = AddSat(res.z, arg1->z);
-			break;
-		case TextureStage::STAGE_PREMODULATE:
-			res.x = arg1->x;
-			res.y = arg1->y;
-			res.z = arg1->z;
-			break;
-		case TextureStage::STAGE_MODULATEALPHA_ADDCOLOR: // Arg1 + Arg1.w * Arg2
-			res.x = MulHigh(arg1->w, arg2->x) << 4; res.x = AddSat(res.x, arg1->x);
-			res.y = MulHigh(arg1->w, arg2->y) << 4; res.y = AddSat(res.y, arg1->y);
-			res.z = MulHigh(arg1->w, arg2->z) << 4; res.z = AddSat(res.z, arg1->z);
-			break;
-		case TextureStage::STAGE_MODULATECOLOR_ADDALPHA: // Arg1 * Arg2 + Arg1.w
-			res.x = MulHigh(arg1->x, arg2->x) << 4; res.x = AddSat(res.x, arg1->w);
-			res.y = MulHigh(arg1->y, arg2->y) << 4; res.y = AddSat(res.y, arg1->w);
-			res.z = MulHigh(arg1->z, arg2->z) << 4; res.z = AddSat(res.z, arg1->w);
-			break;
-		case TextureStage::STAGE_MODULATEINVALPHA_ADDCOLOR: // (1 - Arg1.w) * Arg2 + Arg1
-			{
-				Short4 tmp;
-
-				res.x = AddSat(arg1->x, arg2->x); tmp = MulHigh(arg1->w, arg2->x) << 4; res.x = SubSat(res.x, tmp);
-				res.y = AddSat(arg1->y, arg2->y); tmp = MulHigh(arg1->w, arg2->y) << 4; res.y = SubSat(res.y, tmp);
-				res.z = AddSat(arg1->z, arg2->z); tmp = MulHigh(arg1->w, arg2->z) << 4; res.z = SubSat(res.z, tmp);
-			}
-			break;
-		case TextureStage::STAGE_MODULATEINVCOLOR_ADDALPHA: // (1 - Arg1) * Arg2 + Arg1.w
-			{
-				Short4 tmp;
-
-				res.x = AddSat(arg1->w, arg2->x); tmp = MulHigh(arg1->x, arg2->x) << 4; res.x = SubSat(res.x, tmp);
-				res.y = AddSat(arg1->w, arg2->y); tmp = MulHigh(arg1->y, arg2->y) << 4; res.y = SubSat(res.y, tmp);
-				res.z = AddSat(arg1->w, arg2->z); tmp = MulHigh(arg1->z, arg2->z) << 4; res.z = SubSat(res.z, tmp);
-			}
-			break;
-		case TextureStage::STAGE_BUMPENVMAP:
-			{
-				du = Float4(texture.x) * Float4(1.0f / 0x0FE0);
-				dv = Float4(texture.y) * Float4(1.0f / 0x0FE0);
-
-				Float4 du2;
-				Float4 dv2;
-
-				du2 = du;
-				dv2 = dv;
-				du *= *Pointer<Float4>(data + OFFSET(DrawData, textureStage[stage].bumpmapMatrix4F[0][0]));
-				dv2 *= *Pointer<Float4>(data + OFFSET(DrawData, textureStage[stage].bumpmapMatrix4F[1][0]));
-				du += dv2;
-				dv *= *Pointer<Float4>(data + OFFSET(DrawData, textureStage[stage].bumpmapMatrix4F[1][1]));
-				du2 *= *Pointer<Float4>(data + OFFSET(DrawData, textureStage[stage].bumpmapMatrix4F[0][1]));
-				dv += du2;
-
-				perturbate = true;
-
-				res.x = current.x;
-				res.y = current.y;
-				res.z = current.z;
-				res.w = current.w;
-			}
-			break;
-		case TextureStage::STAGE_BUMPENVMAPLUMINANCE:
-			{
-				du = Float4(texture.x) * Float4(1.0f / 0x0FE0);
-				dv = Float4(texture.y) * Float4(1.0f / 0x0FE0);
-
-				Float4 du2;
-				Float4 dv2;
-
-				du2 = du;
-				dv2 = dv;
-
-				du *= *Pointer<Float4>(data + OFFSET(DrawData, textureStage[stage].bumpmapMatrix4F[0][0]));
-				dv2 *= *Pointer<Float4>(data + OFFSET(DrawData, textureStage[stage].bumpmapMatrix4F[1][0]));
-				du += dv2;
-				dv *= *Pointer<Float4>(data + OFFSET(DrawData, textureStage[stage].bumpmapMatrix4F[1][1]));
-				du2 *= *Pointer<Float4>(data + OFFSET(DrawData, textureStage[stage].bumpmapMatrix4F[0][1]));
-				dv += du2;
-
-				perturbate = true;
-
-				L = texture.z;
-				L = MulHigh(L, *Pointer<Short4>(data + OFFSET(DrawData, textureStage[stage].luminanceScale4)));
-				L = L << 4;
-				L = AddSat(L, *Pointer<Short4>(data + OFFSET(DrawData, textureStage[stage].luminanceOffset4)));
-				L = Max(L, Short4(0x0000));
-				L = Min(L, Short4(0x1000));
-
-				luminance = true;
-
-				res.x = current.x;
-				res.y = current.y;
-				res.z = current.z;
-				res.w = current.w;
-			}
-			break;
-		default:
-			ASSERT(false);
-		}
-
-		if(textureStage.stageOperation != TextureStage::STAGE_DOT3)
-		{
-			switch(textureStage.firstArgumentAlpha)
-			{
-			case TextureStage::SOURCE_TEXTURE:	arg1 = &texture;		break;
-			case TextureStage::SOURCE_CONSTANT:	arg1 = &constant;		break;
-			case TextureStage::SOURCE_CURRENT:	arg1 = &current;		break;
-			case TextureStage::SOURCE_DIFFUSE:	arg1 = &diffuse;		break;
-			case TextureStage::SOURCE_SPECULAR:	arg1 = &specular;		break;
-			case TextureStage::SOURCE_TEMP:		arg1 = &temp;			break;
-			case TextureStage::SOURCE_TFACTOR:	arg1 = &tfactor;		break;
-			default:
-				ASSERT(false);
-			}
-
-			switch(textureStage.secondArgumentAlpha)
-			{
-			case TextureStage::SOURCE_TEXTURE:	arg2 = &texture;		break;
-			case TextureStage::SOURCE_CONSTANT:	arg2 = &constant;		break;
-			case TextureStage::SOURCE_CURRENT:	arg2 = &current;		break;
-			case TextureStage::SOURCE_DIFFUSE:	arg2 = &diffuse;		break;
-			case TextureStage::SOURCE_SPECULAR:	arg2 = &specular;		break;
-			case TextureStage::SOURCE_TEMP:		arg2 = &temp;			break;
-			case TextureStage::SOURCE_TFACTOR:	arg2 = &tfactor;		break;
-			default:
-				ASSERT(false);
-			}
-
-			switch(textureStage.thirdArgumentAlpha)
-			{
-			case TextureStage::SOURCE_TEXTURE:	arg3 = &texture;		break;
-			case TextureStage::SOURCE_CONSTANT:	arg3 = &constant;		break;
-			case TextureStage::SOURCE_CURRENT:	arg3 = &current;		break;
-			case TextureStage::SOURCE_DIFFUSE:	arg3 = &diffuse;		break;
-			case TextureStage::SOURCE_SPECULAR:	arg3 = &specular;		break;
-			case TextureStage::SOURCE_TEMP:		arg3 = &temp;			break;
-			case TextureStage::SOURCE_TFACTOR:	arg3 = &tfactor;		break;
-			default:
-				ASSERT(false);
-			}
-
-			switch(textureStage.firstModifierAlpha)   // FIXME: Check if actually used
-			{
-			case TextureStage::MODIFIER_COLOR:
-				break;
-			case TextureStage::MODIFIER_INVCOLOR:
-				mod1.w = SubSat(Short4(0x1000), arg1->w);
-
-				arg1 = &mod1;
-				break;
-			case TextureStage::MODIFIER_ALPHA:
-				// Redudant
-				break;
-			case TextureStage::MODIFIER_INVALPHA:
-				mod1.w = SubSat(Short4(0x1000), arg1->w);
-
-				arg1 = &mod1;
-				break;
-			default:
-				ASSERT(false);
-			}
-
-			switch(textureStage.secondModifierAlpha)   // FIXME: Check if actually used
-			{
-			case TextureStage::MODIFIER_COLOR:
-				break;
-			case TextureStage::MODIFIER_INVCOLOR:
-				mod2.w = SubSat(Short4(0x1000), arg2->w);
-
-				arg2 = &mod2;
-				break;
-			case TextureStage::MODIFIER_ALPHA:
-				// Redudant
-				break;
-			case TextureStage::MODIFIER_INVALPHA:
-				mod2.w = SubSat(Short4(0x1000), arg2->w);
-
-				arg2 = &mod2;
-				break;
-			default:
-				ASSERT(false);
-			}
-
-			switch(textureStage.thirdModifierAlpha)   // FIXME: Check if actually used
-			{
-			case TextureStage::MODIFIER_COLOR:
-				break;
-			case TextureStage::MODIFIER_INVCOLOR:
-				mod3.w = SubSat(Short4(0x1000), arg3->w);
-
-				arg3 = &mod3;
-				break;
-			case TextureStage::MODIFIER_ALPHA:
-				// Redudant
-				break;
-			case TextureStage::MODIFIER_INVALPHA:
-				mod3.w = SubSat(Short4(0x1000), arg3->w);
-
-				arg3 = &mod3;
-				break;
-			default:
-				ASSERT(false);
-			}
-
-			switch(textureStage.stageOperationAlpha)
-			{
-			case TextureStage::STAGE_DISABLE:
-				break;
-			case TextureStage::STAGE_SELECTARG1: // Arg1
-				res.w = arg1->w;
-				break;
-			case TextureStage::STAGE_SELECTARG2: // Arg2
-				res.w = arg2->w;
-				break;
-			case TextureStage::STAGE_SELECTARG3: // Arg3
-				res.w = arg3->w;
-				break;
-			case TextureStage::STAGE_MODULATE: // Arg1 * Arg2
-				res.w = MulHigh(arg1->w, arg2->w) << 4;
-				break;
-			case TextureStage::STAGE_MODULATE2X: // Arg1 * Arg2 * 2
-				res.w = MulHigh(arg1->w, arg2->w) << 5;
-				break;
-			case TextureStage::STAGE_MODULATE4X: // Arg1 * Arg2 * 4
-				res.w = MulHigh(arg1->w, arg2->w) << 6;
-				break;
-			case TextureStage::STAGE_ADD: // Arg1 + Arg2
-				res.w = AddSat(arg1->w, arg2->w);
-				break;
-			case TextureStage::STAGE_ADDSIGNED: // Arg1 + Arg2 - 0.5
-				res.w = AddSat(arg1->w, arg2->w);
-				res.w = SubSat(res.w, Short4(0x0800));
-				break;
-			case TextureStage::STAGE_ADDSIGNED2X: // (Arg1 + Arg2 - 0.5) << 1
-				res.w = AddSat(arg1->w, arg2->w);
-				res.w = SubSat(res.w, Short4(0x0800));
-				res.w = AddSat(res.w, res.w);
-				break;
-			case TextureStage::STAGE_SUBTRACT: // Arg1 - Arg2
-				res.w = SubSat(arg1->w, arg2->w);
-				break;
-			case TextureStage::STAGE_ADDSMOOTH: // Arg1 + Arg2 - Arg1 * Arg2
-				{
-					Short4 tmp;
-
-					tmp = MulHigh(arg1->w, arg2->w) << 4; res.w = AddSat(arg1->w, arg2->w); res.w = SubSat(res.w, tmp);
-				}
-				break;
-			case TextureStage::STAGE_MULTIPLYADD: // Arg3 + Arg1 * Arg2
-				res.w = MulHigh(arg1->w, arg2->w) << 4; res.w = AddSat(res.w, arg3->w);
-				break;
-			case TextureStage::STAGE_LERP: // Arg3 * (Arg1 - Arg2) + Arg2
-				res.w = SubSat(arg1->w, arg2->w); res.w = MulHigh(res.w, arg3->w) << 4; res.w = AddSat(res.w, arg2->w);
-				break;
-			case TextureStage::STAGE_DOT3:
-				break;   // Already computed in color channel
-			case TextureStage::STAGE_BLENDCURRENTALPHA: // Alpha * (Arg1 - Arg2) + Arg2
-				res.w = SubSat(arg1->w, arg2->w); res.w = MulHigh(res.w, current.w) << 4; res.w = AddSat(res.w, arg2->w);
-				break;
-			case TextureStage::STAGE_BLENDDIFFUSEALPHA: // Arg1 * (Alpha) + Arg2 * (1 - Alpha)
-				res.w = SubSat(arg1->w, arg2->w); res.w = MulHigh(res.w, diffuse.w) << 4; res.w = AddSat(res.w, arg2->w);
-				break;
-			case TextureStage::STAGE_BLENDFACTORALPHA:
-				res.w = SubSat(arg1->w, arg2->w); res.w = MulHigh(res.w, *Pointer<Short4>(data + OFFSET(DrawData, factor.textureFactor4[3]))) << 4; res.w = AddSat(res.w, arg2->w);
-				break;
-			case TextureStage::STAGE_BLENDTEXTUREALPHA: // Arg1 * (Alpha) + Arg2 * (1 - Alpha)
-				res.w = SubSat(arg1->w, arg2->w); res.w = MulHigh(res.w, texture.w) << 4; res.w = AddSat(res.w, arg2->w);
-				break;
-			case TextureStage::STAGE_BLENDTEXTUREALPHAPM: // Arg1 + Arg2 * (1 - Alpha)
-				res.w = SubSat(Short4(0x1000), texture.w); res.w = MulHigh(res.w, arg2->w) << 4; res.w = AddSat(res.w, arg1->w);
-				break;
-			case TextureStage::STAGE_PREMODULATE:
-				res.w = arg1->w;
-				break;
-			case TextureStage::STAGE_MODULATEALPHA_ADDCOLOR:
-			case TextureStage::STAGE_MODULATECOLOR_ADDALPHA:
-			case TextureStage::STAGE_MODULATEINVALPHA_ADDCOLOR:
-			case TextureStage::STAGE_MODULATEINVCOLOR_ADDALPHA:
-			case TextureStage::STAGE_BUMPENVMAP:
-			case TextureStage::STAGE_BUMPENVMAPLUMINANCE:
-				break;   // Invalid alpha operations
-			default:
-				ASSERT(false);
-			}
-		}
-
-		// Clamp result to [0, 1]
-
-		switch(textureStage.stageOperation)
-		{
-		case TextureStage::STAGE_DISABLE:
-		case TextureStage::STAGE_SELECTARG1:
-		case TextureStage::STAGE_SELECTARG2:
-		case TextureStage::STAGE_SELECTARG3:
-		case TextureStage::STAGE_MODULATE:
-		case TextureStage::STAGE_MODULATE2X:
-		case TextureStage::STAGE_MODULATE4X:
-		case TextureStage::STAGE_ADD:
-		case TextureStage::STAGE_MULTIPLYADD:
-		case TextureStage::STAGE_LERP:
-		case TextureStage::STAGE_BLENDCURRENTALPHA:
-		case TextureStage::STAGE_BLENDDIFFUSEALPHA:
-		case TextureStage::STAGE_BLENDFACTORALPHA:
-		case TextureStage::STAGE_BLENDTEXTUREALPHA:
-		case TextureStage::STAGE_BLENDTEXTUREALPHAPM:
-		case TextureStage::STAGE_DOT3:   // Already clamped
-		case TextureStage::STAGE_PREMODULATE:
-		case TextureStage::STAGE_MODULATEALPHA_ADDCOLOR:
-		case TextureStage::STAGE_MODULATECOLOR_ADDALPHA:
-		case TextureStage::STAGE_MODULATEINVALPHA_ADDCOLOR:
-		case TextureStage::STAGE_MODULATEINVCOLOR_ADDALPHA:
-		case TextureStage::STAGE_BUMPENVMAP:
-		case TextureStage::STAGE_BUMPENVMAPLUMINANCE:
-			if(state.textureStage[stage].cantUnderflow)
-			{
-				break;   // Can't go below zero
-			}
-		case TextureStage::STAGE_ADDSIGNED:
-		case TextureStage::STAGE_ADDSIGNED2X:
-		case TextureStage::STAGE_SUBTRACT:
-		case TextureStage::STAGE_ADDSMOOTH:
-			res.x = Max(res.x, Short4(0x0000));
-			res.y = Max(res.y, Short4(0x0000));
-			res.z = Max(res.z, Short4(0x0000));
-			break;
-		default:
-			ASSERT(false);
-		}
-
-		switch(textureStage.stageOperationAlpha)
-		{
-		case TextureStage::STAGE_DISABLE:
-		case TextureStage::STAGE_SELECTARG1:
-		case TextureStage::STAGE_SELECTARG2:
-		case TextureStage::STAGE_SELECTARG3:
-		case TextureStage::STAGE_MODULATE:
-		case TextureStage::STAGE_MODULATE2X:
-		case TextureStage::STAGE_MODULATE4X:
-		case TextureStage::STAGE_ADD:
-		case TextureStage::STAGE_MULTIPLYADD:
-		case TextureStage::STAGE_LERP:
-		case TextureStage::STAGE_BLENDCURRENTALPHA:
-		case TextureStage::STAGE_BLENDDIFFUSEALPHA:
-		case TextureStage::STAGE_BLENDFACTORALPHA:
-		case TextureStage::STAGE_BLENDTEXTUREALPHA:
-		case TextureStage::STAGE_BLENDTEXTUREALPHAPM:
-		case TextureStage::STAGE_DOT3:   // Already clamped
-		case TextureStage::STAGE_PREMODULATE:
-		case TextureStage::STAGE_MODULATEALPHA_ADDCOLOR:
-		case TextureStage::STAGE_MODULATECOLOR_ADDALPHA:
-		case TextureStage::STAGE_MODULATEINVALPHA_ADDCOLOR:
-		case TextureStage::STAGE_MODULATEINVCOLOR_ADDALPHA:
-		case TextureStage::STAGE_BUMPENVMAP:
-		case TextureStage::STAGE_BUMPENVMAPLUMINANCE:
-			if(state.textureStage[stage].cantUnderflow)
-			{
-				break;   // Can't go below zero
-			}
-		case TextureStage::STAGE_ADDSIGNED:
-		case TextureStage::STAGE_ADDSIGNED2X:
-		case TextureStage::STAGE_SUBTRACT:
-		case TextureStage::STAGE_ADDSMOOTH:
-			res.w = Max(res.w, Short4(0x0000));
-			break;
-		default:
-			ASSERT(false);
-		}
-
-		switch(textureStage.stageOperation)
-		{
-		case TextureStage::STAGE_DISABLE:
-		case TextureStage::STAGE_SELECTARG1:
-		case TextureStage::STAGE_SELECTARG2:
-		case TextureStage::STAGE_SELECTARG3:
-		case TextureStage::STAGE_MODULATE:
-		case TextureStage::STAGE_SUBTRACT:
-		case TextureStage::STAGE_ADDSMOOTH:
-		case TextureStage::STAGE_LERP:
-		case TextureStage::STAGE_BLENDCURRENTALPHA:
-		case TextureStage::STAGE_BLENDDIFFUSEALPHA:
-		case TextureStage::STAGE_BLENDFACTORALPHA:
-		case TextureStage::STAGE_BLENDTEXTUREALPHA:
-		case TextureStage::STAGE_DOT3:   // Already clamped
-		case TextureStage::STAGE_PREMODULATE:
-		case TextureStage::STAGE_MODULATEINVALPHA_ADDCOLOR:
-		case TextureStage::STAGE_MODULATEINVCOLOR_ADDALPHA:
-		case TextureStage::STAGE_BUMPENVMAP:
-		case TextureStage::STAGE_BUMPENVMAPLUMINANCE:
-			break;   // Can't go above one
-		case TextureStage::STAGE_MODULATE2X:
-		case TextureStage::STAGE_MODULATE4X:
-		case TextureStage::STAGE_ADD:
-		case TextureStage::STAGE_ADDSIGNED:
-		case TextureStage::STAGE_ADDSIGNED2X:
-		case TextureStage::STAGE_MULTIPLYADD:
-		case TextureStage::STAGE_BLENDTEXTUREALPHAPM:
-		case TextureStage::STAGE_MODULATEALPHA_ADDCOLOR:
-		case TextureStage::STAGE_MODULATECOLOR_ADDALPHA:
-			res.x = Min(res.x, Short4(0x1000));
-			res.y = Min(res.y, Short4(0x1000));
-			res.z = Min(res.z, Short4(0x1000));
-			break;
-		default:
-			ASSERT(false);
-		}
-
-		switch(textureStage.stageOperationAlpha)
-		{
-		case TextureStage::STAGE_DISABLE:
-		case TextureStage::STAGE_SELECTARG1:
-		case TextureStage::STAGE_SELECTARG2:
-		case TextureStage::STAGE_SELECTARG3:
-		case TextureStage::STAGE_MODULATE:
-		case TextureStage::STAGE_SUBTRACT:
-		case TextureStage::STAGE_ADDSMOOTH:
-		case TextureStage::STAGE_LERP:
-		case TextureStage::STAGE_BLENDCURRENTALPHA:
-		case TextureStage::STAGE_BLENDDIFFUSEALPHA:
-		case TextureStage::STAGE_BLENDFACTORALPHA:
-		case TextureStage::STAGE_BLENDTEXTUREALPHA:
-		case TextureStage::STAGE_DOT3:   // Already clamped
-		case TextureStage::STAGE_PREMODULATE:
-		case TextureStage::STAGE_MODULATEINVALPHA_ADDCOLOR:
-		case TextureStage::STAGE_MODULATEINVCOLOR_ADDALPHA:
-		case TextureStage::STAGE_BUMPENVMAP:
-		case TextureStage::STAGE_BUMPENVMAPLUMINANCE:
-			break;   // Can't go above one
-		case TextureStage::STAGE_MODULATE2X:
-		case TextureStage::STAGE_MODULATE4X:
-		case TextureStage::STAGE_ADD:
-		case TextureStage::STAGE_ADDSIGNED:
-		case TextureStage::STAGE_ADDSIGNED2X:
-		case TextureStage::STAGE_MULTIPLYADD:
-		case TextureStage::STAGE_BLENDTEXTUREALPHAPM:
-		case TextureStage::STAGE_MODULATEALPHA_ADDCOLOR:
-		case TextureStage::STAGE_MODULATECOLOR_ADDALPHA:
-			res.w = Min(res.w, Short4(0x1000));
-			break;
-		default:
-			ASSERT(false);
-		}
-
-		switch(textureStage.destinationArgument)
-		{
-		case TextureStage::DESTINATION_CURRENT:
-			current.x = res.x;
-			current.y = res.y;
-			current.z = res.z;
-			current.w = res.w;
-			break;
-		case TextureStage::DESTINATION_TEMP:
-			temp.x = res.x;
-			temp.y = res.y;
-			temp.z = res.z;
-			temp.w = res.w;
-			break;
-		default:
-			ASSERT(false);
-		}
-	}
-
-	void PixelPipeline::fogBlend(Vector4s &current, Float4 &f)
-	{
-		if(!state.fogActive)
-		{
-			return;
-		}
-
-		if(state.pixelFogMode != FOG_NONE)
-		{
-			pixelFog(f);
-		}
-
-		UShort4 fog = convertFixed16(f, true);
-
-		current.x = As<Short4>(MulHigh(As<UShort4>(current.x), fog));
-		current.y = As<Short4>(MulHigh(As<UShort4>(current.y), fog));
-		current.z = As<Short4>(MulHigh(As<UShort4>(current.z), fog));
-
-		UShort4 invFog = UShort4(0xFFFFu) - fog;
-
-		current.x += As<Short4>(MulHigh(invFog, *Pointer<UShort4>(data + OFFSET(DrawData, fog.color4[0]))));
-		current.y += As<Short4>(MulHigh(invFog, *Pointer<UShort4>(data + OFFSET(DrawData, fog.color4[1]))));
-		current.z += As<Short4>(MulHigh(invFog, *Pointer<UShort4>(data + OFFSET(DrawData, fog.color4[2]))));
-	}
-
-	void PixelPipeline::specularPixel(Vector4s &current, Vector4s &specular)
-	{
-		if(!state.specularAdd)
-		{
-			return;
-		}
-
-		current.x = AddSat(current.x, specular.x);
-		current.y = AddSat(current.y, specular.y);
-		current.z = AddSat(current.z, specular.z);
-	}
-
-	Vector4s PixelPipeline::sampleTexture(int coordinates, int stage, bool project)
-	{
-		Float4 x = v[2 + coordinates].x;
-		Float4 y = v[2 + coordinates].y;
-		Float4 z = v[2 + coordinates].z;
-		Float4 w = v[2 + coordinates].w;
-
-		if(perturbate)
-		{
-			x += du;
-			y += dv;
-
-			perturbate = false;
-		}
-
-		return sampleTexture(stage, x, y, z, w, project);
-	}
-
-	Vector4s PixelPipeline::sampleTexture(int stage, Float4 &u, Float4 &v, Float4 &w, Float4 &q, bool project)
-	{
-		Vector4s c;
-
-		#if PERF_PROFILE
-			Long texTime = Ticks();
-		#endif
-
-		Vector4f dsx;
-		Vector4f dsy;
-
-		Pointer<Byte> texture = data + OFFSET(DrawData, mipmap) + stage * sizeof(Texture);
-
-		if(!project)
-		{
-			c = SamplerCore(constants, state.sampler[stage]).sampleTexture(texture, u, v, w, q, q, dsx, dsy);
-		}
-		else
-		{
-			Float4 rq = reciprocal(q);
-
-			Float4 u_q = u * rq;
-			Float4 v_q = v * rq;
-			Float4 w_q = w * rq;
-
-			c = SamplerCore(constants, state.sampler[stage]).sampleTexture(texture, u_q, v_q, w_q, q, q, dsx, dsy);
-		}
-
-		#if PERF_PROFILE
-			cycles[PERF_TEX] += Ticks() - texTime;
-		#endif
-
-		return c;
-	}
-
-	Short4 PixelPipeline::convertFixed12(RValue<Float4> cf)
-	{
-		return RoundShort4(cf * Float4(0x1000));
-	}
-
-	void PixelPipeline::convertFixed12(Vector4s &cs, Vector4f &cf)
-	{
-		cs.x = convertFixed12(cf.x);
-		cs.y = convertFixed12(cf.y);
-		cs.z = convertFixed12(cf.z);
-		cs.w = convertFixed12(cf.w);
-	}
-
-	Float4 PixelPipeline::convertSigned12(Short4 &cs)
-	{
-		return Float4(cs) * Float4(1.0f / 0x0FFE);
-	}
-
-	void PixelPipeline::convertSigned12(Vector4f &cf, Vector4s &cs)
-	{
-		cf.x = convertSigned12(cs.x);
-		cf.y = convertSigned12(cs.y);
-		cf.z = convertSigned12(cs.z);
-		cf.w = convertSigned12(cs.w);
-	}
-
-	void PixelPipeline::writeDestination(Vector4s &d, const Dst &dst)
-	{
-		switch(dst.type)
-		{
-		case Shader::PARAMETER_TEMP:
-			if(dst.mask & 0x1) rs[dst.index].x = d.x;
-			if(dst.mask & 0x2) rs[dst.index].y = d.y;
-			if(dst.mask & 0x4) rs[dst.index].z = d.z;
-			if(dst.mask & 0x8) rs[dst.index].w = d.w;
-			break;
-		case Shader::PARAMETER_INPUT:
-			if(dst.mask & 0x1) vs[dst.index].x = d.x;
-			if(dst.mask & 0x2) vs[dst.index].y = d.y;
-			if(dst.mask & 0x4) vs[dst.index].z = d.z;
-			if(dst.mask & 0x8) vs[dst.index].w = d.w;
-			break;
-		case Shader::PARAMETER_CONST: ASSERT(false); break;
-		case Shader::PARAMETER_TEXTURE:
-			if(dst.mask & 0x1) ts[dst.index].x = d.x;
-			if(dst.mask & 0x2) ts[dst.index].y = d.y;
-			if(dst.mask & 0x4) ts[dst.index].z = d.z;
-			if(dst.mask & 0x8) ts[dst.index].w = d.w;
-			break;
-		case Shader::PARAMETER_COLOROUT:
-			if(dst.mask & 0x1) vs[dst.index].x = d.x;
-			if(dst.mask & 0x2) vs[dst.index].y = d.y;
-			if(dst.mask & 0x4) vs[dst.index].z = d.z;
-			if(dst.mask & 0x8) vs[dst.index].w = d.w;
-			break;
-		default:
-			ASSERT(false);
-		}
-	}
-
-	Vector4s PixelPipeline::fetchRegister(const Src &src)
-	{
-		Vector4s *reg;
-		int i = src.index;
-
-		Vector4s c;
-
-		if(src.type == Shader::PARAMETER_CONST)
-		{
-			c.x = *Pointer<Short4>(data + OFFSET(DrawData, ps.cW[i][0]));
-			c.y = *Pointer<Short4>(data + OFFSET(DrawData, ps.cW[i][1]));
-			c.z = *Pointer<Short4>(data + OFFSET(DrawData, ps.cW[i][2]));
-			c.w = *Pointer<Short4>(data + OFFSET(DrawData, ps.cW[i][3]));
-		}
-
-		switch(src.type)
-		{
-		case Shader::PARAMETER_TEMP:          reg = &rs[i]; break;
-		case Shader::PARAMETER_INPUT:         reg = &vs[i]; break;
-		case Shader::PARAMETER_CONST:         reg = &c;       break;
-		case Shader::PARAMETER_TEXTURE:       reg = &ts[i]; break;
-		case Shader::PARAMETER_VOID:          return rs[0]; // Dummy
-		case Shader::PARAMETER_FLOAT4LITERAL: return rs[0]; // Dummy
-		default: ASSERT(false); return rs[0];
-		}
-
-		const Short4 &x = (*reg)[(src.swizzle >> 0) & 0x3];
-		const Short4 &y = (*reg)[(src.swizzle >> 2) & 0x3];
-		const Short4 &z = (*reg)[(src.swizzle >> 4) & 0x3];
-		const Short4 &w = (*reg)[(src.swizzle >> 6) & 0x3];
-
-		Vector4s mod;
-
-		switch(src.modifier)
-		{
-		case Shader::MODIFIER_NONE:
-			mod.x = x;
-			mod.y = y;
-			mod.z = z;
-			mod.w = w;
-			break;
-		case Shader::MODIFIER_BIAS:
-			mod.x = SubSat(x, Short4(0x0800));
-			mod.y = SubSat(y, Short4(0x0800));
-			mod.z = SubSat(z, Short4(0x0800));
-			mod.w = SubSat(w, Short4(0x0800));
-			break;
-		case Shader::MODIFIER_BIAS_NEGATE:
-			mod.x = SubSat(Short4(0x0800), x);
-			mod.y = SubSat(Short4(0x0800), y);
-			mod.z = SubSat(Short4(0x0800), z);
-			mod.w = SubSat(Short4(0x0800), w);
-			break;
-		case Shader::MODIFIER_COMPLEMENT:
-			mod.x = SubSat(Short4(0x1000), x);
-			mod.y = SubSat(Short4(0x1000), y);
-			mod.z = SubSat(Short4(0x1000), z);
-			mod.w = SubSat(Short4(0x1000), w);
-			break;
-		case Shader::MODIFIER_NEGATE:
-			mod.x = -x;
-			mod.y = -y;
-			mod.z = -z;
-			mod.w = -w;
-			break;
-		case Shader::MODIFIER_X2:
-			mod.x = AddSat(x, x);
-			mod.y = AddSat(y, y);
-			mod.z = AddSat(z, z);
-			mod.w = AddSat(w, w);
-			break;
-		case Shader::MODIFIER_X2_NEGATE:
-			mod.x = -AddSat(x, x);
-			mod.y = -AddSat(y, y);
-			mod.z = -AddSat(z, z);
-			mod.w = -AddSat(w, w);
-			break;
-		case Shader::MODIFIER_SIGN:
-			mod.x = SubSat(x, Short4(0x0800));
-			mod.y = SubSat(y, Short4(0x0800));
-			mod.z = SubSat(z, Short4(0x0800));
-			mod.w = SubSat(w, Short4(0x0800));
-			mod.x = AddSat(mod.x, mod.x);
-			mod.y = AddSat(mod.y, mod.y);
-			mod.z = AddSat(mod.z, mod.z);
-			mod.w = AddSat(mod.w, mod.w);
-			break;
-		case Shader::MODIFIER_SIGN_NEGATE:
-			mod.x = SubSat(Short4(0x0800), x);
-			mod.y = SubSat(Short4(0x0800), y);
-			mod.z = SubSat(Short4(0x0800), z);
-			mod.w = SubSat(Short4(0x0800), w);
-			mod.x = AddSat(mod.x, mod.x);
-			mod.y = AddSat(mod.y, mod.y);
-			mod.z = AddSat(mod.z, mod.z);
-			mod.w = AddSat(mod.w, mod.w);
-			break;
-		case Shader::MODIFIER_DZ:
-			mod.x = x;
-			mod.y = y;
-			mod.z = z;
-			mod.w = w;
-			// Projection performed by texture sampler
-			break;
-		case Shader::MODIFIER_DW:
-			mod.x = x;
-			mod.y = y;
-			mod.z = z;
-			mod.w = w;
-			// Projection performed by texture sampler
-			break;
-		default:
-			ASSERT(false);
-		}
-
-		if(src.type == Shader::PARAMETER_CONST && (src.modifier == Shader::MODIFIER_X2 || src.modifier == Shader::MODIFIER_X2_NEGATE))
-		{
-			mod.x = Min(mod.x, Short4(0x1000)); mod.x = Max(mod.x, Short4(-0x1000));
-			mod.y = Min(mod.y, Short4(0x1000)); mod.y = Max(mod.y, Short4(-0x1000));
-			mod.z = Min(mod.z, Short4(0x1000)); mod.z = Max(mod.z, Short4(-0x1000));
-			mod.w = Min(mod.w, Short4(0x1000)); mod.w = Max(mod.w, Short4(-0x1000));
-		}
-
-		return mod;
-	}
-
-	void PixelPipeline::MOV(Vector4s &dst, Vector4s &src0)
-	{
-		dst.x = src0.x;
-		dst.y = src0.y;
-		dst.z = src0.z;
-		dst.w = src0.w;
-	}
-
-	void PixelPipeline::ADD(Vector4s &dst, Vector4s &src0, Vector4s &src1)
-	{
-		dst.x = AddSat(src0.x, src1.x);
-		dst.y = AddSat(src0.y, src1.y);
-		dst.z = AddSat(src0.z, src1.z);
-		dst.w = AddSat(src0.w, src1.w);
-	}
-
-	void PixelPipeline::SUB(Vector4s &dst, Vector4s &src0, Vector4s &src1)
-	{
-		dst.x = SubSat(src0.x, src1.x);
-		dst.y = SubSat(src0.y, src1.y);
-		dst.z = SubSat(src0.z, src1.z);
-		dst.w = SubSat(src0.w, src1.w);
-	}
-
-	void PixelPipeline::MAD(Vector4s &dst, Vector4s &src0, Vector4s &src1, Vector4s &src2)
-	{
-		// FIXME: Long fixed-point multiply fixup
-		{ dst.x = MulHigh(src0.x, src1.x); dst.x = AddSat(dst.x, dst.x); dst.x = AddSat(dst.x, dst.x); dst.x = AddSat(dst.x, dst.x); dst.x = AddSat(dst.x, dst.x); dst.x = AddSat(dst.x, src2.x); }
-		{ dst.y = MulHigh(src0.y, src1.y); dst.y = AddSat(dst.y, dst.y); dst.y = AddSat(dst.y, dst.y); dst.y = AddSat(dst.y, dst.y); dst.y = AddSat(dst.y, dst.y); dst.y = AddSat(dst.y, src2.y); }
-		{ dst.z = MulHigh(src0.z, src1.z); dst.z = AddSat(dst.z, dst.z); dst.z = AddSat(dst.z, dst.z); dst.z = AddSat(dst.z, dst.z); dst.z = AddSat(dst.z, dst.z); dst.z = AddSat(dst.z, src2.z); }
-		{ dst.w = MulHigh(src0.w, src1.w); dst.w = AddSat(dst.w, dst.w); dst.w = AddSat(dst.w, dst.w); dst.w = AddSat(dst.w, dst.w); dst.w = AddSat(dst.w, dst.w); dst.w = AddSat(dst.w, src2.w); }
-	}
-
-	void PixelPipeline::MUL(Vector4s &dst, Vector4s &src0, Vector4s &src1)
-	{
-		// FIXME: Long fixed-point multiply fixup
-		{ dst.x = MulHigh(src0.x, src1.x); dst.x = AddSat(dst.x, dst.x); dst.x = AddSat(dst.x, dst.x); dst.x = AddSat(dst.x, dst.x); dst.x = AddSat(dst.x, dst.x); }
-		{ dst.y = MulHigh(src0.y, src1.y); dst.y = AddSat(dst.y, dst.y); dst.y = AddSat(dst.y, dst.y); dst.y = AddSat(dst.y, dst.y); dst.y = AddSat(dst.y, dst.y); }
-		{ dst.z = MulHigh(src0.z, src1.z); dst.z = AddSat(dst.z, dst.z); dst.z = AddSat(dst.z, dst.z); dst.z = AddSat(dst.z, dst.z); dst.z = AddSat(dst.z, dst.z); }
-		{ dst.w = MulHigh(src0.w, src1.w); dst.w = AddSat(dst.w, dst.w); dst.w = AddSat(dst.w, dst.w); dst.w = AddSat(dst.w, dst.w); dst.w = AddSat(dst.w, dst.w); }
-	}
-
-	void PixelPipeline::DP3(Vector4s &dst, Vector4s &src0, Vector4s &src1)
-	{
-		Short4 t0;
-		Short4 t1;
-
-		// FIXME: Long fixed-point multiply fixup
-		t0 = MulHigh(src0.x, src1.x); t0 = AddSat(t0, t0); t0 = AddSat(t0, t0); t0 = AddSat(t0, t0); t0 = AddSat(t0, t0);
-		t1 = MulHigh(src0.y, src1.y); t1 = AddSat(t1, t1); t1 = AddSat(t1, t1); t1 = AddSat(t1, t1); t1 = AddSat(t1, t1);
-		t0 = AddSat(t0, t1);
-		t1 = MulHigh(src0.z, src1.z); t1 = AddSat(t1, t1); t1 = AddSat(t1, t1); t1 = AddSat(t1, t1); t1 = AddSat(t1, t1);
-		t0 = AddSat(t0, t1);
-
-		dst.x = t0;
-		dst.y = t0;
-		dst.z = t0;
-		dst.w = t0;
-	}
-
-	void PixelPipeline::DP4(Vector4s &dst, Vector4s &src0, Vector4s &src1)
-	{
-		Short4 t0;
-		Short4 t1;
-
-		// FIXME: Long fixed-point multiply fixup
-		t0 = MulHigh(src0.x, src1.x); t0 = AddSat(t0, t0); t0 = AddSat(t0, t0); t0 = AddSat(t0, t0); t0 = AddSat(t0, t0);
-		t1 = MulHigh(src0.y, src1.y); t1 = AddSat(t1, t1); t1 = AddSat(t1, t1); t1 = AddSat(t1, t1); t1 = AddSat(t1, t1);
-		t0 = AddSat(t0, t1);
-		t1 = MulHigh(src0.z, src1.z); t1 = AddSat(t1, t1); t1 = AddSat(t1, t1); t1 = AddSat(t1, t1); t1 = AddSat(t1, t1);
-		t0 = AddSat(t0, t1);
-		t1 = MulHigh(src0.w, src1.w); t1 = AddSat(t1, t1); t1 = AddSat(t1, t1); t1 = AddSat(t1, t1); t1 = AddSat(t1, t1);
-		t0 = AddSat(t0, t1);
-
-		dst.x = t0;
-		dst.y = t0;
-		dst.z = t0;
-		dst.w = t0;
-	}
-
-	void PixelPipeline::LRP(Vector4s &dst, Vector4s &src0, Vector4s &src1, Vector4s &src2)
-	{
-		// FIXME: Long fixed-point multiply fixup
-		{ dst.x = SubSat(src1.x, src2.x); dst.x = MulHigh(dst.x, src0.x); dst.x = AddSat(dst.x, dst.x); dst.x = AddSat(dst.x, dst.x); dst.x = AddSat(dst.x, dst.x); dst.x = AddSat(dst.x, dst.x); dst.x = AddSat(dst.x, src2.x); }
-		{
-		dst.y = SubSat(src1.y, src2.y); dst.y = MulHigh(dst.y, src0.y); dst.y = AddSat(dst.y, dst.y); dst.y = AddSat(dst.y, dst.y); dst.y = AddSat(dst.y, dst.y); dst.y = AddSat(dst.y, dst.y); dst.y = AddSat(dst.y, src2.y);
-	}
-		{dst.z = SubSat(src1.z, src2.z); dst.z = MulHigh(dst.z, src0.z); dst.z = AddSat(dst.z, dst.z); dst.z = AddSat(dst.z, dst.z); dst.z = AddSat(dst.z, dst.z); dst.z = AddSat(dst.z, dst.z); dst.z = AddSat(dst.z, src2.z); }
-		{dst.w = SubSat(src1.w, src2.w); dst.w = MulHigh(dst.w, src0.w); dst.w = AddSat(dst.w, dst.w); dst.w = AddSat(dst.w, dst.w); dst.w = AddSat(dst.w, dst.w); dst.w = AddSat(dst.w, dst.w); dst.w = AddSat(dst.w, src2.w); }
-	}
-
-	void PixelPipeline::TEXCOORD(Vector4s &dst, Float4 &u, Float4 &v, Float4 &s, int coordinate)
-	{
-		Float4 uw;
-		Float4 vw;
-		Float4 sw;
-
-		if(state.interpolant[2 + coordinate].component & 0x01)
-		{
-			uw = Max(u, Float4(0.0f));
-			uw = Min(uw, Float4(1.0f));
-			dst.x = convertFixed12(uw);
-		}
-		else
-		{
-			dst.x = Short4(0x0000);
-		}
-
-		if(state.interpolant[2 + coordinate].component & 0x02)
-		{
-			vw = Max(v, Float4(0.0f));
-			vw = Min(vw, Float4(1.0f));
-			dst.y = convertFixed12(vw);
-		}
-		else
-		{
-			dst.y = Short4(0x0000);
-		}
-
-		if(state.interpolant[2 + coordinate].component & 0x04)
-		{
-			sw = Max(s, Float4(0.0f));
-			sw = Min(sw, Float4(1.0f));
-			dst.z = convertFixed12(sw);
-		}
-		else
-		{
-			dst.z = Short4(0x0000);
-		}
-
-		dst.w = Short4(0x1000);
-	}
-
-	void PixelPipeline::TEXCRD(Vector4s &dst, Float4 &u, Float4 &v, Float4 &s, int coordinate, bool project)
-	{
-		Float4 uw = u;
-		Float4 vw = v;
-		Float4 sw = s;
-
-		if(project)
-		{
-			uw *= Rcp_pp(s);
-			vw *= Rcp_pp(s);
-		}
-
-		if(state.interpolant[2 + coordinate].component & 0x01)
-		{
-			uw *= Float4(0x1000);
-			uw = Max(uw, Float4(-0x8000));
-			uw = Min(uw, Float4(0x7FFF));
-			dst.x = RoundShort4(uw);
-		}
-		else
-		{
-			dst.x = Short4(0x0000);
-		}
-
-		if(state.interpolant[2 + coordinate].component & 0x02)
-		{
-			vw *= Float4(0x1000);
-			vw = Max(vw, Float4(-0x8000));
-			vw = Min(vw, Float4(0x7FFF));
-			dst.y = RoundShort4(vw);
-		}
-		else
-		{
-			dst.y = Short4(0x0000);
-		}
-
-		if(state.interpolant[2 + coordinate].component & 0x04)
-		{
-			sw *= Float4(0x1000);
-			sw = Max(sw, Float4(-0x8000));
-			sw = Min(sw, Float4(0x7FFF));
-			dst.z = RoundShort4(sw);
-		}
-		else
-		{
-			dst.z = Short4(0x0000);
-		}
-	}
-
-	void PixelPipeline::TEXDP3(Vector4s &dst, Float4 &u, Float4 &v, Float4 &s, Vector4s &src)
-	{
-		TEXM3X3PAD(u, v, s, src, 0, false);
-
-		Short4 t0 = RoundShort4(u_ * Float4(0x1000));
-
-		dst.x = t0;
-		dst.y = t0;
-		dst.z = t0;
-		dst.w = t0;
-	}
-
-	void PixelPipeline::TEXDP3TEX(Vector4s &dst, Float4 &u, Float4 &v, Float4 &s, int stage, Vector4s &src0)
-	{
-		TEXM3X3PAD(u, v, s, src0, 0, false);
-
-		v_ = Float4(0.0f);
-		w_ = Float4(0.0f);
-
-		dst = sampleTexture(stage, u_, v_, w_, w_);
-	}
-
-	void PixelPipeline::TEXKILL(Int cMask[4], Float4 &u, Float4 &v, Float4 &s)
-	{
-		Int kill = SignMask(CmpNLT(u, Float4(0.0f))) &
-			SignMask(CmpNLT(v, Float4(0.0f))) &
-			SignMask(CmpNLT(s, Float4(0.0f)));
-
-		for(unsigned int q = 0; q < state.multiSample; q++)
-		{
-			cMask[q] &= kill;
-		}
-	}
-
-	void PixelPipeline::TEXKILL(Int cMask[4], Vector4s &src)
-	{
-		Short4 test = src.x | src.y | src.z;
-		Int kill = SignMask(PackSigned(test, test)) ^ 0x0000000F;
-
-		for(unsigned int q = 0; q < state.multiSample; q++)
-		{
-			cMask[q] &= kill;
-		}
-	}
-
-	void PixelPipeline::TEX(Vector4s &dst, Float4 &u, Float4 &v, Float4 &s, int sampler, bool project)
-	{
-		dst = sampleTexture(sampler, u, v, s, s, project);
-	}
-
-	void PixelPipeline::TEXLD(Vector4s &dst, Vector4s &src, int sampler, bool project)
-	{
-		Float4 u = Float4(src.x) * Float4(1.0f / 0x0FFE);
-		Float4 v = Float4(src.y) * Float4(1.0f / 0x0FFE);
-		Float4 s = Float4(src.z) * Float4(1.0f / 0x0FFE);
-
-		dst = sampleTexture(sampler, u, v, s, s, project);
-	}
-
-	void PixelPipeline::TEXBEM(Vector4s &dst, Vector4s &src, Float4 &u, Float4 &v, Float4 &s, int stage)
-	{
-		Float4 du = Float4(src.x) * Float4(1.0f / 0x0FFE);
-		Float4 dv = Float4(src.y) * Float4(1.0f / 0x0FFE);
-
-		Float4 du2 = du;
-		Float4 dv2 = dv;
-
-		du *= *Pointer<Float4>(data + OFFSET(DrawData, textureStage[stage].bumpmapMatrix4F[0][0]));
-		dv2 *= *Pointer<Float4>(data + OFFSET(DrawData, textureStage[stage].bumpmapMatrix4F[1][0]));
-		du += dv2;
-		dv *= *Pointer<Float4>(data + OFFSET(DrawData, textureStage[stage].bumpmapMatrix4F[1][1]));
-		du2 *= *Pointer<Float4>(data + OFFSET(DrawData, textureStage[stage].bumpmapMatrix4F[0][1]));
-		dv += du2;
-
-		Float4 u_ = u + du;
-		Float4 v_ = v + dv;
-
-		dst = sampleTexture(stage, u_, v_, s, s);
-	}
-
-	void PixelPipeline::TEXBEML(Vector4s &dst, Vector4s &src, Float4 &u, Float4 &v, Float4 &s, int stage)
-	{
-		Float4 du = Float4(src.x) * Float4(1.0f / 0x0FFE);
-		Float4 dv = Float4(src.y) * Float4(1.0f / 0x0FFE);
-
-		Float4 du2 = du;
-		Float4 dv2 = dv;
-
-		du *= *Pointer<Float4>(data + OFFSET(DrawData, textureStage[stage].bumpmapMatrix4F[0][0]));
-		dv2 *= *Pointer<Float4>(data + OFFSET(DrawData, textureStage[stage].bumpmapMatrix4F[1][0]));
-		du += dv2;
-		dv *= *Pointer<Float4>(data + OFFSET(DrawData, textureStage[stage].bumpmapMatrix4F[1][1]));
-		du2 *= *Pointer<Float4>(data + OFFSET(DrawData, textureStage[stage].bumpmapMatrix4F[0][1]));
-		dv += du2;
-
-		Float4 u_ = u + du;
-		Float4 v_ = v + dv;
-
-		dst = sampleTexture(stage, u_, v_, s, s);
-
-		Short4 L;
-
-		L = src.z;
-		L = MulHigh(L, *Pointer<Short4>(data + OFFSET(DrawData, textureStage[stage].luminanceScale4)));
-		L = L << 4;
-		L = AddSat(L, *Pointer<Short4>(data + OFFSET(DrawData, textureStage[stage].luminanceOffset4)));
-		L = Max(L, Short4(0x0000));
-		L = Min(L, Short4(0x1000));
-
-		dst.x = MulHigh(dst.x, L); dst.x = dst.x << 4;
-		dst.y = MulHigh(dst.y, L); dst.y = dst.y << 4;
-		dst.z = MulHigh(dst.z, L); dst.z = dst.z << 4;
-	}
-
-	void PixelPipeline::TEXREG2AR(Vector4s &dst, Vector4s &src0, int stage)
-	{
-		Float4 u = Float4(src0.w) * Float4(1.0f / 0x0FFE);
-		Float4 v = Float4(src0.x) * Float4(1.0f / 0x0FFE);
-		Float4 s = Float4(src0.z) * Float4(1.0f / 0x0FFE);
-
-		dst = sampleTexture(stage, u, v, s, s);
-	}
-
-	void PixelPipeline::TEXREG2GB(Vector4s &dst, Vector4s &src0, int stage)
-	{
-		Float4 u = Float4(src0.y) * Float4(1.0f / 0x0FFE);
-		Float4 v = Float4(src0.z) * Float4(1.0f / 0x0FFE);
-		Float4 s = v;
-
-		dst = sampleTexture(stage, u, v, s, s);
-	}
-
-	void PixelPipeline::TEXREG2RGB(Vector4s &dst, Vector4s &src0, int stage)
-	{
-		Float4 u = Float4(src0.x) * Float4(1.0f / 0x0FFE);
-		Float4 v = Float4(src0.y) * Float4(1.0f / 0x0FFE);
-		Float4 s = Float4(src0.z) * Float4(1.0f / 0x0FFE);
-
-		dst = sampleTexture(stage, u, v, s, s);
-	}
-
-	void PixelPipeline::TEXM3X2DEPTH(Vector4s &dst, Float4 &u, Float4 &v, Float4 &s, Vector4s &src, bool signedScaling)
-	{
-		TEXM3X2PAD(u, v, s, src, 1, signedScaling);
-
-		// z / w
-		u_ *= Rcp_pp(v_);   // FIXME: Set result to 1.0 when division by zero
-
-		oDepth = u_;
-	}
-
-	void PixelPipeline::TEXM3X2PAD(Float4 &u, Float4 &v, Float4 &s, Vector4s &src0, int component, bool signedScaling)
-	{
-		TEXM3X3PAD(u, v, s, src0, component, signedScaling);
-	}
-
-	void PixelPipeline::TEXM3X2TEX(Vector4s &dst, Float4 &u, Float4 &v, Float4 &s, int stage, Vector4s &src0, bool signedScaling)
-	{
-		TEXM3X2PAD(u, v, s, src0, 1, signedScaling);
-
-		w_ = Float4(0.0f);
-
-		dst = sampleTexture(stage, u_, v_, w_, w_);
-	}
-
-	void PixelPipeline::TEXM3X3(Vector4s &dst, Float4 &u, Float4 &v, Float4 &s, Vector4s &src0, bool signedScaling)
-	{
-		TEXM3X3PAD(u, v, s, src0, 2, signedScaling);
-
-		dst.x = RoundShort4(u_ * Float4(0x1000));
-		dst.y = RoundShort4(v_ * Float4(0x1000));
-		dst.z = RoundShort4(w_ * Float4(0x1000));
-		dst.w = Short4(0x1000);
-	}
-
-	void PixelPipeline::TEXM3X3PAD(Float4 &u, Float4 &v, Float4 &s, Vector4s &src0, int component, bool signedScaling)
-	{
-		if(component == 0 || previousScaling != signedScaling)   // FIXME: Other source modifiers?
-		{
-			U = Float4(src0.x);
-			V = Float4(src0.y);
-			W = Float4(src0.z);
-
-			previousScaling = signedScaling;
-		}
-
-		Float4 x = U * u + V * v + W * s;
-
-		x *= Float4(1.0f / 0x1000);
-
-		switch(component)
-		{
-		case 0:	u_ = x; break;
-		case 1:	v_ = x; break;
-		case 2: w_ = x; break;
-		default: ASSERT(false);
-		}
-	}
-
-	void PixelPipeline::TEXM3X3SPEC(Vector4s &dst, Float4 &u, Float4 &v, Float4 &s, int stage, Vector4s &src0, Vector4s &src1)
-	{
-		TEXM3X3PAD(u, v, s, src0, 2, false);
-
-		Float4 E[3];   // Eye vector
-
-		E[0] = Float4(src1.x) * Float4(1.0f / 0x0FFE);
-		E[1] = Float4(src1.y) * Float4(1.0f / 0x0FFE);
-		E[2] = Float4(src1.z) * Float4(1.0f / 0x0FFE);
-
-		// Reflection
-		Float4 u__;
-		Float4 v__;
-		Float4 w__;
-
-		// (u'', v'', w'') = 2 * (N . E) * N - E * (N . N)
-		u__ = u_ * E[0];
-		v__ = v_ * E[1];
-		w__ = w_ * E[2];
-		u__ += v__ + w__;
-		u__ += u__;
-		v__ = u__;
-		w__ = u__;
-		u__ *= u_;
-		v__ *= v_;
-		w__ *= w_;
-		u_ *= u_;
-		v_ *= v_;
-		w_ *= w_;
-		u_ += v_ + w_;
-		u__ -= E[0] * u_;
-		v__ -= E[1] * u_;
-		w__ -= E[2] * u_;
-
-		dst = sampleTexture(stage, u__, v__, w__, w__);
-	}
-
-	void PixelPipeline::TEXM3X3TEX(Vector4s &dst, Float4 &u, Float4 &v, Float4 &s, int stage, Vector4s &src0, bool signedScaling)
-	{
-		TEXM3X3PAD(u, v, s, src0, 2, signedScaling);
-
-		dst = sampleTexture(stage, u_, v_, w_, w_);
-	}
-
-	void PixelPipeline::TEXM3X3VSPEC(Vector4s &dst, Float4 &x, Float4 &y, Float4 &z, int stage, Vector4s &src0)
-	{
-		TEXM3X3PAD(x, y, z, src0, 2, false);
-
-		Float4 E[3];   // Eye vector
-
-		E[0] = v[2 + stage - 2].w;
-		E[1] = v[2 + stage - 1].w;
-		E[2] = v[2 + stage - 0].w;
-
-		// Reflection
-		Float4 u__;
-		Float4 v__;
-		Float4 w__;
-
-		// (u'', v'', w'') = 2 * (N . E) * N - E * (N . N)
-		u__ = u_ * E[0];
-		v__ = v_ * E[1];
-		w__ = w_ * E[2];
-		u__ += v__ + w__;
-		u__ += u__;
-		v__ = u__;
-		w__ = u__;
-		u__ *= u_;
-		v__ *= v_;
-		w__ *= w_;
-		u_ *= u_;
-		v_ *= v_;
-		w_ *= w_;
-		u_ += v_ + w_;
-		u__ -= E[0] * u_;
-		v__ -= E[1] * u_;
-		w__ -= E[2] * u_;
-
-		dst = sampleTexture(stage, u__, v__, w__, w__);
-	}
-
-	void PixelPipeline::TEXDEPTH()
-	{
-		u_ = Float4(rs[5].x);
-		v_ = Float4(rs[5].y);
-
-		// z / w
-		u_ *= Rcp_pp(v_);   // FIXME: Set result to 1.0 when division by zero
-
-		oDepth = u_;
-	}
-
-	void PixelPipeline::CND(Vector4s &dst, Vector4s &src0, Vector4s &src1, Vector4s &src2)
-	{
-		{Short4 t0; t0 = src0.x; t0 = CmpGT(t0, Short4(0x0800)); Short4 t1; t1 = src1.x; t1 = t1 & t0; t0 = ~t0 & src2.x; t0 = t0 | t1; dst.x = t0; };
-		{Short4 t0; t0 = src0.y; t0 = CmpGT(t0, Short4(0x0800)); Short4 t1; t1 = src1.y; t1 = t1 & t0; t0 = ~t0 & src2.y; t0 = t0 | t1; dst.y = t0; };
-		{Short4 t0; t0 = src0.z; t0 = CmpGT(t0, Short4(0x0800)); Short4 t1; t1 = src1.z; t1 = t1 & t0; t0 = ~t0 & src2.z; t0 = t0 | t1; dst.z = t0; };
-		{Short4 t0; t0 = src0.w; t0 = CmpGT(t0, Short4(0x0800)); Short4 t1; t1 = src1.w; t1 = t1 & t0; t0 = ~t0 & src2.w; t0 = t0 | t1; dst.w = t0; };
-	}
-
-	void PixelPipeline::CMP(Vector4s &dst, Vector4s &src0, Vector4s &src1, Vector4s &src2)
-	{
-		{Short4 t0 = CmpGT(Short4(0x0000), src0.x); Short4 t1; t1 = src2.x; t1 &= t0; t0 = ~t0 & src1.x; t0 |= t1; dst.x = t0; };
-		{Short4 t0 = CmpGT(Short4(0x0000), src0.y); Short4 t1; t1 = src2.y; t1 &= t0; t0 = ~t0 & src1.y; t0 |= t1; dst.y = t0; };
-		{Short4 t0 = CmpGT(Short4(0x0000), src0.z); Short4 t1; t1 = src2.z; t1 &= t0; t0 = ~t0 & src1.z; t0 |= t1; dst.z = t0; };
-		{Short4 t0 = CmpGT(Short4(0x0000), src0.w); Short4 t1; t1 = src2.w; t1 &= t0; t0 = ~t0 & src1.w; t0 |= t1; dst.w = t0; };
-	}
-
-	void PixelPipeline::BEM(Vector4s &dst, Vector4s &src0, Vector4s &src1, int stage)
-	{
-		Short4 t0;
-		Short4 t1;
-
-		// dst.x = src0.x + BUMPENVMAT00(stage) * src1.x + BUMPENVMAT10(stage) * src1.y
-		t0 = MulHigh(src1.x, *Pointer<Short4>(data + OFFSET(DrawData, textureStage[stage].bumpmapMatrix4W[0][0]))); t0 = t0 << 4;   // FIXME: Matrix components range? Overflow hazard.
-		t1 = MulHigh(src1.y, *Pointer<Short4>(data + OFFSET(DrawData, textureStage[stage].bumpmapMatrix4W[1][0]))); t1 = t1 << 4;   // FIXME: Matrix components range? Overflow hazard.
-		t0 = AddSat(t0, t1);
-		t0 = AddSat(t0, src0.x);
-		dst.x = t0;
-
-		// dst.y = src0.y + BUMPENVMAT01(stage) * src1.x + BUMPENVMAT11(stage) * src1.y
-		t0 = MulHigh(src1.x, *Pointer<Short4>(data + OFFSET(DrawData, textureStage[stage].bumpmapMatrix4W[0][1]))); t0 = t0 << 4;   // FIXME: Matrix components range? Overflow hazard.
-		t1 = MulHigh(src1.y, *Pointer<Short4>(data + OFFSET(DrawData, textureStage[stage].bumpmapMatrix4W[1][1]))); t1 = t1 << 4;   // FIXME: Matrix components range? Overflow hazard.
-		t0 = AddSat(t0, t1);
-		t0 = AddSat(t0, src0.y);
-		dst.y = t0;
-	}
-}
-
diff --git a/src/Pipeline/PixelPipeline.hpp b/src/Pipeline/PixelPipeline.hpp
deleted file mode 100644
index 66f0ec7..0000000
--- a/src/Pipeline/PixelPipeline.hpp
+++ /dev/null
@@ -1,114 +0,0 @@
-// 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_PixelPipeline_hpp
-#define sw_PixelPipeline_hpp
-
-#include "PixelRoutine.hpp"
-
-namespace sw
-{
-	class PixelPipeline : public PixelRoutine
-	{
-	public:
-		PixelPipeline(const PixelProcessor::State &state, const PixelShader *shader) :
-			PixelRoutine(state, shader), current(rs[0]), diffuse(vs[0]), specular(vs[1]), perturbate(false), luminance(false), previousScaling(false) {}
-		virtual ~PixelPipeline() {}
-
-	protected:
-		virtual void setBuiltins(Int &x, Int &y, Float4(&z)[4], Float4 &w);
-		virtual void applyShader(Int cMask[4]);
-		virtual Bool alphaTest(Int cMask[4]);
-		virtual void rasterOperation(Float4 &fog, Pointer<Byte> cBuffer[4], Int &x, Int sMask[4], Int zMask[4], Int cMask[4]);
-
-	private:
-		Vector4s &current;
-		Vector4s &diffuse;
-		Vector4s &specular;
-
-		Vector4s rs[6];
-		Vector4s vs[2];
-		Vector4s ts[6];
-
-		// bem(l) offsets and luminance
-		Float4 du;
-		Float4 dv;
-		Short4 L;
-
-		// texm3x3 temporaries
-		Float4 u_; // FIXME
-		Float4 v_; // FIXME
-		Float4 w_; // FIXME
-		Float4 U;  // FIXME
-		Float4 V;  // FIXME
-		Float4 W;  // FIXME
-
-		void fixedFunction();
-		void blendTexture(Vector4s &temp, Vector4s &texture, int stage);
-		void fogBlend(Vector4s &current, Float4 &fog);
-		void specularPixel(Vector4s &current, Vector4s &specular);
-
-		Vector4s sampleTexture(int coordinates, int sampler, bool project = false);
-		Vector4s sampleTexture(int sampler, Float4 &u, Float4 &v, Float4 &w, Float4 &q, bool project = false);
-
-		Short4 convertFixed12(RValue<Float4> cf);
-		void convertFixed12(Vector4s &cs, Vector4f &cf);
-		Float4 convertSigned12(Short4 &cs);
-		void convertSigned12(Vector4f &cf, Vector4s &cs);
-
-		void writeDestination(Vector4s &d, const Dst &dst);
-		Vector4s fetchRegister(const Src &src);
-
-		// Instructions
-		void MOV(Vector4s &dst, Vector4s &src0);
-		void ADD(Vector4s &dst, Vector4s &src0, Vector4s &src1);
-		void SUB(Vector4s &dst, Vector4s &src0, Vector4s &src1);
-		void MAD(Vector4s &dst, Vector4s &src0, Vector4s &src1, Vector4s &src2);
-		void MUL(Vector4s &dst, Vector4s &src0, Vector4s &src1);
-		void DP3(Vector4s &dst, Vector4s &src0, Vector4s &src1);
-		void DP4(Vector4s &dst, Vector4s &src0, Vector4s &src1);
-		void LRP(Vector4s &dst, Vector4s &src0, Vector4s &src1, Vector4s &src2);
-		void TEXCOORD(Vector4s &dst, Float4 &u, Float4 &v, Float4 &s, int coordinate);
-		void TEXCRD(Vector4s &dst, Float4 &u, Float4 &v, Float4 &s, int coordinate, bool project);
-		void TEXDP3(Vector4s &dst, Float4 &u, Float4 &v, Float4 &s, Vector4s &src);
-		void TEXDP3TEX(Vector4s &dst, Float4 &u, Float4 &v, Float4 &s, int stage, Vector4s &src0);
-		void TEXKILL(Int cMask[4], Float4 &u, Float4 &v, Float4 &s);
-		void TEXKILL(Int cMask[4], Vector4s &dst);
-		void TEX(Vector4s &dst, Float4 &u, Float4 &v, Float4 &s, int stage, bool project);
-		void TEXLD(Vector4s &dst, Vector4s &src, int stage, bool project);
-		void TEXBEM(Vector4s &dst, Vector4s &src, Float4 &u, Float4 &v, Float4 &s, int stage);
-		void TEXBEML(Vector4s &dst, Vector4s &src, Float4 &u, Float4 &v, Float4 &s, int stage);
-		void TEXREG2AR(Vector4s &dst, Vector4s &src0, int stage);
-		void TEXREG2GB(Vector4s &dst, Vector4s &src0, int stage);
-		void TEXREG2RGB(Vector4s &dst, Vector4s &src0, int stage);
-		void TEXM3X2DEPTH(Vector4s &dst, Float4 &u, Float4 &v, Float4 &s, Vector4s &src, bool signedScaling);
-		void TEXM3X2PAD(Float4 &u, Float4 &v, Float4 &s, Vector4s &src0, int component, bool signedScaling);
-		void TEXM3X2TEX(Vector4s &dst, Float4 &u, Float4 &v, Float4 &s, int stage, Vector4s &src0, bool signedScaling);
-		void TEXM3X3(Vector4s &dst, Float4 &u, Float4 &v, Float4 &s, Vector4s &src0, bool signedScaling);
-		void TEXM3X3PAD(Float4 &u, Float4 &v, Float4 &s, Vector4s &src0, int component, bool signedScaling);
-		void TEXM3X3SPEC(Vector4s &dst, Float4 &u, Float4 &v, Float4 &s, int stage, Vector4s &src0, Vector4s &src1);
-		void TEXM3X3TEX(Vector4s &dst, Float4 &u, Float4 &v, Float4 &s, int stage, Vector4s &src0, bool singedScaling);
-		void TEXM3X3VSPEC(Vector4s &dst, Float4 &u, Float4 &v, Float4 &s, int stage, Vector4s &src0);
-		void TEXDEPTH();
-		void CND(Vector4s &dst, Vector4s &src0, Vector4s &src1, Vector4s &src2);
-		void CMP(Vector4s &dst, Vector4s &src0, Vector4s &src1, Vector4s &src2);
-		void BEM(Vector4s &dst, Vector4s &src0, Vector4s &src1, int stage);
-
-		bool perturbate;
-		bool luminance;
-		bool previousScaling;
-	};
-}
-
-#endif
diff --git a/src/Pipeline/PixelProgram.cpp b/src/Pipeline/PixelProgram.cpp
index 8f285f0..3d9cfe7 100644
--- a/src/Pipeline/PixelProgram.cpp
+++ b/src/Pipeline/PixelProgram.cpp
@@ -627,11 +627,6 @@
 				c[index].z = linearToSRGB(c[index].z);
 			}
 
-			if(index == 0)
-			{
-				fogBlend(c[index], fog);
-			}
-
 			switch(state.targetFormat[index])
 			{
 			case FORMAT_R5G6B5:
diff --git a/src/Pipeline/PixelRoutine.cpp b/src/Pipeline/PixelRoutine.cpp
index 31bcab3..0cf82cb 100644
--- a/src/Pipeline/PixelRoutine.cpp
+++ b/src/Pipeline/PixelRoutine.cpp
@@ -583,79 +583,6 @@
 		cMask[3] &= aMask3;
 	}
 
-	void PixelRoutine::fogBlend(Vector4f &c0, Float4 &fog)
-	{
-		if(!state.fogActive)
-		{
-			return;
-		}
-
-		if(state.pixelFogMode != FOG_NONE)
-		{
-			pixelFog(fog);
-
-			fog = Min(fog, Float4(1.0f));
-			fog = Max(fog, Float4(0.0f));
-		}
-
-		c0.x -= *Pointer<Float4>(data + OFFSET(DrawData,fog.colorF[0]));
-		c0.y -= *Pointer<Float4>(data + OFFSET(DrawData,fog.colorF[1]));
-		c0.z -= *Pointer<Float4>(data + OFFSET(DrawData,fog.colorF[2]));
-
-		c0.x *= fog;
-		c0.y *= fog;
-		c0.z *= fog;
-
-		c0.x += *Pointer<Float4>(data + OFFSET(DrawData,fog.colorF[0]));
-		c0.y += *Pointer<Float4>(data + OFFSET(DrawData,fog.colorF[1]));
-		c0.z += *Pointer<Float4>(data + OFFSET(DrawData,fog.colorF[2]));
-	}
-
-	void PixelRoutine::pixelFog(Float4 &visibility)
-	{
-		Float4 &zw = visibility;
-
-		if(state.pixelFogMode != FOG_NONE)
-		{
-			if(state.wBasedFog)
-			{
-				zw = rhw;
-			}
-			else
-			{
-				if(complementaryDepthBuffer)
-				{
-					zw = Float4(1.0f) - z[0];
-				}
-				else
-				{
-					zw = z[0];
-				}
-			}
-		}
-
-		switch(state.pixelFogMode)
-		{
-		case FOG_NONE:
-			break;
-		case FOG_LINEAR:
-			zw *= *Pointer<Float4>(data + OFFSET(DrawData,fog.scale));
-			zw += *Pointer<Float4>(data + OFFSET(DrawData,fog.offset));
-			break;
-		case FOG_EXP:
-			zw *= *Pointer<Float4>(data + OFFSET(DrawData,fog.densityE));
-			zw = exponential2(zw, true);
-			break;
-		case FOG_EXP2:
-			zw *= zw;
-			zw *= *Pointer<Float4>(data + OFFSET(DrawData,fog.density2E));
-			zw = exponential2(zw, true);
-			break;
-		default:
-			ASSERT(false);
-		}
-	}
-
 	void PixelRoutine::writeDepth(Pointer<Byte> &zBuffer, int q, Int &x, Float4 &z, Int &zMask)
 	{
 		if(!state.depthWriteEnable)
diff --git a/src/Pipeline/PixelRoutine.hpp b/src/Pipeline/PixelRoutine.hpp
index 0c5fd63..8e8e074 100644
--- a/src/Pipeline/PixelRoutine.hpp
+++ b/src/Pipeline/PixelRoutine.hpp
@@ -51,8 +51,6 @@
 
 		void alphaTest(Int &aMask, Short4 &alpha);
 		void alphaToCoverage(Int cMask[4], Float4 &alpha);
-		void fogBlend(Vector4f &c0, Float4 &fog);
-		void pixelFog(Float4 &visibility);
 
 		// Raster operations
 		void alphaBlend(int index, Pointer<Byte> &cBuffer, Vector4s &current, Int &x);
diff --git a/src/Pipeline/SetupRoutine.cpp b/src/Pipeline/SetupRoutine.cpp
index 7d12326..b5b31cd 100644
--- a/src/Pipeline/SetupRoutine.cpp
+++ b/src/Pipeline/SetupRoutine.cpp
@@ -47,10 +47,8 @@
 			Pointer<Byte> constants = *Pointer<Pointer<Byte> >(data + OFFSET(DrawData,constants));
 
 			const bool point = state.isDrawPoint;
-			const bool sprite = state.pointSprite;
 			const bool line = state.isDrawLine;
-			const bool triangle = state.isDrawSolidTriangle || sprite;
-			const bool solidTriangle = state.isDrawSolidTriangle;
+			const bool triangle = state.isDrawTriangle;
 
 			const int V0 = OFFSET(Triangle,v0);
 			const int V1 = (triangle || line) ? OFFSET(Triangle,v1) : OFFSET(Triangle,v0);
@@ -76,7 +74,7 @@
 			Int d = 1;     // Winding direction
 
 			// Culling
-			if(solidTriangle)
+			if(triangle)
 			{
 				Float x0 = Float(X[0]);
 				Float x1 = Float(X[1]);
@@ -141,7 +139,7 @@
 			Int n = *Pointer<Int>(polygon + OFFSET(Polygon,n));
 			Int m = *Pointer<Int>(polygon + OFFSET(Polygon,i));
 
-			If(m != 0 || Bool(!solidTriangle))   // Clipped triangle; reproject
+			If(m != 0 || Bool(!triangle))   // Clipped triangle; reproject
 			{
 				Pointer<Byte> V = polygon + OFFSET(Polygon,P) + m * sizeof(void*) * 16;
 
@@ -279,7 +277,7 @@
 			*Pointer<Int>(primitive + OFFSET(Primitive,yMax)) = yMax;
 
 			// Sort by minimum y
-			if(solidTriangle && logPrecision >= WHQL)
+			if(triangle)
 			{
 				Float y0 = *Pointer<Float>(v0 + pos * 16 + 4);
 				Float y1 = *Pointer<Float>(v1 + pos * 16 + 4);
@@ -292,7 +290,7 @@
 			}
 
 			// Sort by maximum w
-			if(solidTriangle)
+			if(triangle)
 			{
 				Float w0 = *Pointer<Float>(v0 + pos * 16 + 12);
 				Float w1 = *Pointer<Float>(v1 + pos * 16 + 12);
@@ -463,16 +461,11 @@
 
 					if(attribute != Unused)
 					{
-						setupGradient(primitive, tri, w012, M, v0, v1, v2, OFFSET(Vertex,v[attribute][component]), OFFSET(Primitive,V[interpolant][component]), flat, sprite, state.perspective, wrap, component);
+						setupGradient(primitive, tri, w012, M, v0, v1, v2, OFFSET(Vertex,v[attribute][component]), OFFSET(Primitive,V[interpolant][component]), flat, point, state.perspective, wrap, component);
 					}
 				}
 			}
 
-			if(state.fog.attribute == Fog)
-			{
-				setupGradient(primitive, tri, w012, M, v0, v1, v2, OFFSET(Vertex,f), OFFSET(Primitive,f), state.fog.flat, false, state.perspective, false, 0);
-			}
-
 			Return(true);
 		}
 
@@ -521,7 +514,7 @@
 				m = Max(m, *Pointer<Float>(v2 + attribute));
 				m -= 0.5f;
 
-				// FIXME: Vectorize
+				// TODO: Vectorize
 				If(Float(i.x) < m) i.x = i.x + 1.0f;
 				If(Float(i.y) < m) i.y = i.y + 1.0f;
 				If(Float(i.z) < m) i.z = i.z + 1.0f;
diff --git a/src/Pipeline/VertexPipeline.cpp b/src/Pipeline/VertexPipeline.cpp
deleted file mode 100644
index 129d8a8..0000000
--- a/src/Pipeline/VertexPipeline.cpp
+++ /dev/null
@@ -1,953 +0,0 @@
-// 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.
-
-#include "VertexPipeline.hpp"
-
-#include "Renderer/Vertex.hpp"
-#include "Renderer/Renderer.hpp"
-#include "Common/Debug.hpp"
-
-#include <string.h>
-#include <stdlib.h>
-#include <stdio.h>
-
-#undef max
-#undef min
-
-namespace sw
-{
-	extern bool secondaryColor;
-
-	VertexPipeline::VertexPipeline(const VertexProcessor::State &state) : VertexRoutine(state, 0)
-	{
-	}
-
-	VertexPipeline::~VertexPipeline()
-	{
-	}
-
-	Vector4f VertexPipeline::transformBlend(const Register &src, const Pointer<Byte> &matrix, bool homogeneous)
-	{
-		Vector4f dst;
-
-		if(state.vertexBlendMatrixCount == 0)
-		{
-			dst = transform(src, matrix, homogeneous);
-		}
-		else
-		{
-			UInt index0[4];
-			UInt index1[4];
-			UInt index2[4];
-			UInt index3[4];
-
-			if(state.indexedVertexBlendEnable)
-			{
-				for(int i = 0; i < 4; i++)
-				{
-					Float4 B = v[BlendIndices].x;
-					UInt indices;
-
-					switch(i)
-					{
-					case 0: indices = As<UInt>(Float(B.x)); break;
-					case 1: indices = As<UInt>(Float(B.y)); break;
-					case 2: indices = As<UInt>(Float(B.z)); break;
-					case 3: indices = As<UInt>(Float(B.w)); break;
-					}
-
-					index0[i] = (indices & 0x000000FF) << 6;
-					index1[i] = (indices & 0x0000FF00) >> 2;
-					index2[i] = (indices & 0x00FF0000) >> 10;
-					index3[i] = (indices & 0xFF000000) >> 18;
-				}
-			}
-			else
-			{
-				for(int i = 0; i < 4; i++)
-				{
-					index0[i] = 0 * 64;
-					index1[i] = 1 * 64;
-					index2[i] = 2 * 64;
-					index3[i] = 3 * 64;
-				}
-			}
-
-			Float4 weight0;
-			Float4 weight1;
-			Float4 weight2;
-			Float4 weight3;
-
-			switch(state.vertexBlendMatrixCount)
-			{
-			case 4: weight2 = v[BlendWeight].z;
-			case 3: weight1 = v[BlendWeight].y;
-			case 2: weight0 = v[BlendWeight].x;
-			case 1:
-				break;
-			}
-
-			if(state.vertexBlendMatrixCount == 1)
-			{
-				dst = transform(src, matrix, index0, homogeneous);
-			}
-			else if(state.vertexBlendMatrixCount == 2)
-			{
-				weight1 = Float4(1.0f) - weight0;
-
-				Vector4f pos0;
-				Vector4f pos1;
-
-				pos0 = transform(src, matrix, index0, homogeneous);
-				pos1 = transform(src, matrix, index1, homogeneous);
-
-				dst.x = pos0.x * weight0 + pos1.x * weight1;   // FIXME: Vector4f operators
-				dst.y = pos0.y * weight0 + pos1.y * weight1;
-				dst.z = pos0.z * weight0 + pos1.z * weight1;
-				dst.w = pos0.w * weight0 + pos1.w * weight1;
-			}
-			else if(state.vertexBlendMatrixCount == 3)
-			{
-				weight2 = Float4(1.0f) - (weight0 + weight1);
-
-				Vector4f pos0;
-				Vector4f pos1;
-				Vector4f pos2;
-
-				pos0 = transform(src, matrix, index0, homogeneous);
-				pos1 = transform(src, matrix, index1, homogeneous);
-				pos2 = transform(src, matrix, index2, homogeneous);
-
-				dst.x = pos0.x * weight0 + pos1.x * weight1 + pos2.x * weight2;
-				dst.y = pos0.y * weight0 + pos1.y * weight1 + pos2.y * weight2;
-				dst.z = pos0.z * weight0 + pos1.z * weight1 + pos2.z * weight2;
-				dst.w = pos0.w * weight0 + pos1.w * weight1 + pos2.w * weight2;
-			}
-			else if(state.vertexBlendMatrixCount == 4)
-			{
-				weight3 = Float4(1.0f) - (weight0 + weight1 + weight2);
-
-				Vector4f pos0;
-				Vector4f pos1;
-				Vector4f pos2;
-				Vector4f pos3;
-
-				pos0 = transform(src, matrix, index0, homogeneous);
-				pos1 = transform(src, matrix, index1, homogeneous);
-				pos2 = transform(src, matrix, index2, homogeneous);
-				pos3 = transform(src, matrix, index3, homogeneous);
-
-				dst.x = pos0.x * weight0 + pos1.x * weight1 + pos2.x * weight2 + pos3.x * weight3;
-				dst.y = pos0.y * weight0 + pos1.y * weight1 + pos2.y * weight2 + pos3.y * weight3;
-				dst.z = pos0.z * weight0 + pos1.z * weight1 + pos2.z * weight2 + pos3.z * weight3;
-				dst.w = pos0.w * weight0 + pos1.w * weight1 + pos2.w * weight2 + pos3.w * weight3;
-			}
-		}
-
-		return dst;
-	}
-
-	void VertexPipeline::pipeline(UInt &index)
-	{
-		Vector4f position;
-		Vector4f normal;
-
-		if(!state.preTransformed)
-		{
-			position = transformBlend(v[Position], Pointer<Byte>(data + OFFSET(DrawData,ff.transformT)), true);
-		}
-		else
-		{
-			position = v[PositionT];
-		}
-
-		o[Pos].x = position.x;
-		o[Pos].y = position.y;
-		o[Pos].z = position.z;
-		o[Pos].w = position.w;
-
-		Vector4f vertexPosition = transformBlend(v[Position], Pointer<Byte>(data + OFFSET(DrawData,ff.cameraTransformT)), true);
-
-		if(state.vertexNormalActive)
-		{
-			normal = transformBlend(v[Normal], Pointer<Byte>(data + OFFSET(DrawData,ff.normalTransformT)), false);
-
-			if(state.normalizeNormals)
-			{
-				normal = normalize(normal);
-			}
-		}
-
-		if(!state.vertexLightingActive)
-		{
-			// FIXME: Don't process if not used at all
-			if(state.diffuseActive && state.input[Color0])
-			{
-				Vector4f diffuse = v[Color0];
-
-				o[C0].x = diffuse.x;
-				o[C0].y = diffuse.y;
-				o[C0].z = diffuse.z;
-				o[C0].w = diffuse.w;
-			}
-			else
-			{
-				o[C0].x = Float4(1.0f);
-				o[C0].y = Float4(1.0f);
-				o[C0].z = Float4(1.0f);
-				o[C0].w = Float4(1.0f);
-			}
-
-			// FIXME: Don't process if not used at all
-			if(state.specularActive && state.input[Color1])
-			{
-				Vector4f specular = v[Color1];
-
-				o[C1].x = specular.x;
-				o[C1].y = specular.y;
-				o[C1].z = specular.z;
-				o[C1].w = specular.w;
-			}
-			else
-			{
-				o[C1].x = Float4(0.0f);
-				o[C1].y = Float4(0.0f);
-				o[C1].z = Float4(0.0f);
-				o[C1].w = Float4(1.0f);
-			}
-		}
-		else
-		{
-			o[C0].x = Float4(0.0f);
-			o[C0].y = Float4(0.0f);
-			o[C0].z = Float4(0.0f);
-			o[C0].w = Float4(0.0f);
-
-			o[C1].x = Float4(0.0f);
-			o[C1].y = Float4(0.0f);
-			o[C1].z = Float4(0.0f);
-			o[C1].w = Float4(0.0f);
-
-			Vector4f ambient;
-			Float4 globalAmbient = *Pointer<Float4>(data + OFFSET(DrawData,ff.globalAmbient));   // FIXME: Unpack
-
-			ambient.x = globalAmbient.x;
-			ambient.y = globalAmbient.y;
-			ambient.z = globalAmbient.z;
-
-			for(int i = 0; i < 8; i++)
-			{
-				if(!(state.vertexLightActive & (1 << i)))
-				{
-					continue;
-				}
-
-				Vector4f L;    // Light vector
-				Float4 att;   // Attenuation
-
-				// Attenuation
-				{
-					Float4 d;   // Distance
-
-					L.x = L.y = L.z = *Pointer<Float4>(data + OFFSET(DrawData,ff.lightPosition[i]));   // FIXME: Unpack
-					L.x = L.x.xxxx;
-					L.y = L.y.yyyy;
-					L.z = L.z.zzzz;
-
-					L.x -= vertexPosition.x;
-					L.y -= vertexPosition.y;
-					L.z -= vertexPosition.z;
-					d = dot3(L, L);
-					d = RcpSqrt_pp(d);     // FIXME: Sufficient precision?
-					L.x *= d;
-					L.y *= d;
-					L.z *= d;
-					d = Rcp_pp(d);       // FIXME: Sufficient precision?
-
-					Float4 q = *Pointer<Float4>(data + OFFSET(DrawData,ff.attenuationQuadratic[i]));
-					Float4 l = *Pointer<Float4>(data + OFFSET(DrawData,ff.attenuationLinear[i]));
-					Float4 c = *Pointer<Float4>(data + OFFSET(DrawData,ff.attenuationConstant[i]));
-
-					att = Rcp_pp((q * d + l) * d + c);
-				}
-
-				// Ambient per light
-				{
-					Float4 lightAmbient = *Pointer<Float4>(data + OFFSET(DrawData,ff.lightAmbient[i]));   // FIXME: Unpack
-
-					ambient.x = ambient.x + lightAmbient.x * att;
-					ambient.y = ambient.y + lightAmbient.y * att;
-					ambient.z = ambient.z + lightAmbient.z * att;
-				}
-
-				// Diffuse
-				if(state.vertexNormalActive)
-				{
-					Float4 dot;
-
-					dot = dot3(L, normal);
-					dot = Max(dot, Float4(0.0f));
-					dot *= att;
-
-					Vector4f diff;
-
-					if(state.vertexDiffuseMaterialSourceActive == MATERIAL_MATERIAL)
-					{
-						diff.x = diff.y = diff.z = *Pointer<Float4>(data + OFFSET(DrawData,ff.materialDiffuse));   // FIXME: Unpack
-						diff.x = diff.x.xxxx;
-						diff.y = diff.y.yyyy;
-						diff.z = diff.z.zzzz;
-					}
-					else if(state.vertexDiffuseMaterialSourceActive == MATERIAL_COLOR1)
-					{
-						diff = v[Color0];
-					}
-					else if(state.vertexDiffuseMaterialSourceActive == MATERIAL_COLOR2)
-					{
-						diff = v[Color1];
-					}
-					else ASSERT(false);
-
-					Float4 lightDiffuse = *Pointer<Float4>(data + OFFSET(DrawData,ff.lightDiffuse[i]));
-
-					o[C0].x = o[C0].x + diff.x * dot * lightDiffuse.x;   // FIXME: Clamp first?
-					o[C0].y = o[C0].y + diff.y * dot * lightDiffuse.y;   // FIXME: Clamp first?
-					o[C0].z = o[C0].z + diff.z * dot * lightDiffuse.z;   // FIXME: Clamp first?
-				}
-
-				// Specular
-				if(state.vertexSpecularActive)
-				{
-					Vector4f S;
-					Vector4f C;   // Camera vector
-					Float4 pow;
-
-					pow = *Pointer<Float>(data + OFFSET(DrawData,ff.materialShininess));
-
-					S.x = Float4(0.0f) - vertexPosition.x;
-					S.y = Float4(0.0f) - vertexPosition.y;
-					S.z = Float4(0.0f) - vertexPosition.z;
-					C = normalize(S);
-
-					S.x = L.x + C.x;
-					S.y = L.y + C.y;
-					S.z = L.z + C.z;
-					C = normalize(S);
-
-					Float4 dot = Max(dot3(C, normal), Float4(0.0f));   // FIXME: max(dot3(C, normal), 0)
-
-					Float4 P = power(dot, pow);
-					P *= att;
-
-					Vector4f spec;
-
-					if(state.vertexSpecularMaterialSourceActive == MATERIAL_MATERIAL)
-					{
-						Float4 materialSpecular = *Pointer<Float4>(data + OFFSET(DrawData,ff.materialSpecular));   // FIXME: Unpack
-
-						spec.x = materialSpecular.x;
-						spec.y = materialSpecular.y;
-						spec.z = materialSpecular.z;
-					}
-					else if(state.vertexSpecularMaterialSourceActive == MATERIAL_COLOR1)
-					{
-						spec = v[Color0];
-					}
-					else if(state.vertexSpecularMaterialSourceActive == MATERIAL_COLOR2)
-					{
-						spec = v[Color1];
-					}
-					else ASSERT(false);
-
-					Float4 lightSpecular = *Pointer<Float4>(data + OFFSET(DrawData,ff.lightSpecular[i]));
-
-					spec.x *= lightSpecular.x;
-					spec.y *= lightSpecular.y;
-					spec.z *= lightSpecular.z;
-
-					spec.x *= P;
-					spec.y *= P;
-					spec.z *= P;
-
-					spec.x = Max(spec.x, Float4(0.0f));
-					spec.y = Max(spec.y, Float4(0.0f));
-					spec.z = Max(spec.z, Float4(0.0f));
-
-					if(secondaryColor)
-					{
-						o[C1].x = o[C1].x + spec.x;
-						o[C1].y = o[C1].y + spec.y;
-						o[C1].z = o[C1].z + spec.z;
-					}
-					else
-					{
-						o[C0].x = o[C0].x + spec.x;
-						o[C0].y = o[C0].y + spec.y;
-						o[C0].z = o[C0].z + spec.z;
-					}
-				}
-			}
-
-			if(state.vertexAmbientMaterialSourceActive == MATERIAL_MATERIAL)
-			{
-				Float4 materialAmbient = *Pointer<Float4>(data + OFFSET(DrawData,ff.materialAmbient));   // FIXME: Unpack
-
-				ambient.x = ambient.x * materialAmbient.x;
-				ambient.y = ambient.y * materialAmbient.y;
-				ambient.z = ambient.z * materialAmbient.z;
-			}
-			else if(state.vertexAmbientMaterialSourceActive == MATERIAL_COLOR1)
-			{
-				Vector4f materialDiffuse = v[Color0];
-
-				ambient.x = ambient.x * materialDiffuse.x;
-				ambient.y = ambient.y * materialDiffuse.y;
-				ambient.z = ambient.z * materialDiffuse.z;
-			}
-			else if(state.vertexAmbientMaterialSourceActive == MATERIAL_COLOR2)
-			{
-				Vector4f materialSpecular = v[Color1];
-
-				ambient.x = ambient.x * materialSpecular.x;
-				ambient.y = ambient.y * materialSpecular.y;
-				ambient.z = ambient.z * materialSpecular.z;
-			}
-			else ASSERT(false);
-
-			o[C0].x = o[C0].x + ambient.x;
-			o[C0].y = o[C0].y + ambient.y;
-			o[C0].z = o[C0].z + ambient.z;
-
-			// Emissive
-			if(state.vertexEmissiveMaterialSourceActive == MATERIAL_MATERIAL)
-			{
-				Float4 materialEmission = *Pointer<Float4>(data + OFFSET(DrawData,ff.materialEmission));   // FIXME: Unpack
-
-				o[C0].x = o[C0].x + materialEmission.x;
-				o[C0].y = o[C0].y + materialEmission.y;
-				o[C0].z = o[C0].z + materialEmission.z;
-			}
-			else if(state.vertexEmissiveMaterialSourceActive == MATERIAL_COLOR1)
-			{
-				Vector4f materialSpecular = v[Color0];
-
-				o[C0].x = o[C0].x + materialSpecular.x;
-				o[C0].y = o[C0].y + materialSpecular.y;
-				o[C0].z = o[C0].z + materialSpecular.z;
-			}
-			else if(state.vertexEmissiveMaterialSourceActive == MATERIAL_COLOR2)
-			{
-				Vector4f materialSpecular = v[Color1];
-
-				o[C0].x = o[C0].x + materialSpecular.x;
-				o[C0].y = o[C0].y + materialSpecular.y;
-				o[C0].z = o[C0].z + materialSpecular.z;
-			}
-			else ASSERT(false);
-
-			// Diffuse alpha component
-			if(state.vertexDiffuseMaterialSourceActive == MATERIAL_MATERIAL)
-			{
-				o[C0].w = Float4(*Pointer<Float4>(data + OFFSET(DrawData,ff.materialDiffuse[0]))).wwww;   // FIXME: Unpack
-			}
-			else if(state.vertexDiffuseMaterialSourceActive == MATERIAL_COLOR1)
-			{
-				Vector4f alpha = v[Color0];
-				o[C0].w = alpha.w;
-			}
-			else if(state.vertexDiffuseMaterialSourceActive == MATERIAL_COLOR2)
-			{
-				Vector4f alpha = v[Color1];
-				o[C0].w = alpha.w;
-			}
-			else ASSERT(false);
-
-			if(state.vertexSpecularActive)
-			{
-				// Specular alpha component
-				if(state.vertexSpecularMaterialSourceActive == MATERIAL_MATERIAL)
-				{
-					o[C1].w = Float4(*Pointer<Float4>(data + OFFSET(DrawData,ff.materialSpecular[3]))).wwww;   // FIXME: Unpack
-				}
-				else if(state.vertexSpecularMaterialSourceActive == MATERIAL_COLOR1)
-				{
-					Vector4f alpha = v[Color0];
-					o[C1].w = alpha.w;
-				}
-				else if(state.vertexSpecularMaterialSourceActive == MATERIAL_COLOR2)
-				{
-					Vector4f alpha = v[Color1];
-					o[C1].w = alpha.w;
-				}
-				else ASSERT(false);
-			}
-		}
-
-		if(state.fogActive)
-		{
-			Float4 f;
-
-			if(!state.rangeFogActive)
-			{
-				f = Abs(vertexPosition.z);
-			}
-			else
-			{
-				f = Sqrt(dot3(vertexPosition, vertexPosition));   // FIXME: f = length(vertexPosition);
-			}
-
-			switch(state.vertexFogMode)
-			{
-			case FOG_NONE:
-				if(state.specularActive)
-				{
-					o[Fog].x = o[C1].w;
-				}
-				else
-				{
-					o[Fog].x = Float4(0.0f);
-				}
-				break;
-			case FOG_LINEAR:
-				o[Fog].x = f * *Pointer<Float4>(data + OFFSET(DrawData,fog.scale)) + *Pointer<Float4>(data + OFFSET(DrawData,fog.offset));
-				break;
-			case FOG_EXP:
-				o[Fog].x = exponential2(f * *Pointer<Float4>(data + OFFSET(DrawData,fog.densityE)), true);
-				break;
-			case FOG_EXP2:
-				o[Fog].x = exponential2((f * f) * *Pointer<Float4>(data + OFFSET(DrawData,fog.density2E)), true);
-				break;
-			default:
-				ASSERT(false);
-			}
-		}
-
-		for(int stage = 0; stage < 8; stage++)
-		{
-			processTextureCoordinate(stage, normal, position);
-		}
-
-		processPointSize();
-	}
-
-	void VertexPipeline::processTextureCoordinate(int stage, Vector4f &normal, Vector4f &position)
-	{
-		if(state.output[T0 + stage].write)
-		{
-			int i = state.textureState[stage].texCoordIndexActive;
-
-			switch(state.textureState[stage].texGenActive)
-			{
-			case TEXGEN_NONE:
-				{
-					Vector4f &&varying = v[TexCoord0 + i];
-
-					o[T0 + stage].x = varying.x;
-					o[T0 + stage].y = varying.y;
-					o[T0 + stage].z = varying.z;
-					o[T0 + stage].w = varying.w;
-				}
-				break;
-			case TEXGEN_PASSTHRU:
-				{
-					Vector4f &&varying = v[TexCoord0 + i];
-
-					o[T0 + stage].x = varying.x;
-					o[T0 + stage].y = varying.y;
-					o[T0 + stage].z = varying.z;
-					o[T0 + stage].w = varying.w;
-
-					if(state.input[TexCoord0 + i])
-					{
-						switch(state.input[TexCoord0 + i].count)
-						{
-						case 1:
-							o[T0 + stage].y = Float4(1.0f);
-							o[T0 + stage].z = Float4(0.0f);
-							o[T0 + stage].w = Float4(0.0f);
-							break;
-						case 2:
-							o[T0 + stage].z = Float4(1.0f);
-							o[T0 + stage].w = Float4(0.0f);
-							break;
-						case 3:
-							o[T0 + stage].w = Float4(1.0f);
-							break;
-						case 4:
-							break;
-						default:
-							ASSERT(false);
-						}
-					}
-				}
-				break;
-			case TEXGEN_NORMAL:
-				{
-					Vector4f Nc;   // Normal vector in camera space
-
-					if(state.vertexNormalActive)
-					{
-						Nc = normal;
-					}
-					else
-					{
-						Nc.x = Float4(0.0f);
-						Nc.y = Float4(0.0f);
-						Nc.z = Float4(0.0f);
-					}
-
-					Nc.w = Float4(1.0f);
-
-					o[T0 + stage].x = Nc.x;
-					o[T0 + stage].y = Nc.y;
-					o[T0 + stage].z = Nc.z;
-					o[T0 + stage].w = Nc.w;
-				}
-				break;
-			case TEXGEN_POSITION:
-				{
-					Vector4f Pn = transformBlend(v[Position], Pointer<Byte>(data + OFFSET(DrawData,ff.cameraTransformT)), true);   // Position in camera space
-
-					Pn.w = Float4(1.0f);
-
-					o[T0 + stage].x = Pn.x;
-					o[T0 + stage].y = Pn.y;
-					o[T0 + stage].z = Pn.z;
-					o[T0 + stage].w = Pn.w;
-				}
-				break;
-			case TEXGEN_REFLECTION:
-				{
-					Vector4f R;   // Reflection vector
-
-					if(state.vertexNormalActive)
-					{
-						Vector4f Nc;   // Normal vector in camera space
-
-						Nc = normal;
-
-						if(state.localViewerActive)
-						{
-							Vector4f Ec;   // Eye vector in camera space
-							Vector4f N2;
-
-							Ec = transformBlend(v[Position], Pointer<Byte>(data + OFFSET(DrawData,ff.cameraTransformT)), true);
-							Ec = normalize(Ec);
-
-							// R = E - 2 * N * (E . N)
-							Float4 dot = Float4(2.0f) * dot3(Ec, Nc);
-
-							R.x = Ec.x - Nc.x * dot;
-							R.y = Ec.y - Nc.y * dot;
-							R.z = Ec.z - Nc.z * dot;
-						}
-						else
-						{
-							// u = -2 * Nz * Nx
-							// v = -2 * Nz * Ny
-							// w = 1 - 2 * Nz * Nz
-
-							R.x = -Float4(2.0f) * Nc.z * Nc.x;
-							R.y = -Float4(2.0f) * Nc.z * Nc.y;
-							R.z = Float4(1.0f) - Float4(2.0f) * Nc.z * Nc.z;
-						}
-					}
-					else
-					{
-						R.x = Float4(0.0f);
-						R.y = Float4(0.0f);
-						R.z = Float4(0.0f);
-					}
-
-					R.w = Float4(1.0f);
-
-					o[T0 + stage].x = R.x;
-					o[T0 + stage].y = R.y;
-					o[T0 + stage].z = R.z;
-					o[T0 + stage].w = R.w;
-				}
-				break;
-			case TEXGEN_SPHEREMAP:
-				{
-					Vector4f R;   // Reflection vector
-
-					if(state.vertexNormalActive)
-					{
-						Vector4f Nc;   // Normal vector in camera space
-
-						Nc = normal;
-
-						if(state.localViewerActive)
-						{
-							Vector4f Ec;   // Eye vector in camera space
-							Vector4f N2;
-
-							Ec = transformBlend(v[Position], Pointer<Byte>(data + OFFSET(DrawData,ff.cameraTransformT)), true);
-							Ec = normalize(Ec);
-
-							// R = E - 2 * N * (E . N)
-							Float4 dot = Float4(2.0f) * dot3(Ec, Nc);
-
-							R.x = Ec.x - Nc.x * dot;
-							R.y = Ec.y - Nc.y * dot;
-							R.z = Ec.z - Nc.z * dot;
-						}
-						else
-						{
-							// u = -2 * Nz * Nx
-							// v = -2 * Nz * Ny
-							// w = 1 - 2 * Nz * Nz
-
-							R.x = -Float4(2.0f) * Nc.z * Nc.x;
-							R.y = -Float4(2.0f) * Nc.z * Nc.y;
-							R.z = Float4(1.0f) - Float4(2.0f) * Nc.z * Nc.z;
-						}
-					}
-					else
-					{
-						R.x = Float4(0.0f);
-						R.y = Float4(0.0f);
-						R.z = Float4(0.0f);
-					}
-
-					R.z -= Float4(1.0f);
-					R = normalize(R);
-					R.x = Float4(0.5f) * R.x + Float4(0.5f);
-					R.y = Float4(0.5f) * R.y + Float4(0.5f);
-
-					R.z = Float4(1.0f);
-					R.w = Float4(0.0f);
-
-					o[T0 + stage].x = R.x;
-					o[T0 + stage].y = R.y;
-					o[T0 + stage].z = R.z;
-					o[T0 + stage].w = R.w;
-				}
-				break;
-			default:
-				ASSERT(false);
-			}
-
-			Vector4f texTrans0;
-			Vector4f texTrans1;
-			Vector4f texTrans2;
-			Vector4f texTrans3;
-
-			Vector4f T;
-			Vector4f t;
-
-			T.x = o[T0 + stage].x;
-			T.y = o[T0 + stage].y;
-			T.z = o[T0 + stage].z;
-			T.w = o[T0 + stage].w;
-
-			switch(state.textureState[stage].textureTransformCountActive)
-			{
-			case 4:
-				texTrans3.x = texTrans3.y = texTrans3.z = texTrans3.w = *Pointer<Float4>(data + OFFSET(DrawData,ff.textureTransform[stage][3]));   // FIXME: Unpack
-				texTrans3.x = texTrans3.x.xxxx;
-				texTrans3.y = texTrans3.y.yyyy;
-				texTrans3.z = texTrans3.z.zzzz;
-				texTrans3.w = texTrans3.w.wwww;
-				t.w = dot4(T, texTrans3);
-			case 3:
-				texTrans2.x = texTrans2.y = texTrans2.z = texTrans2.w = *Pointer<Float4>(data + OFFSET(DrawData,ff.textureTransform[stage][2]));   // FIXME: Unpack
-				texTrans2.x = texTrans2.x.xxxx;
-				texTrans2.y = texTrans2.y.yyyy;
-				texTrans2.z = texTrans2.z.zzzz;
-				texTrans2.w = texTrans2.w.wwww;
-				t.z = dot4(T, texTrans2);
-			case 2:
-				texTrans1.x = texTrans1.y = texTrans1.z = texTrans1.w = *Pointer<Float4>(data + OFFSET(DrawData,ff.textureTransform[stage][1]));   // FIXME: Unpack
-				texTrans1.x = texTrans1.x.xxxx;
-				texTrans1.y = texTrans1.y.yyyy;
-				texTrans1.z = texTrans1.z.zzzz;
-				texTrans1.w = texTrans1.w.wwww;
-				t.y = dot4(T, texTrans1);
-			case 1:
-				texTrans0.x = texTrans0.y = texTrans0.z = texTrans0.w = *Pointer<Float4>(data + OFFSET(DrawData,ff.textureTransform[stage][0]));   // FIXME: Unpack
-				texTrans0.x = texTrans0.x.xxxx;
-				texTrans0.y = texTrans0.y.yyyy;
-				texTrans0.z = texTrans0.z.zzzz;
-				texTrans0.w = texTrans0.w.wwww;
-				t.x = dot4(T, texTrans0);
-
-				o[T0 + stage].x = t.x;
-				o[T0 + stage].y = t.y;
-				o[T0 + stage].z = t.z;
-				o[T0 + stage].w = t.w;
-			case 0:
-				break;
-			default:
-				ASSERT(false);
-			}
-		}
-	}
-
-	void VertexPipeline::processPointSize()
-	{
-		if(!state.pointSizeActive)
-		{
-			return;   // Use global pointsize
-		}
-
-		if(state.input[PointSize])
-		{
-			o[Pts].y = v[PointSize].x;
-		}
-		else
-		{
-			o[Pts].y = *Pointer<Float4>(data + OFFSET(DrawData,point.pointSize));
-		}
-
-		if(state.pointScaleActive && !state.preTransformed)
-		{
-			Vector4f p = transformBlend(v[Position], Pointer<Byte>(data + OFFSET(DrawData,ff.cameraTransformT)), true);
-
-			Float4 d = Sqrt(dot3(p, p));   // FIXME: length(p);
-
-			Float4 A = *Pointer<Float>(data + OFFSET(DrawData,point.pointScaleA));   // FIXME: Unpack
-			Float4 B = *Pointer<Float>(data + OFFSET(DrawData,point.pointScaleB));   // FIXME: Unpack
-			Float4 C = *Pointer<Float>(data + OFFSET(DrawData,point.pointScaleC));   // FIXME: Unpack
-
-			A = RcpSqrt_pp(A + d * (B + d * C));
-
-			o[Pts].y = o[Pts].y * Float4(*Pointer<Float>(data + OFFSET(DrawData,viewportHeight))) * A;   // FIXME: Unpack
-		}
-	}
-
-	Vector4f VertexPipeline::transform(const Register &src, const Pointer<Byte> &matrix, bool homogeneous)
-	{
-		Vector4f dst;
-
-		if(homogeneous)
-		{
-			Float4 m[4][4];
-
-			for(int j = 0; j < 4; j++)
-			{
-				for(int i = 0; i < 4; i++)
-				{
-					m[j][i].x = *Pointer<Float>(matrix + 16 * i + 4 * j);
-					m[j][i].y = *Pointer<Float>(matrix + 16 * i + 4 * j);
-					m[j][i].z = *Pointer<Float>(matrix + 16 * i + 4 * j);
-					m[j][i].w = *Pointer<Float>(matrix + 16 * i + 4 * j);
-				}
-			}
-
-			dst.x = src.x * m[0][0] + src.y * m[0][1] + src.z * m[0][2] + src.w * m[0][3];
-			dst.y = src.x * m[1][0] + src.y * m[1][1] + src.z * m[1][2] + src.w * m[1][3];
-			dst.z = src.x * m[2][0] + src.y * m[2][1] + src.z * m[2][2] + src.w * m[2][3];
-			dst.w = src.x * m[3][0] + src.y * m[3][1] + src.z * m[3][2] + src.w * m[3][3];
-		}
-		else
-		{
-			Float4 m[3][3];
-
-			for(int j = 0; j < 3; j++)
-			{
-				for(int i = 0; i < 3; i++)
-				{
-					m[j][i].x = *Pointer<Float>(matrix + 16 * i + 4 * j);
-					m[j][i].y = *Pointer<Float>(matrix + 16 * i + 4 * j);
-					m[j][i].z = *Pointer<Float>(matrix + 16 * i + 4 * j);
-					m[j][i].w = *Pointer<Float>(matrix + 16 * i + 4 * j);
-				}
-			}
-
-			dst.x = src.x * m[0][0] + src.y * m[0][1] + src.z * m[0][2];
-			dst.y = src.x * m[1][0] + src.y * m[1][1] + src.z * m[1][2];
-			dst.z = src.x * m[2][0] + src.y * m[2][1] + src.z * m[2][2];
-		}
-
-		return dst;
-	}
-
-	Vector4f VertexPipeline::transform(const Register &src, const Pointer<Byte> &matrix, UInt index[4], bool homogeneous)
-	{
-		Vector4f dst;
-
-		if(homogeneous)
-		{
-			Float4 m[4][4];
-
-			for(int j = 0; j < 4; j++)
-			{
-				for(int i = 0; i < 4; i++)
-				{
-					m[j][i].x = *Pointer<Float>(matrix + 16 * i + 4 * j + index[0]);
-					m[j][i].y = *Pointer<Float>(matrix + 16 * i + 4 * j + index[1]);
-					m[j][i].z = *Pointer<Float>(matrix + 16 * i + 4 * j + index[2]);
-					m[j][i].w = *Pointer<Float>(matrix + 16 * i + 4 * j + index[3]);
-				}
-			}
-
-			dst.x = src.x * m[0][0] + src.y * m[0][1] + src.z * m[0][2] + m[0][3];
-			dst.y = src.x * m[1][0] + src.y * m[1][1] + src.z * m[1][2] + m[1][3];
-			dst.z = src.x * m[2][0] + src.y * m[2][1] + src.z * m[2][2] + m[2][3];
-			dst.w = src.x * m[3][0] + src.y * m[3][1] + src.z * m[3][2] + m[3][3];
-		}
-		else
-		{
-			Float4 m[3][3];
-
-			for(int j = 0; j < 3; j++)
-			{
-				for(int i = 0; i < 3; i++)
-				{
-					m[j][i].x = *Pointer<Float>(matrix + 16 * i + 4 * j + index[0]);
-					m[j][i].y = *Pointer<Float>(matrix + 16 * i + 4 * j + index[1]);
-					m[j][i].z = *Pointer<Float>(matrix + 16 * i + 4 * j + index[2]);
-					m[j][i].w = *Pointer<Float>(matrix + 16 * i + 4 * j + index[3]);
-				}
-			}
-
-			dst.x = src.x * m[0][0] + src.y * m[0][1] + src.z * m[0][2];
-			dst.y = src.x * m[1][0] + src.y * m[1][1] + src.z * m[1][2];
-			dst.z = src.x * m[2][0] + src.y * m[2][1] + src.z * m[2][2];
-		}
-
-		return dst;
-	}
-
-	Vector4f VertexPipeline::normalize(Vector4f &src)
-	{
-		Vector4f dst;
-
-		Float4 rcpLength = RcpSqrt_pp(dot3(src, src));
-
-		dst.x = src.x * rcpLength;
-		dst.y = src.y * rcpLength;
-		dst.z = src.z * rcpLength;
-
-		return dst;
-	}
-
-	Float4 VertexPipeline::power(Float4 &src0, Float4 &src1)
-	{
-		Float4 dst = src0;
-
-		dst = dst * dst;
-		dst = dst * dst;
-		dst = Float4(As<Int4>(dst) - As<Int4>(Float4(1.0f)));
-
-		dst *= src1;
-
-		dst = As<Float4>(Int4(dst) + As<Int4>(Float4(1.0f)));
-		dst = RcpSqrt_pp(dst);
-		dst = RcpSqrt_pp(dst);
-
-		return dst;
-	}
-}
diff --git a/src/Pipeline/VertexPipeline.hpp b/src/Pipeline/VertexPipeline.hpp
deleted file mode 100644
index 852c76a..0000000
--- a/src/Pipeline/VertexPipeline.hpp
+++ /dev/null
@@ -1,45 +0,0 @@
-// 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_VertexPipeline_hpp
-#define sw_VertexPipeline_hpp
-
-#include "VertexRoutine.hpp"
-
-#include "Device/Context.hpp"
-#include "Device/VertexProcessor.hpp"
-
-namespace sw
-{
-	class VertexPipeline : public VertexRoutine
-	{
-	public:
-		VertexPipeline(const VertexProcessor::State &state);
-
-		virtual ~VertexPipeline();
-
-	private:
-		void pipeline(UInt &index) override;
-		void processTextureCoordinate(int stage, Vector4f &normal, Vector4f &position);
-		void processPointSize();
-
-		Vector4f transformBlend(const Register &src, const Pointer<Byte> &matrix, bool homogenous);
-		Vector4f transform(const Register &src, const Pointer<Byte> &matrix, bool homogenous);
-		Vector4f transform(const Register &src, const Pointer<Byte> &matrix, UInt index[4], bool homogenous);
-		Vector4f normalize(Vector4f &src);
-		Float4 power(Float4 &src0, Float4 &src1);
-	};
-};
-
-#endif   // sw_VertexPipeline_hpp
diff --git a/src/Pipeline/VertexProgram.cpp b/src/Pipeline/VertexProgram.cpp
index a24bb40..816af77 100644
--- a/src/Pipeline/VertexProgram.cpp
+++ b/src/Pipeline/VertexProgram.cpp
@@ -59,21 +59,9 @@
 	{
 	}
 
-	void VertexProgram::pipeline(UInt &index)
-	{
-		if(!state.preTransformed)
-		{
-			program(index);
-		}
-		else
-		{
-			passThrough();
-		}
-	}
-
 	void VertexProgram::program(UInt &index)
 	{
-	//	shader->print("VertexShader-%0.8X.txt", state.shaderID);
+		//	shader->print("VertexShader-%0.8X.txt", state.shaderID);
 
 		unsigned short shaderModel = shader->getShaderModel();
 
@@ -418,7 +406,7 @@
 						if(dst.w) pDst.w = o[C0 + dst.index].w;
 						break;
 					case Shader::PARAMETER_TEXCRDOUT:
-				//	case Shader::PARAMETER_OUTPUT:
+						//	case Shader::PARAMETER_OUTPUT:
 						if(shaderModel < 0x0300)
 						{
 							if(dst.x) pDst.x = o[T0 + dst.index].x;
@@ -564,7 +552,7 @@
 					if(dst.w) o[C0 + dst.index].w = d.w;
 					break;
 				case Shader::PARAMETER_TEXCRDOUT:
-			//	case Shader::PARAMETER_OUTPUT:
+					//	case Shader::PARAMETER_OUTPUT:
 					if(shaderModel < 0x0300)
 					{
 						if(dst.x) o[T0 + dst.index].x = d.x;
@@ -613,74 +601,6 @@
 		}
 	}
 
-	void VertexProgram::passThrough()
-	{
-		if(shader)
-		{
-			for(int i = 0; i < MAX_VERTEX_OUTPUTS; i++)
-			{
-				unsigned char usage = shader->getOutput(i, 0).usage;
-
-				switch(usage)
-				{
-				case 0xFF:
-					continue;
-				case Shader::USAGE_PSIZE:
-					o[i].y = v[i].x;
-					break;
-				case Shader::USAGE_TEXCOORD:
-					o[i].x = v[i].x;
-					o[i].y = v[i].y;
-					o[i].z = v[i].z;
-					o[i].w = v[i].w;
-					break;
-				case Shader::USAGE_POSITION:
-					o[i].x = v[i].x;
-					o[i].y = v[i].y;
-					o[i].z = v[i].z;
-					o[i].w = v[i].w;
-					break;
-				case Shader::USAGE_COLOR:
-					o[i].x = v[i].x;
-					o[i].y = v[i].y;
-					o[i].z = v[i].z;
-					o[i].w = v[i].w;
-					break;
-				case Shader::USAGE_FOG:
-					o[i].x = v[i].x;
-					break;
-				default:
-					ASSERT(false);
-				}
-			}
-		}
-		else
-		{
-			o[Pos].x = v[PositionT].x;
-			o[Pos].y = v[PositionT].y;
-			o[Pos].z = v[PositionT].z;
-			o[Pos].w = v[PositionT].w;
-
-			for(int i = 0; i < 2; i++)
-			{
-				o[C0 + i].x = v[Color0 + i].x;
-				o[C0 + i].y = v[Color0 + i].y;
-				o[C0 + i].z = v[Color0 + i].z;
-				o[C0 + i].w = v[Color0 + i].w;
-			}
-
-			for(int i = 0; i < 8; i++)
-			{
-				o[T0 + i].x = v[TexCoord0 + i].x;
-				o[T0 + i].y = v[TexCoord0 + i].y;
-				o[T0 + i].z = v[TexCoord0 + i].z;
-				o[T0 + i].w = v[TexCoord0 + i].w;
-			}
-
-			o[Pts].y = v[PointSize].x;
-		}
-	}
-
 	Vector4f VertexProgram::fetchRegister(const Src &src, unsigned int offset)
 	{
 		Vector4f reg;
diff --git a/src/Pipeline/VertexProgram.hpp b/src/Pipeline/VertexProgram.hpp
index b008d91..9d46b6a 100644
--- a/src/Pipeline/VertexProgram.hpp
+++ b/src/Pipeline/VertexProgram.hpp
@@ -63,9 +63,7 @@
 		typedef Shader::Control Control;
 		typedef Shader::Usage Usage;
 
-		void pipeline(UInt &index) override;
-		void program(UInt &index);
-		void passThrough();
+		void program(UInt &index) override;
 
 		Vector4f fetchRegister(const Src &src, unsigned int offset = 0);
 		Vector4f readConstant(const Src &src, unsigned int offset = 0);
diff --git a/src/Pipeline/VertexRoutine.cpp b/src/Pipeline/VertexRoutine.cpp
index 916230f..592daa0 100644
--- a/src/Pipeline/VertexRoutine.cpp
+++ b/src/Pipeline/VertexRoutine.cpp
@@ -62,7 +62,7 @@
 				*Pointer<UInt>(tagCache + tagIndex) = indexQ;
 
 				readInput(indexQ);
-				pipeline(indexQ);
+				program(indexQ);
 				postTransform();
 				computeClipFlags();
 
@@ -130,11 +130,6 @@
 
 		Int4 finiteXYZ = finiteX & finiteY & finiteZ;
 		clipFlags |= *Pointer<Int>(constants + OFFSET(Constants,fini) + SignMask(finiteXYZ) * 4);
-
-		if(state.preTransformed)
-		{
-			clipFlags &= 0xFBFBFBFB;   // Don't clip against far clip plane
-		}
 	}
 
 	Vector4f VertexRoutine::readStream(Pointer<Byte> &buffer, UInt &stride, const Stream &stream, const UInt &index)
@@ -612,33 +607,11 @@
 	{
 		int pos = state.positionRegister;
 
-		// Backtransform
-		if(state.preTransformed)
-		{
-			Float4 rhw = Float4(1.0f) / o[pos].w;
-
-			Float4 W = *Pointer<Float4>(data + OFFSET(DrawData,Wx16)) * Float4(1.0f / 16.0f);
-			Float4 H = *Pointer<Float4>(data + OFFSET(DrawData,Hx16)) * Float4(1.0f / 16.0f);
-			Float4 L = *Pointer<Float4>(data + OFFSET(DrawData,X0x16)) * Float4(1.0f / 16.0f);
-			Float4 T = *Pointer<Float4>(data + OFFSET(DrawData,Y0x16)) * Float4(1.0f / 16.0f);
-
-			o[pos].x = (o[pos].x - L) / W * rhw;
-			o[pos].y = (o[pos].y - T) / H * rhw;
-			o[pos].z = o[pos].z * rhw;
-			o[pos].w = rhw;
-		}
-
-		if(!halfIntegerCoordinates && !state.preTransformed)
+		if(!halfIntegerCoordinates)
 		{
 			o[pos].x = o[pos].x + *Pointer<Float4>(data + OFFSET(DrawData,halfPixelX)) * o[pos].w;
 			o[pos].y = o[pos].y + *Pointer<Float4>(data + OFFSET(DrawData,halfPixelY)) * o[pos].w;
 		}
-
-		if(state.superSampling)
-		{
-			o[pos].x = o[pos].x + *Pointer<Float4>(data + OFFSET(DrawData,XXXX)) * o[pos].w;
-			o[pos].y = o[pos].y + *Pointer<Float4>(data + OFFSET(DrawData,YYYY)) * o[pos].w;
-		}
 	}
 
 	void VertexRoutine::writeCache(Pointer<Byte> &cacheLine)
diff --git a/src/Pipeline/VertexRoutine.hpp b/src/Pipeline/VertexRoutine.hpp
index 9837fdc..f1f180d 100644
--- a/src/Pipeline/VertexRoutine.hpp
+++ b/src/Pipeline/VertexRoutine.hpp
@@ -54,7 +54,7 @@
 		const VertexProcessor::State &state;
 
 	private:
-		virtual void pipeline(UInt &index) = 0;
+		virtual void program(UInt &index) = 0;
 
 		typedef VertexProcessor::State::Input Stream;
 
diff --git a/src/Renderer/Context.hpp b/src/Renderer/Context.hpp
index d9110d8..8b5a8eb 100644
--- a/src/Renderer/Context.hpp
+++ b/src/Renderer/Context.hpp
@@ -455,8 +455,6 @@
 		float fogStart;
 		float fogEnd;
 
-		void computeIllumination();
-
 		bool textureWrapActive;
 		unsigned char textureWrap[TEXTURE_IMAGE_UNITS];
 		TexGen texGen[8];
diff --git a/src/Vulkan/Version.h b/src/Vulkan/Version.h
index 2629a34..002d880 100644
--- a/src/Vulkan/Version.h
+++ b/src/Vulkan/Version.h
@@ -15,7 +15,7 @@
 #define MAJOR_VERSION 5
 #define MINOR_VERSION 0
 #define BUILD_VERSION 0
-#define BUILD_REVISION 0
+#define BUILD_REVISION 1
 
 #define STRINGIFY(x) #x
 #define MACRO_STRINGIFY(x) STRINGIFY(x)
diff --git a/src/Vulkan/vulkan.vcxproj b/src/Vulkan/vulkan.vcxproj
index 252979f..5258dc6 100644
--- a/src/Vulkan/vulkan.vcxproj
+++ b/src/Vulkan/vulkan.vcxproj
@@ -127,11 +127,9 @@
     <ClCompile Include="..\Device\SetupProcessor.cpp" />
     <ClCompile Include="..\Device\Surface.cpp" />
     <ClCompile Include="..\Device\SwiftConfig.cpp" />
-    <ClCompile Include="..\Device\TextureStage.cpp" />
     <ClCompile Include="..\Device\Vector.cpp" />
     <ClCompile Include="..\Device\VertexProcessor.cpp" />
     <ClCompile Include="..\Pipeline\Constants.cpp" />
-    <ClCompile Include="..\Pipeline\PixelPipeline.cpp" />
     <ClCompile Include="..\Pipeline\PixelProgram.cpp" />
     <ClCompile Include="..\Pipeline\PixelRoutine.cpp" />
     <ClCompile Include="..\Pipeline\PixelShader.cpp" />
@@ -139,7 +137,6 @@
     <ClCompile Include="..\Pipeline\SetupRoutine.cpp" />
     <ClCompile Include="..\Pipeline\Shader.cpp" />
     <ClCompile Include="..\Pipeline\ShaderCore.cpp" />
-    <ClCompile Include="..\Pipeline\VertexPipeline.cpp" />
     <ClCompile Include="..\Pipeline\VertexProgram.cpp" />
     <ClCompile Include="..\Pipeline\VertexRoutine.cpp" />
     <ClCompile Include="..\Pipeline\VertexShader.cpp" />
@@ -224,13 +221,11 @@
     <ClInclude Include="..\Device\Stream.hpp" />
     <ClInclude Include="..\Device\Surface.hpp" />
     <ClInclude Include="..\Device\SwiftConfig.hpp" />
-    <ClInclude Include="..\Device\TextureStage.hpp" />
     <ClInclude Include="..\Device\Triangle.hpp" />
     <ClInclude Include="..\Device\Vector.hpp" />
     <ClInclude Include="..\Device\Vertex.hpp" />
     <ClInclude Include="..\Device\VertexProcessor.hpp" />
     <ClInclude Include="..\Pipeline\Constants.hpp" />
-    <ClInclude Include="..\Pipeline\PixelPipeline.hpp" />
     <ClInclude Include="..\Pipeline\PixelProgram.hpp" />
     <ClInclude Include="..\Pipeline\PixelRoutine.hpp" />
     <ClInclude Include="..\Pipeline\PixelShader.hpp" />
diff --git a/src/Vulkan/vulkan.vcxproj.filters b/src/Vulkan/vulkan.vcxproj.filters
index f8661bd..297d7e3 100644
--- a/src/Vulkan/vulkan.vcxproj.filters
+++ b/src/Vulkan/vulkan.vcxproj.filters
@@ -51,9 +51,6 @@
     <ClCompile Include="..\Device\Vector.cpp">
       <Filter>Source Files\Device</Filter>
     </ClCompile>
-    <ClCompile Include="..\Device\TextureStage.cpp">
-      <Filter>Source Files\Device</Filter>
-    </ClCompile>
     <ClCompile Include="..\Device\SwiftConfig.cpp">
       <Filter>Source Files\Device</Filter>
     </ClCompile>
@@ -111,9 +108,6 @@
     <ClCompile Include="..\Pipeline\VertexProgram.cpp">
       <Filter>Source Files\Pipeline</Filter>
     </ClCompile>
-    <ClCompile Include="..\Pipeline\VertexPipeline.cpp">
-      <Filter>Source Files\Pipeline</Filter>
-    </ClCompile>
     <ClCompile Include="..\Pipeline\ShaderCore.cpp">
       <Filter>Source Files\Pipeline</Filter>
     </ClCompile>
@@ -135,9 +129,6 @@
     <ClCompile Include="..\Pipeline\PixelProgram.cpp">
       <Filter>Source Files\Pipeline</Filter>
     </ClCompile>
-    <ClCompile Include="..\Pipeline\PixelPipeline.cpp">
-      <Filter>Source Files\Pipeline</Filter>
-    </ClCompile>
     <ClCompile Include="..\Pipeline\Constants.cpp">
       <Filter>Source Files\Pipeline</Filter>
     </ClCompile>
@@ -302,9 +293,6 @@
     <ClInclude Include="..\Device\Triangle.hpp">
       <Filter>Header Files\Device</Filter>
     </ClInclude>
-    <ClInclude Include="..\Device\TextureStage.hpp">
-      <Filter>Header Files\Device</Filter>
-    </ClInclude>
     <ClInclude Include="..\Device\SwiftConfig.hpp">
       <Filter>Header Files\Device</Filter>
     </ClInclude>
@@ -431,9 +419,6 @@
     <ClInclude Include="..\Pipeline\PixelProgram.hpp">
       <Filter>Header Files\Pipeline</Filter>
     </ClInclude>
-    <ClInclude Include="..\Pipeline\PixelPipeline.hpp">
-      <Filter>Header Files\Pipeline</Filter>
-    </ClInclude>
     <ClInclude Include="..\Pipeline\Constants.hpp">
       <Filter>Header Files\Pipeline</Filter>
     </ClInclude>
