• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (C) 2018 The Android Open Source Project
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #include "GLSnapshotTesting.h"
16 
17 #include <gtest/gtest.h>
18 
19 namespace emugl {
20 
21 struct GlRenderbufferFormat {
22     GLenum name;
23     GLsizei red;
24     GLsizei green;
25     GLsizei blue;
26     GLsizei alpha;
27     GLsizei depth;
28     GLsizei stencil;
29 };
30 
31 struct GlRenderbufferState {
32     GLuint width;
33     GLuint height;
34     GlRenderbufferFormat format;
35 };
36 
37 static const GlRenderbufferState kGLES2DefaultRenderbufferState = {
38         0,
39         0,
40         {.name = GL_RGBA4}};
41 
42 static const GlRenderbufferFormat kGLES2RenderbufferFormatFieldSizes[] = {
43         {GL_DEPTH_COMPONENT16, 0, 0, 0, 0, 16, 0},
44         {GL_RGBA4, 4, 4, 4, 4, 0, 0},
45         {GL_RGB5_A1, 5, 5, 5, 1, 0, 0},
46         {GL_RGB565, 5, 6, 5, 0, 0, 0},
47         {GL_STENCIL_INDEX8, 0, 0, 0, 0, 0, 8},
48 };
49 
50 static const GlRenderbufferState kGLES2TestRenderbufferStates[] = {
51         {1, 1, kGLES2RenderbufferFormatFieldSizes[0]},
52         {0, 3, kGLES2RenderbufferFormatFieldSizes[1]},
53         {2, 2, kGLES2RenderbufferFormatFieldSizes[1]},
54         {4, 4, kGLES2RenderbufferFormatFieldSizes[2]},
55         {8, 8, kGLES2RenderbufferFormatFieldSizes[3]},
56         {16, 16, kGLES2RenderbufferFormatFieldSizes[4]},
57 };
58 
59 class SnapshotGlRenderbufferTest : public SnapshotPreserveTest {
60 public:
defaultStateCheck()61     void defaultStateCheck() override {
62         EXPECT_EQ(GL_FALSE, gl->glIsRenderbuffer(m_renderbuffer_name));
63         EXPECT_TRUE(compareGlobalGlInt(gl, GL_RENDERBUFFER_BINDING, 0));
64     }
65 
changedStateCheck()66     void changedStateCheck() override {
67         EXPECT_EQ(GL_TRUE, gl->glIsRenderbuffer(m_renderbuffer_name));
68         EXPECT_TRUE(compareGlobalGlInt(gl, GL_RENDERBUFFER_BINDING,
69                                        m_renderbuffer_name));
70 
71         EXPECT_TRUE(compareParameter(GL_RENDERBUFFER_WIDTH, m_state.width));
72         EXPECT_TRUE(compareParameter(GL_RENDERBUFFER_HEIGHT, m_state.height));
73         EXPECT_TRUE(compareParameter(GL_RENDERBUFFER_INTERNAL_FORMAT,
74                                      m_state.format.name));
75         EXPECT_TRUE(
76                 compareParameter(GL_RENDERBUFFER_RED_SIZE, m_state.format.red));
77         EXPECT_TRUE(compareParameter(GL_RENDERBUFFER_GREEN_SIZE,
78                                      m_state.format.green));
79         EXPECT_TRUE(compareParameter(GL_RENDERBUFFER_BLUE_SIZE,
80                                      m_state.format.blue));
81         EXPECT_TRUE(compareParameter(GL_RENDERBUFFER_ALPHA_SIZE,
82                                      m_state.format.alpha));
83         EXPECT_TRUE(compareParameter(GL_RENDERBUFFER_DEPTH_SIZE,
84                                      m_state.format.depth));
85         EXPECT_TRUE(compareParameter(GL_RENDERBUFFER_STENCIL_SIZE,
86                                      m_state.format.stencil));
87     }
88 
stateChange()89     void stateChange() override {
90         gl->glGenRenderbuffers(1, &m_renderbuffer_name);
91         gl->glBindRenderbuffer(GL_RENDERBUFFER, m_renderbuffer_name);
92 
93         m_state_changer();
94     }
95 
setStateChanger(std::function<void ()> changer)96     void setStateChanger(std::function<void()> changer) {
97         m_state_changer = changer;
98     }
99 
100 protected:
compareParameter(GLenum name,GLint expected)101     testing::AssertionResult compareParameter(GLenum name, GLint expected) {
102         GLint actual;
103         gl->glGetRenderbufferParameteriv(GL_RENDERBUFFER, name, &actual);
104         return compareValue<GLint>(
105                 expected, actual,
106                 "GL Renderbuffer object mismatch for param " +
107                         describeGlEnum(name) + ":");
108     }
109 
110     GLuint m_renderbuffer_name = 0;
111     GlRenderbufferState m_state = kGLES2DefaultRenderbufferState;
__anon76cdd31e0102null112     std::function<void()> m_state_changer = [] {};
113 };
114 
TEST_F(SnapshotGlRenderbufferTest,CreateAndBind)115 TEST_F(SnapshotGlRenderbufferTest, CreateAndBind) {
116     doCheckedSnapshot();
117 }
118 
119 class SnapshotGlRenderbufferFormatTest
120     : public SnapshotGlRenderbufferTest,
121       public ::testing::WithParamInterface<GlRenderbufferState> {};
122 
TEST_P(SnapshotGlRenderbufferFormatTest,SetFormat)123 TEST_P(SnapshotGlRenderbufferFormatTest, SetFormat) {
124     setStateChanger([this] {
125         GLint maxSize;
126         gl->glGetIntegerv(GL_MAX_RENDERBUFFER_SIZE, &maxSize);
127         m_state = GetParam();
128         if (maxSize < m_state.width || maxSize < m_state.height) {
129             fprintf(stderr,
130                     "test dimensions exceed max renderbuffer size %d; "
131                     "using max size instead\n",
132                     maxSize);
133             m_state.width = maxSize;
134             m_state.height = maxSize;
135         }
136         gl->glRenderbufferStorage(GL_RENDERBUFFER, m_state.format.name,
137                                   m_state.width, m_state.height);
138 
139         // The actual number of bits used for each format doesn't necessarily
140         // match how they are defined.
141         GLint fieldSize;
142         gl->glGetRenderbufferParameteriv(GL_RENDERBUFFER,
143                                          GL_RENDERBUFFER_RED_SIZE, &fieldSize);
144         if (fieldSize != m_state.format.red) {
145             fprintf(stderr,
146                     "format 0x%x internal RED uses %d bits instead of %d\n",
147                     m_state.format.name, fieldSize, m_state.format.red);
148             m_state.format.red = fieldSize;
149         }
150         gl->glGetRenderbufferParameteriv(
151                 GL_RENDERBUFFER, GL_RENDERBUFFER_GREEN_SIZE, &fieldSize);
152         if (fieldSize != m_state.format.green) {
153             fprintf(stderr,
154                     "format 0x%x internal GREEN uses %d bits instead of %d\n",
155                     m_state.format.name, fieldSize, m_state.format.green);
156             m_state.format.green = fieldSize;
157         }
158         gl->glGetRenderbufferParameteriv(GL_RENDERBUFFER,
159                                          GL_RENDERBUFFER_BLUE_SIZE, &fieldSize);
160         if (fieldSize != m_state.format.blue) {
161             fprintf(stderr,
162                     "format 0x%x internal BLUE uses %d bits instead of %d\n",
163                     m_state.format.name, fieldSize, m_state.format.blue);
164             m_state.format.blue = fieldSize;
165         }
166         gl->glGetRenderbufferParameteriv(
167                 GL_RENDERBUFFER, GL_RENDERBUFFER_ALPHA_SIZE, &fieldSize);
168         if (fieldSize != m_state.format.alpha) {
169             fprintf(stderr,
170                     "format 0x%x internal ALPHA uses %d bits instead of %d\n",
171                     m_state.format.name, fieldSize, m_state.format.alpha);
172             m_state.format.alpha = fieldSize;
173         }
174         gl->glGetRenderbufferParameteriv(
175                 GL_RENDERBUFFER, GL_RENDERBUFFER_DEPTH_SIZE, &fieldSize);
176         if (fieldSize != m_state.format.depth) {
177             fprintf(stderr,
178                     "format 0x%x internal DEPTH uses %d bits instead of %d\n",
179                     m_state.format.name, fieldSize, m_state.format.depth);
180             m_state.format.depth = fieldSize;
181         }
182         gl->glGetRenderbufferParameteriv(
183                 GL_RENDERBUFFER, GL_RENDERBUFFER_STENCIL_SIZE, &fieldSize);
184         if (fieldSize != m_state.format.stencil) {
185             fprintf(stderr,
186                     "format 0x%x internal STENCIL uses %d bits instead of %d\n",
187                     m_state.format.name, fieldSize, m_state.format.stencil);
188             m_state.format.stencil = fieldSize;
189         }
190         EXPECT_EQ(GL_NO_ERROR, gl->glGetError());
191     });
192     doCheckedSnapshot();
193 }
194 
195 INSTANTIATE_TEST_SUITE_P(GLES2SnapshotRenderbuffers,
196                          SnapshotGlRenderbufferFormatTest,
197                          ::testing::ValuesIn(kGLES2TestRenderbufferStates));
198 
199 }  // namespace emugl
200