Add new framebuffer fetch extension tests am: 2a609fb223
[platform/upstream/VK-GL-CTS.git] / modules / gles2 / functional / es2fTextureStateQueryTests.cpp
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 Texture State Query tests.
22  *//*--------------------------------------------------------------------*/
23
24 #include "es2fTextureStateQueryTests.hpp"
25 #include "es2fApiCase.hpp"
26 #include "glsStateQueryUtil.hpp"
27 #include "gluRenderContext.hpp"
28 #include "glwEnums.hpp"
29 #include "glwFunctions.hpp"
30 #include "deRandom.hpp"
31 #include "deMath.h"
32
33 using namespace glw; // GLint and other GL types
34 using namespace deqp::gls;
35 using deqp::gls::StateQueryUtil::StateQueryMemoryWriteGuard;
36
37
38 namespace deqp
39 {
40 namespace gles2
41 {
42 namespace Functional
43 {
44 namespace TextureParamVerifiers
45 {
46
47 // TexParamVerifier
48
49 class TexParamVerifier : protected glu::CallLogWrapper
50 {
51 public:
52                                                 TexParamVerifier        (const glw::Functions& gl, tcu::TestLog& log, const char* testNamePostfix);
53         virtual                         ~TexParamVerifier       (); // make GCC happy
54
55         const char*                     getTestNamePostfix      (void) const;
56
57         virtual void            verifyInteger           (tcu::TestContext& testCtx, GLenum target, GLenum name, GLint reference)        = DE_NULL;
58         virtual void            verifyFloat                     (tcu::TestContext& testCtx, GLenum target, GLenum name, GLfloat reference)      = DE_NULL;
59 private:
60         const char*     const   m_testNamePostfix;
61 };
62
63 TexParamVerifier::TexParamVerifier (const glw::Functions& gl, tcu::TestLog& log, const char* testNamePostfix)
64         : glu::CallLogWrapper   (gl, log)
65         , m_testNamePostfix             (testNamePostfix)
66 {
67         enableLogging(true);
68 }
69 TexParamVerifier::~TexParamVerifier ()
70 {
71 }
72
73 const char* TexParamVerifier::getTestNamePostfix (void) const
74 {
75         return m_testNamePostfix;
76 }
77
78 class GetTexParameterIVerifier : public TexParamVerifier
79 {
80 public:
81                         GetTexParameterIVerifier        (const glw::Functions& gl, tcu::TestLog& log);
82
83         void    verifyInteger                           (tcu::TestContext& testCtx, GLenum target, GLenum name, GLint reference);
84         void    verifyFloat                                     (tcu::TestContext& testCtx, GLenum target, GLenum name, GLfloat reference);
85 };
86
87 GetTexParameterIVerifier::GetTexParameterIVerifier (const glw::Functions& gl, tcu::TestLog& log)
88         : TexParamVerifier(gl, log, "_gettexparameteri")
89 {
90 }
91
92 void GetTexParameterIVerifier::verifyInteger (tcu::TestContext& testCtx, GLenum target, GLenum name, GLint reference)
93 {
94         using tcu::TestLog;
95
96         StateQueryMemoryWriteGuard<GLint> state;
97         glGetTexParameteriv(target, name, &state);
98
99         if (!state.verifyValidity(testCtx))
100                 return;
101
102         if (state != reference)
103         {
104                 testCtx.getLog() << TestLog::Message << "// ERROR: expected " << reference << "; got " << state << TestLog::EndMessage;
105
106                 if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
107                         testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid texture param value");
108         }
109 }
110
111 void GetTexParameterIVerifier::verifyFloat (tcu::TestContext& testCtx, GLenum target, GLenum name, GLfloat reference)
112 {
113         using tcu::TestLog;
114
115         const GLint expectedGLStateMax = StateQueryUtil::roundGLfloatToNearestIntegerHalfUp<GLint>(reference);
116         const GLint expectedGLStateMin = StateQueryUtil::roundGLfloatToNearestIntegerHalfDown<GLint>(reference);
117
118         StateQueryMemoryWriteGuard<GLint> state;
119         glGetTexParameteriv(target, name, &state);
120
121         if (!state.verifyValidity(testCtx))
122                 return;
123
124         if (state < expectedGLStateMin || state > expectedGLStateMax)
125         {
126                 testCtx.getLog() << TestLog::Message << "// ERROR: expected in range [" << expectedGLStateMin << ", " << expectedGLStateMax << "]; got " << state << TestLog::EndMessage;
127
128                 if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
129                         testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid texture param value");
130         }
131 }
132
133 class GetTexParameterFVerifier : public TexParamVerifier
134 {
135 public:
136                         GetTexParameterFVerifier        (const glw::Functions& gl, tcu::TestLog& log);
137
138         void    verifyInteger                           (tcu::TestContext& testCtx, GLenum target, GLenum name, GLint reference);
139         void    verifyFloat                                     (tcu::TestContext& testCtx, GLenum target, GLenum name, GLfloat reference);
140 };
141
142 GetTexParameterFVerifier::GetTexParameterFVerifier (const glw::Functions& gl, tcu::TestLog& log)
143         : TexParamVerifier(gl, log, "_gettexparameterf")
144 {
145 }
146
147 void GetTexParameterFVerifier::verifyInteger (tcu::TestContext& testCtx, GLenum target, GLenum name, GLint reference)
148 {
149         DE_ASSERT(reference == GLint(GLfloat(reference))); // reference integer must have 1:1 mapping to float for this to work. Reference value is always such value in these tests
150
151         using tcu::TestLog;
152
153         const GLfloat referenceAsFloat = GLfloat(reference);
154
155         StateQueryMemoryWriteGuard<GLfloat> state;
156         glGetTexParameterfv(target, name, &state);
157
158         if (!state.verifyValidity(testCtx))
159                 return;
160
161         if (state != referenceAsFloat)
162         {
163                 testCtx.getLog() << TestLog::Message << "// ERROR: expected " << referenceAsFloat << "; got " << state << TestLog::EndMessage;
164
165                 if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
166                         testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid float value");
167         }
168 }
169
170 void GetTexParameterFVerifier::verifyFloat (tcu::TestContext& testCtx, GLenum target, GLenum name, GLfloat reference)
171 {
172         using tcu::TestLog;
173
174         StateQueryMemoryWriteGuard<GLfloat> state;
175         glGetTexParameterfv(target, name, &state);
176
177         if (!state.verifyValidity(testCtx))
178                 return;
179
180         if (state != reference)
181         {
182                 testCtx.getLog() << TestLog::Message << "// ERROR: expected " << reference << "; got " << state << TestLog::EndMessage;
183
184                 if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
185                         testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got invalid float value");
186         }
187 }
188
189 } // TextureParamVerifiers
190
191 namespace
192 {
193
194 using namespace TextureParamVerifiers;
195
196 // Tests
197
198 class TextureCase : public ApiCase
199 {
200 public:
201         TextureCase (Context& context, TexParamVerifier* verifier, const char* name, const char* description, GLenum textureTarget)
202                 : ApiCase                       (context, name, description)
203                 , m_textureTarget       (textureTarget)
204                 , m_verifier            (verifier)
205         {
206         }
207
208         virtual void testTexture (void) = DE_NULL;
209
210         void test (void)
211         {
212                 GLuint textureId = 0;
213                 glGenTextures(1, &textureId);
214                 glBindTexture(m_textureTarget, textureId);
215                 expectError(GL_NO_ERROR);
216
217                 testTexture();
218
219                 glDeleteTextures(1, &textureId);
220                 expectError(GL_NO_ERROR);
221         }
222
223 protected:
224         GLenum                          m_textureTarget;
225         TexParamVerifier*       m_verifier;
226 };
227
228 class TextureWrapCase : public TextureCase
229 {
230 public:
231         TextureWrapCase (Context& context, TexParamVerifier* verifier, const char* name, const char* description, GLenum textureTarget, GLenum valueName)
232                 : TextureCase   (context, verifier, name, description, textureTarget)
233                 , m_valueName   (valueName)
234         {
235         }
236
237         void testTexture (void)
238         {
239                 const GLenum wrapValues[] = {GL_CLAMP_TO_EDGE, GL_REPEAT, GL_MIRRORED_REPEAT};
240
241                 m_verifier->verifyInteger(m_testCtx, m_textureTarget, m_valueName, GL_REPEAT);
242                 expectError(GL_NO_ERROR);
243
244                 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(wrapValues); ++ndx)
245                 {
246                         glTexParameteri(m_textureTarget, m_valueName, wrapValues[ndx]);
247                         expectError(GL_NO_ERROR);
248
249                         m_verifier->verifyInteger(m_testCtx, m_textureTarget, m_valueName, wrapValues[ndx]);
250                         expectError(GL_NO_ERROR);
251                 }
252
253                 //check unit conversions with float
254
255                 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(wrapValues); ++ndx)
256                 {
257                         glTexParameterf(m_textureTarget, m_valueName, (GLfloat)wrapValues[ndx]);
258                         expectError(GL_NO_ERROR);
259
260                         m_verifier->verifyInteger(m_testCtx, m_textureTarget, m_valueName, wrapValues[ndx]);
261                         expectError(GL_NO_ERROR);
262                 }
263         }
264
265 private:
266         GLenum  m_valueName;
267 };
268
269 class TextureMagFilterCase : public TextureCase
270 {
271 public:
272         TextureMagFilterCase (Context& context, TexParamVerifier* verifier, const char* name, const char* description, GLenum textureTarget)
273                 : TextureCase(context, verifier, name, description, textureTarget)
274         {
275         }
276
277         void testTexture (void)
278         {
279                 const GLenum magValues[] = {GL_NEAREST, GL_LINEAR};
280
281                 m_verifier->verifyInteger(m_testCtx, m_textureTarget, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
282                 expectError(GL_NO_ERROR);
283
284                 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(magValues); ++ndx)
285                 {
286                         glTexParameteri(m_textureTarget, GL_TEXTURE_MAG_FILTER, magValues[ndx]);
287                         expectError(GL_NO_ERROR);
288
289                         m_verifier->verifyInteger(m_testCtx, m_textureTarget, GL_TEXTURE_MAG_FILTER, magValues[ndx]);
290                         expectError(GL_NO_ERROR);
291                 }
292
293                 //check unit conversions with float
294
295                 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(magValues); ++ndx)
296                 {
297                         glTexParameterf(m_textureTarget, GL_TEXTURE_MAG_FILTER, (GLfloat)magValues[ndx]);
298                         expectError(GL_NO_ERROR);
299
300                         m_verifier->verifyInteger(m_testCtx, m_textureTarget, GL_TEXTURE_MAG_FILTER, magValues[ndx]);
301                         expectError(GL_NO_ERROR);
302                 }
303         }
304 };
305
306 class TextureMinFilterCase : public TextureCase
307 {
308 public:
309         TextureMinFilterCase (Context& context, TexParamVerifier* verifier, const char* name, const char* description, GLenum textureTarget)
310                 : TextureCase(context, verifier, name, description, textureTarget)
311         {
312         }
313
314         void testTexture (void)
315         {
316                 const GLenum minValues[] = {GL_NEAREST, GL_LINEAR, GL_NEAREST_MIPMAP_NEAREST, GL_NEAREST_MIPMAP_LINEAR, GL_LINEAR_MIPMAP_NEAREST, GL_LINEAR_MIPMAP_LINEAR};
317
318                 m_verifier->verifyInteger(m_testCtx, m_textureTarget, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR);
319                 expectError(GL_NO_ERROR);
320
321                 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(minValues); ++ndx)
322                 {
323                         glTexParameteri(m_textureTarget, GL_TEXTURE_MIN_FILTER, minValues[ndx]);
324                         expectError(GL_NO_ERROR);
325
326                         m_verifier->verifyInteger(m_testCtx, m_textureTarget, GL_TEXTURE_MIN_FILTER, minValues[ndx]);
327                         expectError(GL_NO_ERROR);
328                 }
329
330                 //check unit conversions with float
331
332                 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(minValues); ++ndx)
333                 {
334                         glTexParameterf(m_textureTarget, GL_TEXTURE_MIN_FILTER, (GLfloat)minValues[ndx]);
335                         expectError(GL_NO_ERROR);
336
337                         m_verifier->verifyInteger(m_testCtx, m_textureTarget, GL_TEXTURE_MIN_FILTER, minValues[ndx]);
338                         expectError(GL_NO_ERROR);
339                 }
340         }
341 };
342
343 } // anonymous
344
345 #define FOR_EACH_VERIFIER(VERIFIERS, CODE_BLOCK)                                                                                                \
346         for (int _verifierNdx = 0; _verifierNdx < DE_LENGTH_OF_ARRAY(VERIFIERS); _verifierNdx++)        \
347         {                                                                                                                                                                                       \
348                 TexParamVerifier* verifier = (VERIFIERS)[_verifierNdx];                                                                 \
349                 CODE_BLOCK;                                                                                                                                                             \
350         }
351
352 TextureStateQueryTests::TextureStateQueryTests (Context& context)
353         : TestCaseGroup         (context, "texture", "Texture State Query tests")
354         , m_verifierInt         (DE_NULL)
355         , m_verifierFloat       (DE_NULL)
356 {
357 }
358
359 TextureStateQueryTests::~TextureStateQueryTests (void)
360 {
361         deinit();
362 }
363
364 void TextureStateQueryTests::init (void)
365 {
366         using namespace TextureParamVerifiers;
367
368         DE_ASSERT(m_verifierInt == DE_NULL);
369         DE_ASSERT(m_verifierFloat == DE_NULL);
370
371         m_verifierInt           = new GetTexParameterIVerifier(m_context.getRenderContext().getFunctions(), m_context.getTestContext().getLog());
372         m_verifierFloat         = new GetTexParameterFVerifier(m_context.getRenderContext().getFunctions(), m_context.getTestContext().getLog());
373
374         TexParamVerifier* verifiers[] = {m_verifierInt, m_verifierFloat};
375
376         const struct
377         {
378                 const char*     name;
379                 GLenum          textureTarget;
380         } textureTargets[] =
381         {
382                 { "texture_2d",                 GL_TEXTURE_2D},
383                 { "texture_cube_map",   GL_TEXTURE_CUBE_MAP}
384         };
385
386         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(textureTargets); ++ndx)
387         {
388                 FOR_EACH_VERIFIER(verifiers, addChild(new TextureWrapCase               (m_context, verifier,   (std::string(textureTargets[ndx].name)  + "_texture_wrap_s"                     + verifier->getTestNamePostfix()).c_str(), "TEXTURE_WRAP_S",            textureTargets[ndx].textureTarget, GL_TEXTURE_WRAP_S)));
389                 FOR_EACH_VERIFIER(verifiers, addChild(new TextureWrapCase               (m_context, verifier,   (std::string(textureTargets[ndx].name)  + "_texture_wrap_t"                     + verifier->getTestNamePostfix()).c_str(), "TEXTURE_WRAP_T",            textureTargets[ndx].textureTarget, GL_TEXTURE_WRAP_T)));
390
391                 FOR_EACH_VERIFIER(verifiers, addChild(new TextureMagFilterCase  (m_context, verifier,   (std::string(textureTargets[ndx].name)  + "_texture_mag_filter"         + verifier->getTestNamePostfix()).c_str(), "TEXTURE_MAG_FILTER",        textureTargets[ndx].textureTarget)));
392                 FOR_EACH_VERIFIER(verifiers, addChild(new TextureMinFilterCase  (m_context, verifier,   (std::string(textureTargets[ndx].name)  + "_texture_min_filter"         + verifier->getTestNamePostfix()).c_str(), "TEXTURE_MIN_FILTER",        textureTargets[ndx].textureTarget)));
393         }
394 }
395
396 void TextureStateQueryTests::deinit (void)
397 {
398         if (m_verifierInt)
399         {
400                 delete m_verifierInt;
401                 m_verifierInt = NULL;
402         }
403         if (m_verifierFloat)
404         {
405                 delete m_verifierFloat;
406                 m_verifierFloat = NULL;
407         }
408
409         this->TestCaseGroup::deinit();
410 }
411
412 } // Functional
413 } // gles2
414 } // deqp