Update SwiftShader to April code dump.

April code dump from Transgaming. Adds new shader compiler.
diff --git a/src/Renderer/Surface.cpp b/src/Renderer/Surface.cpp
index d072a15..3767123 100644
--- a/src/Renderer/Surface.cpp
+++ b/src/Renderer/Surface.cpp
@@ -1,6 +1,6 @@
 // SwiftShader Software Renderer
 //
-// Copyright(c) 2005-2011 TransGaming Inc.
+// Copyright(c) 2005-2012 TransGaming Inc.
 //
 // All rights reserved. No part of this software may be copied, distributed, transmitted,
 // transcribed, stored in a retrieval system, translated into any human or computer
@@ -13,12 +13,13 @@
 
 #include "Color.hpp"
 #include "Context.hpp"
+#include "Renderer.hpp"
 #include "Common/Half.hpp"
 #include "Common/Memory.hpp"
 #include "Common/CPUID.hpp"
 #include "Common/Resource.hpp"
 #include "Common/Debug.hpp"
-#include "Reactor/Shell.hpp"
+#include "Reactor/Reactor.hpp"
 
 #include <xmmintrin.h>
 #include <emmintrin.h>
@@ -35,6 +36,14 @@
 	unsigned int *Surface::palette = 0;
 	unsigned int Surface::paletteID = 0;
 
+	void Rect::clip(int minX, int minY, int maxX, int maxY)
+	{
+		x0 = sw::clamp(x0, minX, maxX);
+		y0 = sw::clamp(y0, minY, maxY);
+		x1 = sw::clamp(x1, minX, maxX);
+		y1 = sw::clamp(y1, minY, maxY);
+	}
+
 	void Surface::Buffer::write(int x, int y, int z, const Color<float> &color)
 	{
 		void *element = (unsigned char*)buffer + x * bytes + y * pitchB + z * sliceB;
@@ -624,7 +633,7 @@
 		return c00 + c10 + c01 + c11;
 	}
 
-	void *Surface::Buffer::lockRect(int left, int top, int front, Lock lock)
+	void *Surface::Buffer::lockRect(int x, int y, int z, Lock lock)
 	{
 		this->lock = lock;
 
@@ -647,14 +656,14 @@
 		#if S3TC_SUPPORT
 		case FORMAT_DXT1:
 		case FORMAT_ATI1:
-			return (unsigned char*)buffer + 8 * (left / 4) + (top / 4) * pitchB + front * sliceB;
+			return (unsigned char*)buffer + 8 * (x / 4) + (y / 4) * pitchB + z * sliceB;
 		case FORMAT_DXT3:
 		case FORMAT_DXT5:
 		case FORMAT_ATI2:
-			return (unsigned char*)buffer + 16 * (left / 4) + (top / 4) * pitchB + front * sliceB;
+			return (unsigned char*)buffer + 16 * (x / 4) + (y / 4) * pitchB + z * sliceB;
 		#endif
 		default:
-			return (unsigned char*)buffer + left * bytes + top * pitchB + front * sliceB;
+			return (unsigned char*)buffer + x * bytes + y * pitchB + z * sliceB;
 		}
 
 		return 0;
@@ -668,7 +677,7 @@
 	Surface::Surface(Resource *texture, int width, int height, int depth, Format format, bool lockable, bool renderTarget) : lockable(lockable), renderTarget(renderTarget)
 	{
 		resource = texture ? texture : new Resource(0);
-		hasParent = texture;
+		hasParent = texture != 0;
 		depth = max(1, depth);
 
 		external.buffer = 0;
@@ -720,6 +729,9 @@
 	{
 		if(!hasParent)
 		{
+			// Synchronize so we can deallocate the buffers below
+			resource->lock(DESTRUCT);
+			resource->unlock();
 			resource->destruct();
 		}
 
@@ -737,7 +749,7 @@
 		stencil.buffer = 0;
 	}
 
-	void *Surface::lockExternal(int left, int top, int front, Lock lock, Accessor client)
+	void *Surface::lockExternal(int x, int y, int z, Lock lock, Accessor client)
 	{
 		resource->lock(client);
 
@@ -774,7 +786,7 @@
 			ASSERT(false);
 		}
 
-		return external.lockRect(left, top, front, lock);
+		return external.lockRect(x, y, z, lock);
 	}
 
 	void Surface::unlockExternal()
@@ -784,7 +796,7 @@
 		external.unlockRect();
 	}
 
-	void *Surface::lockInternal(int left, int top, int front, Lock lock, Accessor client)
+	void *Surface::lockInternal(int x, int y, int z, Lock lock, Accessor client)
 	{
 		if(lock != LOCK_UNLOCKED)
 		{
@@ -860,7 +872,7 @@
 			resolve();
 		}
 
-		return internal.lockRect(left, top, front, lock);
+		return internal.lockRect(x, y, z, lock);
 	}
 
 	void Surface::unlockInternal()
@@ -2066,9 +2078,7 @@
 		int width4 = (width + 3) & ~3;
 		int height4 = (height + 3) & ~3;
 
-		void *buffer = allocate(size(width4, height4, depth, format));
-
-		return buffer;
+		return allocate(size(width4, height4, depth, format));
 	}
 
 	void Surface::memfill(void *buffer, int pattern, int bytes)
@@ -2199,7 +2209,7 @@
 					case FORMAT_A8R8G8B8:
 				//	case FORMAT_X8G8R8B8Q:   // FIXME
 				//	case FORMAT_A8G8R8B8Q:   // FIXME
-						if(rgbaMask == 0xF || (internal.format == FORMAT_X8R8G8B8 && rgbaMask == 0xF))
+						if(rgbaMask == 0xF || (internal.format == FORMAT_X8R8G8B8 && rgbaMask == 0x7))
 						{
 							memfill(target, color, 4 * (x1 - x0));
 						}