New read/write cases for integer types

Added new read/write functionality for integer types. Also added cases for integer types in some utility functions.

Change-Id: I5efc7c4957d3a1591b47a5df888a9534776033be
Reviewed-on: https://swiftshader-review.googlesource.com/4114
Tested-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/Common/Math.hpp b/src/Common/Math.hpp
index 4d0d06b..c58bb52 100644
--- a/src/Common/Math.hpp
+++ b/src/Common/Math.hpp
@@ -209,49 +209,103 @@
 	template<const int n>

 	inline unsigned int unorm(float x)

 	{

-		const unsigned int max = 0xFFFFFFFF >> (32 - n);

+		static const unsigned int max = 0xFFFFFFFF >> (32 - n);

+		static const float maxf = static_cast<float>(max);

 

-		if(x > 1)

+		if(x >= 1.0f)

 		{

 			return max;

 		}

-		else if(x < 0)

+		else if(x <= 0.0f)

 		{

 			return 0;

 		}

 		else

 		{

-			return (unsigned int)(max * x + 0.5f);

+			return static_cast<unsigned int>(maxf * x + 0.5f);

 		}

 	}

 

 	template<const int n>

 	inline int snorm(float x)

 	{

-		const unsigned int min = 0x80000000 >> (32 - n);

-		const unsigned int max = 0xFFFFFFFF >> (32 - n + 1);

-		const unsigned int range = 0xFFFFFFFF >> (32 - n);

+		static const unsigned int min = 0x80000000 >> (32 - n);

+		static const unsigned int max = 0xFFFFFFFF >> (32 - n + 1);

+		static const float maxf = static_cast<float>(max);

+		static const unsigned int range = 0xFFFFFFFF >> (32 - n);

 

-		if(x > 0)

+		if(x >= 0.0f)

 		{

-			if(x > 1)

+			if(x >= 1.0f)

 			{

 				return max;

 			}

 			else

 			{

-				return (int)(max * x + 0.5f);

+				return static_cast<int>(maxf * x + 0.5f);

 			}

 		}

 		else

 		{

-			if(x < -1)

+			if(x <= -1.0f)

 			{

 				return min;

 			}

 			else

 			{

-				return (int)(max * x - 0.5f) & range;

+				return static_cast<int>(maxf * x - 0.5f) & range;

+			}

+		}

+	}

+

+	template<const int n>

+	inline unsigned int ucast(float x)

+	{

+		static const unsigned int max = 0xFFFFFFFF >> (32 - n);

+		static const float maxf = static_cast<float>(max);

+

+		if(x >= maxf)

+		{

+			return max;

+		}

+		else if(x <= 0.0f)

+		{

+			return 0;

+		}

+		else

+		{

+			return static_cast<unsigned int>(x + 0.5f);

+		}

+	}

+

+	template<const int n>

+	inline int scast(float x)

+	{

+		static const unsigned int min = 0x80000000 >> (32 - n);

+		static const unsigned int max = 0xFFFFFFFF >> (32 - n + 1);

+		static const float maxf = static_cast<float>(max);

+		static const unsigned int range = 0xFFFFFFFF >> (32 - n);

+

+		if(x > 0.0f)

+		{

+			if(x >= maxf)

+			{

+				return max;

+			}

+			else

+			{

+				return static_cast<int>(maxf * x + 0.5f);

+			}

+		}

+		else

+		{

+			if(x <= -1.0f)

+			{

+				return min;

+			}

+			else

+			{

+				return static_cast<int>(maxf * x - 0.5f) & range;

 			}

 		}

 	}

diff --git a/src/Renderer/Surface.cpp b/src/Renderer/Surface.cpp
index 61fc9bc..74213f9 100644
--- a/src/Renderer/Surface.cpp
+++ b/src/Renderer/Surface.cpp
@@ -66,9 +66,30 @@
 		case FORMAT_A8:
 			*(unsigned char*)element = unorm<8>(color.a);
 			break;
+		case FORMAT_R8I_SNORM:
+			*(char*)element = snorm<8>(color.r);
+			break;
 		case FORMAT_R8:
 			*(unsigned char*)element = unorm<8>(color.r);
 			break;
