diff --git a/src/Pipeline/PixelRoutine.cpp b/src/Pipeline/PixelRoutine.cpp
index cc69777..e510e6a 100644
--- a/src/Pipeline/PixelRoutine.cpp
+++ b/src/Pipeline/PixelRoutine.cpp
@@ -24,10 +24,6 @@
 
 namespace sw
 {
-	extern bool postBlendSRGB;
-	extern bool exactColorRounding;
-	extern bool forceClearRegisters;
-
 	PixelRoutine::PixelRoutine(
 			const PixelProcessor::State &state,
 			vk::PipelineLayout const *pipelineLayout,
@@ -40,12 +36,12 @@
 		if (spirvShader)
 		{
 			spirvShader->emitProlog(&routine);
-			if (forceClearRegisters)
+
+			// Clearing inputs to 0 is not demanded by the spec,
+			// but it makes the undefined behavior deterministic.
+			for(int i = 0; i < MAX_INTERFACE_COMPONENTS; i++)
 			{
-				for (int i = 0; i < MAX_INTERFACE_COMPONENTS; i++)
-				{
-					routine.inputs[i] = Float4(0.0f);
-				}
+				routine.inputs[i] = Float4(0.0f);
 			}
 		}
 	}
@@ -56,10 +52,6 @@
 
 	void PixelRoutine::quad(Pointer<Byte> cBuffer[RENDERTARGETS], Pointer<Byte> &zBuffer, Pointer<Byte> &sBuffer, Int cMask[4], Int &x, Int &y)
 	{
-		#if PERF_PROFILE
-			Long pipeTime = Ticks();
-		#endif
-
 		// TODO: consider shader which modifies sample mask in general
 		const bool earlyDepthTest = !spirvShader || (!spirvShader->getModes().DepthReplacing && !state.alphaToCoverage);
 
@@ -109,10 +101,6 @@
 
 		If(depthPass || Bool(!earlyDepthTest))
 		{
-			#if PERF_PROFILE
-				Long interpTime = Ticks();
-			#endif
-
 			Float4 yyyy = Float4(Float(y)) + *Pointer<Float4>(primitive + OFFSET(Primitive,yQuad), 16);
 
 			// Centroid locations
@@ -176,25 +164,13 @@
 				setBuiltins(x, y, z, w);
 			}
 
-			#if PERF_PROFILE
-				cycles[PERF_INTERP] += Ticks() - interpTime;
-			#endif
-
 			Bool alphaPass = true;
 
-			#if PERF_PROFILE
-				Long shaderTime = Ticks();
-			#endif
-
 			if (spirvShader)
 			{
 				applyShader(cMask);
 			}
 
-			#if PERF_PROFILE
-				cycles[PERF_SHADER] += Ticks() - shaderTime;
-			#endif
-
 			alphaPass = alphaTest(cMask);
 
 			if((spirvShader && spirvShader->getModes().ContainsKill) || state.alphaToCoverage)
@@ -216,10 +192,6 @@
 					}
 				}
 
-				#if PERF_PROFILE
-					Long ropTime = Ticks();
-				#endif
-
 				If(depthPass || Bool(earlyDepthTest))
 				{
 					for(unsigned int q = 0; q < state.multiSample; q++)
@@ -235,16 +207,8 @@
 						}
 					}
 
-					#if PERF_PROFILE
-						AddAtomic(Pointer<Long>(&profiler.ropOperations), 4);
-					#endif
-
 					rasterOperation(cBuffer, x, sMask, zMask, cMask);
 				}
-
-				#if PERF_PROFILE
-					cycles[PERF_ROP] += Ticks() - ropTime;
-				#endif
 			}
 		}
 
@@ -255,10 +219,6 @@
 				writeStencil(sBuffer, q, x, sMask[q], zMask[q], cMask[q]);
 			}
 		}
-
-		#if PERF_PROFILE
-			cycles[PERF_PIPE] += Ticks() - pipeTime;
-		#endif
 	}
 
 	Float4 PixelRoutine::interpolateCentroid(Float4 &x, Float4 &y, Float4 &rhw, Pointer<Byte> planeEquation, bool flat, bool perspective)
