1 /*-------------------------------------------------------------------------
2 * OpenGL Conformance Test Suite
3 * -----------------------------
4 *
5 * Copyright (c) 2015-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 */ /*!
26 * \file gl4cGetTextureSubImageTests.cpp
27 * \brief Get Texture Sub Image Tests Suite Implementation
28 */ /*-------------------------------------------------------------------*/
29
30 /* Includes. */
31 #include "gl4cGetTextureSubImageTests.hpp"
32 #include "gluContextInfo.hpp"
33 #include "gluDefs.hpp"
34 #include "gluRenderContext.hpp"
35 #include "gluStrUtil.hpp"
36 #include "tcuTestLog.hpp"
37 #include <cstdlib>
38
39 /* Implementation */
40
41 /**************************************************************************************************
42 * Tests Group Implementation *
43 **************************************************************************************************/
44
Tests(deqp::Context & context)45 gl4cts::GetTextureSubImage::Tests::Tests(deqp::Context& context)
46 : TestCaseGroup(context, "get_texture_sub_image", "Get Texture Sub Image Tests Suite")
47 {
48 addChild(new GetTextureSubImage::Errors(m_context));
49 addChild(new GetTextureSubImage::Functional(m_context));
50 }
51
~Tests(void)52 gl4cts::GetTextureSubImage::Tests::~Tests(void)
53 {
54 }
55
init(void)56 void gl4cts::GetTextureSubImage::Tests::init(void)
57 {
58 }
59
60 /**************************************************************************************************
61 * Errors Tests Implementation *
62 **************************************************************************************************/
63
64 /** Constructor of API Errors tests.
65 *
66 * @return [in] context OpenGL context in which test shall run.
67 */
Errors(deqp::Context & context)68 gl4cts::GetTextureSubImage::Errors::Errors(deqp::Context& context)
69 : deqp::TestCase(context, "errors_test", "Get Texture SubImage Errors Test")
70 , m_context(context)
71 , m_texture_1D(0)
72 , m_texture_1D_array(0)
73 , m_texture_2D(0)
74 , m_texture_rectangle(0)
75 , m_texture_2D_compressed(0)
76 , m_texture_2D_multisampled(0)
77 , m_destination_buffer(DE_NULL)
78 , m_gl_GetTextureSubImage(DE_NULL)
79 , m_gl_GetCompressedTextureSubImage(DE_NULL)
80 {
81 }
82
83 /** Destructor of API Errors tests.
84 */
~Errors(void)85 gl4cts::GetTextureSubImage::Errors::~Errors(void)
86 {
87 }
88
89 /** This function iterate over API Errors tests.
90 */
iterate(void)91 tcu::TestNode::IterateResult gl4cts::GetTextureSubImage::Errors::iterate(void)
92 {
93 bool is_ok = true;
94 bool test_error = false;
95
96 bool is_at_least_gl_45 = (glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::core(4, 5)));
97 bool is_arb_get_texture_sub_image = m_context.getContextInfo().isExtensionSupported("GL_ARB_get_texture_sub_image");
98
99 try
100 {
101 if (is_at_least_gl_45 || is_arb_get_texture_sub_image)
102 {
103 /* Prepare texture objects */
104 prepare();
105
106 /* Do tests. */
107 is_ok &= testExistingTextureObjectError();
108
109 is_ok &= testBufferOrMultisampledTargetError();
110
111 is_ok &= testNegativeOffsetError();
112
113 is_ok &= testBoundsError();
114
115 is_ok &= testOneDimmensionalTextureErrors();
116
117 is_ok &= testTwoDimmensionalTextureErrors();
118
119 is_ok &= testBufferSizeError();
120 }
121 }
122 catch (...)
123 {
124 is_ok = false;
125 test_error = true;
126 }
127
128 /* Clean up */
129 clean();
130
131 /* Result's setup. */
132 if (is_ok)
133 {
134 m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
135 }
136 else
137 {
138 if (test_error)
139 {
140 m_testCtx.setTestResult(QP_TEST_RESULT_INTERNAL_ERROR, "Error");
141 }
142 else
143 {
144 m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
145 }
146 }
147
148 return STOP;
149 }
150
151 /** Preparation of source textures and destination buffer.
152 */
prepare()153 void gl4cts::GetTextureSubImage::Errors::prepare()
154 {
155 /* OpenGL functions access point. */
156 const glw::Functions& gl = m_context.getRenderContext().getFunctions();
157
158 /* If already initialized throw exception. */
159 if (m_texture_1D || m_texture_1D_array || m_texture_2D || m_texture_rectangle || m_texture_2D_compressed ||
160 m_texture_2D_multisampled)
161 {
162 throw 0;
163 }
164
165 /* Generate texture ids. */
166 gl.genTextures(1, &m_texture_1D);
167 gl.genTextures(1, &m_texture_1D_array);
168 gl.genTextures(1, &m_texture_2D);
169 gl.genTextures(1, &m_texture_rectangle);
170 gl.genTextures(1, &m_texture_2D_compressed);
171 gl.genTextures(1, &m_texture_2D_multisampled);
172
173 GLU_EXPECT_NO_ERROR(gl.getError(), "glGenTextures call failed.");
174
175 /* If one is not initialized throw exception. */
176 if (!(m_texture_1D && m_texture_1D_array && m_texture_2D))
177 {
178 throw 0;
179 }
180
181 /* Upload texture data. */
182 gl.bindTexture(GL_TEXTURE_1D, m_texture_1D);
183 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture call failed.");
184
185 gl.texImage1D(GL_TEXTURE_1D, 0, GL_RGBA8, s_texture_data_width, 0, GL_RGBA, GL_UNSIGNED_BYTE, s_texture_data);
186 GLU_EXPECT_NO_ERROR(gl.getError(), "glTexImage1D call failed.");
187
188 gl.bindTexture(GL_TEXTURE_1D_ARRAY, m_texture_1D_array);
189 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture call failed.");
190
191 gl.texImage2D(GL_TEXTURE_1D_ARRAY, 0, GL_RGBA8, s_texture_data_width, s_texture_data_height, 0, GL_RGBA,
192 GL_UNSIGNED_BYTE, s_texture_data);
193 GLU_EXPECT_NO_ERROR(gl.getError(), "glTexImage1D call failed.");
194
195 gl.bindTexture(GL_TEXTURE_2D, m_texture_2D);
196 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture call failed.");
197
198 gl.texImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, s_texture_data_width, s_texture_data_height, 0, GL_RGBA, GL_UNSIGNED_BYTE,
199 s_texture_data);
200 GLU_EXPECT_NO_ERROR(gl.getError(), "glTexImage1D call failed.");
201
202 gl.bindTexture(GL_TEXTURE_RECTANGLE, m_texture_rectangle);
203 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture call failed.");
204
205 gl.texImage2D(GL_TEXTURE_RECTANGLE, 0, GL_RGBA8, s_texture_data_width, s_texture_data_height, 0, GL_RGBA,
206 GL_UNSIGNED_BYTE, s_texture_data);
207 GLU_EXPECT_NO_ERROR(gl.getError(), "glTexImage1D call failed.");
208
209 /* Upload compressed texture data. */
210 gl.bindTexture(GL_TEXTURE_2D, m_texture_2D_compressed);
211 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture call failed.");
212
213 gl.compressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB8_ETC2, s_texture_data_compressed_width,
214 s_texture_data_compressed_height, 0, s_texture_data_compressed_size,
215 s_texture_data_compressed);
216 GLU_EXPECT_NO_ERROR(gl.getError(), "glTexImage1D call failed.");
217
218 /* Prepare multisampled texture storage. */
219 gl.bindTexture(GL_TEXTURE_2D_MULTISAMPLE, m_texture_2D_multisampled);
220 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture call failed.");
221
222 gl.texImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 1, GL_R8, s_texture_data_width, s_texture_data_height, GL_TRUE);
223 GLU_EXPECT_NO_ERROR(gl.getError(), "glTexImage1D call failed.");
224
225 /* Prepare function pointers. */
226 m_gl_GetTextureSubImage =
227 (PFNGLGETTEXTURESUBIMAGEPROC)m_context.getRenderContext().getProcAddress("glGetTextureSubImage");
228 m_gl_GetCompressedTextureSubImage =
229 (PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC)m_context.getRenderContext().getProcAddress(
230 "glGetCompressedTextureSubImage");
231
232 if ((DE_NULL == m_gl_GetTextureSubImage) || (DE_NULL == m_gl_GetCompressedTextureSubImage))
233 {
234 throw 0;
235 }
236
237 /* Allocate destination buffer. */
238 m_destination_buffer = (glw::GLubyte*)malloc(s_destination_buffer_size);
239
240 if (DE_NULL == m_destination_buffer)
241 {
242 throw 0;
243 }
244 }
245
246 /** The function checks that GL_INVALID_OPERATION error is generated by GetTextureSubImage if
247 * texture is not the name of an existing texture object. It also checks that
248 * GL_INVALID_OPERATION error is generated by GetCompressedTextureSubImage if texture is not
249 * the name of an existing texture object. For reference see the OpenGL 4.5 Core Specification
250 * chapter 8.11.4.
251 *
252 * @return True if proper error values are generated, false otherwise.
253 */
testExistingTextureObjectError()254 bool gl4cts::GetTextureSubImage::Errors::testExistingTextureObjectError()
255 {
256 /* OpenGL functions access point. */
257 const glw::Functions& gl = m_context.getRenderContext().getFunctions();
258
259 /* Prepare invalid texture name. */
260 glw::GLuint invalid_texture = m_texture_2D_multisampled;
261
262 while (gl.isTexture(++invalid_texture))
263 ;
264
265 m_gl_GetTextureSubImage(invalid_texture, 0, 0, 0, 0, s_texture_data_width, s_texture_data_height, 1, GL_RGBA,
266 GL_UNSIGNED_BYTE, s_destination_buffer_size, m_destination_buffer);
267
268 glw::GLint error_value = gl.getError();
269 glw::GLint is_proper_error = (GL_INVALID_OPERATION == error_value);
270
271 if (!is_proper_error)
272 {
273 m_testCtx.getLog() << tcu::TestLog::Message << "GL_INVALID_OPERATION error is expected to be generated by "
274 "glGetTextureSubImage if texture is not the name of an existing "
275 "texture object (OpenGL 4.5 Core Specification chapter 8.11.4)."
276 << " However, the error value " << glu::getErrorName(error_value) << " was generated."
277 << tcu::TestLog::EndMessage;
278 }
279
280 m_gl_GetCompressedTextureSubImage(invalid_texture, 0, 0, 0, 0, s_texture_data_compressed_width,
281 s_texture_data_compressed_height, 1, s_destination_buffer_size,
282 m_destination_buffer);
283
284 error_value = gl.getError();
285
286 glw::GLint is_proper_error_compressed = (GL_INVALID_OPERATION == error_value);
287
288 if (!is_proper_error_compressed)
289 {
290 m_testCtx.getLog() << tcu::TestLog::Message
291 << "GL_INVALID_OPERATION error is expected to be generated by glGetCompressedTextureSubImage "
292 "if texture is not the name of an existing texture object (OpenGL 4.5 Core Specification "
293 "chapter 8.11.4)."
294 << " However, the error value " << glu::getErrorName(error_value) << " was generated."
295 << tcu::TestLog::EndMessage;
296 }
297
298 if (is_proper_error && is_proper_error_compressed)
299 {
300 return true;
301 }
302
303 return false;
304 }
305
306 /** The function checks that GL_INVALID_OPERATION error is generated if texture is the
307 * name of a buffer or multisample texture. For reference see OpenGL 4.5 Core Specification
308 * chapter 8.11.4.
309 *
310 * @return True if proper error values are generated, false otherwise.
311 */
testBufferOrMultisampledTargetError()312 bool gl4cts::GetTextureSubImage::Errors::testBufferOrMultisampledTargetError()
313 {
314 /* OpenGL functions access point. */
315 const glw::Functions& gl = m_context.getRenderContext().getFunctions();
316
317 /* Test. */
318 m_gl_GetTextureSubImage(m_texture_2D_multisampled, 0, 0, 0, 0, s_texture_data_width, s_texture_data_height, 1,
319 GL_RGBA, GL_UNSIGNED_BYTE, s_destination_buffer_size, m_destination_buffer);
320
321 glw::GLint error_value = gl.getError();
322 glw::GLint is_proper_error = (GL_INVALID_OPERATION == error_value);
323
324 if (!is_proper_error)
325 {
326 m_testCtx.getLog() << tcu::TestLog::Message << "GL_INVALID_OPERATION error is expected to be generated by "
327 "glGetTextureSubImage if texture is the name of multisample "
328 "texture (OpenGL 4.5 Core Specification chapter 8.11.4)."
329 << " However, the error value " << glu::getErrorName(error_value) << " was generated."
330 << tcu::TestLog::EndMessage;
331 }
332
333 if (is_proper_error)
334 {
335 return true;
336 }
337
338 return false;
339 }
340
341 /** The functions checks that GL_INVALID_VALUE is generated if xoffset, yoffset or
342 * zoffset are negative. For reference see OpenGL 4.5 Core Specification
343 * chapter 8.11.4.
344 *
345 * @return True if proper error values are generated, false otherwise.
346 */
testNegativeOffsetError()347 bool gl4cts::GetTextureSubImage::Errors::testNegativeOffsetError()
348 {
349 /* OpenGL functions access point. */
350 const glw::Functions& gl = m_context.getRenderContext().getFunctions();
351
352 /* Test. */
353 m_gl_GetTextureSubImage(m_texture_2D, 0, -1, 0, 0, s_texture_data_width, s_texture_data_height, 1, GL_RGBA,
354 GL_UNSIGNED_BYTE, s_destination_buffer_size, m_destination_buffer);
355
356 glw::GLint error_value = gl.getError();
357 glw::GLint is_proper_error = (GL_INVALID_VALUE == error_value);
358
359 if (!is_proper_error)
360 {
361 m_testCtx.getLog() << tcu::TestLog::Message
362 << "GL_INVALID_VALUE error is expected to be generated by glGetTextureSubImage if xoffset, "
363 "yoffset or zoffset are negative (OpenGL 4.5 Core Specification chapter 8.11.4)."
364 << " However, the error value " << glu::getErrorName(error_value) << " was generated."
365 << tcu::TestLog::EndMessage;
366 }
367
368 m_gl_GetCompressedTextureSubImage(m_texture_2D_compressed, 0, -1, 0, 0, s_texture_data_compressed_width,
369 s_texture_data_compressed_height, 1, s_destination_buffer_size,
370 m_destination_buffer);
371
372 error_value = gl.getError();
373
374 glw::GLint is_proper_error_compressed = (GL_INVALID_VALUE == error_value);
375
376 if (!is_proper_error_compressed)
377 {
378 m_testCtx.getLog() << tcu::TestLog::Message
379 << "GL_INVALID_VALUE error is expected to be generated by glGetCompressedTextureSubImage if "
380 "xoffset, yoffset or zoffset are negative (OpenGL 4.5 Core Specification chapter 8.11.4)."
381 << " However, the error value " << glu::getErrorName(error_value) << " was generated."
382 << tcu::TestLog::EndMessage;
383 }
384
385 if (is_proper_error && is_proper_error_compressed)
386 {
387 return true;
388 }
389
390 return false;
391 }
392
393 /** The functions checks that GL_INVALID_VALUE is generated if xoffset + width is
394 * greater than the texture's width, yoffset + height is greater than
395 * the texture's height, or zoffset + depth is greater than the
396 * texture's depth. For reference see OpenGL 4.5 Core Specification
397 * chapter 8.11.4.
398 *
399 * @return True if proper error values are generated, false otherwise.
400 */
testBoundsError()401 bool gl4cts::GetTextureSubImage::Errors::testBoundsError()
402 {
403 /* OpenGL functions access point. */
404 const glw::Functions& gl = m_context.getRenderContext().getFunctions();
405
406 /* Uncompresse texture test. */
407 m_gl_GetTextureSubImage(m_texture_2D, 0, s_texture_data_width, s_texture_data_height, 0, s_texture_data_width * 2,
408 s_texture_data_height * 2, 1, GL_RGBA, GL_UNSIGNED_BYTE, s_destination_buffer_size,
409 m_destination_buffer);
410
411 glw::GLint error_value = gl.getError();
412 glw::GLint is_proper_error = (GL_INVALID_VALUE == error_value);
413
414 if (!is_proper_error)
415 {
416 m_testCtx.getLog()
417 << tcu::TestLog::Message
418 << "GL_INVALID_VALUE error is expected to be generated by glGetTextureSubImage if xoffset + width is"
419 " greater than the texture's width, yoffset + height is greater than"
420 " the texture's height, or zoffset + depth is greater than the"
421 " texture's depth. (OpenGL 4.5 Core Specification chapter 8.11.4)."
422 " However, the error value "
423 << glu::getErrorName(error_value) << " was generated." << tcu::TestLog::EndMessage;
424 }
425
426 /* Compresse texture test. */
427 m_gl_GetCompressedTextureSubImage(m_texture_2D_compressed, 0, s_texture_data_compressed_width,
428 s_texture_data_compressed_height, 0, s_texture_data_compressed_width * 2,
429 s_texture_data_compressed_height * 2, 1, s_destination_buffer_size,
430 m_destination_buffer);
431
432 error_value = gl.getError();
433
434 glw::GLint is_proper_error_compressed = (GL_INVALID_VALUE == error_value);
435
436 if (!is_proper_error_compressed)
437 {
438 m_testCtx.getLog() << tcu::TestLog::Message
439 << "GL_INVALID_VALUE error is expected to be generated by glGetCompressedTextureSubImage if "
440 "xoffset + width is"
441 " greater than the texture's width, yoffset + height is greater than"
442 " the texture's height, or zoffset + depth is greater than the"
443 " texture's depth. (OpenGL 4.5 Core Specification chapter 8.11.4)."
444 " However, the error value "
445 << glu::getErrorName(error_value) << " was generated." << tcu::TestLog::EndMessage;
446 }
447
448 if (is_proper_error && is_proper_error_compressed)
449 {
450 return true;
451 }
452
453 return false;
454 }
455
456 /** The functions checks that GL_INVALID_VALUE error is generated if the effective
457 * target is GL_TEXTURE_1D and either yoffset is not zero, or height
458 * is not one. For reference see OpenGL 4.5 Core Specification
459 * chapter 8.11.4.
460 *
461 * @return True if proper error values are generated, false otherwise.
462 */
testOneDimmensionalTextureErrors()463 bool gl4cts::GetTextureSubImage::Errors::testOneDimmensionalTextureErrors()
464 {
465 /* OpenGL functions access point. */
466 const glw::Functions& gl = m_context.getRenderContext().getFunctions();
467
468 /* Test. */
469 m_gl_GetTextureSubImage(m_texture_1D, 0, 0, 1, 0, s_texture_data_width, 2, 1, GL_RGBA, GL_UNSIGNED_BYTE,
470 s_destination_buffer_size, m_destination_buffer);
471
472 glw::GLint error_value = gl.getError();
473 glw::GLint is_proper_error = (GL_INVALID_VALUE == error_value);
474
475 if (!is_proper_error)
476 {
477 m_testCtx.getLog()
478 << tcu::TestLog::Message
479 << "GL_INVALID_VALUE error is expected to be generated by glGetTextureSubImage if the effective"
480 " target is GL_TEXTURE_1D and either yoffset is not zero, or height"
481 " is not one (OpenGL 4.5 Core Specification chapter 8.11.4)."
482 " However, the error value "
483 << glu::getErrorName(error_value) << " was generated." << tcu::TestLog::EndMessage;
484 }
485
486 if (is_proper_error)
487 {
488 return true;
489 }
490
491 return false;
492 }
493
494 /** The functions checks that GL_INVALID_VALUE error is generated if the effective
495 * target is GL_TEXTURE_1D, GL_TEXTURE_1D_ARRAY, GL_TEXTURE_2D or
496 * GL_TEXTURE_RECTANGLE and either zoffset is not zero, or depth
497 * is not one. For reference see OpenGL 4.5 Core Specification
498 * chapter 8.11.4.
499 *
500 * @return True if proper error values are generated, false otherwise.
501 */
testTwoDimmensionalTextureErrors()502 bool gl4cts::GetTextureSubImage::Errors::testTwoDimmensionalTextureErrors()
503 {
504 /* OpenGL functions access point. */
505 const glw::Functions& gl = m_context.getRenderContext().getFunctions();
506
507 /* Test. */
508 const struct
509 {
510 glw::GLuint id;
511 const glw::GLchar* target_name;
512 } test_textures[] = { { m_texture_1D, "GL_TEXTURE_1D" },
513 { m_texture_1D_array, "GL_TEXTURE_1D_ARRAY" },
514 { m_texture_2D, "GL_TEXTURE_2D" } };
515
516 static const glw::GLuint test_textures_size = sizeof(test_textures) / sizeof(test_textures[0]);
517
518 glw::GLint is_error = true;
519
520 for (glw::GLuint i = 0; i < test_textures_size; ++i)
521 {
522 m_gl_GetTextureSubImage(test_textures[i].id, 0, 0, 0, 1, s_texture_data_width,
523 (test_textures[i].id == m_texture_1D) ? 1 : s_texture_data_height, 2, GL_RGBA,
524 GL_UNSIGNED_BYTE, s_destination_buffer_size, m_destination_buffer);
525
526 glw::GLint error_value = gl.getError();
527 glw::GLint is_proper_error = (GL_INVALID_VALUE == error_value);
528
529 if (!is_proper_error)
530 {
531 is_error = false;
532
533 m_testCtx.getLog()
534 << tcu::TestLog::Message
535 << "GL_INVALID_VALUE error is expected to be generated by glGetTextureSubImage if the effective"
536 " target is "
537 << test_textures[i].target_name << " and either zoffset is not zero, or depth"
538 " is not one. (OpenGL 4.5 Core Specification chapter 8.11.4)."
539 " However, the error value "
540 << glu::getErrorName(error_value) << " was generated." << tcu::TestLog::EndMessage;
541 }
542 }
543
544 /* Test (compressed textures). */
545 const struct
546 {
547 glw::GLuint id;
548 const glw::GLchar* target_name;
549 } test_compressed_textures[] = { { m_texture_2D_compressed, "GL_TEXTURE_2D" } };
550
551 static const glw::GLuint test_compressed_textures_size =
552 sizeof(test_compressed_textures) / sizeof(test_compressed_textures[0]);
553
554 for (glw::GLuint i = 0; i < test_compressed_textures_size; ++i)
555 {
556 m_gl_GetCompressedTextureSubImage(test_compressed_textures[i].id, 0, 0, 0, 1, s_texture_data_compressed_width,
557 s_texture_data_compressed_height, 2, s_destination_buffer_size,
558 m_destination_buffer);
559
560 glw::GLint error_value = gl.getError();
561
562 glw::GLint is_proper_error_compressed = (GL_INVALID_VALUE == error_value);
563
564 if (!is_proper_error_compressed)
565 {
566 is_error = false;
567
568 m_testCtx.getLog() << tcu::TestLog::Message << "GL_INVALID_VALUE error is expected to be generated by "
569 "glGetCompressedTextureSubImage if the effective"
570 " target is "
571 << test_compressed_textures[i].target_name
572 << " and either zoffset is not zero, or depth"
573 " is not one. (OpenGL 4.5 Core Specification chapter 8.11.4)."
574 " However, the error value "
575 << glu::getErrorName(error_value) << " was generated." << tcu::TestLog::EndMessage;
576 }
577 }
578
579 if (is_error)
580 {
581 return true;
582 }
583
584 return false;
585 }
586
587 /** The functions checks that GL_INVALID_OPERATION error is generated if the buffer
588 * size required to store the requested data is greater than bufSize.
589 * For reference see OpenGL 4.5 Core Specification chapter 8.11.4.
590 *
591 * @return True if proper error values are generated, false otherwise.
592 */
testBufferSizeError()593 bool gl4cts::GetTextureSubImage::Errors::testBufferSizeError()
594 {
595 /* OpenGL functions access point. */
596 const glw::Functions& gl = m_context.getRenderContext().getFunctions();
597
598 /* Test for uncompressed texture. */
599 m_gl_GetTextureSubImage(m_texture_2D, 0, 0, 0, 0, s_texture_data_width, s_texture_data_height, 1, GL_RGBA,
600 GL_UNSIGNED_BYTE, 1, m_destination_buffer);
601
602 glw::GLint error_value = gl.getError();
603 glw::GLint is_proper_error = (GL_INVALID_OPERATION == error_value);
604
605 if (!is_proper_error)
606 {
607 m_testCtx.getLog()
608 << tcu::TestLog::Message
609 << "GL_INVALID_OPERATION error is expected to be generated by glGetTextureSubImage if the buffer"
610 " size required to store the requested data is greater than bufSize. (OpenGL 4.5 Core Specification "
611 "chapter 8.11.4)."
612 " However, the error value "
613 << glu::getErrorName(error_value) << " was generated." << tcu::TestLog::EndMessage;
614 }
615
616 /* Test for compressed texture. */
617 m_gl_GetCompressedTextureSubImage(m_texture_2D_compressed, 0, 0, 0, 0, s_texture_data_compressed_width,
618 s_texture_data_compressed_height, 1, 1, m_destination_buffer);
619
620 error_value = gl.getError();
621
622 glw::GLint is_proper_error_compressed = (GL_INVALID_OPERATION == error_value);
623
624 if (!is_proper_error_compressed)
625 {
626 m_testCtx.getLog()
627 << tcu::TestLog::Message
628 << "GL_INVALID_OPERATION error is expected to be generated by glGetCompressedTextureSubImage if the buffer"
629 " size required to store the requested data is greater than bufSize. (OpenGL 4.5 Core Specification "
630 "chapter 8.11.4)."
631 " However, the error value "
632 << glu::getErrorName(error_value) << " was generated." << tcu::TestLog::EndMessage;
633 }
634
635 /* Return results. */
636 if (is_proper_error && is_proper_error_compressed)
637 {
638 return true;
639 }
640
641 return false;
642 }
643
clean()644 void gl4cts::GetTextureSubImage::Errors::clean()
645 {
646 /* OpenGL functions access point. */
647 const glw::Functions& gl = m_context.getRenderContext().getFunctions();
648
649 /*Textures cleanup. */
650 if (m_texture_1D)
651 {
652 gl.deleteTextures(1, &m_texture_1D);
653 m_texture_1D = 0;
654 }
655
656 if (m_texture_1D_array)
657 {
658 gl.deleteTextures(1, &m_texture_1D_array);
659 m_texture_1D_array = 0;
660 }
661
662 if (m_texture_2D)
663 {
664 gl.deleteTextures(1, &m_texture_2D);
665 m_texture_2D = 0;
666 }
667 if (m_texture_rectangle)
668 {
669 gl.deleteTextures(1, &m_texture_rectangle);
670 m_texture_rectangle = 0;
671 }
672
673 if (m_texture_2D_compressed)
674 {
675 gl.deleteTextures(1, &m_texture_2D_compressed);
676 m_texture_2D_compressed = 0;
677 }
678
679 if (m_texture_2D_multisampled)
680 {
681 gl.deleteTextures(1, &m_texture_2D_multisampled);
682 m_texture_2D_multisampled = 0;
683 }
684
685 /* CPU buffers */
686 if (m_destination_buffer)
687 {
688 free(m_destination_buffer);
689 m_destination_buffer = DE_NULL;
690 }
691 }
692
693 /* Uncompressed source texture 2x2 pixels */
694
695 const glw::GLubyte gl4cts::GetTextureSubImage::Errors::s_texture_data[] = {
696 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
697 }; //<! uncompressed texture
698
699 const glw::GLuint gl4cts::GetTextureSubImage::Errors::s_texture_data_size =
700 sizeof(s_texture_data); //<! uncompressed texture size
701
702 const glw::GLuint gl4cts::GetTextureSubImage::Errors::s_texture_data_width = 2; //<! uncompressed texture width
703
704 const glw::GLuint gl4cts::GetTextureSubImage::Errors::s_texture_data_height = 2; //<! uncompressed texture height
705
706 /* ETC2 compressed texture (4x4 pixels === 1 block) */
707
708 const glw::GLubyte gl4cts::GetTextureSubImage::Errors::s_texture_data_compressed[] = {
709 0x15, 0x90, 0x33, 0x6f, 0xaf, 0xcc, 0x16, 0x98
710 }; //<! ETC2 compressed texture
711
712 const glw::GLuint gl4cts::GetTextureSubImage::Errors::s_texture_data_compressed_size =
713 sizeof(s_texture_data_compressed); //<! ETC2 compressed texture size
714
715 const glw::GLuint gl4cts::GetTextureSubImage::Errors::s_texture_data_compressed_width =
716 4; //<! ETC2 compressed texture width
717
718 const glw::GLuint gl4cts::GetTextureSubImage::Errors::s_texture_data_compressed_height =
719 4; //<! ETC2 compressed texture height
720
721 const glw::GLuint gl4cts::GetTextureSubImage::Errors::s_destination_buffer_size =
722 (s_texture_data_size > s_texture_data_compressed_size) ?
723 s_texture_data_size :
724 s_texture_data_compressed_size; //<! size of the destination buffer (for fetched data)
725
726 /*****************************************************************************************************
727 * Functional Test Implementation *
728 *****************************************************************************************************/
729
730 /** Constructor of the functional test.
731 *
732 * @param [in] context OpenGL context in which test shall run.
733 */
Functional(deqp::Context & context)734 gl4cts::GetTextureSubImage::Functional::Functional(deqp::Context& context)
735 : deqp::TestCase(context, "functional_test", "Get Texture SubImage Functional Test")
736 , m_context(context)
737 , m_texture(0)
738 {
739 }
740
741 /** Destructor of the functional test.
742 */
~Functional(void)743 gl4cts::GetTextureSubImage::Functional::~Functional(void)
744 {
745 }
746
747 /** Iterate over functional test cases.
748 */
iterate(void)749 tcu::TestNode::IterateResult gl4cts::GetTextureSubImage::Functional::iterate(void)
750 {
751 bool is_ok = true;
752 bool test_error = false;
753
754 bool is_at_least_gl_45 = (glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::core(4, 5)));
755 bool is_arb_get_texture_sub_image = m_context.getContextInfo().isExtensionSupported("GL_ARB_get_texture_sub_image");
756
757 /* Bind function pointers. */
758 m_gl_GetCompressedTextureSubImage =
759 (PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC)m_context.getRenderContext().getProcAddress(
760 "glGetCompressedTextureSubImage");
761 m_gl_GetTextureSubImage =
762 (PFNGLGETTEXTURESUBIMAGEPROC)m_context.getRenderContext().getProcAddress("glGetTextureSubImage");
763
764 try
765 {
766 /* Report error when function pointers are not available. */
767 if ((DE_NULL == m_gl_GetCompressedTextureSubImage) || (DE_NULL == m_gl_GetTextureSubImage))
768 {
769 m_testCtx.getLog()
770 << tcu::TestLog::Message
771 << "Cannot obtain glGetCompressedTextureSubImage or glGetTextureSubImage function pointer."
772 << tcu::TestLog::EndMessage;
773 throw 0;
774 }
775
776 /* Run tests. */
777 if (is_at_least_gl_45 || is_arb_get_texture_sub_image)
778 {
779 /* Tested targets. */
780 glw::GLenum targets[] = { GL_TEXTURE_1D, GL_TEXTURE_1D_ARRAY, GL_TEXTURE_2D,
781 GL_TEXTURE_RECTANGLE, GL_TEXTURE_CUBE_MAP, GL_TEXTURE_CUBE_MAP_ARRAY,
782 GL_TEXTURE_2D_ARRAY, GL_TEXTURE_3D };
783
784 glw::GLuint targets_count = sizeof(targets) / sizeof(targets[0]);
785
786 for (glw::GLuint i = 0; i < targets_count; ++i)
787 {
788 prepare(targets[i], false);
789
790 is_ok &= check(targets[i], false);
791
792 clean();
793 }
794
795 /* Compressed textures tested targets. */
796 glw::GLenum compressed_targets[] = { GL_TEXTURE_2D, GL_TEXTURE_CUBE_MAP, GL_TEXTURE_CUBE_MAP_ARRAY,
797 GL_TEXTURE_2D_ARRAY };
798
799 glw::GLuint compressed_targets_count = sizeof(compressed_targets) / sizeof(compressed_targets[0]);
800
801 for (glw::GLuint i = 0; i < compressed_targets_count; ++i)
802 {
803 prepare(compressed_targets[i], true);
804
805 is_ok &= check(compressed_targets[i], true);
806
807 clean();
808 }
809 }
810 }
811 catch (...)
812 {
813 m_testCtx.getLog() << tcu::TestLog::Message << "Test error has occured." << tcu::TestLog::EndMessage;
814
815 is_ok = false;
816 test_error = true;
817
818 clean();
819 }
820
821 /* Result's setup. */
822 if (is_ok)
823 {
824 m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
825 }
826 else
827 {
828 if (test_error)
829 {
830 m_testCtx.setTestResult(QP_TEST_RESULT_INTERNAL_ERROR, "Error");
831 }
832 else
833 {
834 m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
835 }
836 }
837
838 return STOP;
839 }
840
841 /** Prepare source texture for the test.
842 *
843 * @param [in] target Target of the texture to be prepared.
844 * @param [in] is_compressed Flag indicating that texture shall be compressed (true) or uncompressed (false).
845 */
prepare(glw::GLenum target,bool is_compressed)846 void gl4cts::GetTextureSubImage::Functional::prepare(glw::GLenum target, bool is_compressed)
847 {
848 /* OpenGL functions access point. */
849 const glw::Functions& gl = m_context.getRenderContext().getFunctions();
850
851 /* Generate and bind texture. */
852 gl.genTextures(1, &m_texture);
853 GLU_EXPECT_NO_ERROR(gl.getError(), "glGenTextures call failed.");
854
855 gl.bindTexture(target, m_texture);
856 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture call failed.");
857
858 /* Upload data to the texture. */
859 if (is_compressed)
860 {
861 /* Upload compressed texture. */
862 switch (target)
863 {
864 case GL_TEXTURE_2D:
865 gl.compressedTexImage2D(target, 0, GL_COMPRESSED_RGBA_BPTC_UNORM, s_texture_data_width, s_texture_data_height, 0,
866 s_texture_data_compressed_size / s_texture_data_depth, s_texture_data_compressed);
867 GLU_EXPECT_NO_ERROR(gl.getError(), "glCompressedTexImage2D call failed.");
868 break;
869 case GL_TEXTURE_CUBE_MAP:
870 gl.compressedTexImage2D(
871 GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_COMPRESSED_RGBA_BPTC_UNORM, s_texture_data_width, s_texture_data_height,
872 0, s_texture_data_compressed_size / s_texture_data_depth,
873 &s_texture_data_compressed[0 * s_texture_data_compressed_size / s_texture_data_depth]);
874 gl.compressedTexImage2D(
875 GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_COMPRESSED_RGBA_BPTC_UNORM, s_texture_data_width, s_texture_data_height,
876 0, s_texture_data_compressed_size / s_texture_data_depth,
877 &s_texture_data_compressed[1 * s_texture_data_compressed_size / s_texture_data_depth]);
878 gl.compressedTexImage2D(
879 GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_COMPRESSED_RGBA_BPTC_UNORM, s_texture_data_width, s_texture_data_height,
880 0, s_texture_data_compressed_size / s_texture_data_depth,
881 &s_texture_data_compressed[2 * s_texture_data_compressed_size / s_texture_data_depth]);
882 gl.compressedTexImage2D(
883 GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_COMPRESSED_RGBA_BPTC_UNORM, s_texture_data_width, s_texture_data_height,
884 0, s_texture_data_compressed_size / s_texture_data_depth,
885 &s_texture_data_compressed[3 * s_texture_data_compressed_size / s_texture_data_depth]);
886 gl.compressedTexImage2D(
887 GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_COMPRESSED_RGBA_BPTC_UNORM, s_texture_data_width, s_texture_data_height,
888 0, s_texture_data_compressed_size / s_texture_data_depth,
889 &s_texture_data_compressed[4 * s_texture_data_compressed_size / s_texture_data_depth]);
890 gl.compressedTexImage2D(
891 GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_COMPRESSED_RGBA_BPTC_UNORM, s_texture_data_width, s_texture_data_height,
892 0, s_texture_data_compressed_size / s_texture_data_depth,
893 &s_texture_data_compressed[5 * s_texture_data_compressed_size / s_texture_data_depth]);
894 GLU_EXPECT_NO_ERROR(gl.getError(), "glCompressedTexImage2D call failed.");
895 break;
896 case GL_TEXTURE_CUBE_MAP_ARRAY:
897 gl.compressedTexImage3D(target, 0, GL_COMPRESSED_RGBA_BPTC_UNORM, s_texture_data_width, s_texture_data_height, 6,
898 0, s_texture_data_compressed_size / s_texture_data_depth * 6,
899 s_texture_data_compressed);
900 GLU_EXPECT_NO_ERROR(gl.getError(), "glCompressedTexImage3D call failed.");
901 break;
902 case GL_TEXTURE_2D_ARRAY:
903 gl.compressedTexImage3D(target, 0, GL_COMPRESSED_RGBA_BPTC_UNORM, s_texture_data_width, s_texture_data_height,
904 s_texture_data_depth, 0, s_texture_data_compressed_size, s_texture_data_compressed);
905 GLU_EXPECT_NO_ERROR(gl.getError(), "glCompressedTexImage3D call failed.");
906 break;
907 default:
908 throw 0;
909 }
910 }
911 else
912 {
913 /* Upload uncompressed texture. */
914 switch (target)
915 {
916 case GL_TEXTURE_1D:
917 gl.texImage1D(target, 0, GL_RGBA8, s_texture_data_width, 0, GL_RGBA, GL_UNSIGNED_BYTE, s_texture_data);
918 GLU_EXPECT_NO_ERROR(gl.getError(), "glTexImage1D call failed.");
919 break;
920 case GL_TEXTURE_1D_ARRAY:
921 case GL_TEXTURE_2D:
922 case GL_TEXTURE_RECTANGLE:
923 gl.texImage2D(target, 0, GL_RGBA8, s_texture_data_width, s_texture_data_height, 0, GL_RGBA,
924 GL_UNSIGNED_BYTE, s_texture_data);
925 GLU_EXPECT_NO_ERROR(gl.getError(), "glTexImage2D call failed.");
926 break;
927 case GL_TEXTURE_CUBE_MAP:
928 gl.texImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGBA8, s_texture_data_width, s_texture_data_height, 0,
929 GL_RGBA, GL_UNSIGNED_BYTE,
930 &s_texture_data[0 * s_texture_data_width * s_texture_data_height * 4 /* RGBA */]);
931 gl.texImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGBA8, s_texture_data_width, s_texture_data_height, 0,
932 GL_RGBA, GL_UNSIGNED_BYTE,
933 &s_texture_data[1 * s_texture_data_width * s_texture_data_height * 4 /* RGBA */]);
934 gl.texImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGBA8, s_texture_data_width, s_texture_data_height, 0,
935 GL_RGBA, GL_UNSIGNED_BYTE,
936 &s_texture_data[2 * s_texture_data_width * s_texture_data_height * 4 /* RGBA */]);
937 gl.texImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGBA8, s_texture_data_width, s_texture_data_height, 0,
938 GL_RGBA, GL_UNSIGNED_BYTE,
939 &s_texture_data[3 * s_texture_data_width * s_texture_data_height * 4 /* RGBA */]);
940 gl.texImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGBA8, s_texture_data_width, s_texture_data_height, 0,
941 GL_RGBA, GL_UNSIGNED_BYTE,
942 &s_texture_data[4 * s_texture_data_width * s_texture_data_height * 4 /* RGBA */]);
943 gl.texImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGBA8, s_texture_data_width, s_texture_data_height, 0,
944 GL_RGBA, GL_UNSIGNED_BYTE,
945 &s_texture_data[5 * s_texture_data_width * s_texture_data_height * 4 /* RGBA */]);
946 GLU_EXPECT_NO_ERROR(gl.getError(), "glTexImage2D call failed.");
947 break;
948 case GL_TEXTURE_CUBE_MAP_ARRAY:
949 gl.texImage3D(target, 0, GL_RGBA8, s_texture_data_width, s_texture_data_height, 6, 0, GL_RGBA,
950 GL_UNSIGNED_BYTE, s_texture_data);
951 GLU_EXPECT_NO_ERROR(gl.getError(), "glTexImage3D call failed.");
952 break;
953 case GL_TEXTURE_2D_ARRAY:
954 case GL_TEXTURE_3D:
955 gl.texImage3D(target, 0, GL_RGBA8, s_texture_data_width, s_texture_data_height, s_texture_data_depth, 0,
956 GL_RGBA, GL_UNSIGNED_BYTE, s_texture_data);
957 GLU_EXPECT_NO_ERROR(gl.getError(), "glTexImage3D call failed.");
958 break;
959 default:
960 throw 0;
961 }
962 }
963 }
964
965 /** Test that Get(Compressed)TextureSubImage resturns expected texture data.
966 *
967 * @param [in] target Target of the texture to be prepared.
968 * @param [in] is_compressed Flag indicating that texture shall be compressed (true) or uncompressed (false).
969 *
970 * @return True if test succeeded, false otherwise.
971 */
check(glw::GLenum target,bool is_compressed)972 bool gl4cts::GetTextureSubImage::Functional::check(glw::GLenum target, bool is_compressed)
973 {
974 /* OpenGL functions access point. */
975 const glw::Functions& gl = m_context.getRenderContext().getFunctions();
976
977 /* Arguments setup (depends on dimmension) */
978 glw::GLint x_offset = s_texture_data_width / 2 /* half */;
979 glw::GLint width = s_texture_data_width / 2 /* half */;
980
981 glw::GLint y_offset = 0;
982 glw::GLint height = 1;
983
984 glw::GLint z_offset = 0;
985 glw::GLint depth = 1;
986
987 /* For 2 and 3 -dimensional textures setup y-direction. */
988 if (GL_TEXTURE_1D != target)
989 {
990 y_offset = s_texture_data_height / 2 /* half */;
991 height = s_texture_data_height / 2 /* half */;
992 }
993
994 /* For 3-dimensional textures setup z-direction. */
995 if ((GL_TEXTURE_3D == target) || (GL_TEXTURE_2D_ARRAY == target))
996 {
997 z_offset = s_texture_data_depth / 2 /* half */;
998 depth = s_texture_data_depth / 2 /* half */;
999 }
1000
1001 /* For cube-map texture stup 6-cube faces. */
1002 if ((GL_TEXTURE_CUBE_MAP == target) || (GL_TEXTURE_CUBE_MAP_ARRAY == target))
1003 {
1004 z_offset = 3; /* half of cube map */
1005 depth = 3; /* half of cube map */
1006 }
1007
1008 /* Setup number of components. */
1009 glw::GLint number_of_components = 0;
1010
1011 if (is_compressed)
1012 {
1013 number_of_components = 16; /* 128 bit block of 4x4 compressed pixels. */
1014 }
1015 else
1016 {
1017 number_of_components = 4; /* RGBA components. */
1018 }
1019
1020 /* Setup size. */
1021 glw::GLsizei size = 0;
1022
1023 /* Iterate over pixels. */
1024 glw::GLint x_block = 1;
1025 glw::GLint y_block = 1;
1026
1027 if (is_compressed)
1028 {
1029 /* Iterate over 4x4 compressed pixel block. */
1030 x_block = 4;
1031 y_block = 4;
1032
1033 size = static_cast<glw::GLsizei>((width / x_block) * (height / y_block) * depth * number_of_components *
1034 sizeof(glw::GLubyte));
1035 }
1036 else
1037 {
1038 size = static_cast<glw::GLsizei>(width * height * depth * number_of_components * sizeof(glw::GLubyte));
1039 }
1040
1041 /* Storage for fetched texturte. */
1042 glw::GLubyte* texture_data = new glw::GLubyte[size];
1043
1044 if (DE_NULL == texture_data)
1045 {
1046 throw 0;
1047 }
1048
1049 /* Fetching texture. */
1050 if (is_compressed)
1051 {
1052 m_gl_GetCompressedTextureSubImage(m_texture, 0, x_offset, y_offset, z_offset, width, height, depth, size,
1053 texture_data);
1054 }
1055 else
1056 {
1057 m_gl_GetTextureSubImage(m_texture, 0, x_offset, y_offset, z_offset, width, height, depth, GL_RGBA,
1058 GL_UNSIGNED_BYTE, size, texture_data);
1059 }
1060
1061 /* Comprae fetched texture with reference. */
1062 glw::GLint error = gl.getError();
1063
1064 bool is_ok = true;
1065
1066 if (GL_NO_ERROR == error)
1067 {
1068 for (glw::GLint k = 0; k < depth; ++k)
1069 {
1070 for (glw::GLint j = 0; j < height / y_block; ++j)
1071 {
1072 for (glw::GLint i = 0; i < width / x_block; ++i)
1073 {
1074 for (glw::GLint c = 0; c < number_of_components; ++c) /* RGBA components iterating */
1075 {
1076 glw::GLuint reference_data_position =
1077 (i + (x_offset / x_block)) * number_of_components +
1078 (j + (y_offset / y_block)) * s_texture_data_width / x_block * number_of_components +
1079 (k + z_offset) * s_texture_data_width / x_block * s_texture_data_height / y_block *
1080 number_of_components +
1081 c;
1082
1083 glw::GLuint tested_data_position =
1084 i * number_of_components + j * width / x_block * number_of_components +
1085 k * width / x_block * height / y_block * number_of_components + c;
1086
1087 glw::GLubyte reference_value = (is_compressed) ?
1088 s_texture_data_compressed[reference_data_position] :
1089 s_texture_data[reference_data_position];
1090 glw::GLubyte tested_value = texture_data[tested_data_position];
1091
1092 if (reference_value != tested_value)
1093 {
1094 is_ok = false;
1095 break;
1096 }
1097 }
1098 }
1099 }
1100 }
1101 }
1102 else
1103 {
1104 /* GL error. */
1105 delete[] texture_data;
1106 throw 0;
1107 }
1108
1109 /* Cleanup. */
1110 delete[] texture_data;
1111
1112 /* Error reporting. */
1113 if (!is_ok)
1114 {
1115 m_testCtx.getLog() << tcu::TestLog::Message << "Functional test of "
1116 << ((is_compressed) ? "glGetCompressedTextureSubImage " : "glGetTextureSubImage ")
1117 << "function has failed with target " << glu::getTextureTargetStr(target) << "."
1118 << tcu::TestLog::EndMessage;
1119 }
1120
1121 /* Return result. */
1122 return is_ok;
1123 }
1124
1125 /** Clean texture. */
clean()1126 void gl4cts::GetTextureSubImage::Functional::clean()
1127 {
1128 /* OpenGL functions access point. */
1129 const glw::Functions& gl = m_context.getRenderContext().getFunctions();
1130
1131 if (m_texture)
1132 {
1133 gl.deleteTextures(1, &m_texture);
1134
1135 m_texture = 0;
1136 }
1137 }
1138
1139 /** RGBA 8x8x8 pixels in size source texture for testing GetTextureSubImage. */
1140 const glw::GLubyte gl4cts::GetTextureSubImage::Functional::s_texture_data[] = {
1141 0, 0, 0, 0, 0, 0, 32, 1, 0, 0, 64, 2, 0, 0, 96, 3,
1142 0, 0, 128, 4, 0, 0, 160, 5, 0, 0, 192, 6, 0, 0, 224, 7,
1143
1144 0, 32, 0, 1, 0, 32, 32, 2, 0, 32, 64, 3, 0, 32, 96, 4,
1145 0, 32, 128, 5, 0, 32, 160, 6, 0, 32, 192, 7, 0, 32, 224, 8,
1146
1147 0, 64, 0, 2, 0, 64, 32, 3, 0, 64, 64, 4, 0, 64, 96, 5,
1148 0, 64, 128, 6, 0, 64, 160, 7, 0, 64, 192, 8, 0, 64, 224, 9,
1149
1150 0, 96, 0, 3, 0, 96, 32, 4, 0, 96, 64, 5, 0, 96, 96, 6,
1151 0, 96, 128, 7, 0, 96, 160, 8, 0, 96, 192, 9, 0, 96, 224, 10,
1152
1153 0, 128, 0, 4, 0, 128, 32, 5, 0, 128, 64, 6, 0, 128, 96, 7,
1154 0, 128, 128, 8, 0, 128, 160, 9, 0, 128, 192, 10, 0, 128, 224, 11,
1155
1156 0, 160, 0, 5, 0, 160, 32, 6, 0, 160, 64, 7, 0, 160, 96, 8,
1157 0, 160, 128, 9, 0, 160, 160, 10, 0, 160, 192, 11, 0, 160, 224, 12,
1158
1159 0, 192, 0, 6, 0, 192, 32, 7, 0, 192, 64, 8, 0, 192, 96, 9,
1160 0, 192, 128, 10, 0, 192, 160, 11, 0, 192, 192, 12, 0, 192, 224, 13,
1161
1162 0, 224, 0, 7, 0, 224, 32, 8, 0, 224, 64, 9, 0, 224, 96, 10,
1163 0, 224, 128, 11, 0, 224, 160, 12, 0, 224, 192, 13, 0, 224, 224, 14,
1164
1165 32, 0, 0, 1, 32, 0, 32, 2, 32, 0, 64, 3, 32, 0, 96, 4,
1166 32, 0, 128, 5, 32, 0, 160, 6, 32, 0, 192, 7, 32, 0, 224, 8,
1167
1168 32, 32, 0, 2, 32, 32, 32, 3, 32, 32, 64, 4, 32, 32, 96, 5,
1169 32, 32, 128, 6, 32, 32, 160, 7, 32, 32, 192, 8, 32, 32, 224, 9,
1170
1171 32, 64, 0, 3, 32, 64, 32, 4, 32, 64, 64, 5, 32, 64, 96, 6,
1172 32, 64, 128, 7, 32, 64, 160, 8, 32, 64, 192, 9, 32, 64, 224, 10,
1173
1174 32, 96, 0, 4, 32, 96, 32, 5, 32, 96, 64, 6, 32, 96, 96, 7,
1175 32, 96, 128, 8, 32, 96, 160, 9, 32, 96, 192, 10, 32, 96, 224, 11,
1176
1177 32, 128, 0, 5, 32, 128, 32, 6, 32, 128, 64, 7, 32, 128, 96, 8,
1178 32, 128, 128, 9, 32, 128, 160, 10, 32, 128, 192, 11, 32, 128, 224, 12,
1179
1180 32, 160, 0, 6, 32, 160, 32, 7, 32, 160, 64, 8, 32, 160, 96, 9,
1181 32, 160, 128, 10, 32, 160, 160, 11, 32, 160, 192, 12, 32, 160, 224, 13,
1182
1183 32, 192, 0, 7, 32, 192, 32, 8, 32, 192, 64, 9, 32, 192, 96, 10,
1184 32, 192, 128, 11, 32, 192, 160, 12, 32, 192, 192, 13, 32, 192, 224, 14,
1185
1186 32, 224, 0, 8, 32, 224, 32, 9, 32, 224, 64, 10, 32, 224, 96, 11,
1187 32, 224, 128, 12, 32, 224, 160, 13, 32, 224, 192, 14, 32, 224, 224, 15,
1188
1189 64, 0, 0, 2, 64, 0, 32, 3, 64, 0, 64, 4, 64, 0, 96, 5,
1190 64, 0, 128, 6, 64, 0, 160, 7, 64, 0, 192, 8, 64, 0, 224, 9,
1191
1192 64, 32, 0, 3, 64, 32, 32, 4, 64, 32, 64, 5, 64, 32, 96, 6,
1193 64, 32, 128, 7, 64, 32, 160, 8, 64, 32, 192, 9, 64, 32, 224, 10,
1194
1195 64, 64, 0, 4, 64, 64, 32, 5, 64, 64, 64, 6, 64, 64, 96, 7,
1196 64, 64, 128, 8, 64, 64, 160, 9, 64, 64, 192, 10, 64, 64, 224, 11,
1197
1198 64, 96, 0, 5, 64, 96, 32, 6, 64, 96, 64, 7, 64, 96, 96, 8,
1199 64, 96, 128, 9, 64, 96, 160, 10, 64, 96, 192, 11, 64, 96, 224, 12,
1200
1201 64, 128, 0, 6, 64, 128, 32, 7, 64, 128, 64, 8, 64, 128, 96, 9,
1202 64, 128, 128, 10, 64, 128, 160, 11, 64, 128, 192, 12, 64, 128, 224, 13,
1203
1204 64, 160, 0, 7, 64, 160, 32, 8, 64, 160, 64, 9, 64, 160, 96, 10,
1205 64, 160, 128, 11, 64, 160, 160, 12, 64, 160, 192, 13, 64, 160, 224, 14,
1206
1207 64, 192, 0, 8, 64, 192, 32, 9, 64, 192, 64, 10, 64, 192, 96, 11,
1208 64, 192, 128, 12, 64, 192, 160, 13, 64, 192, 192, 14, 64, 192, 224, 15,
1209
1210 64, 224, 0, 9, 64, 224, 32, 10, 64, 224, 64, 11, 64, 224, 96, 12,
1211 64, 224, 128, 13, 64, 224, 160, 14, 64, 224, 192, 15, 64, 224, 224, 16,
1212
1213 96, 0, 0, 3, 96, 0, 32, 4, 96, 0, 64, 5, 96, 0, 96, 6,
1214 96, 0, 128, 7, 96, 0, 160, 8, 96, 0, 192, 9, 96, 0, 224, 10,
1215
1216 96, 32, 0, 4, 96, 32, 32, 5, 96, 32, 64, 6, 96, 32, 96, 7,
1217 96, 32, 128, 8, 96, 32, 160, 9, 96, 32, 192, 10, 96, 32, 224, 11,
1218
1219 96, 64, 0, 5, 96, 64, 32, 6, 96, 64, 64, 7, 96, 64, 96, 8,
1220 96, 64, 128, 9, 96, 64, 160, 10, 96, 64, 192, 11, 96, 64, 224, 12,
1221
1222 96, 96, 0, 6, 96, 96, 32, 7, 96, 96, 64, 8, 96, 96, 96, 9,
1223 96, 96, 128, 10, 96, 96, 160, 11, 96, 96, 192, 12, 96, 96, 224, 13,
1224
1225 96, 128, 0, 7, 96, 128, 32, 8, 96, 128, 64, 9, 96, 128, 96, 10,
1226 96, 128, 128, 11, 96, 128, 160, 12, 96, 128, 192, 13, 96, 128, 224, 14,
1227
1228 96, 160, 0, 8, 96, 160, 32, 9, 96, 160, 64, 10, 96, 160, 96, 11,
1229 96, 160, 128, 12, 96, 160, 160, 13, 96, 160, 192, 14, 96, 160, 224, 15,
1230
1231 96, 192, 0, 9, 96, 192, 32, 10, 96, 192, 64, 11, 96, 192, 96, 12,
1232 96, 192, 128, 13, 96, 192, 160, 14, 96, 192, 192, 15, 96, 192, 224, 16,
1233
1234 96, 224, 0, 10, 96, 224, 32, 11, 96, 224, 64, 12, 96, 224, 96, 13,
1235 96, 224, 128, 14, 96, 224, 160, 15, 96, 224, 192, 16, 96, 224, 224, 17,
1236
1237 128, 0, 0, 4, 128, 0, 32, 5, 128, 0, 64, 6, 128, 0, 96, 7,
1238 128, 0, 128, 8, 128, 0, 160, 9, 128, 0, 192, 10, 128, 0, 224, 11,
1239
1240 128, 32, 0, 5, 128, 32, 32, 6, 128, 32, 64, 7, 128, 32, 96, 8,
1241 128, 32, 128, 9, 128, 32, 160, 10, 128, 32, 192, 11, 128, 32, 224, 12,
1242
1243 128, 64, 0, 6, 128, 64, 32, 7, 128, 64, 64, 8, 128, 64, 96, 9,
1244 128, 64, 128, 10, 128, 64, 160, 11, 128, 64, 192, 12, 128, 64, 224, 13,
1245
1246 128, 96, 0, 7, 128, 96, 32, 8, 128, 96, 64, 9, 128, 96, 96, 10,
1247 128, 96, 128, 11, 128, 96, 160, 12, 128, 96, 192, 13, 128, 96, 224, 14,
1248
1249 128, 128, 0, 8, 128, 128, 32, 9, 128, 128, 64, 10, 128, 128, 96, 11,
1250 128, 128, 128, 12, 128, 128, 160, 13, 128, 128, 192, 14, 128, 128, 224, 15,
1251
1252 128, 160, 0, 9, 128, 160, 32, 10, 128, 160, 64, 11, 128, 160, 96, 12,
1253 128, 160, 128, 13, 128, 160, 160, 14, 128, 160, 192, 15, 128, 160, 224, 16,
1254
1255 128, 192, 0, 10, 128, 192, 32, 11, 128, 192, 64, 12, 128, 192, 96, 13,
1256 128, 192, 128, 14, 128, 192, 160, 15, 128, 192, 192, 16, 128, 192, 224, 17,
1257
1258 128, 224, 0, 11, 128, 224, 32, 12, 128, 224, 64, 13, 128, 224, 96, 14,
1259 128, 224, 128, 15, 128, 224, 160, 16, 128, 224, 192, 17, 128, 224, 224, 18,
1260
1261 160, 0, 0, 5, 160, 0, 32, 6, 160, 0, 64, 7, 160, 0, 96, 8,
1262 160, 0, 128, 9, 160, 0, 160, 10, 160, 0, 192, 11, 160, 0, 224, 12,
1263
1264 160, 32, 0, 6, 160, 32, 32, 7, 160, 32, 64, 8, 160, 32, 96, 9,
1265 160, 32, 128, 10, 160, 32, 160, 11, 160, 32, 192, 12, 160, 32, 224, 13,
1266
1267 160, 64, 0, 7, 160, 64, 32, 8, 160, 64, 64, 9, 160, 64, 96, 10,
1268 160, 64, 128, 11, 160, 64, 160, 12, 160, 64, 192, 13, 160, 64, 224, 14,
1269
1270 160, 96, 0, 8, 160, 96, 32, 9, 160, 96, 64, 10, 160, 96, 96, 11,
1271 160, 96, 128, 12, 160, 96, 160, 13, 160, 96, 192, 14, 160, 96, 224, 15,
1272
1273 160, 128, 0, 9, 160, 128, 32, 10, 160, 128, 64, 11, 160, 128, 96, 12,
1274 160, 128, 128, 13, 160, 128, 160, 14, 160, 128, 192, 15, 160, 128, 224, 16,
1275
1276 160, 160, 0, 10, 160, 160, 32, 11, 160, 160, 64, 12, 160, 160, 96, 13,
1277 160, 160, 128, 14, 160, 160, 160, 15, 160, 160, 192, 16, 160, 160, 224, 17,
1278
1279 160, 192, 0, 11, 160, 192, 32, 12, 160, 192, 64, 13, 160, 192, 96, 14,
1280 160, 192, 128, 15, 160, 192, 160, 16, 160, 192, 192, 17, 160, 192, 224, 18,
1281
1282 160, 224, 0, 12, 160, 224, 32, 13, 160, 224, 64, 14, 160, 224, 96, 15,
1283 160, 224, 128, 16, 160, 224, 160, 17, 160, 224, 192, 18, 160, 224, 224, 19,
1284
1285 192, 0, 0, 6, 192, 0, 32, 7, 192, 0, 64, 8, 192, 0, 96, 9,
1286 192, 0, 128, 10, 192, 0, 160, 11, 192, 0, 192, 12, 192, 0, 224, 13,
1287
1288 192, 32, 0, 7, 192, 32, 32, 8, 192, 32, 64, 9, 192, 32, 96, 10,
1289 192, 32, 128, 11, 192, 32, 160, 12, 192, 32, 192, 13, 192, 32, 224, 14,
1290
1291 192, 64, 0, 8, 192, 64, 32, 9, 192, 64, 64, 10, 192, 64, 96, 11,
1292 192, 64, 128, 12, 192, 64, 160, 13, 192, 64, 192, 14, 192, 64, 224, 15,
1293
1294 192, 96, 0, 9, 192, 96, 32, 10, 192, 96, 64, 11, 192, 96, 96, 12,
1295 192, 96, 128, 13, 192, 96, 160, 14, 192, 96, 192, 15, 192, 96, 224, 16,
1296
1297 192, 128, 0, 10, 192, 128, 32, 11, 192, 128, 64, 12, 192, 128, 96, 13,
1298 192, 128, 128, 14, 192, 128, 160, 15, 192, 128, 192, 16, 192, 128, 224, 17,
1299
1300 192, 160, 0, 11, 192, 160, 32, 12, 192, 160, 64, 13, 192, 160, 96, 14,
1301 192, 160, 128, 15, 192, 160, 160, 16, 192, 160, 192, 17, 192, 160, 224, 18,
1302
1303 192, 192, 0, 12, 192, 192, 32, 13, 192, 192, 64, 14, 192, 192, 96, 15,
1304 192, 192, 128, 16, 192, 192, 160, 17, 192, 192, 192, 18, 192, 192, 224, 19,
1305
1306 192, 224, 0, 13, 192, 224, 32, 14, 192, 224, 64, 15, 192, 224, 96, 16,
1307 192, 224, 128, 17, 192, 224, 160, 18, 192, 224, 192, 19, 192, 224, 224, 20,
1308
1309 224, 0, 0, 7, 224, 0, 32, 8, 224, 0, 64, 9, 224, 0, 96, 10,
1310 224, 0, 128, 11, 224, 0, 160, 12, 224, 0, 192, 13, 224, 0, 224, 14,
1311
1312 224, 32, 0, 8, 224, 32, 32, 9, 224, 32, 64, 10, 224, 32, 96, 11,
1313 224, 32, 128, 12, 224, 32, 160, 13, 224, 32, 192, 14, 224, 32, 224, 15,
1314
1315 224, 64, 0, 9, 224, 64, 32, 10, 224, 64, 64, 11, 224, 64, 96, 12,
1316 224, 64, 128, 13, 224, 64, 160, 14, 224, 64, 192, 15, 224, 64, 224, 16,
1317
1318 224, 96, 0, 10, 224, 96, 32, 11, 224, 96, 64, 12, 224, 96, 96, 13,
1319 224, 96, 128, 14, 224, 96, 160, 15, 224, 96, 192, 16, 224, 96, 224, 17,
1320
1321 224, 128, 0, 11, 224, 128, 32, 12, 224, 128, 64, 13, 224, 128, 96, 14,
1322 224, 128, 128, 15, 224, 128, 160, 16, 224, 128, 192, 17, 224, 128, 224, 18,
1323
1324 224, 160, 0, 12, 224, 160, 32, 13, 224, 160, 64, 14, 224, 160, 96, 15,
1325 224, 160, 128, 16, 224, 160, 160, 17, 224, 160, 192, 18, 224, 160, 224, 19,
1326
1327 224, 192, 0, 13, 224, 192, 32, 14, 224, 192, 64, 15, 224, 192, 96, 16,
1328 224, 192, 128, 17, 224, 192, 160, 18, 224, 192, 192, 19, 224, 192, 224, 20,
1329
1330 224, 224, 0, 14, 224, 224, 32, 15, 224, 224, 64, 16, 224, 224, 96, 17,
1331 224, 224, 128, 18, 224, 224, 160, 19, 224, 224, 192, 20, 224, 224, 224, 21
1332 };
1333
1334 const glw::GLsizei gl4cts::GetTextureSubImage::Functional::s_texture_data_size =
1335 sizeof(s_texture_data); //!< Size of the uncompressed texture.
1336
1337 const glw::GLsizei gl4cts::GetTextureSubImage::Functional::s_texture_data_width =
1338 8; //!< Width of compressed and uncompressed textures.
1339 const glw::GLsizei gl4cts::GetTextureSubImage::Functional::s_texture_data_height =
1340 8; //!< Height of compressed and uncompressed textures.
1341 const glw::GLsizei gl4cts::GetTextureSubImage::Functional::s_texture_data_depth =
1342 8; //!< Depth of compressed and uncompressed textures.
1343
1344 /** ETC2 8x8x8(layers) pixels in size source texture for testing GetCompressedTextureSubImage. */
1345 const glw::GLubyte gl4cts::GetTextureSubImage::Functional::s_texture_data_compressed[] = {
1346 /* Layer 0 */
1347 0x80, 0x80, 0x4, 0x2, 0x1, 0x0, 0x10, 0x0, 0x80, 0x81, 0x4, 0x2, 0x1, 0xf8, 0x10, 0x20,
1348 0x81, 0x80, 0x4, 0x2, 0x81, 0x0, 0x1f, 0xc0, 0x81, 0x81, 0x4, 0x2, 0x81, 0xf8, 0x1f, 0xe0,
1349 0x80, 0x80, 0x5, 0x2, 0x1, 0x0, 0x10, 0x0, 0x80, 0x81, 0x5, 0x2, 0x1, 0xf8, 0x10, 0x20,
1350 0x81, 0x80, 0x5, 0x2, 0x81, 0x0, 0x1f, 0xc0, 0x81, 0x81, 0x5, 0x2, 0x81, 0xf8, 0x1f, 0xe0,
1351
1352 /* Layer 1 */
1353 0x90, 0x80, 0x4, 0x12, 0x1, 0x1, 0x10, 0x0, 0x90, 0x81, 0x4, 0x12, 0x1, 0xf9, 0x10, 0x20,
1354 0x91, 0x80, 0x4, 0x12, 0x81, 0x1, 0x1f, 0xc0, 0x91, 0x81, 0x4, 0x12, 0x81, 0xf9, 0x1f, 0xe0,
1355 0x90, 0x80, 0x5, 0x12, 0x1, 0x1, 0x10, 0x0, 0x90, 0x81, 0x5, 0x12, 0x1, 0xf9, 0x10, 0x20,
1356 0x91, 0x80, 0x5, 0x12, 0x81, 0x1, 0x1f, 0xc0, 0x91, 0x81, 0x5, 0x12, 0x81, 0xf9, 0x1f, 0xe0,
1357
1358 /* Layer 2 */
1359 0xa0, 0x80, 0x4, 0x22, 0x1, 0x2, 0x10, 0x0, 0xa0, 0x81, 0x4, 0x22, 0x1, 0xfa, 0x10, 0x20,
1360 0xa1, 0x80, 0x4, 0x22, 0x81, 0x2, 0x1f, 0xc0, 0xa1, 0x81, 0x4, 0x22, 0x81, 0xfa, 0x1f, 0xe0,
1361 0xa0, 0x80, 0x5, 0x22, 0x1, 0x2, 0x10, 0x0, 0xa0, 0x81, 0x5, 0x22, 0x1, 0xfa, 0x10, 0x20,
1362 0xa1, 0x80, 0x5, 0x22, 0x81, 0x2, 0x1f, 0xc0, 0xa1, 0x81, 0x5, 0x22, 0x81, 0xfa, 0x1f, 0xe0,
1363
1364 /* Layer 3 */
1365 0xb0, 0x80, 0x4, 0x32, 0x1, 0x3, 0x10, 0x0, 0xb0, 0x81, 0x4, 0x32, 0x1, 0xfb, 0x10, 0x20,
1366 0xb1, 0x80, 0x4, 0x32, 0x81, 0x3, 0x1f, 0xc0, 0xb1, 0x81, 0x4, 0x32, 0x81, 0xfb, 0x1f, 0xe0,
1367 0xb0, 0x80, 0x5, 0x32, 0x1, 0x3, 0x10, 0x0, 0xb0, 0x81, 0x5, 0x32, 0x1, 0xfb, 0x10, 0x20,
1368 0xb1, 0x80, 0x5, 0x32, 0x81, 0x3, 0x1f, 0xc0, 0xb1, 0x81, 0x5, 0x32, 0x81, 0xfb, 0x1f, 0xe0,
1369
1370 /* Layer 4 */
1371 0x40, 0x80, 0x4, 0x42, 0x1, 0x4, 0x10, 0x0, 0x40, 0x81, 0x4, 0x42, 0x1, 0xfc, 0x10, 0x20,
1372 0x41, 0x80, 0x4, 0x42, 0x81, 0x4, 0x1f, 0xc0, 0x41, 0x81, 0x4, 0x42, 0x81, 0xfc, 0x1f, 0xe0,
1373 0x40, 0x80, 0x5, 0x42, 0x1, 0x4, 0x10, 0x0, 0x40, 0x81, 0x5, 0x42, 0x1, 0xfc, 0x10, 0x20,
1374 0x41, 0x80, 0x5, 0x42, 0x81, 0x4, 0x1f, 0xc0, 0x41, 0x81, 0x5, 0x42, 0x81, 0xfc, 0x1f, 0xe0,
1375
1376 /* Layer 5 */
1377 0x50, 0x80, 0x4, 0x52, 0x1, 0x5, 0x10, 0x0, 0x50, 0x81, 0x4, 0x52, 0x1, 0xfd, 0x10, 0x20,
1378 0x51, 0x80, 0x4, 0x52, 0x81, 0x5, 0x1f, 0xc0, 0x51, 0x81, 0x4, 0x52, 0x81, 0xfd, 0x1f, 0xe0,
1379 0x50, 0x80, 0x5, 0x52, 0x1, 0x5, 0x10, 0x0, 0x50, 0x81, 0x5, 0x52, 0x1, 0xfd, 0x10, 0x20,
1380 0x51, 0x80, 0x5, 0x52, 0x81, 0x5, 0x1f, 0xc0, 0x51, 0x81, 0x5, 0x52, 0x81, 0xfd, 0x1f, 0xe0,
1381
1382 /* Layer 6 */
1383 0x5e, 0x80, 0x4, 0x5f, 0x1, 0x5, 0xf0, 0x0, 0x5e, 0x81, 0x4, 0x5f, 0x1, 0xfd, 0xf0, 0x20,
1384 0x5f, 0x80, 0x4, 0x5f, 0x81, 0x5, 0xff, 0xc0, 0x5f, 0x81, 0x4, 0x5f, 0x81, 0xfd, 0xff, 0xe0,
1385 0x5e, 0x80, 0x5, 0x5f, 0x1, 0x5, 0xf0, 0x0, 0x5e, 0x81, 0x5, 0x5f, 0x1, 0xfd, 0xf0, 0x20,
1386 0x5f, 0x80, 0x5, 0x5f, 0x81, 0x5, 0xff, 0xc0, 0x5f, 0x81, 0x5, 0x5f, 0x81, 0xfd, 0xff, 0xe0,
1387
1388 /* Layer 7 */
1389 0x6e, 0x80, 0x4, 0x6f, 0x1, 0x6, 0xf0, 0x0, 0x6e, 0x81, 0x4, 0x6f, 0x1, 0xfe, 0xf0, 0x20,
1390 0x6f, 0x80, 0x4, 0x6f, 0x81, 0x6, 0xff, 0xc0, 0x6f, 0x81, 0x4, 0x6f, 0x81, 0xfe, 0xff, 0xe0,
1391 0x6e, 0x80, 0x5, 0x6f, 0x1, 0x6, 0xf0, 0x0, 0x6e, 0x81, 0x5, 0x6f, 0x1, 0xfe, 0xf0, 0x20,
1392 0x6f, 0x80, 0x5, 0x6f, 0x81, 0x6, 0xff, 0xc0, 0x6f, 0x81, 0x5, 0x6f, 0x81, 0xfe, 0xff, 0xe0
1393 };
1394
1395 const glw::GLsizei gl4cts::GetTextureSubImage::Functional::s_texture_data_compressed_size =
1396 sizeof(s_texture_data_compressed); //!< Size of compressed texture.
1397