+		case FORMAT_R8I:
+			*(char*)element = scast<8>(color.r);
+			break;
+		case FORMAT_R8UI:
+			*(unsigned char*)element = ucast<8>(color.r);
+			break;
+		case FORMAT_R16I:
+			*(short*)element = scast<16>(color.r);
+			break;
+		case FORMAT_R16UI:
+			*(unsigned short*)element = ucast<16>(color.r);
+			break;
+		case FORMAT_R32I:
+			*(int*)element = static_cast<int>(color.r);
+			break;
+		case FORMAT_R32UI:
+			*(unsigned int*)element = static_cast<unsigned int>(color.r);
+			break;
 		case FORMAT_R3G3B2:
 			*(unsigned char*)element = (unorm<3>(color.r) << 5) | (unorm<3>(color.g) << 2) | (unorm<2>(color.b) << 0);
 			break;
@@ -102,30 +123,117 @@
 		case FORMAT_X8R8G8B8:
 			*(unsigned int*)element = 0xFF000000 | (unorm<8>(color.r) << 16) | (unorm<8>(color.g) << 8) | (unorm<8>(color.b) << 0);
 			break;
+		case FORMAT_A8B8G8R8I_SNORM:
+			*(unsigned int*)element = (static_cast<unsigned int>(snorm<8>(color.a)) << 24) |
+			                          (static_cast<unsigned int>(snorm<8>(color.b)) << 16) |
+			                          (static_cast<unsigned int>(snorm<8>(color.g)) << 8) |
+			                          (static_cast<unsigned int>(snorm<8>(color.r)) << 0);
+			break;
 		case FORMAT_A8B8G8R8:
 			*(unsigned int*)element = (unorm<8>(color.a) << 24) | (unorm<8>(color.b) << 16) | (unorm<8>(color.g) << 8) | (unorm<8>(color.r) << 0);
 			break;
+		case FORMAT_A8B8G8R8I:
+			*(unsigned int*)element = (static_cast<unsigned int>(scast<8>(color.a)) << 24) |
+			                          (static_cast<unsigned int>(scast<8>(color.b)) << 16) |
+			                          (static_cast<unsigned int>(scast<8>(color.g)) << 8) |
+			                          (static_cast<unsigned int>(scast<8>(color.r)) << 0);
+			break;
+		case FORMAT_A8B8G8R8UI:
+			*(unsigned int*)element = (ucast<8>(color.a) << 24) | (ucast<8>(color.b) << 16) | (ucast<8>(color.g) << 8) | (ucast<8>(color.r) << 0);
+			break;
+		case FORMAT_X8B8G8R8I_SNORM:
+			*(unsigned int*)element = 0x7F000000 |
+			                          (static_cast<unsigned int>(snorm<8>(color.b)) << 16) |
+			                          (static_cast<unsigned int>(snorm<8>(color.g)) << 8) |
+			                          (static_cast<unsigned int>(snorm<8>(color.r)) << 0);
+			break;
 		case FORMAT_X8B8G8R8:
 			*(unsigned int*)element = 0xFF000000 | (unorm<8>(color.b) << 16) | (unorm<8>(color.g) << 8) | (unorm<8>(color.r) << 0);
 			break;
+		case FORMAT_X8B8G8R8I:
+			*(unsigned int*)element = 0x7F000000 |
+			                          (static_cast<unsigned int>(scast<8>(color.b)) << 16) |
+			                          (static_cast<unsigned int>(scast<8>(color.g)) << 8) |
+			                          (static_cast<unsigned int>(scast<8>(color.r)) << 0);
+		case FORMAT_X8B8G8R8UI:
+			*(unsigned int*)element = 0xFF000000 | (ucast<8>(color.b) << 16) | (ucast<8>(color.g) << 8) | (ucast<8>(color.r) << 0);
+			break;
 		case FORMAT_A2R10G10B10:
 			*(unsigned int*)element = (unorm<2>(color.a) << 30) | (unorm<10>(color.r) << 20) | (unorm<10>(color.g) << 10) | (unorm<10>(color.b) << 0);
 			break;
 		case FORMAT_A2B10G10R10:
 			*(unsigned int*)element = (unorm<2>(color.a) << 30) | (unorm<10>(color.b) << 20) | (unorm<10>(color.g) << 10) | (unorm<10>(color.r) << 0);
 			break;
+		case FORMAT_G8R8I_SNORM:
+			*(unsigned short*)element = (static_cast<unsigned short>(snorm<8>(color.g)) << 8) |
+			                            (static_cast<unsigned short>(snorm<8>(color.r)) << 0);
+			break;
 		case FORMAT_G8R8:
-			*(unsigned int*)element = (unorm<8>(color.g) << 8) | (unorm<8>(color.r) << 0);
+			*(unsigned short*)element = (unorm<8>(color.g) << 8) | (unorm<8>(color.r) << 0);
+			break;
+		case FORMAT_G8R8I:
+			*(unsigned short*)element = (static_cast<unsigned short>(scast<8>(color.g)) << 8) |
+			                            (static_cast<unsigned short>(scast<8>(color.r)) << 0);
+			break;
+		case FORMAT_G8R8UI:
+			*(unsigned short*)element = (ucast<8>(color.g) << 8) | (ucast<8>(color.r) << 0);
 			break;
 		case FORMAT_G16R16:
 			*(unsigned int*)element = (unorm<16>(color.g) << 16) | (unorm<16>(color.r) << 0);
 			break;
+		case FORMAT_G16R16I:
+			*(unsigned int*)element = (static_cast<unsigned int>(scast<16>(color.g)) << 16) |
+			                          (static_cast<unsigned int>(scast<16>(color.r)) << 0);
+			break;
+		case FORMAT_G16R16UI:
+			*(unsigned int*)element = (ucast<16>(color.g) << 16) | (ucast<16>(color.r) << 0);
+			break;
+		case FORMAT_G32R32I:
+		case FORMAT_G32R32UI:
+			((unsigned int*)element)[0] = static_cast<unsigned int>(color.r);
+			((unsigned int*)element)[1] = static_cast<unsigned int>(color.g);
+			break;
 		case FORMAT_A16B16G16R16:
 			((unsigned short*)element)[0] = unorm<16>(color.r);
 			((unsigned short*)element)[1] = unorm<16>(color.g);
 			((unsigned short*)element)[2] = unorm<16>(color.b);
 			((unsigned short*)element)[3] = unorm<16>(color.a);
 			break;
+		case FORMAT_A16B16G16R16I:
+			((unsigned short*)element)[0] = static_cast<unsigned short>(scast<16>(color.r));
+			((unsigned short*)element)[1] = static_cast<unsigned short>(scast<16>(color.g));
+			((unsigned short*)element)[2] = static_cast<unsigned short>(scast<16>(color.b));
+			((unsigned short*)element)[3] = static_cast<unsigned short>(scast<16>(color.a));
+			break;
+		case FORMAT_A16B16G16R16UI:
+			((unsigned short*)element)[0] = static_cast<unsigned short>(ucast<16>(color.r));
+			((unsigned short*)element)[1] = static_cast<unsigned short>(ucast<16>(color.g));
+			((unsigned short*)element)[2] = static_cast<unsigned short>(ucast<16>(color.b));
+			((unsigned short*)element)[3] = static_cast<unsigned short>(ucast<16>(color.a));
+			break;
+		case FORMAT_X16B16G16R16I:
+			((unsigned short*)element)[0] = static_cast<unsigned short>(scast<16>(color.r));
+			((unsigned short*)element)[1] = static_cast<unsigned short>(scast<16>(color.g));
+			((unsigned short*)element)[2] = static_cast<unsigned short>(scast<16>(color.b));
+			break;
+		case FORMAT_X16B16G16R16UI:
+			((unsigned short*)element)[0] = static_cast<unsigned short>(ucast<16>(color.r));
+			((unsigned short*)element)[1] = static_cast<unsigned short>(ucast<16>(color.g));
+			((unsigned short*)element)[2] = static_cast<unsigned short>(ucast<16>(color.b));
+			break;
+		case FORMAT_A32B32G32R32I:
+		case FORMAT_A32B32G32R32UI:
+			((unsigned int*)element)[0] = static_cast<unsigned int>(color.r);
+			((unsigned int*)element)[1] = static_cast<unsigned int>(color.g);
+			((unsigned int*)element)[2] = static_cast<unsigned int>(color.b);
+			((unsigned int*)element)[3] = static_cast<unsigned int>(color.a);
+			break;
+		case FORMAT_X32B32G32R32I:
+		case FORMAT_X32B32G32R32UI:
+			((unsigned int*)element)[0] = static_cast<unsigned int>(color.r);
+			((unsigned int*)element)[1] = static_cast<unsigned int>(color.g);
+			((unsigned int*)element)[2] = static_cast<unsigned int>(color.b);
+			break;
 		case FORMAT_V8U8:
 			*(unsigned short*)element = (snorm<8>(color.g) << 8) | (snorm<8>(color.r) << 0);
 			break;
