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
13namespace gpu {
14
15class 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
50TEST_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
68TEST_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, &param);
76  EXPECT_TRUE(param);
77}
78
79TEST_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
96TEST_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
116TEST_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
125TEST_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
135TEST_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