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 |
new file mode 100644 |
index 0000000000000000000000000000000000000000..86b07cd024c4b54f37b54e83ecdd06a763ebb14a |
--- /dev/null |
+++ b/gpu/command_buffer/tests/gl_compressed_copy_texture_CHROMIUM_unittest.cc |
@@ -0,0 +1,369 @@ |
+// Copyright (c) 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef GL_GLEXT_PROTOTYPES |
+#define GL_GLEXT_PROTOTYPES |
+#endif |
+ |
+#include <GLES2/gl2.h> |
+#include <GLES2/gl2ext.h> |
+#include <GLES2/gl2extchromium.h> |
+ |
+#include "base/memory/scoped_vector.h" |
+#include "gpu/command_buffer/tests/gl_manager.h" |
+#include "gpu/command_buffer/tests/gl_test_utils.h" |
+#include "testing/gmock/include/gmock/gmock.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+#define SHADER(src) #src |
+ |
+namespace gpu { |
+ |
+namespace { |
+ |
+const uint8 kCompressedImageColor[4] = { 255u, 0u, 0u, 255u }; |
+ |
+// Single compressed ATC block of source pixels all set to: |
+// kCompressedImageColor. |
+const uint8 kCompressedImageATC[8] = { |
+ 0x0, 0x7c, 0x0, 0xf8, 0x55, 0x55, 0x55, 0x55 }; |
+ |
+// Single compressed ATCIA block of source pixels all set to: |
+// kCompressedImageColor. |
+const uint8 kCompressedImageATCIA[16] = { |
+ 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, |
+ 0x7c, 0x0, 0xf8, 0x55, 0x55, 0x55, 0x55 }; |
+ |
+// Single compressed DXT1 block of source pixels all set to: |
+// kCompressedImageColor. |
+const uint8 kCompressedImageDXT1[8] = { |
+ 0x00, 0xf8, 0x00, 0xf8, 0xaa, 0xaa, 0xaa, 0xaa }; |
+ |
+// Single compressed DXT5 block of source pixels all set to: |
+// kCompressedImageColor. |
+const uint8 kCompressedImageDXT5[16] = { |
+ 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, |
+ 0xf8, 0x0, 0xf8, 0xaa, 0xaa, 0xaa, 0xaa }; |
+ |
+// Single compressed DXT1 block of source pixels all set to: |
+// kCompressedImageColor. |
+const uint8 kCompressedImageETC1[8] = { |
+ 0x0, 0x0, 0xf8, 0x2, 0xff, 0xff, 0x0, 0x0 }; |
+ |
+void glEnableDisable(GLint param, GLboolean value) { |
+ if (value) |
+ glEnable(param); |
+ else |
+ glDisable(param); |
+} |
+ |
+} // unnamed namespace |
+ |
+// A collection of tests that exercise the GL_CHROMIUM_copy_texture extension. |
+class GLCompressedCopyTextureCHROMIUMTest |
+ : public testing::Test { |
+ protected: |
+ void SetUp() override { |
+ gl_.Initialize(GLManager::Options()); |
+ |
+ glGenTextures(2, textures_); |
+ } |
+ |
+ void TearDown() override { |
+ glDeleteTextures(2, textures_); |
+ gl_.Destroy(); |
+ } |
+ |
+ GLuint LoadProgram() { |
+ const char* v_shader_src = SHADER( |
+ attribute vec2 a_position; |
+ varying vec2 v_texcoord; |
+ void main() { |
+ gl_Position = vec4(a_position, 0.0, 1.0); |
+ v_texcoord = (a_position + 1.0) * 0.5; |
+ } |
+ ); |
+ const char* f_shader_src = SHADER( |
+ precision mediump float; |
+ uniform sampler2D u_texture; |
+ varying vec2 v_texcoord; |
+ void main() { |
+ gl_FragColor = texture2D(u_texture, v_texcoord); |
+ } |
+ ); |
+ return GLTestHelper::LoadProgram(v_shader_src, f_shader_src); |
+ } |
+ |
+ GLManager gl_; |
+ GLuint textures_[2]; |
+ GLuint framebuffer_id_; |
+}; |
+ |
+// Test to ensure that the basic functionality of the extension works. |
+TEST_F(GLCompressedCopyTextureCHROMIUMTest, Basic) { |
+ 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); |
+ glCompressedCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1]); |
+ 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(); |
+ |
+ GLTestHelper::CheckPixels(0, 0, 4, 4, 0, kCompressedImageColor); |
+ EXPECT_TRUE(GL_NO_ERROR == glGetError()); |
+} |
+ |
+TEST_F(GLCompressedCopyTextureCHROMIUMTest, InternalFormat) { |
+ struct Image { |
+ const GLint format; |
+ const uint8* data; |
+ const GLsizei data_size; |
+ |
+ Image(const GLint format, const uint8* data, const GLsizei data_size) : |
+ format(format), data(data), data_size(data_size) {} |
+ }; |
+ ScopedVector<Image> supported_formats; |
+ |
+ if (GLTestHelper::HasExtension("GL_AMD_compressed_ATC_texture") || |
+ GLTestHelper::HasExtension("GL_ATI_texture_compression_atitc")) { |
+ supported_formats.push_back(new Image( |
+ GL_ATC_RGB_AMD, |
+ kCompressedImageATC, |
+ sizeof(kCompressedImageATC))); |
+ supported_formats.push_back(new Image( |
+ GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD, |
+ kCompressedImageATCIA, |
+ sizeof(kCompressedImageATCIA))); |
+ } |
+ if (GLTestHelper::HasExtension("GL_EXT_texture_compression_dxt1")) { |
+ supported_formats.push_back(new Image( |
+ GL_COMPRESSED_RGB_S3TC_DXT1_EXT, |
+ kCompressedImageDXT1, |
+ sizeof(kCompressedImageDXT1))); |
+ } |
+ if (GLTestHelper::HasExtension("GL_ANGLE_texture_compression_dxt5") || |
+ GLTestHelper::HasExtension("GL_EXT_texture_compression_s3tc")) { |
+ supported_formats.push_back(new Image( |
+ GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, |
+ kCompressedImageDXT5, |
+ sizeof(kCompressedImageDXT5))); |
+ } |
+ if (GLTestHelper::HasExtension("GL_OES_compressed_ETC1_RGB8_texture")) { |
+ supported_formats.push_back(new Image( |
+ GL_ETC1_RGB8_OES, |
+ kCompressedImageETC1, |
+ sizeof(kCompressedImageETC1))); |
+ } |
+ |
+ for (const Image* image : supported_formats) { |
+ 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, image->format, |
+ 4, 4, 0, image->data_size, image->data); |
+ EXPECT_TRUE(GL_NO_ERROR == glGetError()); |
+ |
+ 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); |
+ glCompressedCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1]); |
+ EXPECT_TRUE(GL_NO_ERROR == glGetError()); |
+ } |
+} |
+ |
+TEST_F(GLCompressedCopyTextureCHROMIUMTest, InternalFormatNotSupported) { |
+ if (!GLTestHelper::HasExtension("GL_EXT_texture_compression_dxt1")) { |
+ LOG(INFO) << |
+ "GL_EXT_texture_compression_dxt1 not supported. Skipping test..."; |
+ return; |
+ } |
+ |
+ const uint8 kUncompressedPixels[1 * 4] = { 255u, 0u, 0u, 255u }; |
+ |
+ 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); |
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, |
+ kUncompressedPixels); |
+ 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); |
+ |
+ // Check that the GL_RGBA format reports an error. |
+ glCompressedCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[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) { |
+ 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); |
+ |
+ GLboolean reference_settings[2] = { GL_TRUE, GL_FALSE }; |
+ for (int x = 0; x < 2; ++x) { |
+ GLboolean setting = reference_settings[x]; |
+ glEnableDisable(GL_DEPTH_TEST, setting); |
+ glEnableDisable(GL_SCISSOR_TEST, setting); |
+ glEnableDisable(GL_STENCIL_TEST, setting); |
+ glEnableDisable(GL_CULL_FACE, setting); |
+ glEnableDisable(GL_BLEND, setting); |
+ glColorMask(setting, setting, setting, setting); |
+ glDepthMask(setting); |
+ |
+ glActiveTexture(GL_TEXTURE1 + x); |
+ |
+ glCompressedCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1]); |
+ EXPECT_TRUE(glGetError() == GL_NO_ERROR); |
+ |
+ EXPECT_EQ(setting, glIsEnabled(GL_DEPTH_TEST)); |
+ EXPECT_EQ(setting, glIsEnabled(GL_SCISSOR_TEST)); |
+ EXPECT_EQ(setting, glIsEnabled(GL_STENCIL_TEST)); |
+ EXPECT_EQ(setting, glIsEnabled(GL_CULL_FACE)); |
+ EXPECT_EQ(setting, glIsEnabled(GL_BLEND)); |
+ |
+ GLboolean bool_array[4] = { GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE }; |
+ glGetBooleanv(GL_DEPTH_WRITEMASK, bool_array); |
+ EXPECT_EQ(setting, bool_array[0]); |
+ |
+ bool_array[0] = GL_FALSE; |
+ glGetBooleanv(GL_COLOR_WRITEMASK, bool_array); |
+ EXPECT_EQ(setting, bool_array[0]); |
+ EXPECT_EQ(setting, bool_array[1]); |
+ EXPECT_EQ(setting, bool_array[2]); |
+ EXPECT_EQ(setting, bool_array[3]); |
+ |
+ GLint active_texture = 0; |
+ glGetIntegerv(GL_ACTIVE_TEXTURE, &active_texture); |
+ EXPECT_EQ(GL_TEXTURE1 + x, active_texture); |
+ } |
+ |
+ EXPECT_TRUE(GL_NO_ERROR == glGetError()); |
+}; |
+ |
+// Verify that invocation of the extension does not modify the bound |
+// texture state. |
+TEST_F(GLCompressedCopyTextureCHROMIUMTest, TextureStatePreserved) { |
+ 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); |
+ |
+ GLuint texture_ids[2]; |
+ glGenTextures(2, texture_ids); |
+ |
+ glActiveTexture(GL_TEXTURE0); |
+ glBindTexture(GL_TEXTURE_2D, texture_ids[0]); |
+ |
+ glActiveTexture(GL_TEXTURE1); |
+ glBindTexture(GL_TEXTURE_2D, texture_ids[1]); |
+ |
+ glCompressedCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1]); |
+ EXPECT_TRUE(GL_NO_ERROR == glGetError()); |
+ |
+ GLint active_texture = 0; |
+ glGetIntegerv(GL_ACTIVE_TEXTURE, &active_texture); |
+ EXPECT_EQ(GL_TEXTURE1, active_texture); |
+ |
+ GLint bound_texture = 0; |
+ glGetIntegerv(GL_TEXTURE_BINDING_2D, &bound_texture); |
+ EXPECT_EQ(texture_ids[1], static_cast<GLuint>(bound_texture)); |
+ glBindTexture(GL_TEXTURE_2D, 0); |
+ |
+ bound_texture = 0; |
+ glActiveTexture(GL_TEXTURE0); |
+ glGetIntegerv(GL_TEXTURE_BINDING_2D, &bound_texture); |
+ EXPECT_EQ(texture_ids[0], static_cast<GLuint>(bound_texture)); |
+ glBindTexture(GL_TEXTURE_2D, 0); |
+ |
+ glDeleteTextures(2, texture_ids); |
+ |
+ EXPECT_TRUE(GL_NO_ERROR == glGetError()); |
+} |
+ |
+} // namespace gpu |