Fix initial rbo state.

Renderbuffer objects are defined to have an initial internalformat of
GL_RGBA4, but the red/green/blue/alpha bits are 0. This inconsistency
is resolved by setting the internalformat to GL_NONE but reporting
GL_RGBA4 when queried.

Change-Id: Ie9a342c05eaa23f81773b37ebb942ca2e5b1addb
Reviewed-on: https://swiftshader-review.googlesource.com/14588
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/libGLESv2/Renderbuffer.cpp b/src/OpenGL/libGLESv2/Renderbuffer.cpp
index 98a1c05..f1f6faa 100644
--- a/src/OpenGL/libGLESv2/Renderbuffer.cpp
+++ b/src/OpenGL/libGLESv2/Renderbuffer.cpp
@@ -402,7 +402,7 @@
 {
 	mWidth = 0;
 	mHeight = 0;
-	format = GL_RGBA4;
+	format = GL_NONE;
 	mSamples = 0;
 }
 
diff --git a/src/OpenGL/libGLESv2/ResourceManager.cpp b/src/OpenGL/libGLESv2/ResourceManager.cpp
index e5c5492..04e1f0d 100644
--- a/src/OpenGL/libGLESv2/ResourceManager.cpp
+++ b/src/OpenGL/libGLESv2/ResourceManager.cpp
@@ -324,7 +324,7 @@
 {
 	if(handle != 0 && !getRenderbuffer(handle))
 	{
-		Renderbuffer *renderbufferObject = new Renderbuffer(handle, new Colorbuffer(0, 0, GL_RGBA4_OES, 0));
+		Renderbuffer *renderbufferObject = new Renderbuffer(handle, new Colorbuffer(0, 0, GL_NONE, 0));
 		renderbufferObject->addRef();
 
 		mRenderbufferNameSpace.insert(handle, renderbufferObject);
diff --git a/src/OpenGL/libGLESv2/libGLESv2.cpp b/src/OpenGL/libGLESv2/libGLESv2.cpp
index 5198ada..f612a63 100644
--- a/src/OpenGL/libGLESv2/libGLESv2.cpp
+++ b/src/OpenGL/libGLESv2/libGLESv2.cpp
@@ -3349,7 +3349,12 @@
 		{
 		case GL_RENDERBUFFER_WIDTH:           *params = renderbuffer->getWidth();       break;
 		case GL_RENDERBUFFER_HEIGHT:          *params = renderbuffer->getHeight();      break;
-		case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getFormat();      break;
+		case GL_RENDERBUFFER_INTERNAL_FORMAT:
+			{
+				GLint internalformat = renderbuffer->getFormat();
+				*params = (internalformat == GL_NONE) ? GL_RGBA4 : internalformat;
+			}
+			break;
 		case GL_RENDERBUFFER_RED_SIZE:        *params = renderbuffer->getRedSize();     break;
 		case GL_RENDERBUFFER_GREEN_SIZE:      *params = renderbuffer->getGreenSize();   break;
 		case GL_RENDERBUFFER_BLUE_SIZE:       *params = renderbuffer->getBlueSize();    break;
diff --git a/src/OpenGL/libGLESv2/utilities.cpp b/src/OpenGL/libGLESv2/utilities.cpp
index c6ad075..a26edce 100644
--- a/src/OpenGL/libGLESv2/utilities.cpp
+++ b/src/OpenGL/libGLESv2/utilities.cpp
@@ -1135,6 +1135,11 @@
 
 	bool IsColorRenderable(GLint internalformat, GLint clientVersion)
 	{
+		if(IsCompressed(internalformat, clientVersion))
+		{
+			return false;
+		}
+
 		switch(internalformat)
 		{
 		case GL_RGBA4:
@@ -1201,6 +1206,11 @@
 
 	bool IsDepthRenderable(GLint internalformat, GLint clientVersion)
 	{
+		if(IsCompressed(internalformat, clientVersion))
+		{
+			return false;
+		}
+
 		switch(internalformat)
 		{
 		case GL_DEPTH_COMPONENT24:
@@ -1267,6 +1277,11 @@
 
 	bool IsStencilRenderable(GLint internalformat, GLint clientVersion)
 	{
+		if(IsCompressed(internalformat, clientVersion))
+		{
+			return false;
+		}
+
 		switch(internalformat)
 		{
 		case GL_STENCIL_INDEX8:
@@ -1353,6 +1368,7 @@
 	{
 		switch(internalformat)
 		{
+		case GL_NONE:           return 0;
 		case GL_RGBA4:          return 4;
 		case GL_RGB5_A1:        return 1;
 		case GL_RGB565:         return 0;
@@ -1392,7 +1408,7 @@
 		case GL_RGBA32UI:       return 32;
 		case GL_R11F_G11F_B10F: return 0;
 		default:
-			UNREACHABLE(internalformat);
+		//	UNREACHABLE(internalformat);
 			return 0;
 		}
 	}
@@ -1401,6 +1417,7 @@
 	{
 		switch(internalformat)
 		{
+		case GL_NONE:           return 0;
 		case GL_RGBA4:          return 4;
 		case GL_RGB5_A1:        return 5;
 		case GL_RGB565:         return 5;
@@ -1440,7 +1457,7 @@
 		case GL_RGBA32UI:       return 32;
 		case GL_R11F_G11F_B10F: return 11;
 		default:
-			UNREACHABLE(internalformat);
+		//	UNREACHABLE(internalformat);
 			return 0;
 		}
 	}
@@ -1449,6 +1466,7 @@
 	{
 		switch(internalformat)
 		{
+		case GL_NONE:           return 0;
 		case GL_RGBA4:          return 4;
 		case GL_RGB5_A1:        return 5;
 		case GL_RGB565:         return 6;
@@ -1488,7 +1506,7 @@
 		case GL_RGBA32UI:       return 32;
 		case GL_R11F_G11F_B10F: return 11;
 		default:
-			UNREACHABLE(internalformat);
+		//	UNREACHABLE(internalformat);
 			return 0;
 		}
 	}
@@ -1497,6 +1515,7 @@
 	{
 		switch(internalformat)
 		{
+		case GL_NONE:           return 0;
 		case GL_RGBA4:          return 4;
 		case GL_RGB5_A1:        return 5;
 		case GL_RGB565:         return 5;
@@ -1536,7 +1555,7 @@
 		case GL_RGBA32UI:       return 32;
 		case GL_R11F_G11F_B10F: return 10;
 		default:
-			UNREACHABLE(internalformat);
+		//	UNREACHABLE(internalformat);
 			return 0;
 		}
 	}
@@ -1553,7 +1572,7 @@
 		case GL_DEPTH24_STENCIL8:      return 24;
 		case GL_DEPTH32F_STENCIL8:     return 32;
 		default:
-			UNREACHABLE(internalformat);
+		//	UNREACHABLE(internalformat);
 			return 0;
 		}
 	}
@@ -1570,7 +1589,7 @@
 		case GL_DEPTH24_STENCIL8:      return 8;
 		case GL_DEPTH32F_STENCIL8:     return 8;
 		default:
-			UNREACHABLE(internalformat);
+		//	UNREACHABLE(internalformat);
 			return 0;
 		}
 	}
@@ -1637,7 +1656,7 @@
 		case GL_RGB9_E5:
 			return GL_FLOAT;
 		default:
-			UNREACHABLE(internalformat);
+		//	UNREACHABLE(internalformat);
 			return GL_NONE;
 		}
 	}
@@ -2061,6 +2080,7 @@
 	{
 		switch(format)
 		{
+		case GL_NONE:                 return sw::FORMAT_NULL;
 		case GL_RGBA4:
 		case GL_RGB5_A1:
 		case GL_RGBA8:                return sw::FORMAT_A8B8G8R8;