1 /*-------------------------------------------------------------------------
2 * drawElements Quality Program OpenGL ES 2.0 Module
3 * -------------------------------------------------
4 *
5 * Copyright 2014 The Android Open Source Project
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 *
19 *//*!
20 * \file
21 * \brief Buffer Object Query tests.
22 *//*--------------------------------------------------------------------*/
23
24 #include "es2fBufferObjectQueryTests.hpp"
25 #include "glsStateQueryUtil.hpp"
26 #include "es2fApiCase.hpp"
27 #include "gluRenderContext.hpp"
28 #include "glwEnums.hpp"
29 #include "glwFunctions.hpp"
30 #include "deRandom.hpp"
31 #include "deMath.h"
32
33 #include <limits>
34
35 using namespace glw; // GLint and other GL types
36 using deqp::gls::StateQueryUtil::StateQueryMemoryWriteGuard;
37
38
39 namespace deqp
40 {
41 namespace gles2
42 {
43 namespace Functional
44 {
45 namespace BufferParamVerifiers
46 {
47
checkIntEquals(tcu::TestContext & testCtx,GLint got,GLint expected)48 void checkIntEquals (tcu::TestContext& testCtx, GLint got, GLint expected)
49 {
50 using tcu::TestLog;
51
52 if (got != expected)
53 {
54 testCtx.getLog() << TestLog::Message << "// ERROR: Expected " << expected << "; got " << got << TestLog::EndMessage;
55 if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
56 testCtx.setTestResult(QP_TEST_RESULT_FAIL, "got invalid value");
57 }
58 }
59
checkPointerEquals(tcu::TestContext & testCtx,const void * got,const void * expected)60 void checkPointerEquals (tcu::TestContext& testCtx, const void* got, const void* expected)
61 {
62 using tcu::TestLog;
63
64 if (got != expected)
65 {
66 testCtx.getLog() << TestLog::Message << "// ERROR: Expected " << expected << "; got " << got << TestLog::EndMessage;
67 if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
68 testCtx.setTestResult(QP_TEST_RESULT_FAIL, "got invalid value");
69 }
70 }
71
72 class BufferParamVerifier : protected glu::CallLogWrapper
73 {
74 public:
75 BufferParamVerifier (const glw::Functions& gl, tcu::TestLog& log, const char* testNamePostfix);
76 virtual ~BufferParamVerifier (); // make GCC happy
77
78 const char* getTestNamePostfix (void) const;
79
80 virtual void verifyInteger (tcu::TestContext& testCtx, GLenum target, GLenum name, GLint reference) = DE_NULL;
81 private:
82 const char* const m_testNamePostfix;
83 };
84
BufferParamVerifier(const glw::Functions & gl,tcu::TestLog & log,const char * testNamePostfix)85 BufferParamVerifier::BufferParamVerifier (const glw::Functions& gl, tcu::TestLog& log, const char* testNamePostfix)
86 : glu::CallLogWrapper (gl, log)
87 , m_testNamePostfix (testNamePostfix)
88 {
89 enableLogging(true);
90 }
91
~BufferParamVerifier()92 BufferParamVerifier::~BufferParamVerifier ()
93 {
94 }
95
getTestNamePostfix(void) const96 const char* BufferParamVerifier::getTestNamePostfix (void) const
97 {
98 return m_testNamePostfix;
99 }
100
101 class GetBufferParameterIVerifier : public BufferParamVerifier
102 {
103 public:
104 GetBufferParameterIVerifier (const glw::Functions& gl, tcu::TestLog& log);
105
106 void verifyInteger (tcu::TestContext& testCtx, GLenum target, GLenum name, GLint reference);
107 };
108
GetBufferParameterIVerifier(const glw::Functions & gl,tcu::TestLog & log)109 GetBufferParameterIVerifier::GetBufferParameterIVerifier (const glw::Functions& gl, tcu::TestLog& log)
110 : BufferParamVerifier(gl, log, "_getbufferparameteri")
111 {
112 }
113
verifyInteger(tcu::TestContext & testCtx,GLenum target,GLenum name,GLint reference)114 void GetBufferParameterIVerifier::verifyInteger (tcu::TestContext& testCtx, GLenum target, GLenum name, GLint reference)
115 {
116 using tcu::TestLog;
117
118 StateQueryMemoryWriteGuard<GLint> state;
119 glGetBufferParameteriv(target, name, &state);
120
121 if (!state.verifyValidity(testCtx))
122 return;
123
124 if (state != reference)
125 {
126 testCtx.getLog() << TestLog::Message << "// ERROR: expected " << reference << "; got " << state << TestLog::EndMessage;
127
128 if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
129 testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid value");
130 }
131 }
132
133 } // BufferParamVerifiers
134
135 namespace
136 {
137
138 using namespace BufferParamVerifiers;
139
140 // Tests
141
142 class BufferCase : public ApiCase
143 {
144 public:
BufferCase(Context & context,BufferParamVerifier * verifier,const char * name,const char * description)145 BufferCase (Context& context, BufferParamVerifier* verifier, const char* name, const char* description)
146 : ApiCase (context, name, description)
147 , m_bufferTarget (0)
148 , m_verifier (verifier)
149 {
150 }
151
152 virtual void testBuffer (void) = DE_NULL;
153
test(void)154 void test (void)
155 {
156 const GLenum bufferTargets[] =
157 {
158 GL_ARRAY_BUFFER, GL_ELEMENT_ARRAY_BUFFER
159 };
160 const int targets = DE_LENGTH_OF_ARRAY(bufferTargets);
161
162 for (int ndx = 0; ndx < targets; ++ndx)
163 {
164 m_bufferTarget = bufferTargets[ndx];
165
166 GLuint bufferId = 0;
167 glGenBuffers(1, &bufferId);
168 glBindBuffer(m_bufferTarget, bufferId);
169 expectError(GL_NO_ERROR);
170
171 testBuffer();
172
173 glDeleteBuffers(1, &bufferId);
174 expectError(GL_NO_ERROR);
175 }
176 }
177
178 protected:
179 GLenum m_bufferTarget;
180 BufferParamVerifier* m_verifier;
181 };
182
183 class BufferSizeCase : public BufferCase
184 {
185 public:
BufferSizeCase(Context & context,BufferParamVerifier * verifier,const char * name,const char * description)186 BufferSizeCase (Context& context, BufferParamVerifier* verifier, const char* name, const char* description)
187 : BufferCase(context, verifier, name, description)
188 {
189 }
190
testBuffer(void)191 void testBuffer (void)
192 {
193 const int numIteration = 16;
194 de::Random rnd(0xabcdef);
195
196 m_verifier->verifyInteger(m_testCtx, m_bufferTarget, GL_BUFFER_SIZE, 0);
197
198 for (int i = 0; i < numIteration; ++i)
199 {
200 const GLint len = rnd.getInt(0, 1024);
201 glBufferData(m_bufferTarget, len, DE_NULL, GL_STREAM_DRAW);
202 expectError(GL_NO_ERROR);
203
204 m_verifier->verifyInteger(m_testCtx, m_bufferTarget, GL_BUFFER_SIZE, len);
205 expectError(GL_NO_ERROR);
206 }
207 }
208 };
209
210 class BufferUsageCase : public BufferCase
211 {
212 public:
BufferUsageCase(Context & context,BufferParamVerifier * verifier,const char * name,const char * description)213 BufferUsageCase (Context& context, BufferParamVerifier* verifier, const char* name, const char* description)
214 : BufferCase(context, verifier, name, description)
215 {
216 }
217
testBuffer(void)218 void testBuffer (void)
219 {
220 const GLenum usages[] =
221 {
222 GL_STATIC_DRAW, GL_DYNAMIC_DRAW, GL_STREAM_DRAW
223 };
224
225 m_verifier->verifyInteger(m_testCtx, m_bufferTarget, GL_BUFFER_USAGE, GL_STATIC_DRAW);
226
227 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(usages); ++ndx)
228 {
229 glBufferData(m_bufferTarget, 16, DE_NULL, usages[ndx]);
230 expectError(GL_NO_ERROR);
231
232 m_verifier->verifyInteger(m_testCtx, m_bufferTarget, GL_BUFFER_USAGE, usages[ndx]);
233 expectError(GL_NO_ERROR);
234 }
235 }
236 };
237
238 } // anonymous
239
240 #define FOR_EACH_VERIFIER(VERIFIERS, CODE_BLOCK) \
241 for (int _verifierNdx = 0; _verifierNdx < DE_LENGTH_OF_ARRAY(VERIFIERS); _verifierNdx++) \
242 { \
243 BufferParamVerifier* verifier = (VERIFIERS)[_verifierNdx]; \
244 CODE_BLOCK; \
245 }
246
BufferObjectQueryTests(Context & context)247 BufferObjectQueryTests::BufferObjectQueryTests (Context& context)
248 : TestCaseGroup (context, "buffer_object", "Buffer Object Query tests")
249 , m_verifierInt (DE_NULL)
250 {
251 }
252
~BufferObjectQueryTests(void)253 BufferObjectQueryTests::~BufferObjectQueryTests (void)
254 {
255 deinit();
256 }
257
init(void)258 void BufferObjectQueryTests::init (void)
259 {
260 using namespace BufferParamVerifiers;
261
262 DE_ASSERT(m_verifierInt == DE_NULL);
263
264 m_verifierInt = new GetBufferParameterIVerifier (m_context.getRenderContext().getFunctions(), m_context.getTestContext().getLog());
265 BufferParamVerifier* verifiers[] = {m_verifierInt};
266
267 FOR_EACH_VERIFIER(verifiers, addChild(new BufferSizeCase (m_context, verifier, (std::string("buffer_size") + verifier->getTestNamePostfix()).c_str(), "BUFFER_SIZE")))
268 FOR_EACH_VERIFIER(verifiers, addChild(new BufferUsageCase (m_context, verifier, (std::string("buffer_usage") + verifier->getTestNamePostfix()).c_str(), "BUFFER_USAGE")))
269 }
270
deinit(void)271 void BufferObjectQueryTests::deinit (void)
272 {
273 if (m_verifierInt)
274 {
275 delete m_verifierInt;
276 m_verifierInt = NULL;
277 }
278
279 this->TestCaseGroup::deinit();
280 }
281
282 } // Functional
283 } // gles2
284 } // deqp
285