| /*------------------------------------------------------------------------- |
| * OpenGL Conformance Test Suite |
| * ----------------------------- |
| * |
| * Copyright (c) 2015-2016 The Khronos Group Inc. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| * |
| */ /*! |
| * \file |
| * \brief |
| */ /*-------------------------------------------------------------------*/ |
| |
| /** |
| */ /*! |
| * \file gl4cGetTextureSubImageTests.cpp |
| * \brief Get Texture Sub Image Tests Suite Implementation |
| */ /*-------------------------------------------------------------------*/ |
| |
| /* Includes. */ |
| #include "gl4cGetTextureSubImageTests.hpp" |
| #include "gluContextInfo.hpp" |
| #include "gluDefs.hpp" |
| #include "gluRenderContext.hpp" |
| #include "gluStrUtil.hpp" |
| #include "tcuTestLog.hpp" |
| #include <cstdlib> |
| |
| /* Implementation */ |
| |
| /************************************************************************************************** |
| * Tests Group Implementation * |
| **************************************************************************************************/ |
| |
| gl4cts::GetTextureSubImage::Tests::Tests(deqp::Context& context) |
| : TestCaseGroup(context, "get_texture_sub_image", "Get Texture Sub Image Tests Suite") |
| { |
| addChild(new GetTextureSubImage::Errors(m_context)); |
| addChild(new GetTextureSubImage::Functional(m_context)); |
| } |
| |
| gl4cts::GetTextureSubImage::Tests::~Tests(void) |
| { |
| } |
| |
| void gl4cts::GetTextureSubImage::Tests::init(void) |
| { |
| } |
| |
| /************************************************************************************************** |
| * Errors Tests Implementation * |
| **************************************************************************************************/ |
| |
| /** Constructor of API Errors tests. |
| * |
| * @return [in] context OpenGL context in which test shall run. |
| */ |
| gl4cts::GetTextureSubImage::Errors::Errors(deqp::Context& context) |
| : deqp::TestCase(context, "errors_test", "Get Texture SubImage Errors Test") |
| , m_context(context) |
| , m_texture_1D(0) |
| , m_texture_1D_array(0) |
| , m_texture_2D(0) |
| , m_texture_rectangle(0) |
| , m_texture_2D_compressed(0) |
| , m_texture_2D_multisampled(0) |
| , m_destination_buffer(DE_NULL) |
| , m_gl_GetTextureSubImage(DE_NULL) |
| , m_gl_GetCompressedTextureSubImage(DE_NULL) |
| { |
| } |
| |
| /** Destructor of API Errors tests. |
| */ |
| gl4cts::GetTextureSubImage::Errors::~Errors(void) |
| { |
| } |
| |
| /** This function iterate over API Errors tests. |
| */ |
| tcu::TestNode::IterateResult gl4cts::GetTextureSubImage::Errors::iterate(void) |
| { |
| bool is_ok = true; |
| bool test_error = false; |
| |
| bool is_at_least_gl_45 = (glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::core(4, 5))); |
| bool is_arb_get_texture_sub_image = m_context.getContextInfo().isExtensionSupported("GL_ARB_get_texture_sub_image"); |
| |
| try |
| { |
| if (is_at_least_gl_45 || is_arb_get_texture_sub_image) |
| { |
| /* Prepare texture objects */ |
| prepare(); |
| |
| /* Do tests. */ |
| is_ok &= testExistingTextureObjectError(); |
| |
| is_ok &= testBufferOrMultisampledTargetError(); |
| |
| is_ok &= testNegativeOffsetError(); |
| |
| is_ok &= testBoundsError(); |
| |
| is_ok &= testOneDimmensionalTextureErrors(); |
| |
| is_ok &= testTwoDimmensionalTextureErrors(); |
| |
| is_ok &= testBufferSizeError(); |
| } |
| } |
| catch (...) |
| { |
| is_ok = false; |
| test_error = true; |
| } |
| |
| /* Clean up */ |
| clean(); |
| |
| /* Result's setup. */ |
| if (is_ok) |
| { |
| m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass"); |
| } |
| else |
| { |
| if (test_error) |
| { |
| m_testCtx.setTestResult(QP_TEST_RESULT_INTERNAL_ERROR, "Error"); |
| } |
| else |
| { |
| m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail"); |
| } |
| } |
| |
| return STOP; |
| } |
| |
| /** Preparation of source textures and destination buffer. |
| */ |
| void gl4cts::GetTextureSubImage::Errors::prepare() |
| { |
| /* OpenGL functions access point. */ |
| const glw::Functions& gl = m_context.getRenderContext().getFunctions(); |
| |
| /* If already initialized throw exception. */ |
| if (m_texture_1D || m_texture_1D_array || m_texture_2D || m_texture_rectangle || m_texture_2D_compressed || |
| m_texture_2D_multisampled) |
| { |
| throw 0; |
| } |
| |
| /* Generate texture ids. */ |
| gl.genTextures(1, &m_texture_1D); |
| gl.genTextures(1, &m_texture_1D_array); |
| gl.genTextures(1, &m_texture_2D); |
| gl.genTextures(1, &m_texture_rectangle); |
| gl.genTextures(1, &m_texture_2D_compressed); |
| gl.genTextures(1, &m_texture_2D_multisampled); |
| |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glGenTextures call failed."); |
| |
| /* If one is not initialized throw exception. */ |
| if (!(m_texture_1D && m_texture_1D_array && m_texture_2D)) |
| { |
| throw 0; |
| } |
| |
| /* Upload texture data. */ |
| gl.bindTexture(GL_TEXTURE_1D, m_texture_1D); |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture call failed."); |
| |
| gl.texImage1D(GL_TEXTURE_1D, 0, GL_RGBA8, s_texture_data_width, 0, GL_RGBA, GL_UNSIGNED_BYTE, s_texture_data); |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glTexImage1D call failed."); |
| |
| gl.bindTexture(GL_TEXTURE_1D_ARRAY, m_texture_1D_array); |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture call failed."); |
| |
| gl.texImage2D(GL_TEXTURE_1D_ARRAY, 0, GL_RGBA8, s_texture_data_width, s_texture_data_height, 0, GL_RGBA, |
| GL_UNSIGNED_BYTE, s_texture_data); |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glTexImage1D call failed."); |
| |
| gl.bindTexture(GL_TEXTURE_2D, m_texture_2D); |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture call failed."); |
| |
| gl.texImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, s_texture_data_width, s_texture_data_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, |
| s_texture_data); |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glTexImage1D call failed."); |
| |
| gl.bindTexture(GL_TEXTURE_RECTANGLE, m_texture_rectangle); |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture call failed."); |
| |
| gl.texImage2D(GL_TEXTURE_RECTANGLE, 0, GL_RGBA8, s_texture_data_width, s_texture_data_height, 0, GL_RGBA, |
| GL_UNSIGNED_BYTE, s_texture_data); |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glTexImage1D call failed."); |
| |
| /* Upload compressed texture data. */ |
| gl.bindTexture(GL_TEXTURE_2D, m_texture_2D_compressed); |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture call failed."); |
| |
| gl.compressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB8_ETC2, s_texture_data_compressed_width, |
| s_texture_data_compressed_height, 0, s_texture_data_compressed_size, |
| s_texture_data_compressed); |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glTexImage1D call failed."); |
| |
| /* Prepare multisampled texture storage. */ |
| gl.bindTexture(GL_TEXTURE_2D_MULTISAMPLE, m_texture_2D_multisampled); |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture call failed."); |
| |
| gl.texImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 1, GL_R8, s_texture_data_width, s_texture_data_height, GL_TRUE); |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glTexImage1D call failed."); |
| |
| /* Prepare function pointers. */ |
| m_gl_GetTextureSubImage = |
| (PFNGLGETTEXTURESUBIMAGEPROC)m_context.getRenderContext().getProcAddress("glGetTextureSubImage"); |
| m_gl_GetCompressedTextureSubImage = |
| (PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC)m_context.getRenderContext().getProcAddress( |
| "glGetCompressedTextureSubImage"); |
| |
| if ((DE_NULL == m_gl_GetTextureSubImage) || (DE_NULL == m_gl_GetCompressedTextureSubImage)) |
| { |
| throw 0; |
| } |
| |
| /* Allocate destination buffer. */ |
| m_destination_buffer = (glw::GLubyte*)malloc(s_destination_buffer_size); |
| |
| if (DE_NULL == m_destination_buffer) |
| { |
| throw 0; |
| } |
| } |
| |
| /** The function checks that GL_INVALID_OPERATION error is generated by GetTextureSubImage if |
| * texture is not the name of an existing texture object. It also checks that |
| * GL_INVALID_OPERATION error is generated by GetCompressedTextureSubImage if texture is not |
| * the name of an existing texture object. For reference see the OpenGL 4.5 Core Specification |
| * chapter 8.11.4. |
| * |
| * @return True if proper error values are generated, false otherwise. |
| */ |
| bool gl4cts::GetTextureSubImage::Errors::testExistingTextureObjectError() |
| { |
| /* OpenGL functions access point. */ |
| const glw::Functions& gl = m_context.getRenderContext().getFunctions(); |
| |
| /* Prepare invalid texture name. */ |
| glw::GLuint invalid_texture = m_texture_2D_multisampled; |
| |
| while (gl.isTexture(++invalid_texture)) |
| ; |
| |
| m_gl_GetTextureSubImage(invalid_texture, 0, 0, 0, 0, s_texture_data_width, s_texture_data_height, 1, GL_RGBA, |
| GL_UNSIGNED_BYTE, s_destination_buffer_size, m_destination_buffer); |
| |
| glw::GLint error_value = gl.getError(); |
| glw::GLint is_proper_error = (GL_INVALID_OPERATION == error_value); |
| |
| if (!is_proper_error) |
| { |
| m_testCtx.getLog() << tcu::TestLog::Message << "GL_INVALID_OPERATION error is expected to be generated by " |
| "glGetTextureSubImage if texture is not the name of an existing " |
| "texture object (OpenGL 4.5 Core Specification chapter 8.11.4)." |
| << " However, the error value " << glu::getErrorName(error_value) << " was generated." |
| << tcu::TestLog::EndMessage; |
| } |
| |
| m_gl_GetCompressedTextureSubImage(invalid_texture, 0, 0, 0, 0, s_texture_data_compressed_width, |
| s_texture_data_compressed_height, 1, s_destination_buffer_size, |
| m_destination_buffer); |
| |
| error_value = gl.getError(); |
| |
| glw::GLint is_proper_error_compressed = (GL_INVALID_OPERATION == error_value); |
| |
| if (!is_proper_error_compressed) |
| { |
| m_testCtx.getLog() << tcu::TestLog::Message |
| << "GL_INVALID_OPERATION error is expected to be generated by glGetCompressedTextureSubImage " |
| "if texture is not the name of an existing texture object (OpenGL 4.5 Core Specification " |
| "chapter 8.11.4)." |
| << " However, the error value " << glu::getErrorName(error_value) << " was generated." |
| << tcu::TestLog::EndMessage; |
| } |
| |
| if (is_proper_error && is_proper_error_compressed) |
| { |
| return true; |
| } |
| |
| return false; |
| } |
| |
| /** The function checks that GL_INVALID_OPERATION error is generated if texture is the |
| * name of a buffer or multisample texture. For reference see OpenGL 4.5 Core Specification |
| * chapter 8.11.4. |
| * |
| * @return True if proper error values are generated, false otherwise. |
| */ |
| bool gl4cts::GetTextureSubImage::Errors::testBufferOrMultisampledTargetError() |
| { |
| /* OpenGL functions access point. */ |
| const glw::Functions& gl = m_context.getRenderContext().getFunctions(); |
| |
| /* Test. */ |
| m_gl_GetTextureSubImage(m_texture_2D_multisampled, 0, 0, 0, 0, s_texture_data_width, s_texture_data_height, 1, |
| GL_RGBA, GL_UNSIGNED_BYTE, s_destination_buffer_size, m_destination_buffer); |
| |
| glw::GLint error_value = gl.getError(); |
| glw::GLint is_proper_error = (GL_INVALID_OPERATION == error_value); |
| |
| if (!is_proper_error) |
| { |
| m_testCtx.getLog() << tcu::TestLog::Message << "GL_INVALID_OPERATION error is expected to be generated by " |
| "glGetTextureSubImage if texture is the name of multisample " |
| "texture (OpenGL 4.5 Core Specification chapter 8.11.4)." |
| << " However, the error value " << glu::getErrorName(error_value) << " was generated." |
| << tcu::TestLog::EndMessage; |
| } |
| |
| if (is_proper_error) |
| { |
| return true; |
| } |
| |
| return false; |
| } |
| |
| /** The functions checks that GL_INVALID_VALUE is generated if xoffset, yoffset or |
| * zoffset are negative. For reference see OpenGL 4.5 Core Specification |
| * chapter 8.11.4. |
| * |
| * @return True if proper error values are generated, false otherwise. |
| */ |
| bool gl4cts::GetTextureSubImage::Errors::testNegativeOffsetError() |
| { |
| /* OpenGL functions access point. */ |
| const glw::Functions& gl = m_context.getRenderContext().getFunctions(); |
| |
| /* Test. */ |
| m_gl_GetTextureSubImage(m_texture_2D, 0, -1, 0, 0, s_texture_data_width, s_texture_data_height, 1, GL_RGBA, |
| GL_UNSIGNED_BYTE, s_destination_buffer_size, m_destination_buffer); |
| |
| glw::GLint error_value = gl.getError(); |
| glw::GLint is_proper_error = (GL_INVALID_VALUE == error_value); |
| |
| if (!is_proper_error) |
| { |
| m_testCtx.getLog() << tcu::TestLog::Message |
| << "GL_INVALID_VALUE error is expected to be generated by glGetTextureSubImage if xoffset, " |
| "yoffset or zoffset are negative (OpenGL 4.5 Core Specification chapter 8.11.4)." |
| << " However, the error value " << glu::getErrorName(error_value) << " was generated." |
| << tcu::TestLog::EndMessage; |
| } |
| |
| m_gl_GetCompressedTextureSubImage(m_texture_2D_compressed, 0, -1, 0, 0, s_texture_data_compressed_width, |
| s_texture_data_compressed_height, 1, s_destination_buffer_size, |
| m_destination_buffer); |
| |
| error_value = gl.getError(); |
| |
| glw::GLint is_proper_error_compressed = (GL_INVALID_VALUE == error_value); |
| |
| if (!is_proper_error_compressed) |
| { |
| m_testCtx.getLog() << tcu::TestLog::Message |
| << "GL_INVALID_VALUE error is expected to be generated by glGetCompressedTextureSubImage if " |
| "xoffset, yoffset or zoffset are negative (OpenGL 4.5 Core Specification chapter 8.11.4)." |
| << " However, the error value " << glu::getErrorName(error_value) << " was generated." |
| << tcu::TestLog::EndMessage; |
| } |
| |
| if (is_proper_error && is_proper_error_compressed) |
| { |
| return true; |
| } |
| |
| return false; |
| } |
| |
| /** The functions checks that GL_INVALID_VALUE is generated if xoffset + width is |
| * greater than the texture's width, yoffset + height is greater than |
| * the texture's height, or zoffset + depth is greater than the |
| * texture's depth. For reference see OpenGL 4.5 Core Specification |
| * chapter 8.11.4. |
| * |
| * @return True if proper error values are generated, false otherwise. |
| */ |
| bool gl4cts::GetTextureSubImage::Errors::testBoundsError() |
| { |
| /* OpenGL functions access point. */ |
| const glw::Functions& gl = m_context.getRenderContext().getFunctions(); |
| |
| /* Uncompresse texture test. */ |
| m_gl_GetTextureSubImage(m_texture_2D, 0, s_texture_data_width, s_texture_data_height, 0, s_texture_data_width * 2, |
| s_texture_data_height * 2, 1, GL_RGBA, GL_UNSIGNED_BYTE, s_destination_buffer_size, |
| m_destination_buffer); |
| |
| glw::GLint error_value = gl.getError(); |
| glw::GLint is_proper_error = (GL_INVALID_VALUE == error_value); |
| |
| if (!is_proper_error) |
| { |
| m_testCtx.getLog() |
| << tcu::TestLog::Message |
| << "GL_INVALID_VALUE error is expected to be generated by glGetTextureSubImage if xoffset + width is" |
| " greater than the texture's width, yoffset + height is greater than" |
| " the texture's height, or zoffset + depth is greater than the" |
| " texture's depth. (OpenGL 4.5 Core Specification chapter 8.11.4)." |
| " However, the error value " |
| << glu::getErrorName(error_value) << " was generated." << tcu::TestLog::EndMessage; |
| } |
| |
| /* Compresse texture test. */ |
| m_gl_GetCompressedTextureSubImage(m_texture_2D_compressed, 0, s_texture_data_compressed_width, |
| s_texture_data_compressed_height, 0, s_texture_data_compressed_width * 2, |
| s_texture_data_compressed_height * 2, 1, s_destination_buffer_size, |
| m_destination_buffer); |
| |
| error_value = gl.getError(); |
| |
| glw::GLint is_proper_error_compressed = (GL_INVALID_VALUE == error_value); |
| |
| if (!is_proper_error_compressed) |
| { |
| m_testCtx.getLog() << tcu::TestLog::Message |
| << "GL_INVALID_VALUE error is expected to be generated by glGetCompressedTextureSubImage if " |
| "xoffset + width is" |
| " greater than the texture's width, yoffset + height is greater than" |
| " the texture's height, or zoffset + depth is greater than the" |
| " texture's depth. (OpenGL 4.5 Core Specification chapter 8.11.4)." |
| " However, the error value " |
| << glu::getErrorName(error_value) << " was generated." << tcu::TestLog::EndMessage; |
| } |
| |
| if (is_proper_error && is_proper_error_compressed) |
| { |
| return true; |
| } |
| |
| return false; |
| } |
| |
| /** The functions checks that GL_INVALID_VALUE error is generated if the effective |
| * target is GL_TEXTURE_1D and either yoffset is not zero, or height |
| * is not one. For reference see OpenGL 4.5 Core Specification |
| * chapter 8.11.4. |
| * |
| * @return True if proper error values are generated, false otherwise. |
| */ |
| bool gl4cts::GetTextureSubImage::Errors::testOneDimmensionalTextureErrors() |
| { |
| /* OpenGL functions access point. */ |
| const glw::Functions& gl = m_context.getRenderContext().getFunctions(); |
| |
| /* Test. */ |
| m_gl_GetTextureSubImage(m_texture_1D, 0, 0, 1, 0, s_texture_data_width, 2, 1, GL_RGBA, GL_UNSIGNED_BYTE, |
| s_destination_buffer_size, m_destination_buffer); |
| |
| glw::GLint error_value = gl.getError(); |
| glw::GLint is_proper_error = (GL_INVALID_VALUE == error_value); |
| |
| if (!is_proper_error) |
| { |
| m_testCtx.getLog() |
| << tcu::TestLog::Message |
| << "GL_INVALID_VALUE error is expected to be generated by glGetTextureSubImage if the effective" |
| " target is GL_TEXTURE_1D and either yoffset is not zero, or height" |
| " is not one (OpenGL 4.5 Core Specification chapter 8.11.4)." |
| " However, the error value " |
| << glu::getErrorName(error_value) << " was generated." << tcu::TestLog::EndMessage; |
| } |
| |
| if (is_proper_error) |
| { |
| return true; |
| } |
| |
| return false; |
| } |
| |
| /** The functions checks that GL_INVALID_VALUE error is generated if the effective |
| * target is GL_TEXTURE_1D, GL_TEXTURE_1D_ARRAY, GL_TEXTURE_2D or |
| * GL_TEXTURE_RECTANGLE and either zoffset is not zero, or depth |
| * is not one. For reference see OpenGL 4.5 Core Specification |
| * chapter 8.11.4. |
| * |
| * @return True if proper error values are generated, false otherwise. |
| */ |
| bool gl4cts::GetTextureSubImage::Errors::testTwoDimmensionalTextureErrors() |
| { |
| /* OpenGL functions access point. */ |
| const glw::Functions& gl = m_context.getRenderContext().getFunctions(); |
| |
| /* Test. */ |
| const struct |
| { |
| glw::GLuint id; |
| const glw::GLchar* target_name; |
| } test_textures[] = { { m_texture_1D, "GL_TEXTURE_1D" }, |
| { m_texture_1D_array, "GL_TEXTURE_1D_ARRAY" }, |
| { m_texture_2D, "GL_TEXTURE_2D" } }; |
| |
| static const glw::GLuint test_textures_size = sizeof(test_textures) / sizeof(test_textures[0]); |
| |
| glw::GLint is_error = true; |
| |
| for (glw::GLuint i = 0; i < test_textures_size; ++i) |
| { |
| m_gl_GetTextureSubImage(test_textures[i].id, 0, 0, 0, 1, s_texture_data_width, |
| (test_textures[i].id == m_texture_1D) ? 1 : s_texture_data_height, 2, GL_RGBA, |
| GL_UNSIGNED_BYTE, s_destination_buffer_size, m_destination_buffer); |
| |
| glw::GLint error_value = gl.getError(); |
| glw::GLint is_proper_error = (GL_INVALID_VALUE == error_value); |
| |
| if (!is_proper_error) |
| { |
| is_error = false; |
| |
| m_testCtx.getLog() |
| << tcu::TestLog::Message |
| << "GL_INVALID_VALUE error is expected to be generated by glGetTextureSubImage if the effective" |
| " target is " |
| << test_textures[i].target_name << " and either zoffset is not zero, or depth" |
| " is not one. (OpenGL 4.5 Core Specification chapter 8.11.4)." |
| " However, the error value " |
| << glu::getErrorName(error_value) << " was generated." << tcu::TestLog::EndMessage; |
| } |
| } |
| |
| /* Test (compressed textures). */ |
| const struct |
| { |
| glw::GLuint id; |
| const glw::GLchar* target_name; |
| } test_compressed_textures[] = { { m_texture_2D_compressed, "GL_TEXTURE_2D" } }; |
| |
| static const glw::GLuint test_compressed_textures_size = |
| sizeof(test_compressed_textures) / sizeof(test_compressed_textures[0]); |
| |
| for (glw::GLuint i = 0; i < test_compressed_textures_size; ++i) |
| { |
| m_gl_GetCompressedTextureSubImage(test_compressed_textures[i].id, 0, 0, 0, 1, s_texture_data_compressed_width, |
| s_texture_data_compressed_height, 2, s_destination_buffer_size, |
| m_destination_buffer); |
| |
| glw::GLint error_value = gl.getError(); |
| |
| glw::GLint is_proper_error_compressed = (GL_INVALID_VALUE == error_value); |
| |
| if (!is_proper_error_compressed) |
| { |
| is_error = false; |
| |
| m_testCtx.getLog() << tcu::TestLog::Message << "GL_INVALID_VALUE error is expected to be generated by " |
| "glGetCompressedTextureSubImage if the effective" |
| " target is " |
| << test_compressed_textures[i].target_name |
| << " and either zoffset is not zero, or depth" |
| " is not one. (OpenGL 4.5 Core Specification chapter 8.11.4)." |
| " However, the error value " |
| << glu::getErrorName(error_value) << " was generated." << tcu::TestLog::EndMessage; |
| } |
| } |
| |
| if (is_error) |
| { |
| return true; |
| } |
| |
| return false; |
| } |
| |
| /** The functions checks that GL_INVALID_OPERATION error is generated if the buffer |
| * size required to store the requested data is greater than bufSize. |
| * For reference see OpenGL 4.5 Core Specification chapter 8.11.4. |
| * |
| * @return True if proper error values are generated, false otherwise. |
| */ |
| bool gl4cts::GetTextureSubImage::Errors::testBufferSizeError() |
| { |
| /* OpenGL functions access point. */ |
| const glw::Functions& gl = m_context.getRenderContext().getFunctions(); |
| |
| /* Test for uncompressed texture. */ |
| m_gl_GetTextureSubImage(m_texture_2D, 0, 0, 0, 0, s_texture_data_width, s_texture_data_height, 1, GL_RGBA, |
| GL_UNSIGNED_BYTE, 1, m_destination_buffer); |
| |
| glw::GLint error_value = gl.getError(); |
| glw::GLint is_proper_error = (GL_INVALID_OPERATION == error_value); |
| |
| if (!is_proper_error) |
| { |
| m_testCtx.getLog() |
| << tcu::TestLog::Message |
| << "GL_INVALID_OPERATION error is expected to be generated by glGetTextureSubImage if the buffer" |
| " size required to store the requested data is greater than bufSize. (OpenGL 4.5 Core Specification " |
| "chapter 8.11.4)." |
| " However, the error value " |
| << glu::getErrorName(error_value) << " was generated." << tcu::TestLog::EndMessage; |
| } |
| |
| /* Test for compressed texture. */ |
| m_gl_GetCompressedTextureSubImage(m_texture_2D_compressed, 0, 0, 0, 0, s_texture_data_compressed_width, |
| s_texture_data_compressed_height, 1, 1, m_destination_buffer); |
| |
| error_value = gl.getError(); |
| |
| glw::GLint is_proper_error_compressed = (GL_INVALID_OPERATION == error_value); |
| |
| if (!is_proper_error_compressed) |
| { |
| m_testCtx.getLog() |
| << tcu::TestLog::Message |
| << "GL_INVALID_OPERATION error is expected to be generated by glGetCompressedTextureSubImage if the buffer" |
| " size required to store the requested data is greater than bufSize. (OpenGL 4.5 Core Specification " |
| "chapter 8.11.4)." |
| " However, the error value " |
| << glu::getErrorName(error_value) << " was generated." << tcu::TestLog::EndMessage; |
| } |
| |
| /* Return results. */ |
| if (is_proper_error && is_proper_error_compressed) |
| { |
| return true; |
| } |
| |
| return false; |
| } |
| |
| void gl4cts::GetTextureSubImage::Errors::clean() |
| { |
| /* OpenGL functions access point. */ |
| const glw::Functions& gl = m_context.getRenderContext().getFunctions(); |
| |
| /*Textures cleanup. */ |
| if (m_texture_1D) |
| { |
| gl.deleteTextures(1, &m_texture_1D); |
| m_texture_1D = 0; |
| } |
| |
| if (m_texture_1D_array) |
| { |
| gl.deleteTextures(1, &m_texture_1D_array); |
| m_texture_1D_array = 0; |
| } |
| |
| if (m_texture_2D) |
| { |
| gl.deleteTextures(1, &m_texture_2D); |
| m_texture_2D = 0; |
| } |
| if (m_texture_rectangle) |
| { |
| gl.deleteTextures(1, &m_texture_rectangle); |
| m_texture_rectangle = 0; |
| } |
| |
| if (m_texture_2D_compressed) |
| { |
| gl.deleteTextures(1, &m_texture_2D_compressed); |
| m_texture_2D_compressed = 0; |
| } |
| |
| if (m_texture_2D_multisampled) |
| { |
| gl.deleteTextures(1, &m_texture_2D_multisampled); |
| m_texture_2D_multisampled = 0; |
| } |
| |
| /* CPU buffers */ |
| if (m_destination_buffer) |
| { |
| free(m_destination_buffer); |
| m_destination_buffer = DE_NULL; |
| } |
| } |
| |
| /* Uncompressed source texture 2x2 pixels */ |
| |
| const glw::GLubyte gl4cts::GetTextureSubImage::Errors::s_texture_data[] = { |
| 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 |
| }; //<! uncompressed texture |
| |
| const glw::GLuint gl4cts::GetTextureSubImage::Errors::s_texture_data_size = |
| sizeof(s_texture_data); //<! uncompressed texture size |
| |
| const glw::GLuint gl4cts::GetTextureSubImage::Errors::s_texture_data_width = 2; //<! uncompressed texture width |
| |
| const glw::GLuint gl4cts::GetTextureSubImage::Errors::s_texture_data_height = 2; //<! uncompressed texture height |
| |
| /* ETC2 compressed texture (4x4 pixels === 1 block) */ |
| |
| const glw::GLubyte gl4cts::GetTextureSubImage::Errors::s_texture_data_compressed[] = { |
| 0x15, 0x90, 0x33, 0x6f, 0xaf, 0xcc, 0x16, 0x98 |
| }; //<! ETC2 compressed texture |
| |
| const glw::GLuint gl4cts::GetTextureSubImage::Errors::s_texture_data_compressed_size = |
| sizeof(s_texture_data_compressed); //<! ETC2 compressed texture size |
| |
| const glw::GLuint gl4cts::GetTextureSubImage::Errors::s_texture_data_compressed_width = |
| 4; //<! ETC2 compressed texture width |
| |
| const glw::GLuint gl4cts::GetTextureSubImage::Errors::s_texture_data_compressed_height = |
| 4; //<! ETC2 compressed texture height |
| |
| const glw::GLuint gl4cts::GetTextureSubImage::Errors::s_destination_buffer_size = |
| (s_texture_data_size > s_texture_data_compressed_size) ? |
| s_texture_data_size : |
| s_texture_data_compressed_size; //<! size of the destination buffer (for fetched data) |
| |
| /***************************************************************************************************** |
| * Functional Test Implementation * |
| *****************************************************************************************************/ |
| |
| /** Constructor of the functional test. |
| * |
| * @param [in] context OpenGL context in which test shall run. |
| */ |
| gl4cts::GetTextureSubImage::Functional::Functional(deqp::Context& context) |
| : deqp::TestCase(context, "functional_test", "Get Texture SubImage Functional Test") |
| , m_context(context) |
| , m_texture(0) |
| { |
| } |
| |
| /** Destructor of the functional test. |
| */ |
| gl4cts::GetTextureSubImage::Functional::~Functional(void) |
| { |
| } |
| |
| /** Iterate over functional test cases. |
| */ |
| tcu::TestNode::IterateResult gl4cts::GetTextureSubImage::Functional::iterate(void) |
| { |
| bool is_ok = true; |
| bool test_error = false; |
| |
| bool is_at_least_gl_45 = (glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::core(4, 5))); |
| bool is_arb_get_texture_sub_image = m_context.getContextInfo().isExtensionSupported("GL_ARB_get_texture_sub_image"); |
| |
| /* Bind function pointers. */ |
| m_gl_GetCompressedTextureSubImage = |
| (PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC)m_context.getRenderContext().getProcAddress( |
| "glGetCompressedTextureSubImage"); |
| m_gl_GetTextureSubImage = |
| (PFNGLGETTEXTURESUBIMAGEPROC)m_context.getRenderContext().getProcAddress("glGetTextureSubImage"); |
| |
| try |
| { |
| /* Report error when function pointers are not available. */ |
| if ((DE_NULL == m_gl_GetCompressedTextureSubImage) || (DE_NULL == m_gl_GetTextureSubImage)) |
| { |
| m_testCtx.getLog() |
| << tcu::TestLog::Message |
| << "Cannot obtain glGetCompressedTextureSubImage or glGetTextureSubImage function pointer." |
| << tcu::TestLog::EndMessage; |
| throw 0; |
| } |
| |
| /* Run tests. */ |
| if (is_at_least_gl_45 || is_arb_get_texture_sub_image) |
| { |
| /* Tested targets. */ |
| glw::GLenum targets[] = { GL_TEXTURE_1D, GL_TEXTURE_1D_ARRAY, GL_TEXTURE_2D, |
| GL_TEXTURE_RECTANGLE, GL_TEXTURE_CUBE_MAP, GL_TEXTURE_CUBE_MAP_ARRAY, |
| GL_TEXTURE_2D_ARRAY, GL_TEXTURE_3D }; |
| |
| glw::GLuint targets_count = sizeof(targets) / sizeof(targets[0]); |
| |
| for (glw::GLuint i = 0; i < targets_count; ++i) |
| { |
| prepare(targets[i], false); |
| |
| is_ok &= check(targets[i], false); |
| |
| clean(); |
| } |
| |
| /* Compressed textures tested targets. */ |
| glw::GLenum compressed_targets[] = { GL_TEXTURE_2D, GL_TEXTURE_CUBE_MAP, GL_TEXTURE_CUBE_MAP_ARRAY, |
| GL_TEXTURE_2D_ARRAY }; |
| |
| glw::GLuint compressed_targets_count = sizeof(compressed_targets) / sizeof(compressed_targets[0]); |
| |
| for (glw::GLuint i = 0; i < compressed_targets_count; ++i) |
| { |
| prepare(compressed_targets[i], true); |
| |
| is_ok &= check(compressed_targets[i], true); |
| |
| clean(); |
| } |
| } |
| } |
| catch (...) |
| { |
| m_testCtx.getLog() << tcu::TestLog::Message << "Test error has occured." << tcu::TestLog::EndMessage; |
| |
| is_ok = false; |
| test_error = true; |
| |
| clean(); |
| } |
| |
| /* Result's setup. */ |
| if (is_ok) |
| { |
| m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass"); |
| } |
| else |
| { |
| if (test_error) |
| { |
| m_testCtx.setTestResult(QP_TEST_RESULT_INTERNAL_ERROR, "Error"); |
| } |
| else |
| { |
| m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail"); |
| } |
| } |
| |
| return STOP; |
| } |
| |
| /** Prepare source texture for the test. |
| * |
| * @param [in] target Target of the texture to be prepared. |
| * @param [in] is_compressed Flag indicating that texture shall be compressed (true) or uncompressed (false). |
| */ |
| void gl4cts::GetTextureSubImage::Functional::prepare(glw::GLenum target, bool is_compressed) |
| { |
| /* OpenGL functions access point. */ |
| const glw::Functions& gl = m_context.getRenderContext().getFunctions(); |
| |
| /* Generate and bind texture. */ |
| gl.genTextures(1, &m_texture); |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glGenTextures call failed."); |
| |
| gl.bindTexture(target, m_texture); |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture call failed."); |
| |
| /* Upload data to the texture. */ |
| if (is_compressed) |
| { |
| /* Upload compressed texture. */ |
| switch (target) |
| { |
| case GL_TEXTURE_2D: |
| gl.compressedTexImage2D(target, 0, GL_COMPRESSED_RGBA_BPTC_UNORM, s_texture_data_width, s_texture_data_height, 0, |
| s_texture_data_compressed_size / s_texture_data_depth, s_texture_data_compressed); |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glCompressedTexImage2D call failed."); |
| break; |
| case GL_TEXTURE_CUBE_MAP: |
| gl.compressedTexImage2D( |
| GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_COMPRESSED_RGBA_BPTC_UNORM, s_texture_data_width, s_texture_data_height, |
| 0, s_texture_data_compressed_size / s_texture_data_depth, |
| &s_texture_data_compressed[0 * s_texture_data_compressed_size / s_texture_data_depth]); |
| gl.compressedTexImage2D( |
| GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_COMPRESSED_RGBA_BPTC_UNORM, s_texture_data_width, s_texture_data_height, |
| 0, s_texture_data_compressed_size / s_texture_data_depth, |
| &s_texture_data_compressed[1 * s_texture_data_compressed_size / s_texture_data_depth]); |
| gl.compressedTexImage2D( |
| GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_COMPRESSED_RGBA_BPTC_UNORM, s_texture_data_width, s_texture_data_height, |
| 0, s_texture_data_compressed_size / s_texture_data_depth, |
| &s_texture_data_compressed[2 * s_texture_data_compressed_size / s_texture_data_depth]); |
| gl.compressedTexImage2D( |
| GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_COMPRESSED_RGBA_BPTC_UNORM, s_texture_data_width, s_texture_data_height, |
| 0, s_texture_data_compressed_size / s_texture_data_depth, |
| &s_texture_data_compressed[3 * s_texture_data_compressed_size / s_texture_data_depth]); |
| gl.compressedTexImage2D( |
| GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_COMPRESSED_RGBA_BPTC_UNORM, s_texture_data_width, s_texture_data_height, |
| 0, s_texture_data_compressed_size / s_texture_data_depth, |
| &s_texture_data_compressed[4 * s_texture_data_compressed_size / s_texture_data_depth]); |
| gl.compressedTexImage2D( |
| GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_COMPRESSED_RGBA_BPTC_UNORM, s_texture_data_width, s_texture_data_height, |
| 0, s_texture_data_compressed_size / s_texture_data_depth, |
| &s_texture_data_compressed[5 * s_texture_data_compressed_size / s_texture_data_depth]); |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glCompressedTexImage2D call failed."); |
| break; |
| case GL_TEXTURE_CUBE_MAP_ARRAY: |
| gl.compressedTexImage3D(target, 0, GL_COMPRESSED_RGBA_BPTC_UNORM, s_texture_data_width, s_texture_data_height, 6, |
| 0, s_texture_data_compressed_size / s_texture_data_depth * 6, |
| s_texture_data_compressed); |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glCompressedTexImage3D call failed."); |
| break; |
| case GL_TEXTURE_2D_ARRAY: |
| gl.compressedTexImage3D(target, 0, GL_COMPRESSED_RGBA_BPTC_UNORM, s_texture_data_width, s_texture_data_height, |
| s_texture_data_depth, 0, s_texture_data_compressed_size, s_texture_data_compressed); |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glCompressedTexImage3D call failed."); |
| break; |
| default: |
| throw 0; |
| }; |
| } |
| else |
| { |
| /* Upload uncompressed texture. */ |
| switch (target) |
| { |
| case GL_TEXTURE_1D: |
| gl.texImage1D(target, 0, GL_RGBA8, s_texture_data_width, 0, GL_RGBA, GL_UNSIGNED_BYTE, s_texture_data); |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glTexImage1D call failed."); |
| break; |
| case GL_TEXTURE_1D_ARRAY: |
| case GL_TEXTURE_2D: |
| case GL_TEXTURE_RECTANGLE: |
| gl.texImage2D(target, 0, GL_RGBA8, s_texture_data_width, s_texture_data_height, 0, GL_RGBA, |
| GL_UNSIGNED_BYTE, s_texture_data); |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glTexImage2D call failed."); |
| break; |
| case GL_TEXTURE_CUBE_MAP: |
| gl.texImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGBA8, s_texture_data_width, s_texture_data_height, 0, |
| GL_RGBA, GL_UNSIGNED_BYTE, |
| &s_texture_data[0 * s_texture_data_width * s_texture_data_height * 4 /* RGBA */]); |
| gl.texImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGBA8, s_texture_data_width, s_texture_data_height, 0, |
| GL_RGBA, GL_UNSIGNED_BYTE, |
| &s_texture_data[1 * s_texture_data_width * s_texture_data_height * 4 /* RGBA */]); |
| gl.texImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGBA8, s_texture_data_width, s_texture_data_height, 0, |
| GL_RGBA, GL_UNSIGNED_BYTE, |
| &s_texture_data[2 * s_texture_data_width * s_texture_data_height * 4 /* RGBA */]); |
| gl.texImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGBA8, s_texture_data_width, s_texture_data_height, 0, |
| GL_RGBA, GL_UNSIGNED_BYTE, |
| &s_texture_data[3 * s_texture_data_width * s_texture_data_height * 4 /* RGBA */]); |
| gl.texImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGBA8, s_texture_data_width, s_texture_data_height, 0, |
| GL_RGBA, GL_UNSIGNED_BYTE, |
| &s_texture_data[4 * s_texture_data_width * s_texture_data_height * 4 /* RGBA */]); |
| gl.texImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGBA8, s_texture_data_width, s_texture_data_height, 0, |
| GL_RGBA, GL_UNSIGNED_BYTE, |
| &s_texture_data[5 * s_texture_data_width * s_texture_data_height * 4 /* RGBA */]); |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glTexImage2D call failed."); |
| break; |
| case GL_TEXTURE_CUBE_MAP_ARRAY: |
| gl.texImage3D(target, 0, GL_RGBA8, s_texture_data_width, s_texture_data_height, 6, 0, GL_RGBA, |
| GL_UNSIGNED_BYTE, s_texture_data); |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glTexImage3D call failed."); |
| break; |
| case GL_TEXTURE_2D_ARRAY: |
| case GL_TEXTURE_3D: |
| gl.texImage3D(target, 0, GL_RGBA8, s_texture_data_width, s_texture_data_height, s_texture_data_depth, 0, |
| GL_RGBA, GL_UNSIGNED_BYTE, s_texture_data); |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glTexImage3D call failed."); |
| break; |
| default: |
| throw 0; |
| }; |
| } |
| } |
| |
| /** Test that Get(Compressed)TextureSubImage resturns expected texture data. |
| * |
| * @param [in] target Target of the texture to be prepared. |
| * @param [in] is_compressed Flag indicating that texture shall be compressed (true) or uncompressed (false). |
| * |
| * @return True if test succeeded, false otherwise. |
| */ |
| bool gl4cts::GetTextureSubImage::Functional::check(glw::GLenum target, bool is_compressed) |
| { |
| /* OpenGL functions access point. */ |
| const glw::Functions& gl = m_context.getRenderContext().getFunctions(); |
| |
| /* Arguments setup (depends on dimmension) */ |
| glw::GLint x_offset = s_texture_data_width / 2 /* half */; |
| glw::GLint width = s_texture_data_width / 2 /* half */; |
| |
| glw::GLint y_offset = 0; |
| glw::GLint height = 1; |
| |
| glw::GLint z_offset = 0; |
| glw::GLint depth = 1; |
| |
| /* For 2 and 3 -dimensional textures setup y-direction. */ |
| if (GL_TEXTURE_1D != target) |
| { |
| y_offset = s_texture_data_height / 2 /* half */; |
| height = s_texture_data_height / 2 /* half */; |
| } |
| |
| /* For 3-dimensional textures setup z-direction. */ |
| if ((GL_TEXTURE_3D == target) || (GL_TEXTURE_2D_ARRAY == target)) |
| { |
| z_offset = s_texture_data_depth / 2 /* half */; |
| depth = s_texture_data_depth / 2 /* half */; |
| } |
| |
| /* For cube-map texture stup 6-cube faces. */ |
| if ((GL_TEXTURE_CUBE_MAP == target) || (GL_TEXTURE_CUBE_MAP_ARRAY == target)) |
| { |
| z_offset = 3; /* half of cube map */ |
| depth = 3; /* half of cube map */ |
| } |
| |
| /* Setup number of components. */ |
| glw::GLint number_of_components = 0; |
| |
| if (is_compressed) |
| { |
| number_of_components = 16; /* 128 bit block of 4x4 compressed pixels. */ |
| } |
| else |
| { |
| number_of_components = 4; /* RGBA components. */ |
| } |
| |
| /* Setup size. */ |
| glw::GLsizei size = 0; |
| |
| /* Iterate over pixels. */ |
| glw::GLint x_block = 1; |
| glw::GLint y_block = 1; |
| |
| if (is_compressed) |
| { |
| /* Iterate over 4x4 compressed pixel block. */ |
| x_block = 4; |
| y_block = 4; |
| |
| size = static_cast<glw::GLsizei>((width / x_block) * (height / y_block) * depth * number_of_components * |
| sizeof(glw::GLubyte)); |
| } |
| else |
| { |
| size = static_cast<glw::GLsizei>(width * height * depth * number_of_components * sizeof(glw::GLubyte)); |
| } |
| |
| /* Storage for fetched texturte. */ |
| glw::GLubyte* texture_data = new glw::GLubyte[size]; |
| |
| if (DE_NULL == texture_data) |
| { |
| throw 0; |
| } |
| |
| /* Fetching texture. */ |
| if (is_compressed) |
| { |
| m_gl_GetCompressedTextureSubImage(m_texture, 0, x_offset, y_offset, z_offset, width, height, depth, size, |
| texture_data); |
| } |
| else |
| { |
| m_gl_GetTextureSubImage(m_texture, 0, x_offset, y_offset, z_offset, width, height, depth, GL_RGBA, |
| GL_UNSIGNED_BYTE, size, texture_data); |
| } |
| |
| /* Comprae fetched texture with reference. */ |
| glw::GLint error = gl.getError(); |
| |
| bool is_ok = true; |
| |
| if (GL_NO_ERROR == error) |
| { |
| for (glw::GLint k = 0; k < depth; ++k) |
| { |
| for (glw::GLint j = 0; j < height / y_block; ++j) |
| { |
| for (glw::GLint i = 0; i < width / x_block; ++i) |
| { |
| for (glw::GLint c = 0; c < number_of_components; ++c) /* RGBA components iterating */ |
| { |
| glw::GLuint reference_data_position = |
| (i + (x_offset / x_block)) * number_of_components + |
| (j + (y_offset / y_block)) * s_texture_data_width / x_block * number_of_components + |
| (k + z_offset) * s_texture_data_width / x_block * s_texture_data_height / y_block * |
| number_of_components + |
| c; |
| |
| glw::GLuint tested_data_position = |
| i * number_of_components + j * width / x_block * number_of_components + |
| k * width / x_block * height / y_block * number_of_components + c; |
| |
| glw::GLubyte reference_value = (is_compressed) ? |
| s_texture_data_compressed[reference_data_position] : |
| s_texture_data[reference_data_position]; |
| glw::GLubyte tested_value = texture_data[tested_data_position]; |
| |
| if (reference_value != tested_value) |
| { |
| is_ok = false; |
| break; |
| } |
| } |
| } |
| } |
| } |
| } |
| else |
| { |
| /* GL error. */ |
| delete[] texture_data; |
| throw 0; |
| } |
| |
| /* Cleanup. */ |
| delete[] texture_data; |
| |
| /* Error reporting. */ |
| if (!is_ok) |
| { |
| m_testCtx.getLog() << tcu::TestLog::Message << "Functional test of " |
| << ((is_compressed) ? "glGetCompressedTextureSubImage " : "glGetTextureSubImage ") |
| << "function has failed with target " << glu::getTextureTargetStr(target) << "." |
| << tcu::TestLog::EndMessage; |
| } |
| |
| /* Return result. */ |
| return is_ok; |
| } |
| |
| /** Clean texture. */ |
| void gl4cts::GetTextureSubImage::Functional::clean() |
| { |
| /* OpenGL functions access point. */ |
| const glw::Functions& gl = m_context.getRenderContext().getFunctions(); |
| |
| if (m_texture) |
| { |
| gl.deleteTextures(1, &m_texture); |
| |
| m_texture = 0; |
| } |
| } |
| |
| /** RGBA 8x8x8 pixels in size source texture for testing GetTextureSubImage. */ |
| const glw::GLubyte gl4cts::GetTextureSubImage::Functional::s_texture_data[] = { |
| 0, 0, 0, 0, 0, 0, 32, 1, 0, 0, 64, 2, 0, 0, 96, 3, |
| 0, 0, 128, 4, 0, 0, 160, 5, 0, 0, 192, 6, 0, 0, 224, 7, |
| |
| 0, 32, 0, 1, 0, 32, 32, 2, 0, 32, 64, 3, 0, 32, 96, 4, |
| 0, 32, 128, 5, 0, 32, 160, 6, 0, 32, 192, 7, 0, 32, 224, 8, |
| |
| 0, 64, 0, 2, 0, 64, 32, 3, 0, 64, 64, 4, 0, 64, 96, 5, |
| 0, 64, 128, 6, 0, 64, 160, 7, 0, 64, 192, 8, 0, 64, 224, 9, |
| |
| 0, 96, 0, 3, 0, 96, 32, 4, 0, 96, 64, 5, 0, 96, 96, 6, |
| 0, 96, 128, 7, 0, 96, 160, 8, 0, 96, 192, 9, 0, 96, 224, 10, |
| |
| 0, 128, 0, 4, 0, 128, 32, 5, 0, 128, 64, 6, 0, 128, 96, 7, |
| 0, 128, 128, 8, 0, 128, 160, 9, 0, 128, 192, 10, 0, 128, 224, 11, |
| |
| 0, 160, 0, 5, 0, 160, 32, 6, 0, 160, 64, 7, 0, 160, 96, 8, |
| 0, 160, 128, 9, 0, 160, 160, 10, 0, 160, 192, 11, 0, 160, 224, 12, |
| |
| 0, 192, 0, 6, 0, 192, 32, 7, 0, 192, 64, 8, 0, 192, 96, 9, |
| 0, 192, 128, 10, 0, 192, 160, 11, 0, 192, 192, 12, 0, 192, 224, 13, |
| |
| 0, 224, 0, 7, 0, 224, 32, 8, 0, 224, 64, 9, 0, 224, 96, 10, |
| 0, 224, 128, 11, 0, 224, 160, 12, 0, 224, 192, 13, 0, 224, 224, 14, |
| |
| 32, 0, 0, 1, 32, 0, 32, 2, 32, 0, 64, 3, 32, 0, 96, 4, |
| 32, 0, 128, 5, 32, 0, 160, 6, 32, 0, 192, 7, 32, 0, 224, 8, |
| |
| 32, 32, 0, 2, 32, 32, 32, 3, 32, 32, 64, 4, 32, 32, 96, 5, |
| 32, 32, 128, 6, 32, 32, 160, 7, 32, 32, 192, 8, 32, 32, 224, 9, |
| |
| 32, 64, 0, 3, 32, 64, 32, 4, 32, 64, 64, 5, 32, 64, 96, 6, |
| 32, 64, 128, 7, 32, 64, 160, 8, 32, 64, 192, 9, 32, 64, 224, 10, |
| |
| 32, 96, 0, 4, 32, 96, 32, 5, 32, 96, 64, 6, 32, 96, 96, 7, |
| 32, 96, 128, 8, 32, 96, 160, 9, 32, 96, 192, 10, 32, 96, 224, 11, |
| |
| 32, 128, 0, 5, 32, 128, 32, 6, 32, 128, 64, 7, 32, 128, 96, 8, |
| 32, 128, 128, 9, 32, 128, 160, 10, 32, 128, 192, 11, 32, 128, 224, 12, |
| |
| 32, 160, 0, 6, 32, 160, 32, 7, 32, 160, 64, 8, 32, 160, 96, 9, |
| 32, 160, 128, 10, 32, 160, 160, 11, 32, 160, 192, 12, 32, 160, 224, 13, |
| |
| 32, 192, 0, 7, 32, 192, 32, 8, 32, 192, 64, 9, 32, 192, 96, 10, |
| 32, 192, 128, 11, 32, 192, 160, 12, 32, 192, 192, 13, 32, 192, 224, 14, |
| |
| 32, 224, 0, 8, 32, 224, 32, 9, 32, 224, 64, 10, 32, 224, 96, 11, |
| 32, 224, 128, 12, 32, 224, 160, 13, 32, 224, 192, 14, 32, 224, 224, 15, |
| |
| 64, 0, 0, 2, 64, 0, 32, 3, 64, 0, 64, 4, 64, 0, 96, 5, |
| 64, 0, 128, 6, 64, 0, 160, 7, 64, 0, 192, 8, 64, 0, 224, 9, |
| |
| 64, 32, 0, 3, 64, 32, 32, 4, 64, 32, 64, 5, 64, 32, 96, 6, |
| 64, 32, 128, 7, 64, 32, 160, 8, 64, 32, 192, 9, 64, 32, 224, 10, |
| |
| 64, 64, 0, 4, 64, 64, 32, 5, 64, 64, 64, 6, 64, 64, 96, 7, |
| 64, 64, 128, 8, 64, 64, 160, 9, 64, 64, 192, 10, 64, 64, 224, 11, |
| |
| 64, 96, 0, 5, 64, 96, 32, 6, 64, 96, 64, 7, 64, 96, 96, 8, |
| 64, 96, 128, 9, 64, 96, 160, 10, 64, 96, 192, 11, 64, 96, 224, 12, |
| |
| 64, 128, 0, 6, 64, 128, 32, 7, 64, 128, 64, 8, 64, 128, 96, 9, |
| 64, 128, 128, 10, 64, 128, 160, 11, 64, 128, 192, 12, 64, 128, 224, 13, |
| |
| 64, 160, 0, 7, 64, 160, 32, 8, 64, 160, 64, 9, 64, 160, 96, 10, |
| 64, 160, 128, 11, 64, 160, 160, 12, 64, 160, 192, 13, 64, 160, 224, 14, |
| |
| 64, 192, 0, 8, 64, 192, 32, 9, 64, 192, 64, 10, 64, 192, 96, 11, |
| 64, 192, 128, 12, 64, 192, 160, 13, 64, 192, 192, 14, 64, 192, 224, 15, |
| |
| 64, 224, 0, 9, 64, 224, 32, 10, 64, 224, 64, 11, 64, 224, 96, 12, |
| 64, 224, 128, 13, 64, 224, 160, 14, 64, 224, 192, 15, 64, 224, 224, 16, |
| |
| 96, 0, 0, 3, 96, 0, 32, 4, 96, 0, 64, 5, 96, 0, 96, 6, |
| 96, 0, 128, 7, 96, 0, 160, 8, 96, 0, 192, 9, 96, 0, 224, 10, |
| |
| 96, 32, 0, 4, 96, 32, 32, 5, 96, 32, 64, 6, 96, 32, 96, 7, |
| 96, 32, 128, 8, 96, 32, 160, 9, 96, 32, 192, 10, 96, 32, 224, 11, |
| |
| 96, 64, 0, 5, 96, 64, 32, 6, 96, 64, 64, 7, 96, 64, 96, 8, |
| 96, 64, 128, 9, 96, 64, 160, 10, 96, 64, 192, 11, 96, 64, 224, 12, |
| |
| 96, 96, 0, 6, 96, 96, 32, 7, 96, 96, 64, 8, 96, 96, 96, 9, |
| 96, 96, 128, 10, 96, 96, 160, 11, 96, 96, 192, 12, 96, 96, 224, 13, |
| |
| 96, 128, 0, 7, 96, 128, 32, 8, 96, 128, 64, 9, 96, 128, 96, 10, |
| 96, 128, 128, 11, 96, 128, 160, 12, 96, 128, 192, 13, 96, 128, 224, 14, |
| |
| 96, 160, 0, 8, 96, 160, 32, 9, 96, 160, 64, 10, 96, 160, 96, 11, |
| 96, 160, 128, 12, 96, 160, 160, 13, 96, 160, 192, 14, 96, 160, 224, 15, |
| |
| 96, 192, 0, 9, 96, 192, 32, 10, 96, 192, 64, 11, 96, 192, 96, 12, |
| 96, 192, 128, 13, 96, 192, 160, 14, 96, 192, 192, 15, 96, 192, 224, 16, |
| |
| 96, 224, 0, 10, 96, 224, 32, 11, 96, 224, 64, 12, 96, 224, 96, 13, |
| 96, 224, 128, 14, 96, 224, 160, 15, 96, 224, 192, 16, 96, 224, 224, 17, |
| |
| 128, 0, 0, 4, 128, 0, 32, 5, 128, 0, 64, 6, 128, 0, 96, 7, |
| 128, 0, 128, 8, 128, 0, 160, 9, 128, 0, 192, 10, 128, 0, 224, 11, |
| |
| 128, 32, 0, 5, 128, 32, 32, 6, 128, 32, 64, 7, 128, 32, 96, 8, |
| 128, 32, 128, 9, 128, 32, 160, 10, 128, 32, 192, 11, 128, 32, 224, 12, |
| |
| 128, 64, 0, 6, 128, 64, 32, 7, 128, 64, 64, 8, 128, 64, 96, 9, |
| 128, 64, 128, 10, 128, 64, 160, 11, 128, 64, 192, 12, 128, 64, 224, 13, |
| |
| 128, 96, 0, 7, 128, 96, 32, 8, 128, 96, 64, 9, 128, 96, 96, 10, |
| 128, 96, 128, 11, 128, 96, 160, 12, 128, 96, 192, 13, 128, 96, 224, 14, |
| |
| 128, 128, 0, 8, 128, 128, 32, 9, 128, 128, 64, 10, 128, 128, 96, 11, |
| 128, 128, 128, 12, 128, 128, 160, 13, 128, 128, 192, 14, 128, 128, 224, 15, |
| |
| 128, 160, 0, 9, 128, 160, 32, 10, 128, 160, 64, 11, 128, 160, 96, 12, |
| 128, 160, 128, 13, 128, 160, 160, 14, 128, 160, 192, 15, 128, 160, 224, 16, |
| |
| 128, 192, 0, 10, 128, 192, 32, 11, 128, 192, 64, 12, 128, 192, 96, 13, |
| 128, 192, 128, 14, 128, 192, 160, 15, 128, 192, 192, 16, 128, 192, 224, 17, |
| |
| 128, 224, 0, 11, 128, 224, 32, 12, 128, 224, 64, 13, 128, 224, 96, 14, |
| 128, 224, 128, 15, 128, 224, 160, 16, 128, 224, 192, 17, 128, 224, 224, 18, |
| |
| 160, 0, 0, 5, 160, 0, 32, 6, 160, 0, 64, 7, 160, 0, 96, 8, |
| 160, 0, 128, 9, 160, 0, 160, 10, 160, 0, 192, 11, 160, 0, 224, 12, |
| |
| 160, 32, 0, 6, 160, 32, 32, 7, 160, 32, 64, 8, 160, 32, 96, 9, |
| 160, 32, 128, 10, 160, 32, 160, 11, 160, 32, 192, 12, 160, 32, 224, 13, |
| |
| 160, 64, 0, 7, 160, 64, 32, 8, 160, 64, 64, 9, 160, 64, 96, 10, |
| 160, 64, 128, 11, 160, 64, 160, 12, 160, 64, 192, 13, 160, 64, 224, 14, |
| |
| 160, 96, 0, 8, 160, 96, 32, 9, 160, 96, 64, 10, 160, 96, 96, 11, |
| 160, 96, 128, 12, 160, 96, 160, 13, 160, 96, 192, 14, 160, 96, 224, 15, |
| |
| 160, 128, 0, 9, 160, 128, 32, 10, 160, 128, 64, 11, 160, 128, 96, 12, |
| 160, 128, 128, 13, 160, 128, 160, 14, 160, 128, 192, 15, 160, 128, 224, 16, |
| |
| 160, 160, 0, 10, 160, 160, 32, 11, 160, 160, 64, 12, 160, 160, 96, 13, |
| 160, 160, 128, 14, 160, 160, 160, 15, 160, 160, 192, 16, 160, 160, 224, 17, |
| |
| 160, 192, 0, 11, 160, 192, 32, 12, 160, 192, 64, 13, 160, 192, 96, 14, |
| 160, 192, 128, 15, 160, 192, 160, 16, 160, 192, 192, 17, 160, 192, 224, 18, |
| |
| 160, 224, 0, 12, 160, 224, 32, 13, 160, 224, 64, 14, 160, 224, 96, 15, |
| 160, 224, 128, 16, 160, 224, 160, 17, 160, 224, 192, 18, 160, 224, 224, 19, |
| |
| 192, 0, 0, 6, 192, 0, 32, 7, 192, 0, 64, 8, 192, 0, 96, 9, |
| 192, 0, 128, 10, 192, 0, 160, 11, 192, 0, 192, 12, 192, 0, 224, 13, |
| |
| 192, 32, 0, 7, 192, 32, 32, 8, 192, 32, 64, 9, 192, 32, 96, 10, |
| 192, 32, 128, 11, 192, 32, 160, 12, 192, 32, 192, 13, 192, 32, 224, 14, |
| |
| 192, 64, 0, 8, 192, 64, 32, 9, 192, 64, 64, 10, 192, 64, 96, 11, |
| 192, 64, 128, 12, 192, 64, 160, 13, 192, 64, 192, 14, 192, 64, 224, 15, |
| |
| 192, 96, 0, 9, 192, 96, 32, 10, 192, 96, 64, 11, 192, 96, 96, 12, |
| 192, 96, 128, 13, 192, 96, 160, 14, 192, 96, 192, 15, 192, 96, 224, 16, |
| |
| 192, 128, 0, 10, 192, 128, 32, 11, 192, 128, 64, 12, 192, 128, 96, 13, |
| 192, 128, 128, 14, 192, 128, 160, 15, 192, 128, 192, 16, 192, 128, 224, 17, |
| |
| 192, 160, 0, 11, 192, 160, 32, 12, 192, 160, 64, 13, 192, 160, 96, 14, |
| 192, 160, 128, 15, 192, 160, 160, 16, 192, 160, 192, 17, 192, 160, 224, 18, |
| |
| 192, 192, 0, 12, 192, 192, 32, 13, 192, 192, 64, 14, 192, 192, 96, 15, |
| 192, 192, 128, 16, 192, 192, 160, 17, 192, 192, 192, 18, 192, 192, 224, 19, |
| |
| 192, 224, 0, 13, 192, 224, 32, 14, 192, 224, 64, 15, 192, 224, 96, 16, |
| 192, 224, 128, 17, 192, 224, 160, 18, 192, 224, 192, 19, 192, 224, 224, 20, |
| |
| 224, 0, 0, 7, 224, 0, 32, 8, 224, 0, 64, 9, 224, 0, 96, 10, |
| 224, 0, 128, 11, 224, 0, 160, 12, 224, 0, 192, 13, 224, 0, 224, 14, |
| |
| 224, 32, 0, 8, 224, 32, 32, 9, 224, 32, 64, 10, 224, 32, 96, 11, |
| 224, 32, 128, 12, 224, 32, 160, 13, 224, 32, 192, 14, 224, 32, 224, 15, |
| |
| 224, 64, 0, 9, 224, 64, 32, 10, 224, 64, 64, 11, 224, 64, 96, 12, |
| 224, 64, 128, 13, 224, 64, 160, 14, 224, 64, 192, 15, 224, 64, 224, 16, |
| |
| 224, 96, 0, 10, 224, 96, 32, 11, 224, 96, 64, 12, 224, 96, 96, 13, |
| 224, 96, 128, 14, 224, 96, 160, 15, 224, 96, 192, 16, 224, 96, 224, 17, |
| |
| 224, 128, 0, 11, 224, 128, 32, 12, 224, 128, 64, 13, 224, 128, 96, 14, |
| 224, 128, 128, 15, 224, 128, 160, 16, 224, 128, 192, 17, 224, 128, 224, 18, |
| |
| 224, 160, 0, 12, 224, 160, 32, 13, 224, 160, 64, 14, 224, 160, 96, 15, |
| 224, 160, 128, 16, 224, 160, 160, 17, 224, 160, 192, 18, 224, 160, 224, 19, |
| |
| 224, 192, 0, 13, 224, 192, 32, 14, 224, 192, 64, 15, 224, 192, 96, 16, |
| 224, 192, 128, 17, 224, 192, 160, 18, 224, 192, 192, 19, 224, 192, 224, 20, |
| |
| 224, 224, 0, 14, 224, 224, 32, 15, 224, 224, 64, 16, 224, 224, 96, 17, |
| 224, 224, 128, 18, 224, 224, 160, 19, 224, 224, 192, 20, 224, 224, 224, 21 |
| }; |
| |
| const glw::GLsizei gl4cts::GetTextureSubImage::Functional::s_texture_data_size = |
| sizeof(s_texture_data); //!< Size of the uncompressed texture. |
| |
| const glw::GLsizei gl4cts::GetTextureSubImage::Functional::s_texture_data_width = |
| 8; //!< Width of compressed and uncompressed textures. |
| const glw::GLsizei gl4cts::GetTextureSubImage::Functional::s_texture_data_height = |
| 8; //!< Height of compressed and uncompressed textures. |
| const glw::GLsizei gl4cts::GetTextureSubImage::Functional::s_texture_data_depth = |
| 8; //!< Depth of compressed and uncompressed textures. |
| |
| /** ETC2 8x8x8(layers) pixels in size source texture for testing GetCompressedTextureSubImage. */ |
| const glw::GLubyte gl4cts::GetTextureSubImage::Functional::s_texture_data_compressed[] = { |
| /* Layer 0 */ |
| 0x80, 0x80, 0x4, 0x2, 0x1, 0x0, 0x10, 0x0, 0x80, 0x81, 0x4, 0x2, 0x1, 0xf8, 0x10, 0x20, |
| 0x81, 0x80, 0x4, 0x2, 0x81, 0x0, 0x1f, 0xc0, 0x81, 0x81, 0x4, 0x2, 0x81, 0xf8, 0x1f, 0xe0, |
| 0x80, 0x80, 0x5, 0x2, 0x1, 0x0, 0x10, 0x0, 0x80, 0x81, 0x5, 0x2, 0x1, 0xf8, 0x10, 0x20, |
| 0x81, 0x80, 0x5, 0x2, 0x81, 0x0, 0x1f, 0xc0, 0x81, 0x81, 0x5, 0x2, 0x81, 0xf8, 0x1f, 0xe0, |
| |
| /* Layer 1 */ |
| 0x90, 0x80, 0x4, 0x12, 0x1, 0x1, 0x10, 0x0, 0x90, 0x81, 0x4, 0x12, 0x1, 0xf9, 0x10, 0x20, |
| 0x91, 0x80, 0x4, 0x12, 0x81, 0x1, 0x1f, 0xc0, 0x91, 0x81, 0x4, 0x12, 0x81, 0xf9, 0x1f, 0xe0, |
| 0x90, 0x80, 0x5, 0x12, 0x1, 0x1, 0x10, 0x0, 0x90, 0x81, 0x5, 0x12, 0x1, 0xf9, 0x10, 0x20, |
| 0x91, 0x80, 0x5, 0x12, 0x81, 0x1, 0x1f, 0xc0, 0x91, 0x81, 0x5, 0x12, 0x81, 0xf9, 0x1f, 0xe0, |
| |
| /* Layer 2 */ |
| 0xa0, 0x80, 0x4, 0x22, 0x1, 0x2, 0x10, 0x0, 0xa0, 0x81, 0x4, 0x22, 0x1, 0xfa, 0x10, 0x20, |
| 0xa1, 0x80, 0x4, 0x22, 0x81, 0x2, 0x1f, 0xc0, 0xa1, 0x81, 0x4, 0x22, 0x81, 0xfa, 0x1f, 0xe0, |
| 0xa0, 0x80, 0x5, 0x22, 0x1, 0x2, 0x10, 0x0, 0xa0, 0x81, 0x5, 0x22, 0x1, 0xfa, 0x10, 0x20, |
| 0xa1, 0x80, 0x5, 0x22, 0x81, 0x2, 0x1f, 0xc0, 0xa1, 0x81, 0x5, 0x22, 0x81, 0xfa, 0x1f, 0xe0, |
| |
| /* Layer 3 */ |
| 0xb0, 0x80, 0x4, 0x32, 0x1, 0x3, 0x10, 0x0, 0xb0, 0x81, 0x4, 0x32, 0x1, 0xfb, 0x10, 0x20, |
| 0xb1, 0x80, 0x4, 0x32, 0x81, 0x3, 0x1f, 0xc0, 0xb1, 0x81, 0x4, 0x32, 0x81, 0xfb, 0x1f, 0xe0, |
| 0xb0, 0x80, 0x5, 0x32, 0x1, 0x3, 0x10, 0x0, 0xb0, 0x81, 0x5, 0x32, 0x1, 0xfb, 0x10, 0x20, |
| 0xb1, 0x80, 0x5, 0x32, 0x81, 0x3, 0x1f, 0xc0, 0xb1, 0x81, 0x5, 0x32, 0x81, 0xfb, 0x1f, 0xe0, |
| |
| /* Layer 4 */ |
| 0x40, 0x80, 0x4, 0x42, 0x1, 0x4, 0x10, 0x0, 0x40, 0x81, 0x4, 0x42, 0x1, 0xfc, 0x10, 0x20, |
| 0x41, 0x80, 0x4, 0x42, 0x81, 0x4, 0x1f, 0xc0, 0x41, 0x81, 0x4, 0x42, 0x81, 0xfc, 0x1f, 0xe0, |
| 0x40, 0x80, 0x5, 0x42, 0x1, 0x4, 0x10, 0x0, 0x40, 0x81, 0x5, 0x42, 0x1, 0xfc, 0x10, 0x20, |
| 0x41, 0x80, 0x5, 0x42, 0x81, 0x4, 0x1f, 0xc0, 0x41, 0x81, 0x5, 0x42, 0x81, 0xfc, 0x1f, 0xe0, |
| |
| /* Layer 5 */ |
| 0x50, 0x80, 0x4, 0x52, 0x1, 0x5, 0x10, 0x0, 0x50, 0x81, 0x4, 0x52, 0x1, 0xfd, 0x10, 0x20, |
| 0x51, 0x80, 0x4, 0x52, 0x81, 0x5, 0x1f, 0xc0, 0x51, 0x81, 0x4, 0x52, 0x81, 0xfd, 0x1f, 0xe0, |
| 0x50, 0x80, 0x5, 0x52, 0x1, 0x5, 0x10, 0x0, 0x50, 0x81, 0x5, 0x52, 0x1, 0xfd, 0x10, 0x20, |
| 0x51, 0x80, 0x5, 0x52, 0x81, 0x5, 0x1f, 0xc0, 0x51, 0x81, 0x5, 0x52, 0x81, 0xfd, 0x1f, 0xe0, |
| |
| /* Layer 6 */ |
| 0x5e, 0x80, 0x4, 0x5f, 0x1, 0x5, 0xf0, 0x0, 0x5e, 0x81, 0x4, 0x5f, 0x1, 0xfd, 0xf0, 0x20, |
| 0x5f, 0x80, 0x4, 0x5f, 0x81, 0x5, 0xff, 0xc0, 0x5f, 0x81, 0x4, 0x5f, 0x81, 0xfd, 0xff, 0xe0, |
| 0x5e, 0x80, 0x5, 0x5f, 0x1, 0x5, 0xf0, 0x0, 0x5e, 0x81, 0x5, 0x5f, 0x1, 0xfd, 0xf0, 0x20, |
| 0x5f, 0x80, 0x5, 0x5f, 0x81, 0x5, 0xff, 0xc0, 0x5f, 0x81, 0x5, 0x5f, 0x81, 0xfd, 0xff, 0xe0, |
| |
| /* Layer 7 */ |
| 0x6e, 0x80, 0x4, 0x6f, 0x1, 0x6, 0xf0, 0x0, 0x6e, 0x81, 0x4, 0x6f, 0x1, 0xfe, 0xf0, 0x20, |
| 0x6f, 0x80, 0x4, 0x6f, 0x81, 0x6, 0xff, 0xc0, 0x6f, 0x81, 0x4, 0x6f, 0x81, 0xfe, 0xff, 0xe0, |
| 0x6e, 0x80, 0x5, 0x6f, 0x1, 0x6, 0xf0, 0x0, 0x6e, 0x81, 0x5, 0x6f, 0x1, 0xfe, 0xf0, 0x20, |
| 0x6f, 0x80, 0x5, 0x6f, 0x81, 0x6, 0xff, 0xc0, 0x6f, 0x81, 0x5, 0x6f, 0x81, 0xfe, 0xff, 0xe0 |
| }; |
| |
| const glw::GLsizei gl4cts::GetTextureSubImage::Functional::s_texture_data_compressed_size = |
| sizeof(s_texture_data_compressed); //!< Size of compressed texture. |