1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include <GLES2/gl2.h> 6 #include <GLES2/gl2ext.h> 7 8 #include "gpu/command_buffer/tests/gl_manager.h" 9 #include "gpu/command_buffer/tests/gl_test_utils.h" 10 #include "testing/gmock/include/gmock/gmock.h" 11 #include "testing/gtest/include/gtest/gtest.h" 12 13 namespace gpu { 14 15 class TextureStorageTest : public testing::Test { 16 protected: 17 static const GLsizei kResolution = 64; 18 virtual void SetUp() { 19 GLManager::Options options; 20 options.size = gfx::Size(kResolution, kResolution); 21 gl_.Initialize(options); 22 gl_.MakeCurrent(); 23 24 glGenTextures(1, &tex_); 25 glBindTexture(GL_TEXTURE_2D, tex_); 26 27 glGenFramebuffers(1, &fbo_); 28 glBindFramebuffer(GL_FRAMEBUFFER, fbo_); 29 glFramebufferTexture2D(GL_FRAMEBUFFER, 30 GL_COLOR_ATTACHMENT0, 31 GL_TEXTURE_2D, 32 tex_, 33 0); 34 35 const GLubyte* extensions = glGetString(GL_EXTENSIONS); 36 extension_available_ = strstr(reinterpret_cast<const char*>( 37 extensions), "GL_EXT_texture_storage"); 38 } 39 40 virtual void TearDown() { 41 gl_.Destroy(); 42 } 43 44 GLManager gl_; 45 GLuint tex_; 46 GLuint fbo_; 47 bool extension_available_; 48 }; 49 50 TEST_F(TextureStorageTest, CorrectPixels) { 51 if (!extension_available_) 52 return; 53 54 glTexStorage2DEXT(GL_TEXTURE_2D, 2, GL_RGBA8_OES, 2, 2); 55 56 uint8 source_pixels[16] = { 57 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4 58 }; 59 glTexSubImage2D(GL_TEXTURE_2D, 60 0, 61 0, 0, 62 2, 2, 63 GL_RGBA, GL_UNSIGNED_BYTE, 64 source_pixels); 65 EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, 2, 2, 0, source_pixels)); 66 } 67 68 TEST_F(TextureStorageTest, IsImmutable) { 69 if (!extension_available_) 70 return; 71 72 glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8_OES, 4, 4); 73 74 GLint param = 0; 75 glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_IMMUTABLE_FORMAT_EXT, ¶m); 76 EXPECT_TRUE(param); 77 } 78 79 TEST_F(TextureStorageTest, OneLevel) { 80 if (!extension_available_) 81 return; 82 83 glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8_OES, 4, 4); 84 85 uint8 source_pixels[64] = { 0 }; 86 87 EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError()); 88 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 4, 4, 89 GL_RGBA, GL_UNSIGNED_BYTE, source_pixels); 90 EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError()); 91 glTexSubImage2D(GL_TEXTURE_2D, 1, 0, 0, 2, 2, 92 GL_RGBA, GL_UNSIGNED_BYTE, source_pixels); 93 EXPECT_EQ(static_cast<GLenum>(GL_INVALID_OPERATION), glGetError()); 94 } 95 96 TEST_F(TextureStorageTest, MultipleLevels) { 97 if (!extension_available_) 98 return; 99 100 glTexStorage2DEXT(GL_TEXTURE_2D, 2, GL_RGBA8_OES, 2, 2); 101 102 uint8 source_pixels[16] = { 0 }; 103 104 EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError()); 105 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 2, 2, 106 GL_RGBA, GL_UNSIGNED_BYTE, source_pixels); 107 EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError()); 108 glTexSubImage2D(GL_TEXTURE_2D, 1, 0, 0, 1, 1, 109 GL_RGBA, GL_UNSIGNED_BYTE, source_pixels); 110 EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError()); 111 glTexSubImage2D(GL_TEXTURE_2D, 2, 0, 0, 1, 1, 112 GL_RGBA, GL_UNSIGNED_BYTE, source_pixels); 113 EXPECT_EQ(static_cast<GLenum>(GL_INVALID_OPERATION), glGetError()); 114 } 115 116 TEST_F(TextureStorageTest, BadTarget) { 117 if (!extension_available_) 118 return; 119 120 EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError()); 121 glTexStorage2DEXT(GL_TEXTURE_CUBE_MAP, 1, GL_RGBA8_OES, 4, 4); 122 EXPECT_EQ(static_cast<GLenum>(GL_INVALID_ENUM), glGetError()); 123 } 124 125 TEST_F(TextureStorageTest, InvalidId) { 126 if (!extension_available_) 127 return; 128 129 glDeleteTextures(1, &tex_); 130 EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError()); 131 glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8_OES, 4, 4); 132 EXPECT_EQ(static_cast<GLenum>(GL_INVALID_OPERATION), glGetError()); 133 } 134 135 TEST_F(TextureStorageTest, CannotRedefine) { 136 if (!extension_available_) 137 return; 138 139 glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8_OES, 4, 4); 140 141 EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError()); 142 glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8_OES, 4, 4); 143 EXPECT_EQ(static_cast<GLenum>(GL_INVALID_OPERATION), glGetError()); 144 145 EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError()); 146 glTexImage2D(GL_TEXTURE_2D, 147 0, 148 GL_RGBA, 149 4, 4, 150 0, 151 GL_RGBA, 152 GL_UNSIGNED_BYTE, 153 NULL); 154 EXPECT_EQ(static_cast<GLenum>(GL_INVALID_OPERATION), glGetError()); 155 } 156 157 } // namespace gpu 158 159 160 161