Implement missing depth/stencil formats.

Several depth-only formats were implemented using depth+stencil
formats. This resulted in unintended stencil operations happening, as
well as unnecessary allocations and blitting of stencil data.

This change also introduces quad-layout depth+stencil formats for more
efficient rendering.

Note that as before the 'internal' buffer's format also indicates the
presence of a stencil component, even though it only stores the depth
component, while the 'stencil' buffer now has an S8 format or NULL for
a depth-only format.

Change-Id: I245f0cb5a999851e24082f3ab1ea78a5f5956af3
Reviewed-on: https://swiftshader-review.googlesource.com/14988
Tested-by: Nicolas Capens <nicolascapens@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/OpenGL/common/Image.cpp b/src/OpenGL/common/Image.cpp
index fe57b93..9fab82e 100644
--- a/src/OpenGL/common/Image.cpp
+++ b/src/OpenGL/common/Image.cpp
@@ -868,7 +868,7 @@
 				return sw::FORMAT_A16B16G16R16UI;
 			case GL_DEPTH_COMPONENT:
 			case GL_DEPTH_COMPONENT16:
-				return sw::FORMAT_D32FS8_TEXTURE;
+				return sw::FORMAT_D32F_LOCKABLE;
 			default:
 				UNREACHABLE(format);
 			}
@@ -909,7 +909,7 @@
 			case GL_DEPTH_COMPONENT16:
 			case GL_DEPTH_COMPONENT24:
 			case GL_DEPTH_COMPONENT32_OES:
-				return sw::FORMAT_D32FS8_TEXTURE;
+				return sw::FORMAT_D32F_LOCKABLE;
 			default:
 				UNREACHABLE(format);
 			}
