Fix floating-point color buffer support.

- Implemented GL_EXT_color_buffer_float.
- Removed duplicate glRenderbufferStorageMultisample implementation.
- Refactored internalformat validation.
- Removed GL_R11F_G11F_B10F as renderable format. OpenGL ES 3.0 only supports
  this as a texture format.

Change-Id: I83ce8225c1b310006f5ce983349ea8cb8b2f7c29
Reviewed-on: https://swiftshader-review.googlesource.com/9048
Tested-by: Nicolas Capens <capn@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
diff --git a/src/OpenGL/libGLESv2/libGLESv2.cpp b/src/OpenGL/libGLESv2/libGLESv2.cpp
index 447d800..ab9fa7e 100644
--- a/src/OpenGL/libGLESv2/libGLESv2.cpp
+++ b/src/OpenGL/libGLESv2/libGLESv2.cpp
@@ -4662,7 +4662,7 @@
 	es2::Shader::releaseCompiler();
 }
 
-void RenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
+void RenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
 {
 	TRACE("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
 	      target, samples, internalformat, width, height);
@@ -4698,84 +4698,35 @@
 		}
 
 		GLint clientVersion = context->getClientVersion();
-		switch(internalformat)
+
+		if(IsColorRenderable(internalformat, clientVersion, false))
 		{
-		case GL_DEPTH_COMPONENT32F:
-			if(clientVersion < 3)
-			{
-				return error(GL_INVALID_ENUM);
-			}
-			// fall through
-		case GL_DEPTH_COMPONENT16:
-		case GL_DEPTH_COMPONENT24:
-		case GL_DEPTH_COMPONENT32_OES:
-			context->setRenderbufferStorage(new es2::Depthbuffer(width, height, internalformat, samples));
-			break;
-		case GL_R8:
-		case GL_R8UI:
-		case GL_R8I:
-		case GL_R16UI:
-		case GL_R16I:
-		case GL_R32UI:
-		case GL_R32I:
-		case GL_RG8:
-		case GL_RG8UI:
-		case GL_RG8I:
-		case GL_RG16UI:
-		case GL_RG16I:
-		case GL_RG32UI:
-		case GL_RG32I:
-		case GL_SRGB8_ALPHA8:
-		case GL_RGB10_A2:
-		case GL_RGBA8UI:
-		case GL_RGBA8I:
-		case GL_RGB10_A2UI:
-		case GL_RGBA16UI:
-		case GL_RGBA16I:
-		case GL_RGBA32I:
-		case GL_RGBA32UI:
-		case GL_R11F_G11F_B10F:
-		case GL_R32F:
-		case GL_RG32F:
-		case GL_RGB32F:
-		case GL_RGBA32F:
-			if(clientVersion < 3)
-			{
-				return error(GL_INVALID_ENUM);
-			}
-			// fall through
-		case GL_RGBA4:
-		case GL_RGB5_A1:
-		case GL_RGB565:
-		case GL_RGB8_OES:
-		case GL_RGBA8_OES:
-		case GL_R16F:
-		case GL_RG16F:
-		case GL_RGB16F:
-		case GL_RGBA16F:
 			context->setRenderbufferStorage(new es2::Colorbuffer(width, height, internalformat, samples));
-			break;
-		case GL_STENCIL_INDEX8:
-			context->setRenderbufferStorage(new es2::Stencilbuffer(width, height, samples));
-			break;
-		case GL_DEPTH32F_STENCIL8:
-			if(clientVersion < 3)
-			{
-				return error(GL_INVALID_ENUM);
-			}
-			// fall through
-		case GL_DEPTH24_STENCIL8_OES:
-			context->setRenderbufferStorage(new es2::DepthStencilbuffer(width, height, internalformat, samples));
-			break;
-		default:
-			return error(GL_INVALID_ENUM);
 		}
+		else if(IsDepthRenderable(internalformat, clientVersion) && IsStencilRenderable(internalformat, clientVersion))
+		{
+			context->setRenderbufferStorage(new es2::DepthStencilbuffer(width, height, internalformat, samples));
+		}
+		else if(IsDepthRenderable(internalformat, clientVersion))
+		{
+			context->setRenderbufferStorage(new es2::Depthbuffer(width, height, internalformat, samples));
+		}
+		else if(IsStencilRenderable(internalformat, clientVersion))
+		{
+			context->setRenderbufferStorage(new es2::Stencilbuffer(width, height, samples));
+		}
+		else error(GL_INVALID_ENUM);
 	}
 }
 
+void RenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
+{
+	RenderbufferStorageMultisample(target, samples, internalformat, width, height);
+}
+
 void RenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
 {
-	glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
+	RenderbufferStorageMultisample(target, 0, internalformat, width, height);
 }
 
 void SampleCoverage(GLclampf value, GLboolean invert)