@@ -304,9 +412,18 @@
 			b = 0;
 			a = *(unsigned char*)element * (1.0f / 0xFF);
 			break;
+		case FORMAT_R8I_SNORM:
+			r = max((*(signed char*)element) * (1.0f / 0x7F), -1.0f);
+			break;
 		case FORMAT_R8:
 			r = *(unsigned char*)element * (1.0f / 0xFF);
 			break;
+		case FORMAT_R8I:
+			r = *(signed char*)element;
+			break;
+		case FORMAT_R8UI:
+			r = *(unsigned char*)element;
+			break;
 		case FORMAT_R3G3B2:
 			{
 				unsigned char rgb = *(unsigned char*)element;
@@ -412,6 +529,16 @@
 				b = (xrgb & 0x000000FF) * (1.0f / 0x000000FF);
 			}
 			break;
+		case FORMAT_A8B8G8R8I_SNORM:
+			{
+				signed char* abgr = (signed char*)element;
+				
+				r = max(abgr[0] * (1.0f / 0x7F), -1.0f);
+				g = max(abgr[1] * (1.0f / 0x7F), -1.0f);
+				b = max(abgr[2] * (1.0f / 0x7F), -1.0f);
+				a = max(abgr[3] * (1.0f / 0x7F), -1.0f);
+			}
+			break;
 		case FORMAT_A8B8G8R8:
 			{
 				unsigned int abgr = *(unsigned int*)element;
@@ -422,6 +549,35 @@
 				r = (abgr & 0x000000FF) * (1.0f / 0x000000FF);
 			}
 			break;
+		case FORMAT_A8B8G8R8I:
+			{
+				signed char* abgr = (signed char*)element;
+				
+				r = abgr[0];
+				g = abgr[1];
+				b = abgr[2];
+				a = abgr[3];
+			}
+			break;
+		case FORMAT_A8B8G8R8UI:
+			{
+				unsigned char* abgr = (unsigned char*)element;
+
+				r = abgr[0];
+				g = abgr[1];
+				b = abgr[2];
+				a = abgr[3];
+			}
+			break;
+		case FORMAT_X8B8G8R8I_SNORM:
+			{
+				signed char* bgr = (signed char*)element;
+				
+				r = max(bgr[0] * (1.0f / 0x7F), -1.0f);
+				g = max(bgr[1] * (1.0f / 0x7F), -1.0f);
+				b = max(bgr[2] * (1.0f / 0x7F), -1.0f);
+			}
+			break;
 		case FORMAT_X8B8G8R8:
 			{
 				unsigned int xbgr = *(unsigned int*)element;
@@ -431,6 +587,32 @@
 				r = (xbgr & 0x000000FF) * (1.0f / 0x000000FF);
 			}
 			break;
+		case FORMAT_X8B8G8R8I:
+			{
+				signed char* bgr = (signed char*)element;
+				
+				r = bgr[0];
+				g = bgr[1];
+				b = bgr[2];
+			}
+			break;
+		case FORMAT_X8B8G8R8UI:
+			{
+				unsigned char* bgr = (unsigned char*)element;
+
+				r = bgr[0];
+				g = bgr[1];
+				b = bgr[2];
+			}
+			break;
+		case FORMAT_G8R8I_SNORM:
+			{
+				signed char* gr = (signed char*)element;
+				
+				r = (gr[0] & 0xFF00) * (1.0f / 0xFF00);
+				g = (gr[1] & 0x00FF) * (1.0f / 0x00FF);
+			}
+			break;
 		case FORMAT_G8R8:
 			{
 				unsigned short gr = *(unsigned short*)element;
@@ -439,6 +621,36 @@
 				r = (gr & 0x00FF) * (1.0f / 0x00FF);
 			}
 			break;
+		case FORMAT_G8R8I:
+			{
+				signed char* gr = (signed char*)element;
+				
+				r = gr[0];
+				g = gr[1];
+			}
+			break;
+		case FORMAT_G8R8UI:
+			{
+				unsigned char* gr = (unsigned char*)element;
+				
+				r = gr[0];
+				g = gr[1];
+			}
+			break;
+		case FORMAT_R16I:
+			r = *((short*)element);
+			break;
+		case FORMAT_R16UI:
+			r = *((unsigned short*)element);
+			break;
+		case FORMAT_G16R16I:
+			{
+				short* gr = (short*)element;
+				
+				r = gr[0];
+				g = gr[1];
+			}
+			break;
 		case FORMAT_G16R16:
 			{
 				unsigned int gr = *(unsigned int*)element;
@@ -447,6 +659,14 @@
 				r = (gr & 0x0000FFFF) * (1.0f / 0x0000FFFF);
 			}
 			break;