diff --git a/src/OpenGL/libGLESv2/Device.cpp b/src/OpenGL/libGLESv2/Device.cpp
index cb2f49f..6bbb4ac 100644
--- a/src/OpenGL/libGLESv2/Device.cpp
+++ b/src/OpenGL/libGLESv2/Device.cpp
@@ -261,6 +261,7 @@
 
 		switch(format)
 		{
+		case FORMAT_S8:
 	//	case FORMAT_D15S1:
 		case FORMAT_D24S8:
 		case FORMAT_D24X8:
diff --git a/src/OpenGL/libGLESv2/Renderbuffer.cpp b/src/OpenGL/libGLESv2/Renderbuffer.cpp
index f1f6faa..61cc223 100644
--- a/src/OpenGL/libGLESv2/Renderbuffer.cpp
+++ b/src/OpenGL/libGLESv2/Renderbuffer.cpp
@@ -528,23 +528,13 @@
 	sw::Format implementationFormat = sw::FORMAT_D24S8;
 	switch(internalformat)
 	{
-	case GL_STENCIL_INDEX8:
-	case GL_DEPTH_COMPONENT24:
-	case GL_DEPTH24_STENCIL8_OES:
-		implementationFormat = sw::FORMAT_D24S8;
-		break;
-	case GL_DEPTH32F_STENCIL8:
-		implementationFormat = sw::FORMAT_D32FS8_TEXTURE;
-		break;
-	case GL_DEPTH_COMPONENT16:
-		implementationFormat = sw::FORMAT_D16;
-		break;
-	case GL_DEPTH_COMPONENT32_OES:
-		implementationFormat = sw::FORMAT_D32;
-		break;
-	case GL_DEPTH_COMPONENT32F:
-		implementationFormat = sw::FORMAT_D32F;
-		break;
+	case GL_STENCIL_INDEX8:        implementationFormat = sw::FORMAT_S8;     break;
+	case GL_DEPTH_COMPONENT24:     implementationFormat = sw::FORMAT_D24X8;  break;
+	case GL_DEPTH24_STENCIL8_OES:  implementationFormat = sw::FORMAT_D24S8;  break;
+	case GL_DEPTH32F_STENCIL8:     implementationFormat = sw::FORMAT_D32FS8; break;
+	case GL_DEPTH_COMPONENT16:     implementationFormat = sw::FORMAT_D16;    break;
+	case GL_DEPTH_COMPONENT32_OES: implementationFormat = sw::FORMAT_D32;    break;
+	case GL_DEPTH_COMPONENT32F:    implementationFormat = sw::FORMAT_D32F;   break;
 	default:
 		UNREACHABLE(internalformat);
 		format = GL_DEPTH24_STENCIL8_OES;
diff --git a/src/OpenGL/libGLESv2/utilities.cpp b/src/OpenGL/libGLESv2/utilities.cpp
index b784a4a..e4f54ed 100644
--- a/src/OpenGL/libGLESv2/utilities.cpp
+++ b/src/OpenGL/libGLESv2/utilities.cpp
@@ -2246,21 +2246,13 @@
 	{
 		switch(format)
 		{
-		case sw::FORMAT_D16:
-		case sw::FORMAT_D24X8:
-		case sw::FORMAT_D32:
-			return GL_DEPTH_COMPONENT16;
-		case sw::FORMAT_D24S8:
-			return GL_DEPTH24_STENCIL8_OES;
-		case sw::FORMAT_D32F:
-		case sw::FORMAT_D32F_COMPLEMENTARY:
-		case sw::FORMAT_D32F_LOCKABLE:
-			return GL_DEPTH_COMPONENT32F;
-		case sw::FORMAT_D32FS8_TEXTURE:
-		case sw::FORMAT_D32FS8_SHADOW:
-			return GL_DEPTH32F_STENCIL8;
-		case sw::FORMAT_S8:
-			return GL_STENCIL_INDEX8;
+		case sw::FORMAT_D16:    return GL_DEPTH_COMPONENT16;
+		case sw::FORMAT_D24X8:  return GL_DEPTH_COMPONENT24;
+		case sw::FORMAT_D32:    return GL_DEPTH_COMPONENT32_OES;
+		case sw::FORMAT_D24S8:  return GL_DEPTH24_STENCIL8_OES;
+		case sw::FORMAT_D32F:   return GL_DEPTH_COMPONENT32F;
+		case sw::FORMAT_D32FS8: return GL_DEPTH32F_STENCIL8;
+		case sw::FORMAT_S8:     return GL_STENCIL_INDEX8;
 		default:
 			UNREACHABLE(format);
 		}
diff --git a/src/Renderer/Blitter.cpp b/src/Renderer/Blitter.cpp
index 810f3cd..a6773fc 100644
--- a/src/Renderer/Blitter.cpp
+++ b/src/Renderer/Blitter.cpp
@@ -400,18 +400,15 @@
 		case FORMAT_D32:
 			c.x = Float(Int((*Pointer<UInt>(element))));
 			break;
-		case FORMAT_D32F:
-			c.x = *Pointer<Float>(element);
-			break;
 		case FORMAT_D32F_COMPLEMENTARY:
+		case FORMAT_D32FS8_COMPLEMENTARY:
 			c.x = 1.0f - *Pointer<Float>(element);
 			break;
+		case FORMAT_D32F:
+		case FORMAT_D32FS8:
 		case FORMAT_D32F_LOCKABLE:
-			c.x = *Pointer<Float>(element);
-			break;
 		case FORMAT_D32FS8_TEXTURE:
-			c.x = *Pointer<Float>(element);
-			break;
+		case FORMAT_D32F_SHADOW:
 		case FORMAT_D32FS8_SHADOW:
 			c.x = *Pointer<Float>(element);
 			break;
@@ -767,18 +764,15 @@
 		case FORMAT_D32:
 			*Pointer<UInt>(element) = UInt(RoundInt(Float(c.x)));
 			break;
-		case FORMAT_D32F:
-			*Pointer<Float>(element) = c.x;
-			break;
 		case FORMAT_D32F_COMPLEMENTARY:
+		case FORMAT_D32FS8_COMPLEMENTARY:
 			*Pointer<Float>(element) = 1.0f - c.x;
 			break;
+		case FORMAT_D32F:
+		case FORMAT_D32FS8:
 		case FORMAT_D32F_LOCKABLE:
-			*Pointer<Float>(element) = c.x;
-			break;
 		case FORMAT_D32FS8_TEXTURE:
-			*Pointer<Float>(element) = c.x;
-			break;
+		case FORMAT_D32F_SHADOW:
 		case FORMAT_D32FS8_SHADOW:
 			*Pointer<Float>(element) = c.x;
 			break;
@@ -1064,9 +1058,12 @@
 			scale = vector(static_cast<float>(0xFFFFFFFF), 0.0f, 0.0f, 0.0f);
 			break;
 		case FORMAT_D32F:
+		case FORMAT_D32FS8:
 		case FORMAT_D32F_COMPLEMENTARY:
+		case FORMAT_D32FS8_COMPLEMENTARY:
 		case FORMAT_D32F_LOCKABLE:
 		case FORMAT_D32FS8_TEXTURE:
+		case FORMAT_D32F_SHADOW:
 		case FORMAT_D32FS8_SHADOW:
 		case FORMAT_S8:
 			scale = vector(1.0f, 1.0f, 1.0f, 1.0f);
diff --git a/src/Renderer/Surface.cpp b/src/Renderer/Surface.cpp
index d836614..b15102d 100644
--- a/src/Renderer/Surface.cpp
+++ b/src/Renderer/Surface.cpp
@@ -318,12 +318,15 @@
 			((float*)element)[3] = color.a;
 			break;
 		case FORMAT_D32F:
+		case FORMAT_D32FS8:
 		case FORMAT_D32F_LOCKABLE:
 		case FORMAT_D32FS8_TEXTURE:
+		case FORMAT_D32F_SHADOW:
 		case FORMAT_D32FS8_SHADOW:
 			*((float*)element) = color.r;
 			break;
 		case FORMAT_D32F_COMPLEMENTARY:
+		case FORMAT_D32FS8_COMPLEMENTARY:
 			*((float*)element) = 1 - color.r;
 			break;
 		case FORMAT_S8:
@@ -962,8 +965,10 @@
 			a = ((float*)element)[3];
 			break;
 		case FORMAT_D32F:
+		case FORMAT_D32FS8:
 		case FORMAT_D32F_LOCKABLE:
 		case FORMAT_D32FS8_TEXTURE:
+		case FORMAT_D32F_SHADOW:
 		case FORMAT_D32FS8_SHADOW:
 			r = *(float*)element;
 			g = r;
@@ -971,6 +976,7 @@
 			a = r;
 			break;
 		case FORMAT_D32F_COMPLEMENTARY:
+		case FORMAT_D32FS8_COMPLEMENTARY:
 			r = 1.0f - *(float*)element;
 			g = r;
 			b = r;
@@ -1213,7 +1219,7 @@
 		external.lock = LOCK_UNLOCKED;
 		external.dirty = true;
 
-		internal.buffer = 0;
+		internal.buffer = nullptr;
 		internal.width = width;
 		internal.height = height;
 		internal.depth = depth;
@@ -1227,11 +1233,11 @@
 		internal.lock = LOCK_UNLOCKED;
 		internal.dirty = false;
 
-		stencil.buffer = 0;
+		stencil.buffer = nullptr;
 		stencil.width = width;
 		stencil.height = height;
 		stencil.depth = depth;
-		stencil.format = FORMAT_S8;
+		stencil.format = isStencil(format) ? FORMAT_S8 : FORMAT_NULL;
 		stencil.bytes = bytes(stencil.format);
 		stencil.pitchB = pitchB(stencil.width, 0, stencil.format, false);
 		stencil.pitchP = pitchP(stencil.width, 0, stencil.format, false);
@@ -1248,11 +1254,11 @@
 	Surface::Surface(Resource *texture, int width, int height, int depth, int border, Format format, bool lockable, bool renderTarget, int pitchPprovided) : lockable(lockable), renderTarget(renderTarget)
 	{
 		resource = texture ? texture : new Resource(0);
-		hasParent = texture != 0;
+		hasParent = texture != nullptr;
 		ownExternal = true;
 		depth = max(1, depth);
 
-		external.buffer = 0;
+		external.buffer = nullptr;
 		external.width = width;
 		external.height = height;
 		external.depth = depth;
@@ -1266,7 +1272,7 @@
 		external.lock = LOCK_UNLOCKED;
 		external.dirty = false;
 
-		internal.buffer = 0;
+		internal.buffer = nullptr;
 		internal.width = width;
 		internal.height = height;
 		internal.depth = depth;
@@ -1280,11 +1286,11 @@
 		internal.lock = LOCK_UNLOCKED;
 		internal.dirty = false;
 
-		stencil.buffer = 0;
+		stencil.buffer = nullptr;
 		stencil.width = width;
 		stencil.height = height;
 		stencil.depth = depth;
-		stencil.format = FORMAT_S8;
+		stencil.format = isStencil(format) ? FORMAT_S8 : FORMAT_NULL;
 		stencil.bytes = bytes(stencil.format);
 		stencil.pitchB = pitchB(stencil.width, 0, stencil.format, renderTarget);
 		stencil.pitchP = pitchP(stencil.width, 0, stencil.format, renderTarget);
@@ -1623,9 +1629,12 @@
 		case FORMAT_D24S8:				return 4;
 		case FORMAT_D24FS8:				return 4;
 		case FORMAT_D32F:				return 4;
+		case FORMAT_D32FS8:				return 4;
 		case FORMAT_D32F_COMPLEMENTARY:	return 4;
+		case FORMAT_D32FS8_COMPLEMENTARY: return 4;
 		case FORMAT_D32F_LOCKABLE:		return 4;
 		case FORMAT_D32FS8_TEXTURE:		return 4;
+		case FORMAT_D32F_SHADOW:		return 4;
 		case FORMAT_D32FS8_SHADOW:		return 4;
 		case FORMAT_DF24S8:				return 4;
 		case FORMAT_DF16S8:				return 2;
@@ -2672,6 +2681,7 @@
 		case FORMAT_D32F:
 		case FORMAT_D32F_COMPLEMENTARY:
 		case FORMAT_D32F_LOCKABLE:
+		case FORMAT_D32F_SHADOW:
 			return false;
 		case FORMAT_D24S8:
 		case FORMAT_D24FS8:
@@ -2680,6 +2690,8 @@
 		case FORMAT_DF16S8:
 		case FORMAT_D32FS8_TEXTURE:
 		case FORMAT_D32FS8_SHADOW:
+		case FORMAT_D32FS8:
+		case FORMAT_D32FS8_COMPLEMENTARY:
 		case FORMAT_INTZ:
 			return true;
 		default:
@@ -2697,11 +2709,14 @@
 		case FORMAT_D24S8:
 		case FORMAT_D24FS8:
 		case FORMAT_D32F:
+		case FORMAT_D32FS8:
 		case FORMAT_D32F_COMPLEMENTARY:
+		case FORMAT_D32FS8_COMPLEMENTARY:
 		case FORMAT_D32F_LOCKABLE:
 		case FORMAT_DF24S8:
 		case FORMAT_DF16S8:
 		case FORMAT_D32FS8_TEXTURE:
+		case FORMAT_D32F_SHADOW:
 		case FORMAT_D32FS8_SHADOW:
 		case FORMAT_INTZ:
 			return true;
@@ -2722,7 +2737,9 @@
 		case FORMAT_D24S8:
 		case FORMAT_D24FS8:
 		case FORMAT_D32F:
+		case FORMAT_D32FS8:
 		case FORMAT_D32F_COMPLEMENTARY:
+		case FORMAT_D32FS8_COMPLEMENTARY:
 		case FORMAT_DF24S8:
 		case FORMAT_DF16S8:
 		case FORMAT_INTZ:
@@ -2732,6 +2749,7 @@
 			return true;
 		case FORMAT_D32F_LOCKABLE:
 		case FORMAT_D32FS8_TEXTURE:
+		case FORMAT_D32F_SHADOW:
 		case FORMAT_D32FS8_SHADOW:
 		default:
 			break;
@@ -2823,9 +2841,12 @@
 		case FORMAT_X32B32G32R32F:
 		case FORMAT_A32B32G32R32F:
 		case FORMAT_D32F:
+		case FORMAT_D32FS8:
 		case FORMAT_D32F_COMPLEMENTARY:
+		case FORMAT_D32FS8_COMPLEMENTARY:
 		case FORMAT_D32F_LOCKABLE:
 		case FORMAT_D32FS8_TEXTURE:
+		case FORMAT_D32F_SHADOW:
 		case FORMAT_D32FS8_SHADOW:
 		case FORMAT_L16F:
 		case FORMAT_A16L16F:
@@ -2870,9 +2891,12 @@
 		case FORMAT_X8B8G8R8UI:
 		case FORMAT_A8B8G8R8UI:
 		case FORMAT_D32F:
+		case FORMAT_D32FS8:
 		case FORMAT_D32F_COMPLEMENTARY:
+		case FORMAT_D32FS8_COMPLEMENTARY:
 		case FORMAT_D32F_LOCKABLE:
 		case FORMAT_D32FS8_TEXTURE:
+		case FORMAT_D32F_SHADOW:
 		case FORMAT_D32FS8_SHADOW:
 		case FORMAT_A8:
 		case FORMAT_R8:
@@ -3135,8 +3159,10 @@
 		case FORMAT_X32B32G32R32F:  return 3;
 		case FORMAT_A32B32G32R32F:  return 4;
 		case FORMAT_D32F:           return 1;
+		case FORMAT_D32FS8:         return 1;
 		case FORMAT_D32F_LOCKABLE:  return 1;
 		case FORMAT_D32FS8_TEXTURE: return 1;
+		case FORMAT_D32F_SHADOW:    return 1;
 		case FORMAT_D32FS8_SHADOW:  return 1;
 		case FORMAT_A8:             return 1;
 		case FORMAT_R8I:            return 1;
@@ -3278,9 +3304,7 @@
 		int x1 = x0 + width;
 		int y1 = y0 + height;
 
-		if(internal.format == FORMAT_D32F_LOCKABLE ||
-		   internal.format == FORMAT_D32FS8_TEXTURE ||
-		   internal.format == FORMAT_D32FS8_SHADOW)
+		if(!hasQuadLayout(internal.format))
 		{
 			float *target = (float*)lockInternal(0, 0, 0, lock, PUBLIC) + x0 + width2 * y0;
 
@@ -3870,11 +3894,9 @@
 		case FORMAT_D16:
 		case FORMAT_D32:
 		case FORMAT_D24X8:
-		case FORMAT_D24S8:
-		case FORMAT_D24FS8:
 			if(hasParent)   // Texture
 			{
-				return FORMAT_D32FS8_SHADOW;
+				return FORMAT_D32F_SHADOW;
 			}
 			else if(complementaryDepthBuffer)
 			{
@@ -3884,12 +3906,29 @@
 			{
 				return FORMAT_D32F;
 			}
+		case FORMAT_D24S8:
+		case FORMAT_D24FS8:
+			if(hasParent)   // Texture
+			{
+				return FORMAT_D32FS8_SHADOW;
+			}
+			else if(complementaryDepthBuffer)
+			{
+				return FORMAT_D32FS8_COMPLEMENTARY;
+			}
+			else
+			{
+				return FORMAT_D32FS8;
+			}
 		case FORMAT_D32F:           return FORMAT_D32F;
+		case FORMAT_D32FS8:         return FORMAT_D32FS8;
 		case FORMAT_D32F_LOCKABLE:  return FORMAT_D32F_LOCKABLE;
 		case FORMAT_D32FS8_TEXTURE: return FORMAT_D32FS8_TEXTURE;
 		case FORMAT_INTZ:           return FORMAT_D32FS8_TEXTURE;
 		case FORMAT_DF24S8:         return FORMAT_D32FS8_SHADOW;
 		case FORMAT_DF16S8:         return FORMAT_D32FS8_SHADOW;
+		case FORMAT_S8:             return FORMAT_S8;
+		// YUV formats
 		case FORMAT_YV12_BT601:     return FORMAT_YV12_BT601;
 		case FORMAT_YV12_BT709:     return FORMAT_YV12_BT709;
 		case FORMAT_YV12_JFIF:      return FORMAT_YV12_JFIF;
diff --git a/src/Renderer/Surface.hpp b/src/Renderer/Surface.hpp
index 02be486..16aa24e 100644
--- a/src/Renderer/Surface.hpp
+++ b/src/Renderer/Surface.hpp
@@ -201,9 +201,12 @@
 		FORMAT_D24S8,
 		FORMAT_D24FS8,
 		FORMAT_D32F,                 // Quad layout
+		FORMAT_D32FS8,               // Quad layout
 		FORMAT_D32F_COMPLEMENTARY,   // Quad layout, 1 - z
+		FORMAT_D32FS8_COMPLEMENTARY, // Quad layout, 1 - z
 		FORMAT_D32F_LOCKABLE,        // Linear layout
 		FORMAT_D32FS8_TEXTURE,       // Linear layout, no PCF
+		FORMAT_D32F_SHADOW,          // Linear layout, PCF
 		FORMAT_D32FS8_SHADOW,        // Linear layout, PCF
 		FORMAT_DF24S8,
 		FORMAT_DF16S8,
diff --git a/src/Shader/SamplerCore.cpp b/src/Shader/SamplerCore.cpp
index 942cf87..a50c1e8 100644
--- a/src/Shader/SamplerCore.cpp
+++ b/src/Shader/SamplerCore.cpp
@@ -263,8 +263,10 @@
 				case FORMAT_A32B32G32R32F:
 					break;
 				case FORMAT_D32F:
+				case FORMAT_D32FS8:
 				case FORMAT_D32F_LOCKABLE:
 				case FORMAT_D32FS8_TEXTURE:
+				case FORMAT_D32F_SHADOW:
 				case FORMAT_D32FS8_SHADOW:
 					c.y = c.x;
 					c.z = c.x;
@@ -518,8 +520,10 @@
 				case FORMAT_A32B32G32R32F:
 					break;
 				case FORMAT_D32F:
+				case FORMAT_D32FS8:
 				case FORMAT_D32F_LOCKABLE:
 				case FORMAT_D32FS8_TEXTURE:
+				case FORMAT_D32F_SHADOW:
 				case FORMAT_D32FS8_SHADOW:
 					c.y = Float4(0.0f);
 					c.z = Float4(0.0f);
@@ -2657,8 +2661,10 @@
 		case FORMAT_L8:
 		case FORMAT_A8L8:
 		case FORMAT_D32F:
+		case FORMAT_D32FS8:
 		case FORMAT_D32F_LOCKABLE:
 		case FORMAT_D32FS8_TEXTURE:
+		case FORMAT_D32F_SHADOW:
 		case FORMAT_D32FS8_SHADOW:
 		case FORMAT_L16:
 		case FORMAT_G16R16:
@@ -2722,8 +2728,10 @@
 		case FORMAT_X32B32G32R32F:
 		case FORMAT_A32B32G32R32F:
 		case FORMAT_D32F:
+		case FORMAT_D32FS8:
 		case FORMAT_D32F_LOCKABLE:
 		case FORMAT_D32FS8_TEXTURE:
+		case FORMAT_D32F_SHADOW:
 		case FORMAT_D32FS8_SHADOW:
 		case FORMAT_L16:
 		case FORMAT_G16R16:
@@ -2802,8 +2810,10 @@
 		case FORMAT_L8:
 		case FORMAT_A8L8:
 		case FORMAT_D32F:
+		case FORMAT_D32FS8:
 		case FORMAT_D32F_LOCKABLE:
 		case FORMAT_D32FS8_TEXTURE:
+		case FORMAT_D32F_SHADOW:
 		case FORMAT_D32FS8_SHADOW:
 		case FORMAT_YV12_BT601:
 		case FORMAT_YV12_BT709:
@@ -2881,8 +2891,10 @@
 		case FORMAT_L8:
 		case FORMAT_A8L8:
 		case FORMAT_D32F:
+		case FORMAT_D32FS8:
 		case FORMAT_D32F_LOCKABLE:
 		case FORMAT_D32FS8_TEXTURE:
+		case FORMAT_D32F_SHADOW:
 		case FORMAT_D32FS8_SHADOW:
 		case FORMAT_YV12_BT601:
 		case FORMAT_YV12_BT709:
@@ -2952,8 +2964,10 @@
 		case FORMAT_L8:
 		case FORMAT_A8L8:
 		case FORMAT_D32F:
+		case FORMAT_D32FS8:
 		case FORMAT_D32F_LOCKABLE:
 		case FORMAT_D32FS8_TEXTURE:
+		case FORMAT_D32F_SHADOW:
 		case FORMAT_D32FS8_SHADOW:
 		case FORMAT_L16:
 		case FORMAT_G16R16:
@@ -3021,8 +3035,10 @@
 		case FORMAT_L8:             return component < 1;
 		case FORMAT_A8L8:           return component < 1;
 		case FORMAT_D32F:           return false;
+		case FORMAT_D32FS8:         return false;
 		case FORMAT_D32F_LOCKABLE:  return false;
 		case FORMAT_D32FS8_TEXTURE: return false;
+		case FORMAT_D32F_SHADOW:    return false;
 		case FORMAT_D32FS8_SHADOW:  return false;
 		case FORMAT_L16:            return component < 1;
 		case FORMAT_G16R16:         return component < 2;