Retrieve the implementation color read format/type from the framebuffer.

Bug 14643416

Change-Id: Icdacb4185839ef6fb71fe2ff651e283d55d447a9
Reviewed-on: https://swiftshader-review.googlesource.com/1701
Reviewed-by: Nicolas Capens <capn@google.com>
Tested-by: Nicolas Capens <capn@google.com>
diff --git a/src/OpenGL/libGLES_CM/Context.cpp b/src/OpenGL/libGLES_CM/Context.cpp
index 781d6e8..c5c86e5 100644
--- a/src/OpenGL/libGLES_CM/Context.cpp
+++ b/src/OpenGL/libGLES_CM/Context.cpp
@@ -1039,8 +1039,18 @@
             }

         }

         break;

-    case GL_IMPLEMENTATION_COLOR_READ_TYPE_OES:   *params = IMPLEMENTATION_COLOR_READ_TYPE;   break;

-    case GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES: *params = IMPLEMENTATION_COLOR_READ_FORMAT; break;

+    case GL_IMPLEMENTATION_COLOR_READ_TYPE:

+		{

+			Framebuffer *framebuffer = getFramebuffer();

+			*params = framebuffer->getImplementationColorReadType();

+		}

+		break;

+    case GL_IMPLEMENTATION_COLOR_READ_FORMAT:

+		{

+			Framebuffer *framebuffer = getFramebuffer();

+			*params = framebuffer->getImplementationColorReadFormat();

+		}

+		break;

     case GL_MAX_VIEWPORT_DIMS:

         {

 			int maxDimension = IMPLEMENTATION_MAX_RENDERBUFFER_SIZE;

@@ -1814,6 +1824,14 @@
         return error(GL_INVALID_OPERATION);

     }

 

+	if(format != GL_RGBA || type != GL_UNSIGNED_BYTE)

+	{

+		if(format != framebuffer->getImplementationColorReadFormat() || type != framebuffer->getImplementationColorReadType())

+		{

+			return error(GL_INVALID_OPERATION);

+		}

+	}

+

 	GLsizei outputPitch = ComputePitch(width, format, type, mState.packAlignment);

 

 	// Sized query sanity check

@@ -1986,10 +2004,10 @@
 					default: UNREACHABLE();

 					}

 					break;

-				case GL_RGB:   // IMPLEMENTATION_COLOR_READ_FORMAT

+				case GL_RGB:

 					switch(type)

 					{

-					case GL_UNSIGNED_SHORT_5_6_5:   // IMPLEMENTATION_COLOR_READ_TYPE

+					case GL_UNSIGNED_SHORT_5_6_5:

 						dest16[i + j * outputPitch / sizeof(unsigned short)] =

 							((unsigned short)(31 * b + 0.5f) << 0) |

 							((unsigned short)(63 * g + 0.5f) << 5) |

diff --git a/src/OpenGL/libGLES_CM/Context.h b/src/OpenGL/libGLES_CM/Context.h
index 816a3ff..1361f22 100644
--- a/src/OpenGL/libGLES_CM/Context.h
+++ b/src/OpenGL/libGLES_CM/Context.h
@@ -71,9 +71,6 @@
 	MAX_MODELVIEW_STACK_DEPTH = 32,

 	MAX_PROJECTION_STACK_DEPTH = 2,

 	MAX_TEXTURE_STACK_DEPTH = 2,

-

-    IMPLEMENTATION_COLOR_READ_FORMAT = GL_RGB,

-    IMPLEMENTATION_COLOR_READ_TYPE = GL_UNSIGNED_SHORT_5_6_5

 };

 

 const GLenum compressedTextureFormats[] =

diff --git a/src/OpenGL/libGLES_CM/Framebuffer.cpp b/src/OpenGL/libGLES_CM/Framebuffer.cpp
index 3692b83..b985406 100644
--- a/src/OpenGL/libGLES_CM/Framebuffer.cpp
+++ b/src/OpenGL/libGLES_CM/Framebuffer.cpp
@@ -400,6 +400,16 @@
 	return GL_FRAMEBUFFER_COMPLETE_OES;
 }
 
+GLenum Framebuffer::getImplementationColorReadFormat()
+{
+	return GL_RGB;
+}
+
+GLenum Framebuffer::getImplementationColorReadType()
+{
+	return GL_UNSIGNED_SHORT_5_6_5;
+}
+
 DefaultFramebuffer::DefaultFramebuffer(Colorbuffer *colorbuffer, DepthStencilbuffer *depthStencil)
 {
 	mColorbufferPointer.set(new Renderbuffer(0, colorbuffer));
diff --git a/src/OpenGL/libGLES_CM/Framebuffer.h b/src/OpenGL/libGLES_CM/Framebuffer.h
index 058db28..0f4542f 100644
--- a/src/OpenGL/libGLES_CM/Framebuffer.h
+++ b/src/OpenGL/libGLES_CM/Framebuffer.h
@@ -63,6 +63,9 @@
 	virtual GLenum completeness();

 	GLenum completeness(int &width, int &height, int &samples);

 

+	GLenum getImplementationColorReadFormat();

+	GLenum getImplementationColorReadType();

+

 protected:

     GLenum mColorbufferType;

     gl::BindingPointer<Renderbuffer> mColorbufferPointer;

diff --git a/src/OpenGL/libGLES_CM/libGLES_CM.cpp b/src/OpenGL/libGLES_CM/libGLES_CM.cpp
index 0e48003..fe85299 100644
--- a/src/OpenGL/libGLES_CM/libGLES_CM.cpp
+++ b/src/OpenGL/libGLES_CM/libGLES_CM.cpp
@@ -80,47 +80,6 @@
 	return true;

 }

 

