15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <GLES2/gl2.h> 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <GLES2/gl2ext.h> 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "gpu/command_buffer/tests/gl_manager.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "gpu/command_buffer/tests/gl_test_utils.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace gpu { 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TextureStorageTest : public testing::Test { 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static const GLsizei kResolution = 64; 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetUp() { 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLManager::Options options; 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) options.size = gfx::Size(kResolution, kResolution); 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gl_.Initialize(options); 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gl_.MakeCurrent(); 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glGenTextures(1, &tex_); 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glBindTexture(GL_TEXTURE_2D, tex_); 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glGenFramebuffers(1, &fbo_); 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glBindFramebuffer(GL_FRAMEBUFFER, fbo_); 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glFramebufferTexture2D(GL_FRAMEBUFFER, 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GL_COLOR_ATTACHMENT0, 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GL_TEXTURE_2D, 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tex_, 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0); 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GLubyte* extensions = glGetString(GL_EXTENSIONS); 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extension_available_ = strstr(reinterpret_cast<const char*>( 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions), "GL_EXT_texture_storage"); 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void TearDown() { 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gl_.Destroy(); 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLManager gl_; 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLuint tex_; 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLuint fbo_; 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool extension_available_; 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(TextureStorageTest, CorrectPixels) { 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!extension_available_) 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glTexStorage2DEXT(GL_TEXTURE_2D, 2, GL_RGBA8_OES, 2, 2); 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint8 source_pixels[16] = { 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glTexSubImage2D(GL_TEXTURE_2D, 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, 0, 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2, 2, 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GL_RGBA, GL_UNSIGNED_BYTE, 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) source_pixels); 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, 2, 2, 0, source_pixels)); 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(TextureStorageTest, IsImmutable) { 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!extension_available_) 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8_OES, 4, 4); 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLint param = 0; 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_IMMUTABLE_FORMAT_EXT, ¶m); 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(param); 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(TextureStorageTest, OneLevel) { 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!extension_available_) 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8_OES, 4, 4); 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint8 source_pixels[64] = { 0 }; 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError()); 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 4, 4, 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GL_RGBA, GL_UNSIGNED_BYTE, source_pixels); 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError()); 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glTexSubImage2D(GL_TEXTURE_2D, 1, 0, 0, 2, 2, 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GL_RGBA, GL_UNSIGNED_BYTE, source_pixels); 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(static_cast<GLenum>(GL_INVALID_OPERATION), glGetError()); 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(TextureStorageTest, MultipleLevels) { 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!extension_available_) 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glTexStorage2DEXT(GL_TEXTURE_2D, 2, GL_RGBA8_OES, 2, 2); 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint8 source_pixels[16] = { 0 }; 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError()); 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 2, 2, 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GL_RGBA, GL_UNSIGNED_BYTE, source_pixels); 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError()); 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glTexSubImage2D(GL_TEXTURE_2D, 1, 0, 0, 1, 1, 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GL_RGBA, GL_UNSIGNED_BYTE, source_pixels); 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError()); 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glTexSubImage2D(GL_TEXTURE_2D, 2, 0, 0, 1, 1, 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GL_RGBA, GL_UNSIGNED_BYTE, source_pixels); 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(static_cast<GLenum>(GL_INVALID_OPERATION), glGetError()); 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(TextureStorageTest, BadTarget) { 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!extension_available_) 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError()); 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glTexStorage2DEXT(GL_TEXTURE_CUBE_MAP, 1, GL_RGBA8_OES, 4, 4); 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(static_cast<GLenum>(GL_INVALID_ENUM), glGetError()); 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(TextureStorageTest, InvalidId) { 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!extension_available_) 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glDeleteTextures(1, &tex_); 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError()); 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8_OES, 4, 4); 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(static_cast<GLenum>(GL_INVALID_OPERATION), glGetError()); 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(TextureStorageTest, CannotRedefine) { 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!extension_available_) 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8_OES, 4, 4); 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError()); 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8_OES, 4, 4); 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(static_cast<GLenum>(GL_INVALID_OPERATION), glGetError()); 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError()); 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) glTexImage2D(GL_TEXTURE_2D, 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GL_RGBA, 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4, 4, 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GL_RGBA, 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GL_UNSIGNED_BYTE, 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL); 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(static_cast<GLenum>(GL_INVALID_OPERATION), glGetError()); 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace gpu 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 161