gl_texture_storage_unittest.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
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, &param);
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