-// Check for combinations of format and type that are valid for ReadPixels

-static bool validReadFormatType(GLenum format, GLenum type)

-{

-	switch(format)

-	{

-	case GL_RGBA:

-		switch (type)

-		{

-		case GL_UNSIGNED_BYTE:

-			break;

-		default:

-			return false;

-		}

-		break;

-	case GL_BGRA_EXT:

-		switch (type)

-		{

-		case GL_UNSIGNED_BYTE:

-		case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT:

-		case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT:

-			break;

-		default:

-			return false;

-		}

-		break;

-	case es1::IMPLEMENTATION_COLOR_READ_FORMAT:

-		switch (type)

-		{

-		case es1::IMPLEMENTATION_COLOR_READ_TYPE:

-			break;

-		default:

-			return false;

-		}

-		break;

-	default:

-		return false;

-	}

-

-	return true;

-}

-

 extern "C"

 {

 

@@ -612,8 +571,8 @@
 }

 

 void GL_APIENTRY glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)

-{
-	size = static_cast<GLint>(size);   // Work around issues with some 64-bit applications
+{

+	size = static_cast<GLint>(size);   // Work around issues with some 64-bit applications

 

 	TRACE("(GLenum target = 0x%X, GLsizeiptr size = %d, const GLvoid* data = 0x%0.8p, GLenum usage = %d)",

 	      target, size, data, usage);

@@ -660,12 +619,12 @@
 }

 

 void GL_APIENTRY glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)

-{
-	size = static_cast<GLint>(size);   // Work around issues with some 64-bit applications
-	offset = static_cast<GLint>(offset);
+{

+	size = static_cast<GLint>(size);   // Work around issues with some 64-bit applications

+	offset = static_cast<GLint>(offset);

 

 	TRACE("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr size = %d, const GLvoid* data = 0x%0.8p)",

-	      target, offset, size, data);
+	      target, offset, size, data);

 

 	if(size < 0 || offset < 0)

 	{

@@ -2952,12 +2911,7 @@
 	{

 		return error(GL_INVALID_VALUE);

 	}

-

-	if(!validReadFormatType(format, type))

-	{

-		return error(GL_INVALID_OPERATION);

-	}

-

+	

 	es1::Context *context = es1::getContext();

 

 	if(context)

diff --git a/src/OpenGL/libGLESv2/Context.cpp b/src/OpenGL/libGLESv2/Context.cpp
index 0c86f51..34003e5 100644
--- a/src/OpenGL/libGLESv2/Context.cpp
+++ b/src/OpenGL/libGLESv2/Context.cpp
@@ -1358,8 +1358,18 @@
             }

         }

         break;

-    case GL_IMPLEMENTATION_COLOR_READ_TYPE:   *params = IMPLEMENTATION_COLOR_READ_TYPE;   break;

-    case GL_IMPLEMENTATION_COLOR_READ_FORMAT: *params = IMPLEMENTATION_COLOR_READ_FORMAT; break;

+    case GL_IMPLEMENTATION_COLOR_READ_TYPE:

+		{

+			Framebuffer *framebuffer = getReadFramebuffer();

+			*params = framebuffer->getImplementationColorReadType();

+		}

+		break;

+    case GL_IMPLEMENTATION_COLOR_READ_FORMAT:

+		{

+			Framebuffer *framebuffer = getReadFramebuffer();

+			*params = framebuffer->getImplementationColorReadFormat();

+		}

+		break;

     case GL_MAX_VIEWPORT_DIMS:

         {

 			int maxDimension = IMPLEMENTATION_MAX_RENDERBUFFER_SIZE;

@@ -2147,6 +2157,14 @@
         return error(GL_INVALID_OPERATION);

     }

 

+	if(format != GL_RGBA || type != GL_UNSIGNED_BYTE)

+	{

+		if(format != framebuffer->getImplementationColorReadFormat() || type != framebuffer->getImplementationColorReadType())

+		{

+			return error(GL_INVALID_OPERATION);

+		}

+	}

+

 	GLsizei outputPitch = ComputePitch(width, format, type, mState.packAlignment);

     

 	// Sized query sanity check

@@ -2319,10 +2337,10 @@
 					default: UNREACHABLE();

 					}

 					break;

