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)
{