blob: ff2c21177fcb311f8aa5bdb72572408234cb7ab4 [file] [log] [blame]
* OpenGL Conformance Test Suite
* -----------------------------
* Copyright (c) 2014-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
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* See the License for the specific language governing permissions and
* limitations under the License.
*/ /*!
* \file
* \brief
*/ /*-------------------------------------------------------------------*/
* \file esextcTextureCubeMapArraySubImage3D.hpp
* \brief Texture Cube Map Array SubImage3D (Test 5)
*/ /*-------------------------------------------------------------------*/
#include "../esextcTestCaseBase.hpp"
namespace glcts
/** Implementation of Test 5 from CTS_EXT_texture_cube_map_array. Test description follows:
* Make sure glTexSubImage3D() and glCopyTexSubImage3D() calls work correctly
* for cube-map array textures.
* Category: Functionality tests.
* Priority: Must-have.
* Make sure glTexSubImage3D() and glCopyTexSubImage3D() correctly replace
* a region of a cube-map array texture defined with GL_RGBA32UI internalformat.
* Source data should be defined with the same GL_RGBA32UI internalformat.
* Original cube-map array texture data should be defined as in test case 1.
* The data to be written over layer-face(s) should be distinctively different
* (for instance: the same values could be used with a different component
* ordering).
* The test should use both client-side pointers and data defined in a BO
* bound to GL_PIXEL_UNPACK_BUFFER target.
* Iterate through texture resolutions as described in test 1.
* The following scenarios should be tested:
* a) A single whole layer-face at index 0 should be replaced
* (both functions);
* b) A region of a layer-face at index 0 should be replaced
* (both functions);
* c) 6 layer-faces, making up a single layer, should be replaced
* (glTexSubImage3D() only).
* d) 6 layer-faces, making up two different layers (for instance: three
* last layer-faces of layer 1 and three first layer-faces of layer 2)
* should be replaced (glTexSubImage3D() only).
* e) c) and d), but limited to a quad defined by the following points:
* (width/2, height/2) x (width, height)
* (glTexSubImage3D() only)
* Test four different cube-map array texture resolutions, as described
* in test 1. Both immutable and mutable textures should be checked.
/* Structure holding information which region of the cube map to replace */
struct SubImage3DCopyParams
SubImage3DCopyParams(void) : m_xoffset(0), m_yoffset(0), m_zoffset(0), m_width(0), m_height(0), m_depth(0)
/* Nothing to be done here */
void init(const glw::GLuint xoffset, const glw::GLuint yoffset, const glw::GLuint zoffset, const glw::GLuint width,
const glw::GLuint height, const glw::GLuint depth)
m_xoffset = xoffset;
m_yoffset = yoffset;
m_zoffset = zoffset;
m_width = width;
m_height = height;
m_depth = depth;
glw::GLuint m_xoffset;
glw::GLuint m_yoffset;
glw::GLuint m_zoffset;
glw::GLuint m_width;
glw::GLuint m_height;
glw::GLuint m_depth;
class TextureCubeMapArraySubImage3D : public TestCaseBase
/* Public methods */
TextureCubeMapArraySubImage3D(Context &context, const ExtParameters &extParams, const char *name,
const char *description);
virtual ~TextureCubeMapArraySubImage3D()
virtual IterateResult iterate(void);
virtual void deinit(void);
/* Public static constants */
static const glw::GLuint m_n_components;
static const glw::GLuint m_n_dimensions;
static const glw::GLuint m_n_resolutions;
static const glw::GLuint m_n_storage_type;
/* Protected methods */
void initTest(void);
void configureDataBuffer(glw::GLuint width, glw::GLuint height, glw::GLuint depth,
const SubImage3DCopyParams &copy_params, glw::GLuint clear_value);
void configurePixelUnpackBuffer(const SubImage3DCopyParams &copy_params);
void configureCubeMapArrayTexture(glw::GLuint width, glw::GLuint height, glw::GLuint depth, STORAGE_TYPE storType,
glw::GLuint clear_value);
void clearCubeMapArrayTexture(glw::GLuint width, glw::GLuint height, glw::GLuint depth, glw::GLuint clear_value);
void configure2DTexture(const SubImage3DCopyParams &copy_params);
void testTexSubImage3D(glw::GLuint width, glw::GLuint height, glw::GLuint depth,
const SubImage3DCopyParams &copy_params, glw::GLboolean &test_passed);
void testCopyTexSubImage3D(glw::GLuint width, glw::GLuint height, glw::GLuint depth,
const SubImage3DCopyParams &copy_params, glw::GLboolean &test_passed);
void texSubImage3D(const SubImage3DCopyParams &copy_params, const glw::GLuint *data_pointer);
void copyTexSubImage3D(const SubImage3DCopyParams &copy_params);
bool checkResults(glw::GLuint width, glw::GLuint height, glw::GLuint depth);
void deletePixelUnpackBuffer();
void deleteCubeMapArrayTexture();
void delete2DTexture();
typedef std::vector<glw::GLuint> DataBufferVec;
/* Protected variables */
DataBufferVec m_copy_data_buffer;
DataBufferVec m_expected_data_buffer;
glw::GLuint m_read_fbo_id;
glw::GLuint m_pixel_buffer_id;
glw::GLuint m_tex_cube_map_array_id;
glw::GLuint m_tex_2d_id;
} // namespace glcts