Index: gpu/command_buffer/tests/gl_compressed_copy_texture_CHROMIUM_unittest.cc |
diff --git a/gpu/command_buffer/tests/gl_compressed_copy_texture_CHROMIUM_unittest.cc b/gpu/command_buffer/tests/gl_compressed_copy_texture_CHROMIUM_unittest.cc |
index 86b07cd024c4b54f37b54e83ecdd06a763ebb14a..d50189daff6622080cdee027f8c33f03435ad843 100644 |
--- a/gpu/command_buffer/tests/gl_compressed_copy_texture_CHROMIUM_unittest.cc |
+++ b/gpu/command_buffer/tests/gl_compressed_copy_texture_CHROMIUM_unittest.cc |
@@ -22,6 +22,12 @@ namespace gpu { |
namespace { |
+enum CopyType { TexImage, TexSubImage }; |
+const CopyType kCopyTypes[] = { |
+ TexImage, |
+ TexSubImage, |
+}; |
+ |
const uint8 kCompressedImageColor[4] = { 255u, 0u, 0u, 255u }; |
// Single compressed ATC block of source pixels all set to: |
@@ -40,6 +46,15 @@ const uint8 kCompressedImageATCIA[16] = { |
const uint8 kCompressedImageDXT1[8] = { |
0x00, 0xf8, 0x00, 0xf8, 0xaa, 0xaa, 0xaa, 0xaa }; |
+// Four compressed DXT1 blocks solidly colored in red, green, blue and black: |
+// [R][G] |
+// [B][b] |
+const uint8 kCompressedImageDXT1RGB[32] = { |
+ 0x0, 0xf8, 0x0, 0xf8, 0xaa, 0xaa, 0xaa, 0xaa, |
+ 0xe0, 0x7, 0xe0, 0x7, 0xaa, 0xaa, 0xaa, 0xaa, |
+ 0x1f, 0x0, 0x1f, 0x0, 0xaa, 0xaa, 0xaa, 0xaa, |
+ 0x0, 0x0, 0x0, 0x0, 0xaa, 0xaa, 0xaa, 0xaa }; |
+ |
// Single compressed DXT5 block of source pixels all set to: |
// kCompressedImageColor. |
const uint8 kCompressedImageDXT5[16] = { |
@@ -51,6 +66,17 @@ const uint8 kCompressedImageDXT5[16] = { |
const uint8 kCompressedImageETC1[8] = { |
0x0, 0x0, 0xf8, 0x2, 0xff, 0xff, 0x0, 0x0 }; |
+// Single block of zeroes, used for texture pre-allocation. |
+const uint8 kInvalidCompressedImage[8] = { |
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }; |
+ |
+// Four blocks of zeroes, used for texture pre-allocation. |
+const uint8 kInvalidCompressedImageLarge[32] = { |
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, |
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, |
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, |
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }; |
+ |
void glEnableDisable(GLint param, GLboolean value) { |
if (value) |
glEnable(param); |
@@ -62,7 +88,8 @@ void glEnableDisable(GLint param, GLboolean value) { |
// A collection of tests that exercise the GL_CHROMIUM_copy_texture extension. |
class GLCompressedCopyTextureCHROMIUMTest |
- : public testing::Test { |
+ : public testing::Test, |
+ public ::testing::WithParamInterface<CopyType> { |
protected: |
void SetUp() override { |
gl_.Initialize(GLManager::Options()); |
@@ -100,14 +127,20 @@ class GLCompressedCopyTextureCHROMIUMTest |
GLuint framebuffer_id_; |
}; |
+INSTANTIATE_TEST_CASE_P(CopyType, |
+ GLCompressedCopyTextureCHROMIUMTest, |
+ ::testing::ValuesIn(kCopyTypes)); |
+ |
// Test to ensure that the basic functionality of the extension works. |
-TEST_F(GLCompressedCopyTextureCHROMIUMTest, Basic) { |
+TEST_P(GLCompressedCopyTextureCHROMIUMTest, Basic) { |
if (!GLTestHelper::HasExtension("GL_EXT_texture_compression_dxt1")) { |
LOG(INFO) << |
"GL_EXT_texture_compression_dxt1 not supported. Skipping test..."; |
return; |
} |
+ CopyType copy_type = GetParam(); |
+ |
glBindTexture(GL_TEXTURE_2D, textures_[0]); |
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
@@ -123,7 +156,17 @@ TEST_F(GLCompressedCopyTextureCHROMIUMTest, Basic) { |
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); |
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); |
- glCompressedCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1]); |
+ if (copy_type == TexImage) { |
+ glCompressedCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1]); |
+ } else { |
+ glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, |
+ 4, 4, 0, |
+ sizeof(kInvalidCompressedImage), |
+ kInvalidCompressedImage); |
+ |
+ glCompressedCopySubTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], |
+ textures_[1], 0, 0, 0, 0, 4, 4); |
+ } |
EXPECT_TRUE(glGetError() == GL_NO_ERROR); |
// Load shader program. |
@@ -152,7 +195,9 @@ TEST_F(GLCompressedCopyTextureCHROMIUMTest, Basic) { |
EXPECT_TRUE(GL_NO_ERROR == glGetError()); |
} |
-TEST_F(GLCompressedCopyTextureCHROMIUMTest, InternalFormat) { |
+TEST_P(GLCompressedCopyTextureCHROMIUMTest, InternalFormat) { |
+ CopyType copy_type = GetParam(); |
+ |
struct Image { |
const GLint format; |
const uint8* data; |
@@ -163,8 +208,9 @@ TEST_F(GLCompressedCopyTextureCHROMIUMTest, InternalFormat) { |
}; |
ScopedVector<Image> supported_formats; |
- if (GLTestHelper::HasExtension("GL_AMD_compressed_ATC_texture") || |
- GLTestHelper::HasExtension("GL_ATI_texture_compression_atitc")) { |
+ if ((GLTestHelper::HasExtension("GL_AMD_compressed_ATC_texture") || |
+ GLTestHelper::HasExtension("GL_ATI_texture_compression_atitc")) && |
+ copy_type != TexSubImage) { |
supported_formats.push_back(new Image( |
GL_ATC_RGB_AMD, |
kCompressedImageATC, |
@@ -187,7 +233,8 @@ TEST_F(GLCompressedCopyTextureCHROMIUMTest, InternalFormat) { |
kCompressedImageDXT5, |
sizeof(kCompressedImageDXT5))); |
} |
- if (GLTestHelper::HasExtension("GL_OES_compressed_ETC1_RGB8_texture")) { |
+ if (GLTestHelper::HasExtension("GL_OES_compressed_ETC1_RGB8_texture") && |
+ copy_type != TexSubImage) { |
supported_formats.push_back(new Image( |
GL_ETC1_RGB8_OES, |
kCompressedImageETC1, |
@@ -209,18 +256,30 @@ TEST_F(GLCompressedCopyTextureCHROMIUMTest, InternalFormat) { |
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); |
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); |
- glCompressedCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1]); |
+ if (copy_type == TexImage) { |
+ glCompressedCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], |
+ textures_[1]); |
+ } else { |
+ glCompressedTexImage2D(GL_TEXTURE_2D, 0, image->format, 4, 4, 0, |
+ sizeof(kInvalidCompressedImage), |
+ kInvalidCompressedImage); |
+ |
+ glCompressedCopySubTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], |
+ textures_[1], 0, 0, 0, 0, 4, 4); |
+ } |
EXPECT_TRUE(GL_NO_ERROR == glGetError()); |
} |
} |
-TEST_F(GLCompressedCopyTextureCHROMIUMTest, InternalFormatNotSupported) { |
+TEST_P(GLCompressedCopyTextureCHROMIUMTest, InternalFormatNotSupported) { |
if (!GLTestHelper::HasExtension("GL_EXT_texture_compression_dxt1")) { |
LOG(INFO) << |
"GL_EXT_texture_compression_dxt1 not supported. Skipping test..."; |
return; |
} |
+ CopyType copy_type = GetParam(); |
+ |
const uint8 kUncompressedPixels[1 * 4] = { 255u, 0u, 0u, 255u }; |
glBindTexture(GL_TEXTURE_2D, textures_[0]); |
@@ -239,19 +298,29 @@ TEST_F(GLCompressedCopyTextureCHROMIUMTest, InternalFormatNotSupported) { |
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); |
// Check that the GL_RGBA format reports an error. |
- glCompressedCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1]); |
+ if (copy_type == TexImage) { |
+ glCompressedCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1]); |
+ } else { |
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, |
+ kUncompressedPixels); |
+ |
+ glCompressedCopySubTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], |
+ textures_[1], 0, 0, 0, 0, 1, 1); |
+ } |
EXPECT_TRUE(GL_INVALID_OPERATION == glGetError()); |
} |
// Validate that some basic GL state is not touched upon execution of |
// the extension. |
-TEST_F(GLCompressedCopyTextureCHROMIUMTest, BasicStatePreservation) { |
+TEST_P(GLCompressedCopyTextureCHROMIUMTest, BasicStatePreservation) { |
if (!GLTestHelper::HasExtension("GL_EXT_texture_compression_dxt1")) { |
LOG(INFO) << |
"GL_EXT_texture_compression_dxt1 not supported. Skipping test..."; |
return; |
} |
+ CopyType copy_type = GetParam(); |
+ |
glBindTexture(GL_TEXTURE_2D, textures_[0]); |
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
@@ -268,6 +337,13 @@ TEST_F(GLCompressedCopyTextureCHROMIUMTest, BasicStatePreservation) { |
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); |
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); |
+ if (copy_type == TexSubImage) { |
+ glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, |
+ 4, 4, 0, |
+ sizeof(kInvalidCompressedImage), |
+ kInvalidCompressedImage); |
+ } |
+ |
GLboolean reference_settings[2] = { GL_TRUE, GL_FALSE }; |
for (int x = 0; x < 2; ++x) { |
GLboolean setting = reference_settings[x]; |
@@ -281,7 +357,13 @@ TEST_F(GLCompressedCopyTextureCHROMIUMTest, BasicStatePreservation) { |
glActiveTexture(GL_TEXTURE1 + x); |
- glCompressedCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1]); |
+ if (copy_type == TexImage) { |
+ glCompressedCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], |
+ textures_[1]); |
+ } else { |
+ glCompressedCopySubTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], |
+ textures_[1], 0, 0, 0, 0, 4, 4); |
+ } |
EXPECT_TRUE(glGetError() == GL_NO_ERROR); |
EXPECT_EQ(setting, glIsEnabled(GL_DEPTH_TEST)); |
@@ -311,13 +393,15 @@ TEST_F(GLCompressedCopyTextureCHROMIUMTest, BasicStatePreservation) { |
// Verify that invocation of the extension does not modify the bound |
// texture state. |
-TEST_F(GLCompressedCopyTextureCHROMIUMTest, TextureStatePreserved) { |
+TEST_P(GLCompressedCopyTextureCHROMIUMTest, TextureStatePreserved) { |
if (!GLTestHelper::HasExtension("GL_EXT_texture_compression_dxt1")) { |
LOG(INFO) << |
"GL_EXT_texture_compression_dxt1 not supported. Skipping test..."; |
return; |
} |
+ CopyType copy_type = GetParam(); |
+ |
glBindTexture(GL_TEXTURE_2D, textures_[0]); |
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
@@ -334,6 +418,13 @@ TEST_F(GLCompressedCopyTextureCHROMIUMTest, TextureStatePreserved) { |
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); |
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); |
+ if (copy_type == TexSubImage) { |
+ glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, |
+ 4, 4, 0, |
+ sizeof(kInvalidCompressedImage), |
+ kInvalidCompressedImage); |
+ } |
+ |
GLuint texture_ids[2]; |
glGenTextures(2, texture_ids); |
@@ -343,7 +434,12 @@ TEST_F(GLCompressedCopyTextureCHROMIUMTest, TextureStatePreserved) { |
glActiveTexture(GL_TEXTURE1); |
glBindTexture(GL_TEXTURE_2D, texture_ids[1]); |
- glCompressedCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1]); |
+ if (copy_type == TexImage) { |
+ glCompressedCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1]); |
+ } else { |
+ glCompressedCopySubTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], |
+ textures_[1], 0, 0, 0, 0, 4, 4); |
+ } |
EXPECT_TRUE(GL_NO_ERROR == glGetError()); |
GLint active_texture = 0; |
@@ -366,4 +462,253 @@ TEST_F(GLCompressedCopyTextureCHROMIUMTest, TextureStatePreserved) { |
EXPECT_TRUE(GL_NO_ERROR == glGetError()); |
} |
+TEST_F(GLCompressedCopyTextureCHROMIUMTest, CopySubTextureDimension) { |
+ if (!GLTestHelper::HasExtension("GL_EXT_texture_compression_dxt1")) { |
+ LOG(INFO) << |
+ "GL_EXT_texture_compression_dxt1 not supported. Skipping test..."; |
+ return; |
+ } |
+ |
+ glBindTexture(GL_TEXTURE_2D, textures_[0]); |
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); |
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); |
+ glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, |
+ 8, 8, 0, |
+ sizeof(kCompressedImageDXT1RGB), |
+ kCompressedImageDXT1RGB); |
+ EXPECT_TRUE(glGetError() == GL_NO_ERROR); |
+ |
+ glBindTexture(GL_TEXTURE_2D, textures_[1]); |
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); |
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); |
+ glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, |
+ 8, 8, 0, |
+ sizeof(kInvalidCompressedImageLarge), |
+ kInvalidCompressedImageLarge); |
+ |
+ glCompressedCopySubTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], |
+ textures_[1], 4, 4, 0, 0, 4, 4); |
+ EXPECT_TRUE(GL_NO_ERROR == glGetError()); |
+ |
+ // Reset the destination texture as it might have been converted to RGBA. |
+ glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, |
+ 8, 8, 0, |
+ sizeof(kInvalidCompressedImageLarge), |
+ kInvalidCompressedImageLarge); |
+ |
+ // xoffset < 0 |
+ glCompressedCopySubTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], |
+ -4, 4, 0, 0, 4, 4); |
+ EXPECT_TRUE(glGetError() == GL_INVALID_VALUE); |
+ |
+ // x < 0 |
+ glCompressedCopySubTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], |
+ 4, 4, -4, 0, 4, 4); |
+ EXPECT_TRUE(glGetError() == GL_INVALID_VALUE); |
+ |
+ // xoffset + width > dest_width |
+ glCompressedCopySubTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], |
+ 8, 8, 0, 0, 4, 4); |
+ EXPECT_TRUE(glGetError() == GL_INVALID_VALUE); |
+ |
+ // x + width > source_width |
+ glCompressedCopySubTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], |
+ 0, 0, 8, 8, 4, 4); |
+ EXPECT_TRUE(glGetError() == GL_INVALID_VALUE); |
+ |
+ // xoffset not within block-boundary |
+ glCompressedCopySubTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], |
+ 3, 0, 0, 0, 4, 4); |
+ EXPECT_TRUE(glGetError() == GL_INVALID_OPERATION); |
+ |
+ // x not within block-boundary |
+ glCompressedCopySubTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], |
+ 0, 0, 3, 0, 4, 4); |
+ EXPECT_TRUE(glGetError() == GL_INVALID_OPERATION); |
+} |
+ |
+TEST_F(GLCompressedCopyTextureCHROMIUMTest, CopySubTextureOffset) { |
+ if (!GLTestHelper::HasExtension("GL_EXT_texture_compression_dxt1")) { |
+ LOG(INFO) << |
+ "GL_EXT_texture_compression_dxt1 not supported. Skipping test..."; |
+ return; |
+ } |
+ |
+ glBindTexture(GL_TEXTURE_2D, textures_[0]); |
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); |
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); |
+ glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, |
+ 8, 8, 0, |
+ sizeof(kCompressedImageDXT1RGB), |
+ kCompressedImageDXT1RGB); |
+ EXPECT_TRUE(glGetError() == GL_NO_ERROR); |
+ |
+ glBindTexture(GL_TEXTURE_2D, textures_[1]); |
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); |
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); |
+ glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, |
+ 8, 8, 0, |
+ sizeof(kInvalidCompressedImageLarge), |
+ kInvalidCompressedImageLarge); |
+ |
+ // Load shader program. |
+ GLuint program = LoadProgram(); |
+ ASSERT_NE(program, 0u); |
+ GLint position_loc = glGetAttribLocation(program, "a_position"); |
+ GLint texture_loc = glGetUniformLocation(program, "u_texture"); |
+ ASSERT_NE(position_loc, -1); |
+ ASSERT_NE(texture_loc, -1); |
+ glUseProgram(program); |
+ |
+ // Load geometry. |
+ GLuint vbo = GLTestHelper::SetupUnitQuad(position_loc); |
+ ASSERT_NE(vbo, 0u); |
+ |
+ // Load texture. |
+ glActiveTexture(GL_TEXTURE0); |
+ glBindTexture(GL_TEXTURE_2D, textures_[1]); |
+ glUniform1i(texture_loc, 0); |
+ |
+ const uint8 kBlack[1 * 4] = {0u, 0u, 0u, 255u}; |
+ const uint8 kRed[1 * 4] = {255u, 0u, 0u, 255u}; |
+ const uint8 kGreen[1 * 4] = {0u, 255u, 0u, 255u}; |
+ const uint8 kBlue[1 * 4] = {0u, 0u, 255u, 255u}; |
+ |
+ // Copy each block one by one in a clockwise fashion. Note that we reset the |
+ // destination texture after each copy operation. That's because on some |
+ // platforms we might fallback into replacing the compressed destination |
+ // texture with an uncompressed one. |
+ |
+ // Move blue block up. |
+ glCompressedCopySubTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], |
+ textures_[1], 0, 0, 0, 4, 4, 4); |
+ EXPECT_TRUE(glGetError() == GL_NO_ERROR); |
+ |
+ glDrawArrays(GL_TRIANGLES, 0, 6); |
+ glFlush(); |
+ GLTestHelper::CheckPixels(0, 0, 2, 2, 0, kBlue); |
+ |
+ glBindTexture(GL_TEXTURE_2D, textures_[1]); |
+ glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, |
+ 8, 8, 0, |
+ sizeof(kInvalidCompressedImageLarge), |
+ kInvalidCompressedImageLarge); |
+ |
+ // Move red block right. |
+ glCompressedCopySubTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], |
+ textures_[1], 4, 0, 0, 0, 4, 4); |
+ EXPECT_TRUE(glGetError() == GL_NO_ERROR); |
+ |
+ glDrawArrays(GL_TRIANGLES, 0, 6); |
+ glFlush(); |
+ GLTestHelper::CheckPixels(2, 0, 2, 2, 0, kRed); |
+ |
+ glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, |
+ 8, 8, 0, |
+ sizeof(kInvalidCompressedImageLarge), |
+ kInvalidCompressedImageLarge); |
+ |
+ // Move green block down. |
+ glCompressedCopySubTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], |
+ textures_[1], 4, 4, 4, 0, 4, 4); |
+ EXPECT_TRUE(glGetError() == GL_NO_ERROR); |
+ |
+ glDrawArrays(GL_TRIANGLES, 0, 6); |
+ glFlush(); |
+ GLTestHelper::CheckPixels(2, 2, 2, 2, 0, kGreen); |
+ |
+ glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, |
+ 8, 8, 0, |
+ sizeof(kInvalidCompressedImageLarge), |
+ kInvalidCompressedImageLarge); |
+ |
+ // Move black block left. |
+ glCompressedCopySubTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], |
+ textures_[1], 0, 4, 4, 4, 4, 4); |
+ EXPECT_TRUE(glGetError() == GL_NO_ERROR); |
+ |
+ glDrawArrays(GL_TRIANGLES, 0, 6); |
+ glFlush(); |
+ GLTestHelper::CheckPixels(0, 2, 2, 2, 0, kBlack); |
+ |
+ EXPECT_TRUE(GL_NO_ERROR == glGetError()); |
+} |
+ |
+TEST_F(GLCompressedCopyTextureCHROMIUMTest, CopySubTexturePreservation) { |
+ if (!GLTestHelper::HasExtension("GL_EXT_texture_compression_dxt1")) { |
+ LOG(INFO) << |
+ "GL_EXT_texture_compression_dxt1 not supported. Skipping test..."; |
+ return; |
+ } |
+ |
+ glBindTexture(GL_TEXTURE_2D, textures_[0]); |
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); |
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); |
+ glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, |
+ 4, 4, 0, |
+ sizeof(kCompressedImageDXT1), |
+ kCompressedImageDXT1); |
+ EXPECT_TRUE(glGetError() == GL_NO_ERROR); |
+ |
+ glBindTexture(GL_TEXTURE_2D, textures_[1]); |
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); |
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); |
+ glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, |
+ 8, 8, 0, |
+ sizeof(kCompressedImageDXT1RGB), |
+ kCompressedImageDXT1RGB); |
+ |
+ // Copy entire first texture into the second, replacing the green block: |
+ // [R][R] |
+ // [B][b] |
+ glCompressedCopySubTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], |
+ textures_[1], 4, 0, 0, 0, 4, 4); |
+ EXPECT_TRUE(glGetError() == GL_NO_ERROR); |
+ |
+ // Load shader program. |
+ GLuint program = LoadProgram(); |
+ ASSERT_NE(program, 0u); |
+ GLint position_loc = glGetAttribLocation(program, "a_position"); |
+ GLint texture_loc = glGetUniformLocation(program, "u_texture"); |
+ ASSERT_NE(position_loc, -1); |
+ ASSERT_NE(texture_loc, -1); |
+ glUseProgram(program); |
+ |
+ // Load geometry. |
+ GLuint vbo = GLTestHelper::SetupUnitQuad(position_loc); |
+ ASSERT_NE(vbo, 0u); |
+ |
+ // Load texture. |
+ glActiveTexture(GL_TEXTURE0); |
+ glBindTexture(GL_TEXTURE_2D, textures_[1]); |
+ glUniform1i(texture_loc, 0); |
+ |
+ // Draw. |
+ glDrawArrays(GL_TRIANGLES, 0, 6); |
+ glFlush(); |
+ |
+ const uint8 kBlack[1 * 4] = {0u, 0u, 0u, 255u}; |
+ const uint8 kRed[1 * 4] = {255u, 0u, 0u, 255u}; |
+ const uint8 kBlue[1 * 4] = {0u, 0u, 255u, 255u}; |
+ |
+ // Note that while destination texture is 8 x 8 pixels the viewport is only |
+ // 4 x 4. |
+ GLTestHelper::CheckPixels(0, 0, 4, 2, 0, kRed); |
+ GLTestHelper::CheckPixels(0, 2, 2, 2, 0, kBlue); |
+ GLTestHelper::CheckPixels(2, 2, 2, 2, 0, kBlack); |
+ EXPECT_TRUE(GL_NO_ERROR == glGetError()); |
+} |
+ |
} // namespace gpu |