+		case FORMAT_G16R16UI:
+			{
+				unsigned short* gr = (unsigned short*)element;
+				
+				r = gr[0];
+				g = gr[1];
+			}
+			break;
 		case FORMAT_A2R10G10B10:
 			{
 				unsigned int argb = *(unsigned int*)element;
@@ -467,12 +687,110 @@
 				r = (abgr & 0x000003FF) * (1.0f / 0x000003FF);
 			}
 			break;
+		case FORMAT_A16B16G16R16I:
+			{
+				short* abgr = (short*)element;
+				
+				r = abgr[0];
+				g = abgr[1];
+				b = abgr[2];
+				a = abgr[3];
+			}
+			break;
 		case FORMAT_A16B16G16R16:
 			r = ((unsigned short*)element)[0] * (1.0f / 0xFFFF);
 			g = ((unsigned short*)element)[1] * (1.0f / 0xFFFF);
 			b = ((unsigned short*)element)[2] * (1.0f / 0xFFFF);
 			a = ((unsigned short*)element)[3] * (1.0f / 0xFFFF);
 			break;
+		case FORMAT_A16B16G16R16UI:
+			{
+				unsigned short* abgr = (unsigned short*)element;
+				
+				r = abgr[0];
+				g = abgr[1];
+				b = abgr[2];
+				a = abgr[3];
+			}
+			break;
+		case FORMAT_X16B16G16R16I:
+			{
+				short* bgr = (short*)element;
+				
+				r = bgr[0];
+				g = bgr[1];
+				b = bgr[2];
+			}
+			break;
+		case FORMAT_X16B16G16R16UI:
+			{
+				unsigned short* bgr = (unsigned short*)element;
+				
+				r = bgr[0];
+				g = bgr[1];
+				b = bgr[2];
+			}
+			break;
+		case FORMAT_A32B32G32R32I:
+			{
+				int* abgr = (int*)element;
+				
+				r = static_cast<float>(abgr[0]);
+				g = static_cast<float>(abgr[1]);
+				b = static_cast<float>(abgr[2]);
+				a = static_cast<float>(abgr[3]);
+			}
+			break;
+		case FORMAT_A32B32G32R32UI:
+			{
+				unsigned int* abgr = (unsigned int*)element;
+				
+				r = static_cast<float>(abgr[0]);
+				g = static_cast<float>(abgr[1]);
+				b = static_cast<float>(abgr[2]);
+				a = static_cast<float>(abgr[3]);
+			}
+			break;
+		case FORMAT_X32B32G32R32I:
+			{
+				int* bgr = (int*)element;
+				
+				r = static_cast<float>(bgr[0]);
+				g = static_cast<float>(bgr[1]);
+				b = static_cast<float>(bgr[2]);
+			}
+			break;
+		case FORMAT_X32B32G32R32UI:
+			{
+				unsigned int* bgr = (unsigned int*)element;
+				
+				r = static_cast<float>(bgr[0]);
+				g = static_cast<float>(bgr[1]);
+				b = static_cast<float>(bgr[2]);
+			}
+			break;
+		case FORMAT_G32R32I:
+			{
+				int* gr = (int*)element;
+				
+				r = static_cast<float>(gr[0]);
+				g = static_cast<float>(gr[1]);
+			}
+			break;
+		case FORMAT_G32R32UI:
+			{
+				unsigned int* gr = (unsigned int*)element;
+				
+				r = static_cast<float>(gr[0]);
+				g = static_cast<float>(gr[1]);
+			}
+			break;
+		case FORMAT_R32I:
+			r = static_cast<float>(*((int*)element));
+			break;
+		case FORMAT_R32UI:
+			r = static_cast<float>(*((unsigned int*)element));
+			break;
 		case FORMAT_V8U8:
 			{
 				unsigned short vu = *(unsigned short*)element;
@@ -1125,8 +1443,11 @@
 		case FORMAT_P8:					return 1;
 		case FORMAT_A8P8:				return 2;
 		case FORMAT_A8:					return 1;
+		case FORMAT_R8I:				return 1;
 		case FORMAT_R8:					return 1;
 		case FORMAT_R3G3B2:				return 1;
+		case FORMAT_R16I:				return 2;
+		case FORMAT_R16UI:				return 2;
 		case FORMAT_A8R3G3B2:			return 2;
 		case FORMAT_R5G6B5:				return 2;
 		case FORMAT_A1R5G5B5:			return 2;
@@ -1137,17 +1458,42 @@
 		case FORMAT_R4G4B4A4:           return 2;
 		case FORMAT_R8G8B8:				return 3;
 		case FORMAT_B8G8R8:             return 3;
+		case FORMAT_R32I:				return 4;
+		case FORMAT_R32UI:				return 4;
 		case FORMAT_X8R8G8B8:			return 4;
 	//	case FORMAT_X8G8R8B8Q:			return 4;
 		case FORMAT_A8R8G8B8:			return 4;
 	//	case FORMAT_A8G8R8B8Q:			return 4;
+		case FORMAT_X8B8G8R8I:			return 4;
 		case FORMAT_X8B8G8R8:			return 4;
+		case FORMAT_A8B8G8R8I:			return 4;
+		case FORMAT_R8UI:				return 1;
+		case FORMAT_G8R8UI:				return 2;
+		case FORMAT_X8B8G8R8UI:			return 4;
+		case FORMAT_A8B8G8R8UI:			return 4;
 		case FORMAT_A8B8G8R8:			return 4;
+		case FORMAT_R8I_SNORM:			return 1;
+		case FORMAT_G8R8I_SNORM:		return 2;
+		case FORMAT_X8B8G8R8I_SNORM:	return 4;
+		case FORMAT_A8B8G8R8I_SNORM:	return 4;
 		case FORMAT_A2R10G10B10:		return 4;
 		case FORMAT_A2B10G10R10:		return 4;
+		case FORMAT_G8R8I:				return 2;
 		case FORMAT_G8R8:				return 2;
+		case FORMAT_G16R16I:			return 4;
+		case FORMAT_G16R16UI:			return 4;
 		case FORMAT_G16R16:				return 4;
+		case FORMAT_G32R32I:			return 8;
+		case FORMAT_G32R32UI:			return 8;
+		case FORMAT_X16B16G16R16I:		return 8;
+		case FORMAT_X16B16G16R16UI:		return 8;
+		case FORMAT_A16B16G16R16I:		return 8;
+		case FORMAT_A16B16G16R16UI:		return 8;
 		case FORMAT_A16B16G16R16:		return 8;
+		case FORMAT_X32B32G32R32I:		return 16;
+		case FORMAT_X32B32G32R32UI:		return 16;
+		case FORMAT_A32B32G32R32I:		return 16;
+		case FORMAT_A32B32G32R32UI:		return 16;
 		// Compressed formats
 		#if S3TC_SUPPORT
 		case FORMAT_DXT1:				return 2;   // Column of four pixels
@@ -2370,8 +2716,20 @@
 		case FORMAT_A8R8G8B8:
 		case FORMAT_A8B8G8R8:
 		case FORMAT_G8R8:
+		case FORMAT_R16UI:
 		case FORMAT_G16R16:
+		case FORMAT_G16R16UI:
+		case FORMAT_X16B16G16R16UI:
 		case FORMAT_A16B16G16R16:
+		case FORMAT_A16B16G16R16UI:
+		case FORMAT_R32UI:
+		case FORMAT_G32R32UI:
+		case FORMAT_X32B32G32R32UI:
+		case FORMAT_A32B32G32R32UI:
+		case FORMAT_R8UI:
+		case FORMAT_G8R8UI:
+		case FORMAT_X8B8G8R8UI:
+		case FORMAT_A8B8G8R8UI:
 		case FORMAT_D32F:
 		case FORMAT_D32F_COMPLEMENTARY:
 		case FORMAT_D32F_LOCKABLE:
@@ -2386,49 +2744,35 @@
 		case FORMAT_YV12_BT709:
 		case FORMAT_YV12_JFIF:
 			return true;
+		case FORMAT_A8B8G8R8I:
+		case FORMAT_A16B16G16R16I:
+		case FORMAT_A32B32G32R32I:
+		case FORMAT_A8B8G8R8I_SNORM:
+		case FORMAT_Q8W8V8U8:
+		case FORMAT_Q16W16V16U16:
+		case FORMAT_A32B32G32R32F:
+			return false;
+		case FORMAT_R32F:
+		case FORMAT_R8I:
+		case FORMAT_R16I:
+		case FORMAT_R32I:
+		case FORMAT_R8I_SNORM:
+			return component >= 1;
 		case FORMAT_V8U8:
 		case FORMAT_X8L8V8U8:
 		case FORMAT_V16U16:
-			if(component < 2)
-			{
-				return false;
-			}
-			else
-			{
-				return true;
-			}
-		case FORMAT_A16W16V16U16:
-			if(component < 3)
-			{
-				return false;
-			}
-			else
-			{
-				return true;
-			}
-		case FORMAT_Q8W8V8U8:
-		case FORMAT_Q16W16V16U16:
-			return false;
-		case FORMAT_R32F:
-			if(component < 1)
-			{
-				return false;
-			}
-			else
-			{
-				return true;
-			}
 		case FORMAT_G32R32F:
-			if(component < 2)
-			{
-				return false;
-			}
-			else
-			{
-				return true;
-			}
-		case FORMAT_A32B32G32R32F:
-			return false;
+		case FORMAT_G8R8I:
+		case FORMAT_G16R16I:
+		case FORMAT_G32R32I:
+		case FORMAT_G8R8I_SNORM:
+			return component >= 2;
+		case FORMAT_A16W16V16U16:
+		case FORMAT_X8B8G8R8I:
+		case FORMAT_X16B16G16R16I:
+		case FORMAT_X32B32G32R32I:
+		case FORMAT_X8B8G8R8I_SNORM:
+			return component >= 3;
 		default:
 			ASSERT(false);
 		}