-				case GL_RGB:   // IMPLEMENTATION_COLOR_READ_FORMAT

+				case GL_RGB:

 					switch(type)

 					{

-					case GL_UNSIGNED_SHORT_5_6_5:   // IMPLEMENTATION_COLOR_READ_TYPE

+					case GL_UNSIGNED_SHORT_5_6_5:

 						dest16[i + j * outputPitch / sizeof(unsigned short)] = 

 							((unsigned short)(31 * b + 0.5f) << 0) |

 							((unsigned short)(63 * g + 0.5f) << 5) |

diff --git a/src/OpenGL/libGLESv2/Context.h b/src/OpenGL/libGLESv2/Context.h
index 9d7ac89..42c8c19 100644
--- a/src/OpenGL/libGLESv2/Context.h
+++ b/src/OpenGL/libGLESv2/Context.h
@@ -75,9 +75,6 @@
     MAX_COMBINED_TEXTURE_IMAGE_UNITS = MAX_TEXTURE_IMAGE_UNITS + MAX_VERTEX_TEXTURE_IMAGE_UNITS,

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

     MAX_DRAW_BUFFERS = 1,

-

-    IMPLEMENTATION_COLOR_READ_FORMAT = GL_RGB,

-    IMPLEMENTATION_COLOR_READ_TYPE = GL_UNSIGNED_SHORT_5_6_5

 };

 

 const GLenum compressedTextureFormats[] =

diff --git a/src/OpenGL/libGLESv2/Framebuffer.cpp b/src/OpenGL/libGLESv2/Framebuffer.cpp
index c98973c..4e67657 100644
--- a/src/OpenGL/libGLESv2/Framebuffer.cpp
+++ b/src/OpenGL/libGLESv2/Framebuffer.cpp
@@ -399,6 +399,16 @@
 	return GL_FRAMEBUFFER_COMPLETE;
 }
 
+GLenum Framebuffer::getImplementationColorReadFormat()

+{

+	return GL_RGB;

+}

+

+GLenum Framebuffer::getImplementationColorReadType()
+{
+	return GL_UNSIGNED_SHORT_5_6_5;
+}
+
 DefaultFramebuffer::DefaultFramebuffer(Colorbuffer *colorbuffer, DepthStencilbuffer *depthStencil)
 {
 	mColorbufferPointer.set(new Renderbuffer(0, colorbuffer));
diff --git a/src/OpenGL/libGLESv2/Framebuffer.h b/src/OpenGL/libGLESv2/Framebuffer.h
index 3021b14..df9486e 100644
--- a/src/OpenGL/libGLESv2/Framebuffer.h
+++ b/src/OpenGL/libGLESv2/Framebuffer.h
@@ -63,6 +63,9 @@
 	virtual GLenum completeness();

 	GLenum completeness(int &width, int &height, int &samples);

 

+	GLenum getImplementationColorReadFormat();

+	GLenum getImplementationColorReadType();

+

 protected:

     GLenum mColorbufferType;

     gl::BindingPointer<Renderbuffer> mColorbufferPointer;

diff --git a/src/OpenGL/libGLESv2/libGLESv2.cpp b/src/OpenGL/libGLESv2/libGLESv2.cpp
index cb2df49..7f289dc 100644
--- a/src/OpenGL/libGLESv2/libGLESv2.cpp
+++ b/src/OpenGL/libGLESv2/libGLESv2.cpp
@@ -78,47 +78,6 @@
 	return true;

 }

 

-// Check for combinations of format and type that are valid for ReadPixels

-static bool validReadFormatType(GLenum format, GLenum type)

-{

-	switch(format)

-	{

-	case GL_RGBA:

-		switch(type)

-		{

-		case GL_UNSIGNED_BYTE:

-			break;

-		default:

-			return false;

-		}

-		break;

-	case GL_BGRA_EXT:

-		switch(type)

-		{

-		case GL_UNSIGNED_BYTE:

-		case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT:

-		case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT:

-			break;

-		default:

-			return false;

-		}

-		break;

-	case es2::IMPLEMENTATION_COLOR_READ_FORMAT:

-		switch(type)

-		{

-		case es2::IMPLEMENTATION_COLOR_READ_TYPE:

-			break;

-		default:

-			return false;

-		}

-		break;

-	default:

-		return false;

-	}

-

-	return true;

-}

-

 extern "C"

 {

 

@@ -3618,11 +3577,6 @@
 		return error(GL_INVALID_VALUE);

 	}

 

-	if(!validReadFormatType(format, type))

-	{

-		return error(GL_INVALID_OPERATION);

-	}

-

 	es2::Context *context = es2::getContext();

 

 	if(context)

@@ -3642,11 +3596,6 @@
 		return error(GL_INVALID_VALUE);

 	}

 

-	if(!validReadFormatType(format, type))

-	{

-		return error(GL_INVALID_OPERATION);

-	}

-

 	es2::Context *context = es2::getContext();

 

 	if(context)