Support glCopyTexImage2D for float formats.

Bug chromium:853424

Change-Id: I9b2de054baf6b042bcd04c5d023099a39ca20d2a
Reviewed-on: https://swiftshader-review.googlesource.com/19569
Tested-by: Nicolas Capens <nicolascapens@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 b6d4718..7ae8126 100644
--- a/src/OpenGL/libGLESv2/libGLESv2.cpp
+++ b/src/OpenGL/libGLESv2/libGLESv2.cpp
@@ -953,6 +953,10 @@
 			{
 				internalformat = gl::GetSizedInternalFormat(internalformat, GL_HALF_FLOAT_OES);
 			}
+			else if(GetColorComponentType(colorbufferFormat) == GL_FLOAT && GetRedSize(colorbufferFormat) == 32)   // GL_EXT_color_buffer_float
+			{
+				internalformat = gl::GetSizedInternalFormat(internalformat, GL_FLOAT);
+			}
 			else
 			{
 				UNIMPLEMENTED();
@@ -6350,6 +6354,7 @@
 		FUNCTION(glDeleteVertexArrays),
 		FUNCTION(glDeleteVertexArraysOES),
 		FUNCTION(glDepthFunc),
+		//FUNCTION(DepthFunc),
 		FUNCTION(glDepthMask),
 		FUNCTION(glDepthRangef),
 		FUNCTION(glDetachShader),
diff --git a/tests/unittests/unittests.cpp b/tests/unittests/unittests.cpp
index ba50b0d..037112d 100644
--- a/tests/unittests/unittests.cpp
+++ b/tests/unittests/unittests.cpp
@@ -190,6 +190,8 @@
 
 	void Uninitialize()
 	{
+		EXPECT_GLENUM_EQ(GL_NO_ERROR, glGetError());
+
 		EGLBoolean success = eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
 		EXPECT_EQ(EGL_SUCCESS, eglGetError());
 		EXPECT_EQ((EGLBoolean)EGL_TRUE, success);
@@ -556,6 +558,35 @@
 	Uninitialize();
 }
 
+// Tests copying between textures of different floating-point formats using a framebuffer object.
+TEST_F(SwiftShaderTest, CopyTexImage)
+{
+	Initialize(3, false);
+
+	GLuint tex1 = 1;
+	float green[4] = { 0.0f, 1.0f, 0.0f, 1.0f };
+	glBindTexture(GL_TEXTURE_2D, tex1);
+	glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA32F, 16, 16);
+	glTexSubImage2D(GL_TEXTURE_2D, 0, 5, 10, 1, 1, GL_RGBA, GL_FLOAT, &green);
+	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+
+	GLuint fbo = 1;
+	glBindFramebuffer(GL_FRAMEBUFFER, fbo);
+	glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex1, 0);
+	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+
+	GLuint tex2 = 2;
+	glBindTexture(GL_TEXTURE_2D, tex2);
+	glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 2, 6, 8, 8, 0);
+	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+
+	glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex2, 0);
+	expectFramebufferColor(green, 3, 4);
+	EXPECT_GLENUM_EQ(GL_NONE, glGetError());
+
+	Uninitialize();
+}
+
 // Tests construction of a structure containing a single matrix
 TEST_F(SwiftShaderTest, MatrixInStruct)
 {