@@ -1102,7 +1062,7 @@
 			UNIMPLEMENTED("VkFormat %d", state.targetFormat[index]);
 		}
 
-		if(postBlendSRGB || isSRGB(index))
+		if(isSRGB(index))
 		{
 			sRGBtoLinear16_12_16(pixel);
 		}
@@ -1229,36 +1189,33 @@
 
 	void PixelRoutine::writeColor(int index, Pointer<Byte> &cBuffer, Int &x, Vector4s &current, Int &sMask, Int &zMask, Int &cMask)
 	{
-		if(postBlendSRGB || isSRGB(index))
+		if(isSRGB(index))
 		{
 			linearToSRGB16_12_16(current);
 		}
 
-		if(exactColorRounding)
+		switch(state.targetFormat[index])
 		{
-			switch(state.targetFormat[index])
-			{
-			case VK_FORMAT_R5G6B5_UNORM_PACK16:
-				current.x = AddSat(As<UShort4>(current.x), UShort4(0x0400));
-				current.y = AddSat(As<UShort4>(current.y), UShort4(0x0200));
-				current.z = AddSat(As<UShort4>(current.z), UShort4(0x0400));
-				break;
-			case VK_FORMAT_B8G8R8A8_UNORM:
-			case VK_FORMAT_B8G8R8A8_SRGB:
-			case VK_FORMAT_R8G8B8A8_UNORM:
-			case VK_FORMAT_R8G8B8A8_SRGB:
-			case VK_FORMAT_R8G8_UNORM:
-			case VK_FORMAT_R8_UNORM:
-			case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
-			case VK_FORMAT_A8B8G8R8_SRGB_PACK32:
-				current.x = current.x - As<Short4>(As<UShort4>(current.x) >> 8) + Short4(0x0080);
-				current.y = current.y - As<Short4>(As<UShort4>(current.y) >> 8) + Short4(0x0080);
-				current.z = current.z - As<Short4>(As<UShort4>(current.z) >> 8) + Short4(0x0080);
-				current.w = current.w - As<Short4>(As<UShort4>(current.w) >> 8) + Short4(0x0080);
-				break;
-			default:
-				break;
-			}
+		case VK_FORMAT_R5G6B5_UNORM_PACK16:
+			current.x = AddSat(As<UShort4>(current.x), UShort4(0x0400));
+			current.y = AddSat(As<UShort4>(current.y), UShort4(0x0200));
+			current.z = AddSat(As<UShort4>(current.z), UShort4(0x0400));
+			break;
+		case VK_FORMAT_B8G8R8A8_UNORM:
+		case VK_FORMAT_B8G8R8A8_SRGB:
+		case VK_FORMAT_R8G8B8A8_UNORM:
+		case VK_FORMAT_R8G8B8A8_SRGB:
+		case VK_FORMAT_R8G8_UNORM:
+		case VK_FORMAT_R8_UNORM:
+		case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
+		case VK_FORMAT_A8B8G8R8_SRGB_PACK32:
+			current.x = current.x - As<Short4>(As<UShort4>(current.x) >> 8) + Short4(0x0080);
+			current.y = current.y - As<Short4>(As<UShort4>(current.y) >> 8) + Short4(0x0080);
+			current.z = current.z - As<Short4>(As<UShort4>(current.z) >> 8) + Short4(0x0080);
+			current.w = current.w - As<Short4>(As<UShort4>(current.w) >> 8) + Short4(0x0080);
+			break;
+		default:
+			break;
 		}
 
 		int rgbaWriteMask = state.colorWriteActive(index);
@@ -1956,7 +1913,7 @@
 			UNIMPLEMENTED("VkFormat: %d", int(state.targetFormat[index]));
 		}
 
-		if(postBlendSRGB || isSRGB(index))
+		if(isSRGB(index))
 		{
 			sRGBtoLinear(pixel.x);
 			sRGBtoLinear(pixel.y);
