blob: 4965cb9cca187d9a9afff419405754cc0e8a8047 [file] [log] [blame]
#ifndef _GL4CGETTEXTURESUBIMAGETESTS_HPP
#define _GL4CGETTEXTURESUBIMAGETESTS_HPP
/*-------------------------------------------------------------------------
* 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.hpp
* \brief Get Texture Sub Image Tests Suite Interface
*/ /*-------------------------------------------------------------------*/
/* Includes. */
#include "glcTestCase.hpp"
#include "glwDefs.hpp"
#include "tcuDefs.hpp"
#include "glwEnums.hpp"
#include "glwFunctions.hpp"
/* Interface. */
namespace gl4cts
{
namespace GetTextureSubImage
{
/** Tests group for GetTextureSubImage tests.
*
* Following tests will be run:
* - Errors Test
* - Functional Test
*/
class Tests : public deqp::TestCaseGroup
{
public:
Tests(deqp::Context& context);
~Tests(void);
virtual void init(void);
private:
/* Private member functions. */
Tests(const Tests& other);
Tests& operator=(const Tests& other);
};
/* Tests class. */
/** Error Generation Tests
*
* The Errors test verifies that functions glGetTextureSubImage and
* glGetCompressedTextureSubImage generate proper error values if used
* improperly. For reference see OpenGL 4.5 Core Specification chapter
* 8.11.4.
* * Check that GL_INVALID_VALUE error is generated by
* glGetTextureSubImage if texture is not the name of an existing
* texture object.
*
* * Check that GL_INVALID_VALUE error is generated by
* glGetCompressedTextureSubImage if texture is not the name
* of an existingtexture object.
*
* * Check that GL_INVALID_OPERATION error is generated if texture is the
* name of a buffer or multisample texture.
*
* * Check that GL_INVALID_VALUE is generated if xoffset, yoffset or
* zoffset are negative.
*
* * Check 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.
*
* * Check 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.
*
* * Check 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.
*
* * Check that GL_INVALID_OPERATION error is generated if the buffer
* size required to store the requested data is greater than bufSize.
*/
class Errors : public deqp::TestCase
{
public:
Errors(deqp::Context& context);
~Errors(void);
IterateResult iterate(void);
private:
/* Private member variables. */
deqp::Context& m_context;
glw::GLuint m_texture_1D;
glw::GLuint m_texture_1D_array;
glw::GLuint m_texture_2D;
glw::GLuint m_texture_rectangle;
glw::GLuint m_texture_2D_compressed;
glw::GLuint m_texture_2D_multisampled;
glw::GLubyte* m_destination_buffer;
/* Get(Compressed)TextureSubImage function pointer and type declarations. */
typedef void(GLW_APIENTRY* PFNGLGETTEXTURESUBIMAGEPROC)(glw::GLuint texture, glw::GLint level, glw::GLint xoffset,
glw::GLint yoffset, glw::GLint zoffset, glw::GLsizei width,
glw::GLsizei height, glw::GLsizei depth, glw::GLenum format,
glw::GLenum type, glw::GLsizei bufSize, void* pixels);
typedef void(GLW_APIENTRY* PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC)(glw::GLuint texture, glw::GLint level,
glw::GLint xoffset, glw::GLint yoffset,
glw::GLint zoffset, glw::GLsizei width,
glw::GLsizei height, glw::GLsizei depth,
glw::GLsizei bufSize, void* pixels);
PFNGLGETTEXTURESUBIMAGEPROC m_gl_GetTextureSubImage;
PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC m_gl_GetCompressedTextureSubImage;
/* Private member functions. */
void prepare();
bool testExistingTextureObjectError();
bool testBufferOrMultisampledTargetError();
bool testNegativeOffsetError();
bool testBoundsError();
bool testOneDimmensionalTextureErrors();
bool testTwoDimmensionalTextureErrors();
bool testBufferSizeError();
void clean();
/* Private static constants. */
static const glw::GLubyte s_texture_data[];
static const glw::GLuint s_texture_data_size;
static const glw::GLuint s_texture_data_width;
static const glw::GLuint s_texture_data_height;
static const glw::GLubyte s_texture_data_compressed[];
static const glw::GLuint s_texture_data_compressed_size;
static const glw::GLuint s_texture_data_compressed_width;
static const glw::GLuint s_texture_data_compressed_height;
static const glw::GLuint s_destination_buffer_size;
};
/* Errors class. */
/** Functional
*
* The Functional test verifies that functions glGetTextureSubImage and
* glGetCompressedTextureSubImage works properly. The whole test shall be
* constructed as follows:
*
* for each tested function
* for each supported texture target
* prepare and upload texture
* download texture using the function
* compare uploaded texture with downloaded texture
* clean up
*
* where:
* * tested functions are:
* - GetTextureSubImage,
* - GetCompressedTextureSubImage;
* * supported uncompressed texture targets are:
* - GL_TEXTURE_1D,
* - GL_TEXTURE_1D_ARRAY,
* - GL_TEXTURE_2D,
* - GL_TEXTURE_2D_ARRAY,
* - GL_TEXTURE_3D,
* - GL_TEXTURE_CUBE_MAP,
* - GL_TEXTURE_CUBE_MAP_ARRAY,
* - GL_TEXTURE_RECTANGLE;
* * supported compressed texture targets are:
* - GL_TEXTURE_2D,
* - GL_TEXTURE_2D_ARRAY,
* - GL_TEXTURE_CUBE_MAP,
* - GL_TEXTURE_CUBE_MAP_ARRAY;
* * texture internal format shall be GL_RGBA8 and
* GL_COMPRESSED_RGB8_ETC2;
* * use linear dimmension of texture equal to 8;
* * use offset of 4 (if dimmension is available);
* * use width/height/depth of 4 (if dimmension is available).
*/
class Functional : public deqp::TestCase
{
public:
Functional(deqp::Context& context);
~Functional(void);
IterateResult iterate(void);
private:
/* Private member variables. */
deqp::Context& m_context;
glw::GLuint m_texture;
/* Private member functions. */
void prepare(glw::GLenum target, bool is_compressed);
bool check(glw::GLenum target, bool is_compressed);
void clean();
/* Get(Compressed)TextureSubImage function pointer and type declarations. */
typedef void(GLW_APIENTRY* PFNGLGETTEXTURESUBIMAGEPROC)(glw::GLuint texture, glw::GLint level, glw::GLint xoffset,
glw::GLint yoffset, glw::GLint zoffset, glw::GLsizei width,
glw::GLsizei height, glw::GLsizei depth, glw::GLenum format,
glw::GLenum type, glw::GLsizei bufSize, void* pixels);
typedef void(GLW_APIENTRY* PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC)(glw::GLuint texture, glw::GLint level,
glw::GLint xoffset, glw::GLint yoffset,
glw::GLint zoffset, glw::GLsizei width,
glw::GLsizei height, glw::GLsizei depth,
glw::GLsizei bufSize, void* pixels);
PFNGLGETTEXTURESUBIMAGEPROC m_gl_GetTextureSubImage;
PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC m_gl_GetCompressedTextureSubImage;
/* Static constants. */
static const glw::GLubyte s_texture_data[];
static const glw::GLsizei s_texture_data_size;
static const glw::GLsizei s_texture_data_width;
static const glw::GLsizei s_texture_data_height;
static const glw::GLsizei s_texture_data_depth;
static const glw::GLubyte s_texture_data_compressed[];
static const glw::GLsizei s_texture_data_compressed_size;
};
/* Functional class */
} /* namespace GetTextureSubImage */
} /* namespace gl4cts */
#endif // _GL4CGETTEXTURESUBIMAGETESTS_HPP