Refactor implementation constants.

Bug 19353282

Change-Id: If2eb9f2d78c3a44b720bb1f223711411b576d710
Reviewed-on: https://swiftshader-review.googlesource.com/5140
Reviewed-by: Alexis Hétu <sugoi@google.com>
Tested-by: Nicolas Capens <capn@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/Common/Math.hpp b/src/Common/Math.hpp
index 47a13f5..086c6c6 100644
--- a/src/Common/Math.hpp
+++ b/src/Common/Math.hpp
@@ -92,38 +92,41 @@
 	}

 

 	#define BITS(x)    ( \

-	!!(x & 0x80000000) + \

-	!!(x & 0xC0000000) + \

-	!!(x & 0xE0000000) + \

-	!!(x & 0xF0000000) + \

-	!!(x & 0xF8000000) + \

-	!!(x & 0xFC000000) + \

-	!!(x & 0xFE000000) + \

-	!!(x & 0xFF000000) + \

-	!!(x & 0xFF800000) + \

-	!!(x & 0xFFC00000) + \

-	!!(x & 0xFFE00000) + \

-	!!(x & 0xFFF00000) + \

-	!!(x & 0xFFF80000) + \

-	!!(x & 0xFFFC0000) + \

-	!!(x & 0xFFFE0000) + \

-	!!(x & 0xFFFF0000) + \

-	!!(x & 0xFFFF8000) + \

-	!!(x & 0xFFFFC000) + \

-	!!(x & 0xFFFFE000) + \

-	!!(x & 0xFFFFF000) + \

-	!!(x & 0xFFFFF800) + \

-	!!(x & 0xFFFFFC00) + \

-	!!(x & 0xFFFFFE00) + \

-	!!(x & 0xFFFFFF00) + \

-	!!(x & 0xFFFFFF80) + \

-	!!(x & 0xFFFFFFC0) + \

-	!!(x & 0xFFFFFFE0) + \

-	!!(x & 0xFFFFFFF0) + \

-	!!(x & 0xFFFFFFF8) + \

-	!!(x & 0xFFFFFFFC) + \

-	!!(x & 0xFFFFFFFE) + \

-	!!(x & 0xFFFFFFFF))

+	!!((x) & 0x80000000) + \

+	!!((x) & 0xC0000000) + \

+	!!((x) & 0xE0000000) + \

+	!!((x) & 0xF0000000) + \

+	!!((x) & 0xF8000000) + \

+	!!((x) & 0xFC000000) + \

+	!!((x) & 0xFE000000) + \

+	!!((x) & 0xFF000000) + \

+	!!((x) & 0xFF800000) + \

+	!!((x) & 0xFFC00000) + \

+	!!((x) & 0xFFE00000) + \

+	!!((x) & 0xFFF00000) + \

+	!!((x) & 0xFFF80000) + \

+	!!((x) & 0xFFFC0000) + \

+	!!((x) & 0xFFFE0000) + \

+	!!((x) & 0xFFFF0000) + \

+	!!((x) & 0xFFFF8000) + \

+	!!((x) & 0xFFFFC000) + \

+	!!((x) & 0xFFFFE000) + \

+	!!((x) & 0xFFFFF000) + \

+	!!((x) & 0xFFFFF800) + \

+	!!((x) & 0xFFFFFC00) + \

+	!!((x) & 0xFFFFFE00) + \

+	!!((x) & 0xFFFFFF00) + \

+	!!((x) & 0xFFFFFF80) + \

+	!!((x) & 0xFFFFFFC0) + \

+	!!((x) & 0xFFFFFFE0) + \

+	!!((x) & 0xFFFFFFF0) + \

+	!!((x) & 0xFFFFFFF8) + \

+	!!((x) & 0xFFFFFFFC) + \

+	!!((x) & 0xFFFFFFFE) + \

+	!!((x) & 0xFFFFFFFF))

+

+	#define MAX(x, y) ((x) > (y) ? (x) : (y))

