1 /*-------------------------------------------------------------------------
2  * OpenGL Conformance Test Suite
3  * -----------------------------
4  *
5  * Copyright (c) 2014-2016 The Khronos Group Inc.
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
22  */ /*-------------------------------------------------------------------*/
23 
24 /*!
25  * \file esextcTextureBorderClampBase.cpp
26  * \brief Base Class for Texture Border Clamp extension tests 1-6.
27  */ /*-------------------------------------------------------------------*/
28 
29 #include "esextcTextureBorderClampBase.hpp"
30 #include "gluContextInfo.hpp"
31 #include "gluDefs.hpp"
32 #include "glwEnums.hpp"
33 #include "glwFunctions.hpp"
34 #include "tcuTestLog.hpp"
35 
36 namespace glcts
37 {
38 
39 /** Constructor
40  *
41  *  @param context     Test context
42  *  @param name        Test case's name
43  *  @param description Test case's description
44  **/
TextureBorderClampBase(Context & context,const ExtParameters & extParams,const char * name,const char * description)45 TextureBorderClampBase::TextureBorderClampBase(Context &context, const ExtParameters &extParams, const char *name,
46                                                const char *description)
47     : TestCaseBase(context, extParams, name, description)
48     , m_texture_2D_array_id(0)
49     , m_texture_2D_id(0)
50     , m_texture_2D_multisample_array_id(0)
51     , m_texture_2D_multisample_id(0)
52     , m_texture_3D_id(0)
53     , m_texture_buffer_id(0)
54     , m_texture_cube_map_id(0)
55     , m_texture_cube_map_array_id(0)
56 {
57     /* Left blank on purpose */
58 }
59 
60 /** Deinitializes GLES objects created during the tests.
61  *
62  */
deinit(void)63 void TextureBorderClampBase::deinit(void)
64 {
65     deinitAllTextures();
66 
67     /* Deinitializes base class */
68     TestCaseBase::deinit();
69 }
70 
71 /** Initializes GLES objects used during the tests.
72  *
73  */
initTest(void)74 void TextureBorderClampBase::initTest(void)
75 {
76     initAllTextures();
77 }
78 
79 /** Deinitializes all texture objects */
deinitAllTextures(void)80 void TextureBorderClampBase::deinitAllTextures(void)
81 {
82     const glw::Functions &gl = m_context.getRenderContext().getFunctions();
83 
84     gl.bindTexture(GL_TEXTURE_2D, 0);
85     gl.bindTexture(GL_TEXTURE_3D, 0);
86     gl.bindTexture(GL_TEXTURE_2D_ARRAY, 0);
87     gl.bindTexture(GL_TEXTURE_CUBE_MAP, 0);
88 
89     if (m_is_texture_storage_multisample_supported)
90     {
91         gl.bindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0);
92     }
93 
94     if (m_is_texture_storage_multisample_2d_array_supported)
95     {
96         gl.bindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, 0);
97     }
98 
99     if (m_is_texture_cube_map_array_supported)
100     {
101         gl.bindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, 0);
102     }
103 
104     if (m_is_texture_buffer_supported)
105     {
106         gl.bindBuffer(m_glExtTokens.TEXTURE_BUFFER, 0);
107     }
108 
109     if (0 != m_texture_2D_id)
110     {
111         gl.deleteTextures(1, &m_texture_2D_id);
112 
113         m_texture_2D_id = 0;
114     }
115 
116     if (0 != m_texture_3D_id)
117     {
118         gl.deleteTextures(1, &m_texture_3D_id);
119 
120         m_texture_3D_id = 0;
121     }
122 
123     if (0 != m_texture_2D_array_id)
124     {
125         gl.deleteTextures(1, &m_texture_2D_array_id);
126 
127         m_texture_2D_array_id = 0;
128     }
129 
130     if (0 != m_texture_cube_map_id)
131     {
132         gl.deleteTextures(1, &m_texture_cube_map_id);
133 
134         m_texture_cube_map_id = 0;
135     }
136 
137     if (0 != m_texture_cube_map_array_id)
138     {
139         gl.deleteTextures(1, &m_texture_cube_map_array_id);
140 
141         m_texture_cube_map_array_id = 0;
142     }
143 
144     if (0 != m_texture_2D_multisample_id)
145     {
146         gl.deleteTextures(1, &m_texture_2D_multisample_id);
147 
148         m_texture_2D_multisample_id = 0;
149     }
150 
151     if (0 != m_texture_2D_multisample_array_id)
152     {
153         gl.deleteTextures(1, &m_texture_2D_multisample_array_id);
154 
155         m_texture_2D_multisample_array_id = 0;
156     }
157 
158     if (0 != m_texture_buffer_id)
159     {
160         gl.deleteBuffers(1, &m_texture_buffer_id);
161 
162         m_texture_buffer_id = 0;
163     }
164 }
165 
166 /** Initializes all texture objects */
initAllTextures(void)167 void TextureBorderClampBase::initAllTextures(void)
168 {
169     const glw::Functions &gl = m_context.getRenderContext().getFunctions();
170 
171     /* Create and bind a 2D texture object */
172     gl.genTextures(1, &m_texture_2D_id);
173     GLU_EXPECT_NO_ERROR(gl.getError(), "Error generating a texture object");
174 
175     gl.bindTexture(GL_TEXTURE_2D, m_texture_2D_id);
176     GLU_EXPECT_NO_ERROR(gl.getError(), "Error binding a texture object to GL_TEXTURE_2D texture target");
177 
178     m_texture_target_list.push_back(GL_TEXTURE_2D);
179 
180     /* Create and bind a 3D texture object */
181     gl.genTextures(1, &m_texture_3D_id);
182     GLU_EXPECT_NO_ERROR(gl.getError(), "Error generating a texture object");
183 
184     gl.bindTexture(GL_TEXTURE_3D, m_texture_3D_id);
185     GLU_EXPECT_NO_ERROR(gl.getError(), "Error binding a texture object to GL_TEXTURE_3D texture target");
186 
187     m_texture_target_list.push_back(GL_TEXTURE_3D);
188 
189     /* Create and bind a 2D array texture object */
190     gl.genTextures(1, &m_texture_2D_array_id);
191     GLU_EXPECT_NO_ERROR(gl.getError(), "Error generating a texture object");
192 
193     gl.bindTexture(GL_TEXTURE_2D_ARRAY, m_texture_2D_array_id);
194     GLU_EXPECT_NO_ERROR(gl.getError(), "Error binding a texture object to GL_TEXTURE_2D_ARRAY texture target");
195 
196     m_texture_target_list.push_back(GL_TEXTURE_2D_ARRAY);
197 
198     /* Create and bind a cube map texture object */
199     gl.genTextures(1, &m_texture_cube_map_id);
200     GLU_EXPECT_NO_ERROR(gl.getError(), "Error generating a texture object");
201 
202     gl.bindTexture(GL_TEXTURE_CUBE_MAP, m_texture_cube_map_id);
203     GLU_EXPECT_NO_ERROR(gl.getError(), "Error binding a texture object to GL_TEXTURE_CUBE_MAP texture target");
204 
205     m_texture_target_list.push_back(GL_TEXTURE_CUBE_MAP);
206 
207     if (m_is_texture_cube_map_array_supported)
208     {
209         /* Create and bind a cube map array texture object */
210         gl.genTextures(1, &m_texture_cube_map_array_id);
211         GLU_EXPECT_NO_ERROR(gl.getError(), "Error generating a texture object");
212 
213         gl.bindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, m_texture_cube_map_array_id);
214         GLU_EXPECT_NO_ERROR(gl.getError(),
215                             "Error binding a texture object to GL_TEXTURE_CUBE_MAP_ARRAY_EXT texture target");
216 
217         m_texture_target_list.push_back(GL_TEXTURE_CUBE_MAP_ARRAY);
218     }
219 
220     if (m_is_texture_storage_multisample_supported)
221     {
222         /* Create and bind a 2D multisample texture object */
223         gl.genTextures(1, &m_texture_2D_multisample_id);
224         GLU_EXPECT_NO_ERROR(gl.getError(), "Error generating a texture object");
225 
226         gl.bindTexture(GL_TEXTURE_2D_MULTISAMPLE, m_texture_2D_multisample_id);
227         GLU_EXPECT_NO_ERROR(gl.getError(),
228                             "Error binding a texture object to GL_TEXTURE_2D_MULTISAMPLE texture target");
229 
230         m_texture_target_list.push_back(GL_TEXTURE_2D_MULTISAMPLE);
231     }
232 
233     if (m_is_texture_storage_multisample_2d_array_supported)
234     {
235         /* Create and bind a 2D multisample array texture object */
236         gl.genTextures(1, &m_texture_2D_multisample_array_id);
237         GLU_EXPECT_NO_ERROR(gl.getError(), "Error generating a texture object");
238 
239         gl.bindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, m_texture_2D_multisample_array_id);
240         GLU_EXPECT_NO_ERROR(gl.getError(),
241                             "Error binding a texture object to GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES texture target");
242 
243         m_texture_target_list.push_back(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES);
244     }
245 
246     if (m_is_texture_buffer_supported)
247     {
248         /* Create and bind a buffer texture object */
249         gl.genBuffers(1, &m_texture_buffer_id);
250         GLU_EXPECT_NO_ERROR(gl.getError(), "Error generating a texture object");
251 
252         gl.bindBuffer(m_glExtTokens.TEXTURE_BUFFER, m_texture_buffer_id);
253         GLU_EXPECT_NO_ERROR(gl.getError(), "Error binding a texture object to GL_TEXTURE_BUFFER_EXT texture target");
254     }
255 }
256 
257 /** Returns "texture border clamp"-specific pname as literals.
258  *
259  * @param  pname GL property name.
260  *
261  * @return pointer to literal with pname
262  */
getPNameString(glw::GLenum pname)263 const char *TextureBorderClampBase::getPNameString(glw::GLenum pname)
264 {
265     static const char *str_GL_TEXTURE_BASE_LEVEL         = "GL_TEXTURE_BASE_LEVEL";
266     static const char *str_GL_TEXTURE_BORDER_COLOR_EXT   = "GL_TEXTURE_BORDER_COLOR_EXT";
267     static const char *str_GL_TEXTURE_MIN_FILTER         = "GL_TEXTURE_MIN_FILTER";
268     static const char *str_GL_TEXTURE_IMMUTABLE_FORMAT   = "GL_TEXTURE_IMMUTABLE_FORMAT";
269     static const char *str_GL_TEXTURE_COMPARE_MODE       = "GL_TEXTURE_COMPARE_MODE";
270     static const char *str_GL_TEXTURE_COMPARE_FUNC       = "GL_TEXTURE_COMPARE_FUNC";
271     static const char *str_GL_TEXTURE_MAG_FILTER         = "GL_TEXTURE_MAG_FILTER";
272     static const char *str_GL_TEXTURE_MAX_LEVEL          = "GL_TEXTURE_MAX_LEVEL";
273     static const char *str_GL_TEXTURE_SWIZZLE_R          = "GL_TEXTURE_SWIZZLE_R";
274     static const char *str_GL_TEXTURE_SWIZZLE_G          = "GL_TEXTURE_SWIZZLE_G";
275     static const char *str_GL_TEXTURE_SWIZZLE_B          = "GL_TEXTURE_SWIZZLE_B";
276     static const char *str_GL_TEXTURE_SWIZZLE_A          = "GL_TEXTURE_SWIZZLE_A";
277     static const char *str_GL_TEXTURE_WRAP_S             = "GL_TEXTURE_WRAP_S";
278     static const char *str_GL_TEXTURE_WRAP_T             = "GL_TEXTURE_WRAP_T";
279     static const char *str_GL_TEXTURE_WRAP_R             = "GL_TEXTURE_WRAP_R";
280     static const char *str_GL_DEPTH_STENCIL_TEXTURE_MODE = "GL_DEPTH_STENCIL_TEXTURE_MODE";
281     static const char *str_GL_TEXTURE_IMMUTABLE_LEVELS   = "GL_TEXTURE_IMMUTABLE_LEVELS";
282     static const char *str_GL_TEXTURE_MAX_LOD            = "GL_TEXTURE_MAX_LOD";
283     static const char *str_GL_TEXTURE_MIN_LOD            = "GL_TEXTURE_MIN_LOD";
284     static const char *str_UNKNOWN                       = "UNKNOWN";
285 
286     if (pname == m_glExtTokens.TEXTURE_BORDER_COLOR)
287     {
288         return str_GL_TEXTURE_BORDER_COLOR_EXT;
289     }
290 
291     switch (pname)
292     {
293     case GL_TEXTURE_BASE_LEVEL:
294         return str_GL_TEXTURE_BASE_LEVEL;
295     case GL_TEXTURE_MIN_FILTER:
296         return str_GL_TEXTURE_MIN_FILTER;
297     case GL_TEXTURE_IMMUTABLE_FORMAT:
298         return str_GL_TEXTURE_IMMUTABLE_FORMAT;
299     case GL_TEXTURE_COMPARE_MODE:
300         return str_GL_TEXTURE_COMPARE_MODE;
301     case GL_TEXTURE_COMPARE_FUNC:
302         return str_GL_TEXTURE_COMPARE_FUNC;
303     case GL_TEXTURE_MAG_FILTER:
304         return str_GL_TEXTURE_MAG_FILTER;
305     case GL_TEXTURE_MAX_LEVEL:
306         return str_GL_TEXTURE_MAX_LEVEL;
307     case GL_TEXTURE_SWIZZLE_R:
308         return str_GL_TEXTURE_SWIZZLE_R;
309     case GL_TEXTURE_SWIZZLE_G:
310         return str_GL_TEXTURE_SWIZZLE_G;
311     case GL_TEXTURE_SWIZZLE_B:
312         return str_GL_TEXTURE_SWIZZLE_B;
313     case GL_TEXTURE_SWIZZLE_A:
314         return str_GL_TEXTURE_SWIZZLE_A;
315     case GL_TEXTURE_WRAP_S:
316         return str_GL_TEXTURE_WRAP_S;
317     case GL_TEXTURE_WRAP_T:
318         return str_GL_TEXTURE_WRAP_T;
319     case GL_TEXTURE_WRAP_R:
320         return str_GL_TEXTURE_WRAP_R;
321     case GL_DEPTH_STENCIL_TEXTURE_MODE:
322         return str_GL_DEPTH_STENCIL_TEXTURE_MODE;
323     case GL_TEXTURE_IMMUTABLE_LEVELS:
324         return str_GL_TEXTURE_IMMUTABLE_LEVELS;
325     case GL_TEXTURE_MAX_LOD:
326         return str_GL_TEXTURE_MAX_LOD;
327     case GL_TEXTURE_MIN_LOD:
328         return str_GL_TEXTURE_MIN_LOD;
329     default:
330         return str_UNKNOWN;
331     }
332 }
333 
334 /** Returns texture target as literals.
335  *
336  * @param  target ES texture target.
337  *
338  * @return requested literal
339  */
getTexTargetString(glw::GLenum target)340 const char *TextureBorderClampBase::getTexTargetString(glw::GLenum target)
341 {
342     static const char *str_GL_TEXTURE_2D                       = "GL_TEXTURE_2D";
343     static const char *str_GL_TEXTURE_2D_ARRAY                 = "GL_TEXTURE_2D_ARRAY";
344     static const char *str_GL_TEXTURE_2D_MULTISAMPLE           = "GL_TEXTURE_2D_MULTISAMPLE";
345     static const char *str_GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES = "GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES";
346     static const char *str_GL_TEXTURE_3D                       = "GL_TEXTURE_3D";
347     static const char *str_GL_TEXTURE_BUFFER_EXT               = "GL_TEXTURE_BUFFER_EXT";
348     static const char *str_GL_TEXTURE_CUBE_MAP                 = "GL_TEXTURE_CUBE_MAP";
349     static const char *str_GL_TEXTURE_CUBE_MAP_ARRAY_EXT       = "GL_TEXTURE_CUBE_MAP_ARRAY_EXT";
350     static const char *str_GL_TEXTURE_CUBE_MAP_POSITIVE_X      = "GL_TEXTURE_CUBE_MAP_POSITIVE_X";
351     static const char *str_UNKNOWN                             = "UNKNOWN";
352 
353     if (target == m_glExtTokens.TEXTURE_BORDER_COLOR)
354     {
355         return str_GL_TEXTURE_BUFFER_EXT;
356     }
357 
358     switch (target)
359     {
360     case GL_TEXTURE_2D:
361         return str_GL_TEXTURE_2D;
362     case GL_TEXTURE_3D:
363         return str_GL_TEXTURE_3D;
364     case GL_TEXTURE_2D_ARRAY:
365         return str_GL_TEXTURE_2D_ARRAY;
366     case GL_TEXTURE_CUBE_MAP:
367         return str_GL_TEXTURE_CUBE_MAP;
368     case GL_TEXTURE_2D_MULTISAMPLE:
369         return str_GL_TEXTURE_2D_MULTISAMPLE;
370     case GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES:
371         return str_GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES;
372     case GL_TEXTURE_CUBE_MAP_ARRAY:
373         return str_GL_TEXTURE_CUBE_MAP_ARRAY_EXT;
374     case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
375         return str_GL_TEXTURE_CUBE_MAP_POSITIVE_X;
376     default:
377         return str_UNKNOWN;
378     }
379 }
380 
381 } // namespace glcts
382