@@ -2580,12 +2924,35 @@
 		{
 		case FORMAT_R5G6B5:         return 3;
 		case FORMAT_X8R8G8B8:       return 3;
+		case FORMAT_X8B8G8R8I:      return 3;
 		case FORMAT_X8B8G8R8:       return 3;
 		case FORMAT_A8R8G8B8:       return 4;
+		case FORMAT_A8B8G8R8I:      return 4;
 		case FORMAT_A8B8G8R8:       return 4;
+		case FORMAT_G8R8I:          return 2;
 		case FORMAT_G8R8:           return 2;
+		case FORMAT_R8I_SNORM:      return 1;
+		case FORMAT_G8R8I_SNORM:    return 2;
+		case FORMAT_X8B8G8R8I_SNORM:return 3;
+		case FORMAT_A8B8G8R8I_SNORM:return 4;
+		case FORMAT_R8UI:           return 1;
+		case FORMAT_G8R8UI:         return 2;
+		case FORMAT_X8B8G8R8UI:     return 3;
+		case FORMAT_A8B8G8R8UI:     return 4;
+		case FORMAT_G16R16I:        return 2;
+		case FORMAT_G16R16UI:       return 2;
 		case FORMAT_G16R16:         return 2;
+		case FORMAT_G32R32I:        return 2;
+		case FORMAT_G32R32UI:       return 2;
+		case FORMAT_X16B16G16R16I:  return 3;
+		case FORMAT_X16B16G16R16UI: return 3;
+		case FORMAT_A16B16G16R16I:  return 4;
+		case FORMAT_A16B16G16R16UI: return 4;
 		case FORMAT_A16B16G16R16:   return 4;
+		case FORMAT_X32B32G32R32I:  return 3;
+		case FORMAT_X32B32G32R32UI: return 3;
+		case FORMAT_A32B32G32R32I:  return 4;
+		case FORMAT_A32B32G32R32UI: return 4;
 		case FORMAT_V8U8:           return 2;
 		case FORMAT_Q8W8V8U8:       return 4;
 		case FORMAT_X8L8V8U8:       return 3;
@@ -2595,11 +2962,17 @@
 		case FORMAT_R32F:           return 1;
 		case FORMAT_G32R32F:        return 2;
 		case FORMAT_A32B32G32R32F:  return 4;
+		case FORMAT_D32F:           return 1;
 		case FORMAT_D32F_LOCKABLE:  return 1;
 		case FORMAT_D32FS8_TEXTURE: return 1;
 		case FORMAT_D32FS8_SHADOW:  return 1;
 		case FORMAT_A8:             return 1;
+		case FORMAT_R8I:            return 1;
 		case FORMAT_R8:             return 1;
+		case FORMAT_R16I:           return 1;
+		case FORMAT_R16UI:          return 1;
+		case FORMAT_R32I:           return 1;
+		case FORMAT_R32UI:          return 1;
 		case FORMAT_L8:             return 1;
 		case FORMAT_L16:            return 1;
 		case FORMAT_A8L8:           return 2;
@@ -3457,16 +3830,56 @@
 			return FORMAT_A8R8G8B8;
 		case FORMAT_A8:
 			return FORMAT_A8;
+		case FORMAT_R8I:
+			return FORMAT_R8I;
+		case FORMAT_R8UI:
+			return FORMAT_R8UI;
+		case FORMAT_R8I_SNORM:
+			return FORMAT_R8I_SNORM;
 		case FORMAT_R8:
 			return FORMAT_R8;
+		case FORMAT_R16I:
+			return FORMAT_R16I;
+		case FORMAT_R16UI:
+			return FORMAT_R16UI;
+		case FORMAT_R32I:
+			return FORMAT_R32I;
+		case FORMAT_R32UI:
+			return FORMAT_R32UI;
 		case FORMAT_A2R10G10B10:
 		case FORMAT_A2B10G10R10:
+		case FORMAT_X16B16G16R16I:
+		case FORMAT_A16B16G16R16I:
+			return FORMAT_A16B16G16R16I;
+		case FORMAT_X16B16G16R16UI:
+		case FORMAT_A16B16G16R16UI:
+			return FORMAT_A16B16G16R16UI;
 		case FORMAT_A16B16G16R16:
 			return FORMAT_A16B16G16R16;
+		case FORMAT_X32B32G32R32I:
+		case FORMAT_A32B32G32R32I:
+			return FORMAT_A32B32G32R32I;
+		case FORMAT_X32B32G32R32UI:
+		case FORMAT_A32B32G32R32UI:
+			return FORMAT_A32B32G32R32UI;
+		case FORMAT_G8R8I:
+			return FORMAT_G8R8I;
+		case FORMAT_G8R8UI:
+			return FORMAT_G8R8UI;
+		case FORMAT_G8R8I_SNORM:
+			return FORMAT_G8R8I_SNORM;
 		case FORMAT_G8R8:
 			return FORMAT_G8R8;
+		case FORMAT_G16R16I:
+			return FORMAT_G16R16I;
+		case FORMAT_G16R16UI:
+			return FORMAT_G16R16UI;
 		case FORMAT_G16R16:
 			return FORMAT_G16R16;
+		case FORMAT_G32R32I:
+			return FORMAT_G32R32I;
+		case FORMAT_G32R32UI:
+			return FORMAT_G32R32UI;
 		case FORMAT_A8R8G8B8:
 			if(lockable || !quadLayoutEnabled)
 			{
@@ -3476,6 +3889,12 @@
 			{
 				return FORMAT_A8G8R8B8Q;
 			}
+		case FORMAT_A8B8G8R8I:
+			return FORMAT_A8B8G8R8I;
+		case FORMAT_A8B8G8R8UI:
+			return FORMAT_A8B8G8R8UI;
+		case FORMAT_A8B8G8R8I_SNORM:
+			return FORMAT_A8B8G8R8I_SNORM;
 		case FORMAT_R5G5B5A1:
 		case FORMAT_R4G4B4A4:
 		case FORMAT_A8B8G8R8:
@@ -3495,6 +3914,12 @@
 			{
 				return FORMAT_X8G8R8B8Q;
 			}
+		case FORMAT_X8B8G8R8I:
+			return FORMAT_X8B8G8R8I;
+		case FORMAT_X8B8G8R8UI:
+			return FORMAT_X8B8G8R8UI;
+		case FORMAT_X8B8G8R8I_SNORM:
+			return FORMAT_X8B8G8R8I_SNORM;
 		case FORMAT_B8G8R8:
 		case FORMAT_X8B8G8R8:
 			return FORMAT_X8B8G8R8;
@@ -3599,6 +4024,7 @@
 			{
 				return FORMAT_D32F;
 			}
+		case FORMAT_D32F:           return FORMAT_D32F;
 		case FORMAT_D32F_LOCKABLE:  return FORMAT_D32F_LOCKABLE;
 		case FORMAT_D32FS8_TEXTURE: return FORMAT_D32FS8_TEXTURE;
 		case FORMAT_INTZ:           return FORMAT_D32FS8_TEXTURE;