+	#define MIN(x, y) ((x) < (y) ? (x) : (y))

 

 	inline float exp2(float x)

 	{

diff --git a/src/D3D9/Direct3D9.cpp b/src/D3D9/Direct3D9.cpp
index 298b22f..de8a86e 100644
--- a/src/D3D9/Direct3D9.cpp
+++ b/src/D3D9/Direct3D9.cpp
@@ -1446,11 +1446,11 @@
 							D3DLINECAPS_TEXTURE |	// Supports texture-mapping. 
 							D3DLINECAPS_ZTEST;		// Supports z-buffer comparisons.
 		
-		caps.MaxTextureWidth = 1 << (MIPMAP_LEVELS - 1);
-		caps.MaxTextureHeight = 1 << (MIPMAP_LEVELS - 1);
-		caps.MaxVolumeExtent = 1 << (MIPMAP_LEVELS - 1);
+		caps.MaxTextureWidth = 1 << (sw::MIPMAP_LEVELS - 1);
+		caps.MaxTextureHeight = 1 << (sw::MIPMAP_LEVELS - 1);
+		caps.MaxVolumeExtent = 1 << (sw::MIPMAP_LEVELS - 1);
 		caps.MaxTextureRepeat = 8192;
-		caps.MaxTextureAspectRatio = 1 << (MIPMAP_LEVELS - 1);
+		caps.MaxTextureAspectRatio = 1 << (sw::MIPMAP_LEVELS - 1);
 		caps.MaxAnisotropy = maxAnisotropy;
 		caps.MaxVertexW = 1e+010;
 
diff --git a/src/D3D9/Direct3DCubeTexture9.cpp b/src/D3D9/Direct3DCubeTexture9.cpp
index 992095e..7907788 100644
--- a/src/D3D9/Direct3DCubeTexture9.cpp
+++ b/src/D3D9/Direct3DCubeTexture9.cpp
@@ -32,10 +32,10 @@
 			int width = edgeLength;
 			int height = edgeLength;
 
-			for(unsigned int level = 0; level < MIPMAP_LEVELS; level++)
+			for(unsigned int level = 0; level < sw::MIPMAP_LEVELS; level++)
 			{
 				if(level < this->levels)
-				{					
+				{
 					surfaceLevel[face][level] = new Direct3DSurface9(device, this, width, height, format, pool, D3DMULTISAMPLE_NONE, 0, false, usage);
 					surfaceLevel[face][level]->bind();
 				}
@@ -56,7 +56,7 @@
 
 		for(unsigned int face = 0; face < 6; face++)
 		{
-			for(int level = 0; level < MIPMAP_LEVELS; level++)
+			for(int level = 0; level < sw::MIPMAP_LEVELS; level++)
 			{
 				if(surfaceLevel[face][level])
 				{
diff --git a/src/D3D9/Direct3DCubeTexture9.hpp b/src/D3D9/Direct3DCubeTexture9.hpp
index bead8ec..a86bb0d 100644
--- a/src/D3D9/Direct3DCubeTexture9.hpp
+++ b/src/D3D9/Direct3DCubeTexture9.hpp
@@ -66,7 +66,7 @@
 		// Creation parameters
 		const unsigned int edgeLength;
 
-		Direct3DSurface9 *surfaceLevel[6][MIPMAP_LEVELS];
+		Direct3DSurface9 *surfaceLevel[6][sw::MIPMAP_LEVELS];
 	};
 }
 
diff --git a/src/D3D9/Direct3DDevice9.cpp b/src/D3D9/Direct3DDevice9.cpp
index 9000357..299ec85 100644
--- a/src/D3D9/Direct3DDevice9.cpp
+++ b/src/D3D9/Direct3DDevice9.cpp
@@ -145,14 +145,14 @@
 			SetTransform(D3DTS_WORLDMATRIX(i), &identity);

 		}

 

-		for(int i = 0; i < FRAGMENT_UNIFORM_VECTORS; i++)

+		for(int i = 0; i < MAX_PIXEL_SHADER_CONST; i++)

 		{

 			float zero[4] = {0, 0, 0, 0};

 

 			SetPixelShaderConstantF(i, zero, 1);

 		}

 

-		for(int i = 0; i < VERTEX_UNIFORM_VECTORS; i++)

+		for(int i = 0; i < MAX_VERTEX_SHADER_CONST; i++)

 		{

 			float zero[4] = {0, 0, 0, 0};

 

@@ -565,7 +565,7 @@
 

 		*surface = 0;

 

-		if(width == 0 || height == 0 || d3d9->CheckDeviceFormat(adapter, deviceType, D3DFMT_X8R8G8B8, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, format) != D3D_OK || height > OUTLINE_RESOLUTION)

+		if(width == 0 || height == 0 || d3d9->CheckDeviceFormat(adapter, deviceType, D3DFMT_X8R8G8B8, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, format) != D3D_OK || height > sw::OUTLINE_RESOLUTION)

 		{

 			return INVALIDCALL();

 		}

@@ -779,7 +779,7 @@
 

 		*surface = 0;

 

-		if(width == 0 || height == 0 || d3d9->CheckDeviceFormat(adapter, deviceType, D3DFMT_X8R8G8B8, D3DUSAGE_RENDERTARGET, D3DRTYPE_SURFACE, format) != D3D_OK || height > OUTLINE_RESOLUTION)

+		if(width == 0 || height == 0 || d3d9->CheckDeviceFormat(adapter, deviceType, D3DFMT_X8R8G8B8, D3DUSAGE_RENDERTARGET, D3DRTYPE_SURFACE, format) != D3D_OK || height > sw::OUTLINE_RESOLUTION)

 		{

 			return INVALIDCALL();

 		}

@@ -2969,7 +2969,7 @@
 

 		if(!stateRecorder)

 		{

-			for(unsigned int i = 0; i < count && startRegister + i < FRAGMENT_UNIFORM_VECTORS; i++)

+			for(unsigned int i = 0; i < count && startRegister + i < MAX_PIXEL_SHADER_CONST; i++)

 			{

 				pixelShaderConstantF[startRegister + i][0] = constantData[i * 4 + 0];

 				pixelShaderConstantF[startRegister + i][1] = constantData[i * 4 + 1];

@@ -5245,7 +5245,7 @@
 

 		if(!stateRecorder)

 		{

-			for(unsigned int i = 0; i < count && startRegister + i < VERTEX_UNIFORM_VECTORS; i++)

+			for(unsigned int i = 0; i < count && startRegister + i < MAX_VERTEX_SHADER_CONST; i++)

 			{

 				vertexShaderConstantF[startRegister + i][0] = constantData[i * 4 + 0];

 				vertexShaderConstantF[startRegister + i][1] = constantData[i * 4 + 1];

@@ -6087,7 +6087,7 @@
 						Direct3DTexture9 *texture = dynamic_cast<Direct3DTexture9*>(baseTexture);

 						Direct3DSurface9 *surface;

 

-						for(int mipmapLevel = 0; mipmapLevel < MIPMAP_LEVELS; mipmapLevel++)

+						for(int mipmapLevel = 0; mipmapLevel < sw::MIPMAP_LEVELS; mipmapLevel++)

 						{

 							int surfaceLevel = mipmapLevel;

 

@@ -6116,7 +6116,7 @@
 						Direct3DCubeTexture9 *cubeTexture = dynamic_cast<Direct3DCubeTexture9*>(baseTexture);

 						Direct3DSurface9 *surface;

 

-						for(int mipmapLevel = 0; mipmapLevel < MIPMAP_LEVELS; mipmapLevel++)

+						for(int mipmapLevel = 0; mipmapLevel < sw::MIPMAP_LEVELS; mipmapLevel++)

 						{

 							int surfaceLevel = mipmapLevel;

 

@@ -6144,7 +6144,7 @@
 						Direct3DVolumeTexture9 *volumeTexture = dynamic_cast<Direct3DVolumeTexture9*>(baseTexture);

 						Direct3DVolume9 *volume;

 

-						for(int mipmapLevel = 0; mipmapLevel < MIPMAP_LEVELS; mipmapLevel++)

+						for(int mipmapLevel = 0; mipmapLevel < sw::MIPMAP_LEVELS; mipmapLevel++)

 						{

 							int surfaceLevel = mipmapLevel;

 

diff --git a/src/D3D9/Direct3DDevice9.hpp b/src/D3D9/Direct3DDevice9.hpp
index c854678..06bad2d 100644
--- a/src/D3D9/Direct3DDevice9.hpp
+++ b/src/D3D9/Direct3DDevice9.hpp
@@ -42,6 +42,12 @@
 	class Direct3DIndexBuffer9;
 	class CriticalSection;
 
+	enum
+	{
+		MAX_VERTEX_SHADER_CONST = MIN(256, sw::VERTEX_UNIFORM_VECTORS),
+		MAX_PIXEL_SHADER_CONST = MIN(224, sw::FRAGMENT_UNIFORM_VECTORS),
+	};
+
 	class Direct3DDevice9 : public IDirect3DDevice9, public Unknown
 	{
 		friend CriticalSection;
@@ -264,11 +270,11 @@
 		unsigned int vertexShaderConstantsFDirty;
 		unsigned int vertexShaderConstantsIDirty;
 
-		float pixelShaderConstantF[FRAGMENT_UNIFORM_VECTORS][4];
+		float pixelShaderConstantF[MAX_PIXEL_SHADER_CONST][4];
 		int pixelShaderConstantI[16][4];
 		int pixelShaderConstantB[16];
 
-		float vertexShaderConstantF[VERTEX_UNIFORM_VECTORS][4];
+		float vertexShaderConstantF[MAX_VERTEX_SHADER_CONST][4];
 		int vertexShaderConstantI[16][4];
 		int vertexShaderConstantB[16];
 
diff --git a/src/D3D9/Direct3DStateBlock9.cpp b/src/D3D9/Direct3DStateBlock9.cpp
index da0611a..1ad9ffa 100644
--- a/src/D3D9/Direct3DStateBlock9.cpp
+++ b/src/D3D9/Direct3DStateBlock9.cpp
@@ -52,7 +52,7 @@
 			capturePixelSamplerStates();
 			capturePixelShaderStates();
 		}
-		
+
 		if(type == D3DSBT_VERTEXSTATE || type == D3DSBT_ALL)
 		{
 			captureVertexRenderStates();
@@ -112,7 +112,7 @@
 
 		return Unknown::AddRef();
 	}
-	
+
 	unsigned long Direct3DStateBlock9::Release()
 	{
 		TRACE("");
@@ -130,7 +130,7 @@
 		{
 			return INVALIDCALL();
 		}
-		
+
 		if(fvfCaptured)
 		{
 			device->SetFVF(FVF);
@@ -248,7 +248,7 @@
 			device->SetViewport(&viewport);
 		}
 
-		for(int i = 0; i < FRAGMENT_UNIFORM_VECTORS; i++)
+		for(int i = 0; i < MAX_PIXEL_SHADER_CONST; i++)
 		{
 			if(*(int*)pixelShaderConstantF[i] != 0x80000000)
 			{
@@ -272,7 +272,7 @@
 			}
 		}
 
-		for(int i = 0; i < VERTEX_UNIFORM_VECTORS; i++)
+		for(int i = 0; i < MAX_VERTEX_SHADER_CONST; i++)
 		{
 			if(*(int*)vertexShaderConstantF[i] != 0x80000000)
 			{
@@ -322,7 +322,7 @@
 		CriticalSection cs(device);
 
 		TRACE("");
-		
+
 		if(fvfCaptured)
 		{
 			device->GetFVF(&FVF);
@@ -332,7 +332,7 @@
 		{
 			Direct3DVertexDeclaration9 *vertexDeclaration;
 			device->GetVertexDeclaration(reinterpret_cast<IDirect3DVertexDeclaration9**>(&vertexDeclaration));
-			
+
 			if(vertexDeclaration)
 			{
 				vertexDeclaration->bind();
@@ -351,7 +351,7 @@
 		{
 			Direct3DIndexBuffer9 *indexBuffer;
 			device->GetIndices(reinterpret_cast<IDirect3DIndexBuffer9**>(&indexBuffer));
-			
+
 			if(indexBuffer)
 			{
 				indexBuffer->bind();
@@ -525,7 +525,7 @@
 			device->GetViewport(&viewport);
 		}
 
-		for(int i = 0; i < FRAGMENT_UNIFORM_VECTORS; i++)
+		for(int i = 0; i < MAX_PIXEL_SHADER_CONST; i++)
 		{
 			if(*(int*)pixelShaderConstantF[i] != 0x80000000)
 			{
@@ -549,7 +549,7 @@
 			}
 		}
 
-		for(int i = 0; i < VERTEX_UNIFORM_VECTORS; i++)
+		for(int i = 0; i < MAX_VERTEX_SHADER_CONST; i++)
 		{
 			if(*(int*)vertexShaderConstantF[i] != 0x80000000)
 			{
@@ -872,7 +872,7 @@
 
 		viewportCaptured = false;
 
-		for(int i = 0; i < FRAGMENT_UNIFORM_VECTORS; i++)
+		for(int i = 0; i < MAX_PIXEL_SHADER_CONST; i++)
 		{
 			(int&)pixelShaderConstantF[i][0] = 0x80000000;
 			(int&)pixelShaderConstantF[i][1] = 0x80000000;
@@ -880,7 +880,7 @@
 			(int&)pixelShaderConstantF[i][3] = 0x80000000;
 		}
 
-		for(int i = 0; i < VERTEX_UNIFORM_VECTORS; i++)
+		for(int i = 0; i < MAX_VERTEX_SHADER_CONST; i++)
 		{
 			(int&)vertexShaderConstantF[i][0] = 0x80000000;
 			(int&)vertexShaderConstantF[i][1] = 0x80000000;
@@ -1085,7 +1085,7 @@
 		{
 			captureSamplerState(sampler, D3DSAMP_ADDRESSU);
 			captureSamplerState(sampler, D3DSAMP_ADDRESSV);
-			captureSamplerState(sampler, D3DSAMP_ADDRESSW); 
+			captureSamplerState(sampler, D3DSAMP_ADDRESSW);
 			captureSamplerState(sampler, D3DSAMP_BORDERCOLOR);
 			captureSamplerState(sampler, D3DSAMP_MAGFILTER);
 			captureSamplerState(sampler, D3DSAMP_MINFILTER);
@@ -1102,7 +1102,7 @@
 	{
 		pixelShaderCaptured = true;
 		device->GetPixelShader(reinterpret_cast<IDirect3DPixelShader9**>(&pixelShader));
-		
+
 		if(pixelShader)
 		{
 			pixelShader->bind();
@@ -1111,7 +1111,7 @@
 
 		device->GetPixelShaderConstantF(0, pixelShaderConstantF[0], 32);
 		device->GetPixelShaderConstantI(0, pixelShaderConstantI[0], 16);
-		device->GetPixelShaderConstantB(0, pixelShaderConstantB, 16);	
+		device->GetPixelShaderConstantB(0, pixelShaderConstantB, 16);
 	}
 
 	void Direct3DStateBlock9::captureVertexRenderStates()
@@ -1206,16 +1206,16 @@
 	{
 		vertexShaderCaptured = true;
 		device->GetVertexShader(reinterpret_cast<IDirect3DVertexShader9**>(&vertexShader));
-		
+
 		if(vertexShader)
 		{
 			vertexShader->bind();
 			vertexShader->Release();
 		}
 
-		device->GetVertexShaderConstantF(0, vertexShaderConstantF[0], VERTEX_UNIFORM_VECTORS);
+		device->GetVertexShaderConstantF(0, vertexShaderConstantF[0], MAX_VERTEX_SHADER_CONST);
 		device->GetVertexShaderConstantI(0, vertexShaderConstantI[0], 16);
-		device->GetVertexShaderConstantB(0, vertexShaderConstantB, 16);		
+		device->GetVertexShaderConstantB(0, vertexShaderConstantB, 16);
 	}
 
 	void Direct3DStateBlock9::captureStreamSourceFrequencies()
@@ -1232,7 +1232,7 @@
 		device->GetFVF(&FVF);
 		fvfCaptured = true;
 	}
-	
+
 	void Direct3DStateBlock9::captureVertexDeclaration()
 	{
 		vertexDeclarationCaptured = true;
@@ -1273,7 +1273,7 @@
 		{
 			streamSourceCaptured[stream] = true;
 			device->GetStreamSource(stream, reinterpret_cast<IDirect3DVertexBuffer9**>(&streamSource[stream].vertexBuffer), &streamSource[stream].offset, &streamSource[stream].stride);
-			
+
 			if(streamSource[stream].vertexBuffer)
 			{
 				streamSource[stream].vertexBuffer->bind();
diff --git a/src/D3D9/Direct3DStateBlock9.hpp b/src/D3D9/Direct3DStateBlock9.hpp
index 3fd4bbc..e831a04 100644
--- a/src/D3D9/Direct3DStateBlock9.hpp
+++ b/src/D3D9/Direct3DStateBlock9.hpp
@@ -12,7 +12,7 @@
 #ifndef D3D9_Direct3DStateBlock9_hpp
 #define D3D9_Direct3DStateBlock9_hpp
 
-#include "Config.hpp"
+#include "Direct3DDevice9.hpp"
 #include "Unknown.hpp"
 
 #include <vector>
@@ -172,11 +172,11 @@
 		bool viewportCaptured;
 		D3DVIEWPORT9 viewport;
 
-		float pixelShaderConstantF[FRAGMENT_UNIFORM_VECTORS][4];
+		float pixelShaderConstantF[MAX_PIXEL_SHADER_CONST][4];
 		int pixelShaderConstantI[16][4];
 		int pixelShaderConstantB[16];
 
-		float vertexShaderConstantF[VERTEX_UNIFORM_VECTORS][4];
+		float vertexShaderConstantF[MAX_VERTEX_SHADER_CONST][4];
 		int vertexShaderConstantI[16][4];
 		int vertexShaderConstantB[16];
 
diff --git a/src/D3D9/Direct3DTexture9.cpp b/src/D3D9/Direct3DTexture9.cpp
index 5e2f1c3..2d7dcda 100644
--- a/src/D3D9/Direct3DTexture9.cpp
+++ b/src/D3D9/Direct3DTexture9.cpp
@@ -27,7 +27,7 @@
 			this->levels = sw::log2(sw::max((int)width, (int)height, 1)) + 1;
 		}
 
-		for(unsigned int level = 0; level < MIPMAP_LEVELS; level++)
+		for(unsigned int level = 0; level < sw::MIPMAP_LEVELS; level++)
 		{
 			if(level < this->levels)
 			{
@@ -48,7 +48,7 @@
 	{
 		resource->lock(sw::DESTRUCT);
 
-		for(int level = 0; level < MIPMAP_LEVELS; level++)
+		for(int level = 0; level < sw::MIPMAP_LEVELS; level++)
 		{
 			if(surfaceLevel[level])
 			{
diff --git a/src/D3D9/Direct3DTexture9.hpp b/src/D3D9/Direct3DTexture9.hpp
index d8ed329..2c19834 100644
--- a/src/D3D9/Direct3DTexture9.hpp
+++ b/src/D3D9/Direct3DTexture9.hpp
@@ -67,7 +67,7 @@
 		const unsigned int width;
 		const unsigned int height;
 
-		Direct3DSurface9 *surfaceLevel[MIPMAP_LEVELS];
+		Direct3DSurface9 *surfaceLevel[sw::MIPMAP_LEVELS];
 	};
 }
 
diff --git a/src/D3D9/Direct3DVolumeTexture9.cpp b/src/D3D9/Direct3DVolumeTexture9.cpp
index 5633cc1..fff5288 100644
--- a/src/D3D9/Direct3DVolumeTexture9.cpp
+++ b/src/D3D9/Direct3DVolumeTexture9.cpp
@@ -27,7 +27,7 @@
 			this->levels = sw::log2(sw::max((int)width, (int)height, (int)depth, 1)) + 1;
 		}
 
-		for(unsigned int level = 0; level < MIPMAP_LEVELS; level++)
+		for(unsigned int level = 0; level < sw::MIPMAP_LEVELS; level++)
 		{
 			if(level < this->levels)
 			{
@@ -49,7 +49,7 @@
 	{
 		resource->lock(sw::DESTRUCT);
 
-		for(int level = 0; level < MIPMAP_LEVELS; level++)
+		for(int level = 0; level < sw::MIPMAP_LEVELS; level++)
 		{
 			if(volumeLevel[level])
 			{
diff --git a/src/D3D9/Direct3DVolumeTexture9.hpp b/src/D3D9/Direct3DVolumeTexture9.hpp
index 1fa2447..e4dda38 100644
--- a/src/D3D9/Direct3DVolumeTexture9.hpp
+++ b/src/D3D9/Direct3DVolumeTexture9.hpp
@@ -68,7 +68,7 @@
 		const unsigned int height;
 		const unsigned int depth;
 
-		Direct3DVolume9 *volumeLevel[MIPMAP_LEVELS];
+		Direct3DVolume9 *volumeLevel[sw::MIPMAP_LEVELS];
 	};
 }
 
diff --git a/src/Main/Config.cpp b/src/Main/Config.cpp
index 10928ba..becea9c 100644
--- a/src/Main/Config.cpp
+++ b/src/Main/Config.cpp
@@ -14,63 +14,66 @@
 #include "Thread.hpp"
 #include "Timer.hpp"
 
-Profiler profiler;
-
-Profiler::Profiler()
+namespace sw
 {
-	reset();
-}
+	Profiler profiler;
 
-void Profiler::reset()
-{
-	framesSec = 0;
-	framesTotal = 0;
-	FPS = 0;
-	
-	#if PERF_PROFILE
-		for(int i = 0; i < PERF_TIMERS; i++)
-		{
-			cycles[i] = 0;
-		}
-
-		ropOperations = 0;
-		ropOperationsTotal = 0;
-		ropOperationsFrame = 0;
-	
-		texOperations = 0;
-		texOperationsTotal = 0;
-		texOperationsFrame = 0;
-	
-		compressedTex = 0;
-		compressedTexTotal = 0;
-		compressedTexFrame = 0;
-	#endif
-};
-
-void Profiler::nextFrame()
-{
-	#if PERF_PROFILE
-		ropOperationsFrame = sw::atomicExchange(&ropOperations, 0);
-		texOperationsFrame = sw::atomicExchange(&texOperations, 0);
-		compressedTexFrame = sw::atomicExchange(&compressedTex, 0);
-
-		ropOperationsTotal += ropOperationsFrame;
-		texOperationsTotal += texOperationsFrame;
-		compressedTexTotal += compressedTexFrame;
-	#endif
-
-	static double fpsTime = sw::Timer::seconds();
-
-	double time = sw::Timer::seconds();
-	double delta = time - fpsTime;
-	framesSec++;
-
-	if(delta > 1.0)
+	Profiler::Profiler()
 	{
-		FPS = framesSec / delta;
-
-		fpsTime = time;
-		framesTotal += framesSec;
-		framesSec = 0;
+		reset();
 	}
-}
+
+	void Profiler::reset()
+	{
+		framesSec = 0;
+		framesTotal = 0;
+		FPS = 0;
+
+		#if PERF_PROFILE
+			for(int i = 0; i < PERF_TIMERS; i++)
+			{
+				cycles[i] = 0;
+			}
+
+			ropOperations = 0;
+			ropOperationsTotal = 0;
+			ropOperationsFrame = 0;
+
+			texOperations = 0;
+			texOperationsTotal = 0;
+			texOperationsFrame = 0;
+
+			compressedTex = 0;
+			compressedTexTotal = 0;
+			compressedTexFrame = 0;
+		#endif
+	};
+
+	void Profiler::nextFrame()
+	{
+		#if PERF_PROFILE
+			ropOperationsFrame = sw::atomicExchange(&ropOperations, 0);
+			texOperationsFrame = sw::atomicExchange(&texOperations, 0);
+			compressedTexFrame = sw::atomicExchange(&compressedTex, 0);
+
+			ropOperationsTotal += ropOperationsFrame;
+			texOperationsTotal += texOperationsFrame;
+			compressedTexTotal += compressedTexFrame;
+		#endif
+
+		static double fpsTime = sw::Timer::seconds();
+
+		double time = sw::Timer::seconds();
+		double delta = time - fpsTime;
+		framesSec++;
+
+		if(delta > 1.0)
+		{
+			FPS = framesSec / delta;
+
+			fpsTime = time;
+			framesTotal += framesSec;
+			framesSec = 0;
+		}
+	}
+}
\ No newline at end of file
diff --git a/src/Main/Config.hpp b/src/Main/Config.hpp
index 7237d28..7d0952c 100644
--- a/src/Main/Config.hpp
+++ b/src/Main/Config.hpp
@@ -30,74 +30,69 @@
 #define DEFAULT_THREAD_COUNT 0

 #endif

 

-enum

+namespace sw

 {

-	PERF_PIXEL,

-	PERF_PIPE,

-	PERF_INTERP,

-	PERF_SHADER,

-	PERF_TEX,

-	PERF_ROP,

+	enum

+	{

+		PERF_PIXEL,

+		PERF_PIPE,

+		PERF_INTERP,

+		PERF_SHADER,

+		PERF_TEX,

+		PERF_ROP,

 

-	PERF_TIMERS

-};

+		PERF_TIMERS

+	};

 

-struct Profiler

-{

-	Profiler();

+	struct Profiler

+	{

+		Profiler();

 

-	void reset();

-	void nextFrame();

+		void reset();

+		void nextFrame();

 

-	int framesSec;

-	int framesTotal;

-	double FPS;

+		int framesSec;

+		int framesTotal;

+		double FPS;

 

-	#if PERF_PROFILE

-	double cycles[PERF_TIMERS];

+		#if PERF_PROFILE

+		double cycles[PERF_TIMERS];

 

-	int64_t ropOperations;

-	int64_t ropOperationsTotal;

-	int64_t ropOperationsFrame;

+		int64_t ropOperations;

+		int64_t ropOperationsTotal;

+		int64_t ropOperationsFrame;

 

-	int64_t texOperations;

-	int64_t texOperationsTotal;

-	int64_t texOperationsFrame;

+		int64_t texOperations;

+		int64_t texOperationsTotal;

+		int64_t texOperationsFrame;

 

-	int64_t compressedTex;

-	int64_t compressedTexTotal;

-	int64_t compressedTexFrame;

-	#endif

-};

+		int64_t compressedTex;

+		int64_t compressedTexTotal;

+		int64_t compressedTexFrame;

+		#endif

+	};

 

-extern Profiler profiler;

+	extern Profiler profiler;

 

-enum

-{

-	OUTLINE_RESOLUTION = 4096,   // Maximum vertical resolution of the render target

-	MIPMAP_LEVELS = 14,

-	MAX_COLOR_ATTACHMENTS = 8,

-	VERTEX_ATTRIBUTES = 16,

-	TEXTURE_IMAGE_UNITS = 16,

-	VERTEX_TEXTURE_IMAGE_UNITS = 16,

-	TOTAL_IMAGE_UNITS = TEXTURE_IMAGE_UNITS + VERTEX_TEXTURE_IMAGE_UNITS,

-	FRAGMENT_UNIFORM_VECTORS = 224,

-	VERTEX_UNIFORM_VECTORS = 256,

-	MAX_FRAGMENT_UNIFORM_COMPONENTS = FRAGMENT_UNIFORM_VECTORS * 4,

-	MAX_VERTEX_UNIFORM_COMPONENTS = VERTEX_UNIFORM_VECTORS * 4,

-	MAX_FRAGMENT_UNIFORM_BLOCKS = 12,

-	MAX_VERTEX_UNIFORM_BLOCKS = 12,

-	MAX_UNIFORM_BLOCK_SIZE = 16384,

-	MAX_FRAGMENT_UNIFORM_BLOCKS_COMPONENTS = MAX_FRAGMENT_UNIFORM_BLOCKS * MAX_UNIFORM_BLOCK_SIZE / 4,

-	MAX_VERTEX_UNIFORM_BLOCKS_COMPONENTS = MAX_VERTEX_UNIFORM_BLOCKS * MAX_UNIFORM_BLOCK_SIZE / 4,

-	MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS = MAX_FRAGMENT_UNIFORM_BLOCKS_COMPONENTS + MAX_FRAGMENT_UNIFORM_COMPONENTS,

-	MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS = MAX_VERTEX_UNIFORM_BLOCKS_COMPONENTS + MAX_VERTEX_UNIFORM_COMPONENTS,

-	MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS = 4,

-	MAX_UNIFORM_BUFFER_BINDINGS = MAX_FRAGMENT_UNIFORM_BLOCKS + MAX_VERTEX_UNIFORM_BLOCKS, // Limited to 127 by SourceParameter.bufferIndex in Shader.hpp

-	MAX_CLIP_PLANES = 6,

-	MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS = 64,

-	MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS = 64,

-	RENDERTARGETS = 4,

-};

+	enum

+	{

+		OUTLINE_RESOLUTION = 4096,   // Maximum vertical resolution of the render target

+		MIPMAP_LEVELS = 14,

+		VERTEX_ATTRIBUTES = 16,

+		TEXTURE_IMAGE_UNITS = 16,

+		VERTEX_TEXTURE_IMAGE_UNITS = 16,

+		TOTAL_IMAGE_UNITS = TEXTURE_IMAGE_UNITS + VERTEX_TEXTURE_IMAGE_UNITS,

+		FRAGMENT_UNIFORM_VECTORS = 224,

+		VERTEX_UNIFORM_VECTORS = 256,

+		MAX_FRAGMENT_UNIFORM_BLOCKS = 12,

+		MAX_VERTEX_UNIFORM_BLOCKS = 12,

+		MAX_UNIFORM_BUFFER_BINDINGS = MAX_FRAGMENT_UNIFORM_BLOCKS + MAX_VERTEX_UNIFORM_BLOCKS,   // Limited to 127 by SourceParameter.bufferIndex in Shader.hpp

+		MAX_UNIFORM_BLOCK_SIZE = 16384,

+		MAX_CLIP_PLANES = 6,

+		MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS = 64,

+		MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS = 64,

+		RENDERTARGETS = 4,

+	};

+}

 

 #endif   // sw_Config_hpp

diff --git a/src/Main/SwiftConfig.cpp b/src/Main/SwiftConfig.cpp
index d80e344..9dce441 100644
--- a/src/Main/SwiftConfig.cpp
+++ b/src/Main/SwiftConfig.cpp
@@ -22,10 +22,10 @@
 #include <sys/stat.h>
 #include <string.h>
 
-extern Profiler profiler;
-
 namespace sw
 {
+	extern Profiler profiler;
+
 	std::string itoa(int number)
 	{
 		std::stringstream ss;
diff --git a/src/OpenGL/libGL/Context.cpp b/src/OpenGL/libGL/Context.cpp
index 0da8157..e886392 100644
--- a/src/OpenGL/libGL/Context.cpp
+++ b/src/OpenGL/libGL/Context.cpp
@@ -2112,7 +2112,7 @@
 		{

 			Texture2D *texture = static_cast<Texture2D*>(baseTexture);

 

-			for(int mipmapLevel = 0; mipmapLevel < MIPMAP_LEVELS; mipmapLevel++)

+			for(int mipmapLevel = 0; mipmapLevel < sw::MIPMAP_LEVELS; mipmapLevel++)

 			{

 				int surfaceLevel = mipmapLevel;

 

@@ -2135,7 +2135,7 @@
 			{

 				TextureCubeMap *cubeTexture = static_cast<TextureCubeMap*>(baseTexture);

 

-				for(int mipmapLevel = 0; mipmapLevel < MIPMAP_LEVELS; mipmapLevel++)

+				for(int mipmapLevel = 0; mipmapLevel < sw::MIPMAP_LEVELS; mipmapLevel++)

 				{

 					int surfaceLevel = mipmapLevel;

 

diff --git a/src/OpenGL/libGL/Context.h b/src/OpenGL/libGL/Context.h
index cd41df6..74ecb6c 100644
--- a/src/OpenGL/libGL/Context.h
+++ b/src/OpenGL/libGL/Context.h
@@ -311,12 +311,12 @@
 {

     MAX_VERTEX_ATTRIBS = 9,

 	MAX_UNIFORM_VECTORS = 256,   // Device limit

-    MAX_VERTEX_UNIFORM_VECTORS = VERTEX_UNIFORM_VECTORS - 3,   // Reserve space for gl_DepthRange

+    MAX_VERTEX_UNIFORM_VECTORS = sw::VERTEX_UNIFORM_VECTORS - 3,   // Reserve space for gl_DepthRange

     MAX_VARYING_VECTORS = 10,

     MAX_TEXTURE_IMAGE_UNITS = 2,

     MAX_VERTEX_TEXTURE_IMAGE_UNITS = 1,

     MAX_COMBINED_TEXTURE_IMAGE_UNITS = MAX_TEXTURE_IMAGE_UNITS + MAX_VERTEX_TEXTURE_IMAGE_UNITS,

-    MAX_FRAGMENT_UNIFORM_VECTORS = FRAGMENT_UNIFORM_VECTORS - 3,    // Reserve space for gl_DepthRange

+    MAX_FRAGMENT_UNIFORM_VECTORS = sw::FRAGMENT_UNIFORM_VECTORS - 3,    // Reserve space for gl_DepthRange

     MAX_DRAW_BUFFERS = 1,

 

     IMPLEMENTATION_COLOR_READ_FORMAT = GL_RGB,

diff --git a/src/OpenGL/libGL/Device.hpp b/src/OpenGL/libGL/Device.hpp
index 63df3f9..e85d909 100644
--- a/src/OpenGL/libGL/Device.hpp
+++ b/src/OpenGL/libGL/Device.hpp
@@ -89,8 +89,8 @@
 		bool vertexShaderDirty;

 		unsigned int vertexShaderConstantsFDirty;

 

-		float pixelShaderConstantF[FRAGMENT_UNIFORM_VECTORS][4];

-		float vertexShaderConstantF[VERTEX_UNIFORM_VECTORS][4];

+		float pixelShaderConstantF[sw::FRAGMENT_UNIFORM_VECTORS][4];

+		float vertexShaderConstantF[sw::VERTEX_UNIFORM_VECTORS][4];

 

 		Image *renderTarget;

 		Image *depthStencil;

diff --git a/src/OpenGL/libGL/Texture.cpp b/src/OpenGL/libGL/Texture.cpp
index 162599c..0f1a0e9 100644
--- a/src/OpenGL/libGL/Texture.cpp
+++ b/src/OpenGL/libGL/Texture.cpp
@@ -271,7 +271,7 @@
 

 Texture2D::Texture2D(GLuint name) : Texture(name)

 {

-	for(int i = 0; i < MIPMAP_LEVELS; i++)

+	for(int i = 0; i < IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)

 	{

 		image[i] = 0;

 	}

@@ -284,7 +284,7 @@
 {

 	resource->lock(sw::DESTRUCT);

 

-	for(int i = 0; i < MIPMAP_LEVELS; i++)

+	for(int i = 0; i < IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)

 	{

 		if(image[i])

 		{

@@ -359,7 +359,7 @@
 	ASSERT(isSamplerComplete());

 	int levels = 0;

 

-	while(levels < MIPMAP_LEVELS && image[levels])

+	while(levels < IMPLEMENTATION_MAX_TEXTURE_LEVELS && image[levels])

 	{

 		levels++;

 	}

@@ -624,7 +624,7 @@
 {

 	for(int f = 0; f < 6; f++)

 	{

-		for(int i = 0; i < MIPMAP_LEVELS; i++)

+		for(int i = 0; i < IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)

 		{

 			image[f][i] = 0;

 		}

@@ -643,7 +643,7 @@
 

 	for(int f = 0; f < 6; f++)

 	{

-		for(int i = 0; i < MIPMAP_LEVELS; i++)

+		for(int i = 0; i < IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)

 		{

 			if(image[f][i])

 			{

@@ -736,7 +736,7 @@
 	ASSERT(isSamplerComplete());

 	int levels = 0;

 

-	while(levels < MIPMAP_LEVELS && image[0][levels])

+	while(levels < IMPLEMENTATION_MAX_TEXTURE_LEVELS && image[0][levels])

 	{

 		levels++;

 	}

diff --git a/src/OpenGL/libGL/Texture.h b/src/OpenGL/libGL/Texture.h
index 6574d42..327aca3 100644
--- a/src/OpenGL/libGL/Texture.h
+++ b/src/OpenGL/libGL/Texture.h
@@ -36,10 +36,10 @@
 

 enum

 {

-	IMPLEMENTATION_MAX_TEXTURE_LEVELS = MIPMAP_LEVELS,

-    IMPLEMENTATION_MAX_TEXTURE_SIZE = 1 << (MIPMAP_LEVELS - 1),

-    IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE = 1 << (MIPMAP_LEVELS - 1),

-	IMPLEMENTATION_MAX_RENDERBUFFER_SIZE = OUTLINE_RESOLUTION,

+	IMPLEMENTATION_MAX_TEXTURE_LEVELS = sw::MIPMAP_LEVELS,

+    IMPLEMENTATION_MAX_TEXTURE_SIZE = 1 << (IMPLEMENTATION_MAX_TEXTURE_LEVELS - 1),

+    IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE = 1 << (IMPLEMENTATION_MAX_TEXTURE_LEVELS - 1),

+	IMPLEMENTATION_MAX_RENDERBUFFER_SIZE = sw::OUTLINE_RESOLUTION,

 };

 

 class Texture : public NamedObject

@@ -149,7 +149,7 @@
 	bool isMipmapComplete() const;

 

 	Image *image[IMPLEMENTATION_MAX_TEXTURE_LEVELS];

-    

+

 	// A specific internal reference count is kept for colorbuffer proxy references,

     // because, as the renderbuffer acting as proxy will maintain a binding pointer

     // back to this texture, there would be a circular reference if we used a binding

@@ -170,7 +170,7 @@
     void releaseProxy(const Renderbuffer *proxy);

 

     virtual GLenum getTarget() const;

-    

+

     virtual GLsizei getWidth(GLenum target, GLint level) const;

     virtual GLsizei getHeight(GLenum target, GLint level) const;

     virtual GLenum getFormat(GLenum target, GLint level) const;

@@ -189,7 +189,7 @@
     virtual bool isSamplerComplete() const;

     virtual bool isCompressed(GLenum target, GLint level) const;

 	virtual bool isDepth(GLenum target, GLint level) const;

-	

+

     virtual void generateMipmaps();

 

     virtual Renderbuffer *getRenderbuffer(GLenum target);

@@ -205,7 +205,7 @@
     Image *getImage(GLenum face, unsigned int level);

 

     Image *image[6][IMPLEMENTATION_MAX_TEXTURE_LEVELS];

-	

+

 	// A specific internal reference count is kept for colorbuffer proxy references,

     // because, as the renderbuffer acting as proxy will maintain a binding pointer

     // back to this texture, there would be a circular reference if we used a binding

diff --git a/src/OpenGL/libGLES_CM/Context.cpp b/src/OpenGL/libGLES_CM/Context.cpp
index 5cc63be..0b1ce44 100644
--- a/src/OpenGL/libGLES_CM/Context.cpp
+++ b/src/OpenGL/libGLES_CM/Context.cpp
@@ -2342,7 +2342,7 @@
 		{

 			Texture2D *texture = static_cast<Texture2D*>(baseTexture);

 

-			for(int mipmapLevel = 0; mipmapLevel < MIPMAP_LEVELS; mipmapLevel++)

+			for(int mipmapLevel = 0; mipmapLevel < sw::MIPMAP_LEVELS; mipmapLevel++)

 			{

 				int surfaceLevel = mipmapLevel;

 

diff --git a/src/OpenGL/libGLES_CM/Context.h b/src/OpenGL/libGLES_CM/Context.h
index 4e86885..90293e3 100644
--- a/src/OpenGL/libGLES_CM/Context.h
+++ b/src/OpenGL/libGLES_CM/Context.h
@@ -60,11 +60,12 @@
 

 enum

 {

-    MAX_VERTEX_ATTRIBS = VERTEX_ATTRIBUTES,

+    MAX_VERTEX_ATTRIBS = sw::VERTEX_ATTRIBUTES,

     MAX_VARYING_VECTORS = 10,

     MAX_TEXTURE_UNITS = 2,

     MAX_DRAW_BUFFERS = 1,

 	MAX_LIGHTS = 8,

+	MAX_CLIP_PLANES = sw::MAX_CLIP_PLANES,

 

 	MAX_MODELVIEW_STACK_DEPTH = 32,

 	MAX_PROJECTION_STACK_DEPTH = 2,

diff --git a/src/OpenGL/libGLES_CM/Texture.cpp b/src/OpenGL/libGLES_CM/Texture.cpp
index bd3da9c..3729d9b 100644
--- a/src/OpenGL/libGLES_CM/Texture.cpp
+++ b/src/OpenGL/libGLES_CM/Texture.cpp
@@ -331,7 +331,7 @@
 

 Texture2D::Texture2D(GLuint name) : Texture(name)

 {

-	for(int i = 0; i < MIPMAP_LEVELS; i++)

+	for(int i = 0; i < IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)

 	{

 		image[i] = nullptr;

 	}

@@ -346,7 +346,7 @@
 {

 	resource->lock(sw::DESTRUCT);

 

-	for(int i = 0; i < MIPMAP_LEVELS; i++)

+	for(int i = 0; i < IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)

 	{

 		if(image[i])

 		{

@@ -391,7 +391,7 @@
 {

 	int imageCount = 0;

 

-	for(int i = 0; i < MIPMAP_LEVELS; i++)

+	for(int i = 0; i < IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)

 	{

 		if(image[i] && image[i]->isChildOf(this))

 		{

@@ -450,7 +450,7 @@
 	ASSERT(isSamplerComplete());

 	int levels = 0;

 

-	while(levels < MIPMAP_LEVELS && image[levels])

+	while(levels < IMPLEMENTATION_MAX_TEXTURE_LEVELS && image[levels])

 	{

 		levels++;

 	}

@@ -496,7 +496,7 @@
         return;

     }

 

-	for(int level = 0; level < MIPMAP_LEVELS; level++)

+	for(int level = 0; level < IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++)

 	{

 		if(image[level])

 		{

@@ -513,7 +513,7 @@
 

 void Texture2D::releaseTexImage()

 {

-    for(int level = 0; level < MIPMAP_LEVELS; level++)

+    for(int level = 0; level < IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++)

 	{

 		if(image[level])

 		{

@@ -817,7 +817,7 @@
 

 egl::Image *createDepthStencil(unsigned int width, unsigned int height, sw::Format format, int multiSampleDepth, bool discard)

 {

-	if(height > OUTLINE_RESOLUTION)

+	if(height > sw::OUTLINE_RESOLUTION)

 	{

 		ERR("Invalid parameters: %dx%d", width, height);

 		return 0;

diff --git a/src/OpenGL/libGLES_CM/Texture.h b/src/OpenGL/libGLES_CM/Texture.h
index 4a49ddb..6d53711 100644
--- a/src/OpenGL/libGLES_CM/Texture.h
+++ b/src/OpenGL/libGLES_CM/Texture.h
@@ -38,10 +38,10 @@
 

 enum

 {

-	IMPLEMENTATION_MAX_TEXTURE_LEVELS = MIPMAP_LEVELS,

-    IMPLEMENTATION_MAX_TEXTURE_SIZE = 1 << (MIPMAP_LEVELS - 1),

-    IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE = 1 << (MIPMAP_LEVELS - 1),

-	IMPLEMENTATION_MAX_RENDERBUFFER_SIZE = OUTLINE_RESOLUTION,

+	IMPLEMENTATION_MAX_TEXTURE_LEVELS = sw::MIPMAP_LEVELS,

+    IMPLEMENTATION_MAX_TEXTURE_SIZE = 1 << (IMPLEMENTATION_MAX_TEXTURE_LEVELS - 1),

+    IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE = 1 << (IMPLEMENTATION_MAX_TEXTURE_LEVELS - 1),

+	IMPLEMENTATION_MAX_RENDERBUFFER_SIZE = sw::OUTLINE_RESOLUTION,

 };

 

 class Texture : public egl::Texture

diff --git a/src/OpenGL/libGLESv2/Context.cpp b/src/OpenGL/libGLESv2/Context.cpp
index 5ce6448..af7a884 100644
--- a/src/OpenGL/libGLESv2/Context.cpp
+++ b/src/OpenGL/libGLESv2/Context.cpp
@@ -2117,8 +2117,7 @@
 		*params = IMPLEMENTATION_MAX_TEXTURE_SIZE;

 		break;

 	case GL_MAX_COLOR_ATTACHMENTS: // integer, at least 8

-		UNIMPLEMENTED();

-		*params = IMPLEMENTATION_MAX_COLOR_ATTACHMENTS;

+		*params = MAX_COLOR_ATTACHMENTS;

 		break;

 	case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS: // integer, at least 50048

 		*params = MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS;

@@ -2132,7 +2131,7 @@
 		break;

 	case GL_MAX_DRAW_BUFFERS: // integer, at least 8

 		UNIMPLEMENTED();

-		*params = IMPLEMENTATION_MAX_DRAW_BUFFERS;

+		*params = MAX_DRAW_BUFFERS;

 		break;

 	case GL_MAX_ELEMENT_INDEX:

 		*params = MAX_ELEMENT_INDEX;

@@ -2171,7 +2170,7 @@
 		break;

 	case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS: // integer, at least 4

 		UNIMPLEMENTED();

-		*params = IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS;

+		*params = MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS;

 		break;

 	case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS: // integer, at least 4

 		UNIMPLEMENTED();

@@ -2181,7 +2180,7 @@
 		*params = MAX_UNIFORM_BLOCK_SIZE;

 		break;

 	case GL_MAX_UNIFORM_BUFFER_BINDINGS: // integer, at least 24

-		*params = IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS;

+		*params = MAX_UNIFORM_BUFFER_BINDINGS;

 		break;

 	case GL_MAX_VARYING_COMPONENTS: // integer, at least 60

 		UNIMPLEMENTED();

@@ -2264,7 +2263,7 @@
 		}

 		break;

 	case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT: // integer, defaults to 1

-		*params = IMPLEMENTATION_UNIFORM_BUFFER_OFFSET_ALIGNMENT;

+		*params = UNIFORM_BUFFER_OFFSET_ALIGNMENT;

 		break;

 	case GL_UNIFORM_BUFFER_SIZE: // indexed[n] 64-bit integer, initially 0

 		if(clientVersion >= 3)

@@ -3109,7 +3108,7 @@
 		{

 			Texture2D *texture = static_cast<Texture2D*>(baseTexture);

 

-			for(int mipmapLevel = 0; mipmapLevel < MIPMAP_LEVELS; mipmapLevel++)

+			for(int mipmapLevel = 0; mipmapLevel < sw::MIPMAP_LEVELS; mipmapLevel++)

 			{

 				int surfaceLevel = mipmapLevel;

 

@@ -3130,7 +3129,7 @@
 		{

 			Texture3D *texture = static_cast<Texture3D*>(baseTexture);

 

-			for(int mipmapLevel = 0; mipmapLevel < MIPMAP_LEVELS; mipmapLevel++)

+			for(int mipmapLevel = 0; mipmapLevel < sw::MIPMAP_LEVELS; mipmapLevel++)

 			{

 				int surfaceLevel = mipmapLevel;

 

@@ -3151,7 +3150,7 @@
 		{

 			Texture2DArray *texture = static_cast<Texture2DArray*>(baseTexture);

 

-			for(int mipmapLevel = 0; mipmapLevel < MIPMAP_LEVELS; mipmapLevel++)

+			for(int mipmapLevel = 0; mipmapLevel < sw::MIPMAP_LEVELS; mipmapLevel++)

 			{

 				int surfaceLevel = mipmapLevel;

 

@@ -3174,7 +3173,7 @@
 			{

 				TextureCubeMap *cubeTexture = static_cast<TextureCubeMap*>(baseTexture);

 

-				for(int mipmapLevel = 0; mipmapLevel < MIPMAP_LEVELS; mipmapLevel++)

+				for(int mipmapLevel = 0; mipmapLevel < sw::MIPMAP_LEVELS; mipmapLevel++)

 				{

 					int surfaceLevel = mipmapLevel;

 

diff --git a/src/OpenGL/libGLESv2/Context.h b/src/OpenGL/libGLESv2/Context.h
index 3fc6e95..08c7a51 100644
--- a/src/OpenGL/libGLESv2/Context.h
+++ b/src/OpenGL/libGLESv2/Context.h
@@ -15,13 +15,13 @@
 #ifndef LIBGLESV2_CONTEXT_H_

 #define LIBGLESV2_CONTEXT_H_

 

-#include "libEGL/Context.hpp"

 #include "ResourceManager.h"

+#include "Buffer.h"

+#include "libEGL/Context.hpp"

 #include "common/NameSpace.hpp"

 #include "common/Object.hpp"

 #include "common/Image.hpp"

 #include "Renderer/Sampler.hpp"

-#include "TransformFeedback.h"

 

 #include <GLES2/gl2.h>

 #include <GLES2/gl2ext.h>

@@ -67,18 +67,18 @@
 class Query;

 class Sampler;

 class VertexArray;

+class TransformFeedback;

 

 enum

 {

-    MAX_VERTEX_ATTRIBS = VERTEX_ATTRIBUTES,

+    MAX_VERTEX_ATTRIBS = sw::VERTEX_ATTRIBUTES,

 	MAX_UNIFORM_VECTORS = 256,   // Device limit

-    MAX_VERTEX_UNIFORM_VECTORS = VERTEX_UNIFORM_VECTORS - 3,   // Reserve space for gl_DepthRange

+    MAX_VERTEX_UNIFORM_VECTORS = sw::VERTEX_UNIFORM_VECTORS - 3,   // Reserve space for gl_DepthRange

     MAX_VARYING_VECTORS = 10,

-    MAX_TEXTURE_IMAGE_UNITS = TEXTURE_IMAGE_UNITS,

-    MAX_VERTEX_TEXTURE_IMAGE_UNITS = VERTEX_TEXTURE_IMAGE_UNITS,

+    MAX_TEXTURE_IMAGE_UNITS = sw::TEXTURE_IMAGE_UNITS,

+    MAX_VERTEX_TEXTURE_IMAGE_UNITS = sw::VERTEX_TEXTURE_IMAGE_UNITS,

     MAX_COMBINED_TEXTURE_IMAGE_UNITS = MAX_TEXTURE_IMAGE_UNITS + MAX_VERTEX_TEXTURE_IMAGE_UNITS,

-    MAX_FRAGMENT_UNIFORM_VECTORS = FRAGMENT_UNIFORM_VECTORS - 3,    // Reserve space for gl_DepthRange

-    MAX_DRAW_BUFFERS = RENDERTARGETS,

+    MAX_FRAGMENT_UNIFORM_VECTORS = sw::FRAGMENT_UNIFORM_VECTORS - 3,    // Reserve space for gl_DepthRange

 	MAX_ELEMENT_INDEX = 0x7FFFFFFF,

 	MAX_ELEMENTS_INDICES = 0x7FFFFFFF,

 	MAX_ELEMENTS_VERTICES = 0x7FFFFFFF,

@@ -86,6 +86,20 @@
     MAX_FRAGMENT_INPUT_VECTORS = 15,

     MIN_PROGRAM_TEXEL_OFFSET = -8,

     MAX_PROGRAM_TEXEL_OFFSET = 7,

+	MAX_DRAW_BUFFERS = sw::RENDERTARGETS,

+	MAX_COLOR_ATTACHMENTS = MAX(MAX_DRAW_BUFFERS, 8),

+	MAX_FRAGMENT_UNIFORM_BLOCKS = sw::MAX_FRAGMENT_UNIFORM_BLOCKS,

+	MAX_VERTEX_UNIFORM_BLOCKS = sw::MAX_VERTEX_UNIFORM_BLOCKS,

+	MAX_FRAGMENT_UNIFORM_COMPONENTS = sw::FRAGMENT_UNIFORM_VECTORS * 4,

+	MAX_VERTEX_UNIFORM_COMPONENTS = sw::VERTEX_UNIFORM_VECTORS * 4,

+	MAX_UNIFORM_BLOCK_SIZE = sw::MAX_UNIFORM_BLOCK_SIZE,

+	MAX_FRAGMENT_UNIFORM_BLOCKS_COMPONENTS = sw::MAX_FRAGMENT_UNIFORM_BLOCKS * MAX_UNIFORM_BLOCK_SIZE / 4,

+	MAX_VERTEX_UNIFORM_BLOCKS_COMPONENTS = MAX_VERTEX_UNIFORM_BLOCKS * MAX_UNIFORM_BLOCK_SIZE / 4,

+	MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS = MAX_FRAGMENT_UNIFORM_BLOCKS_COMPONENTS + MAX_FRAGMENT_UNIFORM_COMPONENTS,

+	MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS = MAX_VERTEX_UNIFORM_BLOCKS_COMPONENTS + MAX_VERTEX_UNIFORM_COMPONENTS,

+	MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS = 4,

+	MAX_UNIFORM_BUFFER_BINDINGS = sw::MAX_UNIFORM_BUFFER_BINDINGS,

+	UNIFORM_BUFFER_OFFSET_ALIGNMENT = 1,

 };

 

 const GLenum compressedTextureFormats[] =

diff --git a/src/OpenGL/libGLESv2/Device.hpp b/src/OpenGL/libGLESv2/Device.hpp
index d254d3b..9283cf3 100644
--- a/src/OpenGL/libGLESv2/Device.hpp
+++ b/src/OpenGL/libGLESv2/Device.hpp
@@ -85,10 +85,10 @@
 		bool vertexShaderDirty;

 		unsigned int vertexShaderConstantsFDirty;

 

-		float pixelShaderConstantF[FRAGMENT_UNIFORM_VECTORS][4];

-		float vertexShaderConstantF[VERTEX_UNIFORM_VECTORS][4];

+		float pixelShaderConstantF[sw::FRAGMENT_UNIFORM_VECTORS][4];

+		float vertexShaderConstantF[sw::VERTEX_UNIFORM_VECTORS][4];

 

-		egl::Image *renderTarget[RENDERTARGETS];

+		egl::Image *renderTarget[sw::RENDERTARGETS];

 		egl::Image *depthBuffer;

 		egl::Image *stencilBuffer;

 	};

diff --git a/src/OpenGL/libGLESv2/Framebuffer.cpp b/src/OpenGL/libGLESv2/Framebuffer.cpp
index 87e60f4..34f3263 100644
--- a/src/OpenGL/libGLESv2/Framebuffer.cpp
+++ b/src/OpenGL/libGLESv2/Framebuffer.cpp
@@ -29,7 +29,7 @@
 
 Framebuffer::Framebuffer()
 {
-	for(int i = 0; i < IMPLEMENTATION_MAX_COLOR_ATTACHMENTS; ++i)
+	for(int i = 0; i < MAX_COLOR_ATTACHMENTS; i++)
 	{
 		mColorbufferType[i] = GL_NONE;
 	}
@@ -46,7 +46,7 @@
 
 Framebuffer::~Framebuffer()
 {
-	for(int i = 0; i < IMPLEMENTATION_MAX_COLOR_ATTACHMENTS; ++i)
+	for(int i = 0; i < MAX_COLOR_ATTACHMENTS; i++)
 	{
 		mColorbufferPointer[i] = nullptr;
 	}
@@ -121,7 +121,7 @@
 
 void Framebuffer::detachTexture(GLuint texture)
 {
-	for(int i = 0; i < IMPLEMENTATION_MAX_COLOR_ATTACHMENTS; ++i)
+	for(int i = 0; i < MAX_COLOR_ATTACHMENTS; i++)
 	{
 		if(mColorbufferPointer[i].name() == texture && IsTextureTarget(mColorbufferType[i]))
 		{
@@ -145,7 +145,7 @@
 
 void Framebuffer::detachRenderbuffer(GLuint renderbuffer)
 {
-	for(int i = 0; i < IMPLEMENTATION_MAX_COLOR_ATTACHMENTS; ++i)
+	for(int i = 0; i < MAX_COLOR_ATTACHMENTS; i++)
 	{
 		if(mColorbufferPointer[i].name() == renderbuffer && IsRenderbuffer(mColorbufferType[i]))
 		{
@@ -312,7 +312,7 @@
 	height = -1;
 	samples = -1;
 
-	for(int i = 0; i < IMPLEMENTATION_MAX_COLOR_ATTACHMENTS; ++i)
+	for(int i = 0; i < MAX_COLOR_ATTACHMENTS; i++)
 	{
 		if(mColorbufferType[i] != GL_NONE)
 		{
@@ -613,7 +613,7 @@
 	mColorbufferPointer[0] = new Renderbuffer(0, colorbuffer);
 	mColorbufferType[0] = defaultRenderbufferType;
 
-	for(int i = 1; i < IMPLEMENTATION_MAX_COLOR_ATTACHMENTS; ++i)
+	for(int i = 1; i < MAX_COLOR_ATTACHMENTS; i++)
 	{
 		mColorbufferPointer[i] = nullptr;
 		mColorbufferType[i] = GL_NONE;
diff --git a/src/OpenGL/libGLESv2/Framebuffer.h b/src/OpenGL/libGLESv2/Framebuffer.h
index 662a9cc..66f05f2 100644
--- a/src/OpenGL/libGLESv2/Framebuffer.h
+++ b/src/OpenGL/libGLESv2/Framebuffer.h
@@ -15,6 +15,7 @@
 #ifndef LIBGLESV2_FRAMEBUFFER_H_

 #define LIBGLESV2_FRAMEBUFFER_H_

 

+#include "Context.h"

 #include "common/Object.hpp"

 #include "common/Image.hpp"

 

diff --git a/src/OpenGL/libGLESv2/Program.cpp b/src/OpenGL/libGLESv2/Program.cpp
index ccd54b2..d965278 100644
--- a/src/OpenGL/libGLESv2/Program.cpp
+++ b/src/OpenGL/libGLESv2/Program.cpp
@@ -1134,15 +1134,15 @@
 

 	void Program::applyUniformBuffers(BufferBinding* uniformBuffers)

 	{

-		GLint vertexUniformBuffers[IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS];

-		GLint fragmentUniformBuffers[IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS];

+		GLint vertexUniformBuffers[MAX_UNIFORM_BUFFER_BINDINGS];

+		GLint fragmentUniformBuffers[MAX_UNIFORM_BUFFER_BINDINGS];

 

-		for(unsigned int bufferBindingIndex = 0; bufferBindingIndex < IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS; ++bufferBindingIndex)

+		for(unsigned int bufferBindingIndex = 0; bufferBindingIndex < MAX_UNIFORM_BUFFER_BINDINGS; bufferBindingIndex++)

 		{

 			vertexUniformBuffers[bufferBindingIndex] = -1;

 		}

 

-		for(unsigned int bufferBindingIndex = 0; bufferBindingIndex < IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS; ++bufferBindingIndex)

+		for(unsigned int bufferBindingIndex = 0; bufferBindingIndex < MAX_UNIFORM_BUFFER_BINDINGS; bufferBindingIndex++)

 		{

 			fragmentUniformBuffers[bufferBindingIndex] = -1;

 		}

@@ -1172,7 +1172,7 @@
 			}

 		}

 

-		for(unsigned int bufferBindingIndex = 0; bufferBindingIndex < IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS; ++bufferBindingIndex)

+		for(unsigned int bufferBindingIndex = 0; bufferBindingIndex < MAX_UNIFORM_BUFFER_BINDINGS; bufferBindingIndex++)

 		{

 			int index = vertexUniformBuffers[bufferBindingIndex];

 			device->VertexProcessor::setUniformBuffer(bufferBindingIndex, (index != -1) ? uniformBuffers[index].get()->getResource() : nullptr, (index != -1) ? uniformBuffers[index].getOffset() : 0);

@@ -1384,7 +1384,7 @@
 						}

 					}

 				}

-				

+

 				for(int i = 0; i < rows; i++)

 				{

 					linkedAttribute[location + i] = *attribute;

diff --git a/src/OpenGL/libGLESv2/Texture.cpp b/src/OpenGL/libGLESv2/Texture.cpp
index 8bbbed5..fe1824c 100644
--- a/src/OpenGL/libGLESv2/Texture.cpp
+++ b/src/OpenGL/libGLESv2/Texture.cpp
@@ -507,7 +507,7 @@
 

 Texture2D::Texture2D(GLuint name) : Texture(name)

 {

-	for(int i = 0; i < MIPMAP_LEVELS; i++)

+	for(int i = 0; i < IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)

 	{

 		image[i] = nullptr;

 	}

@@ -522,7 +522,7 @@
 {

 	resource->lock(sw::DESTRUCT);

 

-	for(int i = 0; i < MIPMAP_LEVELS; i++)

+	for(int i = 0; i < IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)

 	{

 		if(image[i])

 		{

@@ -567,7 +567,7 @@
 {

 	int imageCount = 0;

 

-	for(int i = 0; i < MIPMAP_LEVELS; i++)

+	for(int i = 0; i < IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)

 	{

 		if(image[i] && image[i]->isChildOf(this))

 		{

@@ -626,7 +626,7 @@
 	ASSERT(isSamplerComplete());

 	int levels = 0;

 

-	while(levels < MIPMAP_LEVELS && image[levels])

+	while(levels < IMPLEMENTATION_MAX_TEXTURE_LEVELS && image[levels])

 	{

 		levels++;

 	}

@@ -672,7 +672,7 @@
         return;

     }

 

-	for(int level = 0; level < MIPMAP_LEVELS; level++)

+	for(int level = 0; level < IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++)

 	{

 		if(image[level])

 		{

@@ -689,7 +689,7 @@
 

 void Texture2D::releaseTexImage()

 {

-    for(int level = 0; level < MIPMAP_LEVELS; level++)

+    for(int level = 0; level < IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++)

 	{

 		if(image[level])

 		{

@@ -984,7 +984,7 @@
 {

 	for(int f = 0; f < 6; f++)

 	{

-		for(int i = 0; i < MIPMAP_LEVELS; i++)

+		for(int i = 0; i < IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)

 		{

 			image[f][i] = nullptr;

 		}

@@ -1003,7 +1003,7 @@
 

 	for(int f = 0; f < 6; f++)

 	{

-		for(int i = 0; i < MIPMAP_LEVELS; i++)

+		for(int i = 0; i < IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)

 		{

 			if(image[f][i])

 			{

@@ -1062,7 +1062,7 @@
 

 	for(int f = 0; f < 6; f++)

 	{

-		for(int i = 0; i < MIPMAP_LEVELS; i++)

+		for(int i = 0; i < IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)

 		{

 			if(image[f][i] && image[f][i]->isChildOf(this))

 			{

@@ -1122,7 +1122,7 @@
 	ASSERT(isSamplerComplete());

 	int levels = 0;

 

-	while(levels < MIPMAP_LEVELS && image[0][levels])

+	while(levels < IMPLEMENTATION_MAX_TEXTURE_LEVELS && image[0][levels])

 	{

 		levels++;

 	}

@@ -1468,7 +1468,7 @@
 

 Texture3D::Texture3D(GLuint name) : Texture(name)

 {

-	for(int i = 0; i < MIPMAP_LEVELS; i++)

+	for(int i = 0; i < IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)

 	{

 		image[i] = nullptr;

 	}

@@ -1483,7 +1483,7 @@
 {

 	resource->lock(sw::DESTRUCT);

 

-	for(int i = 0; i < MIPMAP_LEVELS; i++)

+	for(int i = 0; i < IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)

 	{

 		if(image[i])

 		{

@@ -1528,7 +1528,7 @@
 {

 	int imageCount = 0;

 

-	for(int i = 0; i < MIPMAP_LEVELS; i++)

+	for(int i = 0; i < IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)

 	{

 		if(image[i] && image[i]->isChildOf(this))

 		{

@@ -1593,7 +1593,7 @@
 	ASSERT(isSamplerComplete());

 	int levels = 0;

 

-	while(levels < MIPMAP_LEVELS && image[levels])

+	while(levels < IMPLEMENTATION_MAX_TEXTURE_LEVELS && image[levels])

 	{

 		levels++;

 	}

@@ -1635,7 +1635,7 @@
 		return;

 	}

 

-	for(int level = 0; level < MIPMAP_LEVELS; level++)

+	for(int level = 0; level < IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++)

 	{

 		if(image[level])

 		{

@@ -1652,7 +1652,7 @@
 

 void Texture3D::releaseTexImage()

 {

-	for(int level = 0; level < MIPMAP_LEVELS; level++)

+	for(int level = 0; level < IMPLEMENTATION_MAX_TEXTURE_LEVELS; level++)

 	{

 		if(image[level])

 		{

@@ -2033,10 +2033,10 @@
 

 egl::Image *createDepthStencil(unsigned int width, unsigned int height, sw::Format format, int multiSampleDepth, bool discard)

 {

-	if(width == 0 || height == 0 || height > OUTLINE_RESOLUTION)

+	if(width == 0 || height == 0 || height > sw::OUTLINE_RESOLUTION)

 	{

 		ERR("Invalid parameters: %dx%d", width, height);

-		return 0;

+		return nullptr;

 	}

 

 	bool lockable = true;

diff --git a/src/OpenGL/libGLESv2/Texture.h b/src/OpenGL/libGLESv2/Texture.h
index 603ef5e..8c7c5c8 100644
--- a/src/OpenGL/libGLESv2/Texture.h
+++ b/src/OpenGL/libGLESv2/Texture.h
@@ -38,15 +38,10 @@
 

 enum

 {

-	IMPLEMENTATION_MAX_TEXTURE_LEVELS = MIPMAP_LEVELS,

-    IMPLEMENTATION_MAX_TEXTURE_SIZE = 1 << (MIPMAP_LEVELS - 1),

-    IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE = 1 << (MIPMAP_LEVELS - 1),

-	IMPLEMENTATION_MAX_RENDERBUFFER_SIZE = OUTLINE_RESOLUTION,

-	IMPLEMENTATION_MAX_COLOR_ATTACHMENTS = MAX_COLOR_ATTACHMENTS,

-	IMPLEMENTATION_MAX_DRAW_BUFFERS = 8,

-	IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS = MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS,

-	IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS = MAX_UNIFORM_BUFFER_BINDINGS,

-	IMPLEMENTATION_UNIFORM_BUFFER_OFFSET_ALIGNMENT = 1,

+	IMPLEMENTATION_MAX_TEXTURE_LEVELS = sw::MIPMAP_LEVELS,

+    IMPLEMENTATION_MAX_TEXTURE_SIZE = 1 << (IMPLEMENTATION_MAX_TEXTURE_LEVELS - 1),

+    IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE = 1 << (IMPLEMENTATION_MAX_TEXTURE_LEVELS - 1),

+	IMPLEMENTATION_MAX_RENDERBUFFER_SIZE = sw::OUTLINE_RESOLUTION,

 };

 

 class Texture : public egl::Texture

diff --git a/src/OpenGL/libGLESv2/TransformFeedback.h b/src/OpenGL/libGLESv2/TransformFeedback.h
index 4f4302b..4871ee1 100644
--- a/src/OpenGL/libGLESv2/TransformFeedback.h
+++ b/src/OpenGL/libGLESv2/TransformFeedback.h
@@ -15,6 +15,7 @@
 #define LIBGLESV2_TRANSFORM_FEEDBACK_H_

 

 #include "Buffer.h"

+#include "Context.h"

 #include "common/Object.hpp"

 #include "Renderer/Renderer.hpp"

 

diff --git a/src/OpenGL/libGLESv2/libGLESv2.cpp b/src/OpenGL/libGLESv2/libGLESv2.cpp
index f6e9b24..44bb5a4 100644
--- a/src/OpenGL/libGLESv2/libGLESv2.cpp
+++ b/src/OpenGL/libGLESv2/libGLESv2.cpp
@@ -22,6 +22,7 @@
 #include "Shader.h"

 #include "Texture.h"

 #include "Query.h"

+#include "TransformFeedback.h"

 #include "common/debug.h"

 #include "Common/Version.h"

 

@@ -2023,7 +2024,7 @@
 			}

 			// fall through

 		case GL_COLOR_ATTACHMENT0:

-			if((attachment - GL_COLOR_ATTACHMENT0) >= es2::IMPLEMENTATION_MAX_COLOR_ATTACHMENTS)

+			if((attachment - GL_COLOR_ATTACHMENT0) >= MAX_COLOR_ATTACHMENTS)

 			{

 				return error(GL_INVALID_ENUM);

 			}

@@ -2174,7 +2175,7 @@
 			}

 			// fall through

 		case GL_COLOR_ATTACHMENT0:

-			if((attachment - GL_COLOR_ATTACHMENT0) >= es2::IMPLEMENTATION_MAX_COLOR_ATTACHMENTS)

+			if((attachment - GL_COLOR_ATTACHMENT0) >= MAX_COLOR_ATTACHMENTS)

 			{

 				return error(GL_INVALID_ENUM);

 			}

@@ -2843,7 +2844,7 @@
 			}

 			// fall through

 		case GL_COLOR_ATTACHMENT0:

-			if((attachment - GL_COLOR_ATTACHMENT0) >= es2::IMPLEMENTATION_MAX_COLOR_ATTACHMENTS)

+			if((attachment - GL_COLOR_ATTACHMENT0) >= MAX_COLOR_ATTACHMENTS)

 			{

 				return error(GL_INVALID_ENUM);

 			}

@@ -6628,7 +6629,7 @@
 			}

 			// fall through

 		case GL_COLOR_ATTACHMENT0:

-			if((attachment - GL_COLOR_ATTACHMENT0) >= es2::IMPLEMENTATION_MAX_COLOR_ATTACHMENTS)

+			if((attachment - GL_COLOR_ATTACHMENT0) >= MAX_COLOR_ATTACHMENTS)

 			{

 				return error(GL_INVALID_ENUM);

 			}

diff --git a/src/OpenGL/libGLESv2/libGLESv3.cpp b/src/OpenGL/libGLESv2/libGLESv3.cpp
index a95908b..1adb45c 100644
--- a/src/OpenGL/libGLESv2/libGLESv3.cpp
+++ b/src/OpenGL/libGLESv2/libGLESv3.cpp
@@ -19,6 +19,7 @@
 #include "Sampler.h"

 #include "Texture.h"

 #include "mathutil.h"

+#include "TransformFeedback.h"

 #include "common/debug.h"

 

 #include <GLES3/gl3.h>

@@ -553,7 +554,7 @@
 		case GL_COLOR_ATTACHMENT31:

 		{

 			GLuint index = (src - GL_COLOR_ATTACHMENT0);

-			if(index >= es2::IMPLEMENTATION_MAX_COLOR_ATTACHMENTS)

+			if(index >= MAX_COLOR_ATTACHMENTS)

 			{

 				return error(GL_INVALID_ENUM);

 			}

@@ -1131,7 +1132,7 @@
 {

 	TRACE("(GLsizei n = %d, const GLenum *bufs = %p)", n, bufs);

 

-	if(n < 0 || n > es2::IMPLEMENTATION_MAX_DRAW_BUFFERS)

+	if(n < 0 || n > MAX_DRAW_BUFFERS)

 	{

 		return error(GL_INVALID_VALUE);

 	}

@@ -1198,7 +1199,7 @@
 			case GL_COLOR_ATTACHMENT31:

 			{

 				GLuint index = (bufs[i] - GL_COLOR_ATTACHMENT0);

-				if(index >= es2::IMPLEMENTATION_MAX_COLOR_ATTACHMENTS)

+				if(index >= MAX_COLOR_ATTACHMENTS)

 				{

 					return error(GL_INVALID_ENUM);

 				}

@@ -1960,7 +1961,7 @@
 		switch(target)

 		{

 		case GL_TRANSFORM_FEEDBACK_BUFFER:

-			if(index >= es2::IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS)

+			if(index >= MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS)

 			{

 				return error(GL_INVALID_VALUE);

 			}

@@ -1972,11 +1973,11 @@
 			context->bindGenericTransformFeedbackBuffer(buffer);

 			break;

 		case GL_UNIFORM_BUFFER:

-			if(index >= es2::IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS)

+			if(index >= MAX_UNIFORM_BUFFER_BINDINGS)

 			{

 				return error(GL_INVALID_VALUE);

 			}

-			if(offset % es2::IMPLEMENTATION_UNIFORM_BUFFER_OFFSET_ALIGNMENT != 0)

+			if(offset % UNIFORM_BUFFER_OFFSET_ALIGNMENT != 0)

 			{

 				return error(GL_INVALID_VALUE);

 			}

@@ -2001,7 +2002,7 @@
 		switch(target)

 		{

 		case GL_TRANSFORM_FEEDBACK_BUFFER:

-			if(index >= es2::IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS)

+			if(index >= MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS)

 			{

 				return error(GL_INVALID_VALUE);

 			}

@@ -2009,7 +2010,7 @@
 			context->bindGenericTransformFeedbackBuffer(buffer);

 			break;

 		case GL_UNIFORM_BUFFER:

-			if(index >= es2::IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS)

+			if(index >= MAX_UNIFORM_BUFFER_BINDINGS)

 			{

 				return error(GL_INVALID_VALUE);

 			}

@@ -2030,7 +2031,7 @@
 	switch(bufferMode)

 	{

 	case GL_SEPARATE_ATTRIBS:

-		if(count > es2::IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS)

+		if(count > MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS)

 		{

 			return error(GL_INVALID_VALUE);

 		}

@@ -2575,7 +2576,7 @@
 		switch(buffer)

 		{

 		case GL_COLOR:

-			if(drawbuffer < 0 || drawbuffer >= es2::IMPLEMENTATION_MAX_DRAW_BUFFERS)

+			if(drawbuffer < 0 || drawbuffer >= MAX_DRAW_BUFFERS)

 			{

 				return error(GL_INVALID_VALUE);

 			}

@@ -2612,7 +2613,7 @@
 		switch(buffer)

 		{

 		case GL_COLOR:

-			if(drawbuffer < 0 || drawbuffer >= es2::IMPLEMENTATION_MAX_DRAW_BUFFERS)

+			if(drawbuffer < 0 || drawbuffer >= MAX_DRAW_BUFFERS)

 			{

 				return error(GL_INVALID_VALUE);

 			}

@@ -2639,7 +2640,7 @@
 		switch(buffer)

 		{

 		case GL_COLOR:

-			if(drawbuffer < 0 || drawbuffer >= es2::IMPLEMENTATION_MAX_DRAW_BUFFERS)

+			if(drawbuffer < 0 || drawbuffer >= MAX_DRAW_BUFFERS)

 			{

 				return error(GL_INVALID_VALUE);

 			}

@@ -2941,7 +2942,7 @@
 	TRACE("(GLuint program = %d, GLuint uniformBlockIndex = %d, GLuint uniformBlockBinding = %d)",

 	      program, uniformBlockIndex, uniformBlockBinding);

 

-	if(uniformBlockBinding >= es2::IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS)

+	if(uniformBlockBinding >= MAX_UNIFORM_BUFFER_BINDINGS)

 	{

 		return error(GL_INVALID_VALUE);

 	}