Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(232)

Unified Diff: gpu/command_buffer/tests/gl_copy_texture_CHROMIUM_unittest.cc

Issue 481913005: gpu: glCopyTextureCHROMIUM() checks dest internal format incorrectly. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Build fix on clang Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « gpu/command_buffer/service/gles2_cmd_decoder.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: gpu/command_buffer/tests/gl_copy_texture_CHROMIUM_unittest.cc
diff --git a/gpu/command_buffer/tests/gl_copy_texture_CHROMIUM_unittest.cc b/gpu/command_buffer/tests/gl_copy_texture_CHROMIUM_unittest.cc
index b6f82e7f23a7c4ce443e705a995a466557c62535..e637f749ce9e71fa9d9ecf64695ac175d664d5a8 100644
--- a/gpu/command_buffer/tests/gl_copy_texture_CHROMIUM_unittest.cc
+++ b/gpu/command_buffer/tests/gl_copy_texture_CHROMIUM_unittest.cc
@@ -76,6 +76,118 @@ TEST_F(GLCopyTextureCHROMIUMTest, Basic) {
EXPECT_TRUE(GL_NO_ERROR == glGetError());
}
+TEST_F(GLCopyTextureCHROMIUMTest, InternalFormat) {
+ GLint src_formats[] = {GL_ALPHA, GL_RGB, GL_RGBA,
+ GL_LUMINANCE, GL_LUMINANCE_ALPHA, GL_BGRA_EXT};
+ GLint dest_formats[] = {GL_RGB, GL_RGBA};
+
+ for (size_t src_index = 0; src_index < arraysize(src_formats); src_index++) {
+ for (size_t dest_index = 0; dest_index < arraysize(dest_formats);
+ dest_index++) {
+ glBindTexture(GL_TEXTURE_2D, textures_[0]);
+ glTexImage2D(GL_TEXTURE_2D,
+ 0,
+ src_formats[src_index],
+ 1,
+ 1,
+ 0,
+ src_formats[src_index],
+ GL_UNSIGNED_BYTE,
+ NULL);
+ EXPECT_TRUE(GL_NO_ERROR == glGetError());
+
+ glCopyTextureCHROMIUM(GL_TEXTURE_2D,
+ textures_[0],
+ textures_[1],
+ 0,
+ dest_formats[dest_index],
+ GL_UNSIGNED_BYTE);
+ EXPECT_TRUE(GL_NO_ERROR == glGetError()) << "src_index:" << src_index
+ << " dest_index:" << dest_index;
+ }
+ }
+}
+
+TEST_F(GLCopyTextureCHROMIUMTest, InternalFormatNotSupported) {
+ glBindTexture(GL_TEXTURE_2D, textures_[0]);
+ glTexImage2D(
+ GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
+ EXPECT_TRUE(GL_NO_ERROR == glGetError());
+
+ // Check unsupported format reports error.
+ GLint unsupported_dest_formats[] = {GL_ALPHA, GL_LUMINANCE,
+ GL_LUMINANCE_ALPHA, GL_BGRA_EXT};
+ for (size_t dest_index = 0; dest_index < arraysize(unsupported_dest_formats);
+ dest_index++) {
+ glCopyTextureCHROMIUM(GL_TEXTURE_2D,
+ textures_[0],
+ textures_[1],
+ 0,
+ unsupported_dest_formats[dest_index],
+ GL_UNSIGNED_BYTE);
+ EXPECT_TRUE(GL_INVALID_OPERATION == glGetError())
+ << "dest_index:" << dest_index;
+ }
+}
+
+// Test to ensure that the destination texture is redefined if the properties
+// are different.
+TEST_F(GLCopyTextureCHROMIUMTest, RedefineDestinationTexture) {
+ uint8 pixels[4 * 4] = {255u, 0u, 0u, 255u, 255u, 0u, 0u, 255u,
+ 255u, 0u, 0u, 255u, 255u, 0u, 0u, 255u};
+
+ glBindTexture(GL_TEXTURE_2D, textures_[0]);
+ glTexImage2D(
+ GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
+
+ glBindTexture(GL_TEXTURE_2D, textures_[1]);
+ glTexImage2D(GL_TEXTURE_2D,
+ 0,
+ GL_BGRA_EXT,
+ 1,
+ 1,
+ 0,
+ GL_BGRA_EXT,
+ GL_UNSIGNED_BYTE,
+ pixels);
+ EXPECT_TRUE(GL_NO_ERROR == glGetError());
+
+ // GL_INVALID_OPERATION due to "intrinsic format" != "internal format".
+ glTexSubImage2D(
+ GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
+ EXPECT_TRUE(GL_INVALID_OPERATION == glGetError());
+ // GL_INVALID_VALUE due to bad dimensions.
+ glTexSubImage2D(
+ GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_BGRA_EXT, GL_UNSIGNED_BYTE, pixels);
+ EXPECT_TRUE(GL_INVALID_VALUE == glGetError());
+
+ // If the dest texture has different properties, glCopyTextureCHROMIUM()
+ // redefines them.
+ glCopyTextureCHROMIUM(
+ GL_TEXTURE_2D, textures_[0], textures_[1], 0, GL_RGBA, GL_UNSIGNED_BYTE);
+ EXPECT_TRUE(GL_NO_ERROR == glGetError());
+
+ // glTexSubImage2D() succeeds because textures_[1] is redefined into 2x2
+ // dimension and GL_RGBA format.
+ glBindTexture(GL_TEXTURE_2D, textures_[1]);
+ glTexSubImage2D(
+ GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
+ EXPECT_TRUE(GL_NO_ERROR == glGetError());
+
+ // Check the FB is still bound.
+ GLint value = 0;
+ glGetIntegerv(GL_FRAMEBUFFER_BINDING, &value);
+ GLuint fb_id = value;
+ EXPECT_EQ(framebuffer_id_, fb_id);
+
+ // Check that FB is complete.
+ EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE),
+ glCheckFramebufferStatus(GL_FRAMEBUFFER));
+
+ GLTestHelper::CheckPixels(1, 1, 1, 1, 0, &pixels[12]);
+ EXPECT_TRUE(GL_NO_ERROR == glGetError());
+}
+
// Test that the extension respects the flip-y pixel storage setting.
TEST_F(GLCopyTextureCHROMIUMTest, FlipY) {
uint8 pixels[2][2][4];
« no previous file with comments | « gpu/command_buffer/service/gles2_cmd_decoder.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698