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