Home | History | Annotate | Download | only in gl
      1 #ifndef _GL4CDIRECTSTATEACCESSTESTS_HPP
      2 #define _GL4CDIRECTSTATEACCESSTESTS_HPP
      3 /*-------------------------------------------------------------------------
      4  * OpenGL Conformance Test Suite
      5  * -----------------------------
      6  *
      7  * Copyright (c) 2015-2016 The Khronos Group Inc.
      8  *
      9  * Licensed under the Apache License, Version 2.0 (the "License");
     10  * you may not use this file except in compliance with the License.
     11  * You may obtain a copy of the License at
     12  *
     13  *      http://www.apache.org/licenses/LICENSE-2.0
     14  *
     15  * Unless required by applicable law or agreed to in writing, software
     16  * distributed under the License is distributed on an "AS IS" BASIS,
     17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     18  * See the License for the specific language governing permissions and
     19  * limitations under the License.
     20  *
     21  */ /*!
     22  * \file
     23  * \brief
     24  */ /*-------------------------------------------------------------------*/
     25 
     26 /**
     27  */ /*!
     28  * \file  gl4cDirectStateAccessTests.hpp
     29  * \brief Conformance tests for the Direct State Access feature functionality.
     30  */ /*-----------------------------------------------------------------------------*/
     31 
     32 /* Includes. */
     33 
     34 #include "glcTestCase.hpp"
     35 #include "glwDefs.hpp"
     36 #include "tcuDefs.hpp"
     37 
     38 #include <string>
     39 #include <typeinfo>
     40 
     41 namespace gl4cts
     42 {
     43 namespace DirectStateAccess
     44 {
     45 /** @class Tests
     46  *
     47  *  @brief Direct State Access test group.
     48  */
     49 class Tests : public deqp::TestCaseGroup
     50 {
     51 public:
     52 	/* Public member functions */
     53 	Tests(deqp::Context& context);
     54 
     55 	void init();
     56 
     57 private:
     58 	/* Private member functions */
     59 	Tests(const Tests& other);
     60 	Tests& operator=(const Tests& other);
     61 };
     62 /* Tests class */
     63 
     64 /* Direct State Access Feature Interfaces */
     65 
     66 /* Direct State Access Transform Feedback Tests */
     67 namespace TransformFeedback
     68 {
     69 /** @class CreationTest
     70  *
     71  *  @brief Direct State Access Transform Feedback Creation test cases.
     72  *
     73  *  Test follows the steps:
     74  *
     75  *      Create at least two transform feedback objects names with
     76  *      GenTransformFeedbacks function. Check them without binding, using
     77  *      IsTransformFeedback function. Expect GL_FALSE.
     78  *
     79  *      Create at least two transform feedback objects with
     80  *      CreateTransformFeedbacks function. Check them without binding, using
     81  *      IsTransformFeedback function. Expect GL_TRUE.
     82  *
     83  *      Check that transform feedback binding point is unchanged.
     84  */
     85 class CreationTest : public deqp::TestCase
     86 {
     87 public:
     88 	/* Public member functions */
     89 	CreationTest(deqp::Context& context);
     90 
     91 	virtual tcu::TestNode::IterateResult iterate();
     92 
     93 private:
     94 	/* Private member functions */
     95 	CreationTest(const CreationTest& other);
     96 	CreationTest& operator=(const CreationTest& other);
     97 };
     98 /* CreationTest class */
     99 
    100 /** @class DefaultsTest
    101  *
    102  *  @brief Direct State Access Transform Feedback Default State test cases.
    103  *
    104  *  Test follows the steps:
    105  *
    106  *       Create transform feedback object with CreateTransformFeedbacks function.
    107  *
    108  *      Query parameters TRANSFORM_FEEDBACK_BUFFER_BINDING using
    109  *      GetTransformFeedbacki_v for all available indexed binding points. For
    110  *      all queries, expect value equal to 0.
    111  *
    112  *      Query parameters:
    113  *       -  TRANSFORM_FEEDBACK_BUFFER_START and
    114  *       -  TRANSFORM_FEEDBACK_BUFFER_SIZE
    115  *      using GetTransformFeedbacki64_v for all available indexed binding
    116  *      points. For all queries, expect value equal to 0.
    117  *
    118  *      Query parameters:
    119  *       -  TRANSFORM_FEEDBACK_PAUSED and
    120  *       -  TRANSFORM_FEEDBACK_ACTIVE
    121  *      using GetTransformFeedbackiv. For all queries, expect value equal to
    122  *      FALSE.
    123  */
    124 class DefaultsTest : public deqp::TestCase
    125 {
    126 public:
    127 	/* Public member functions */
    128 	DefaultsTest(deqp::Context& context);
    129 
    130 	virtual tcu::TestNode::IterateResult iterate();
    131 
    132 private:
    133 	/* Private member functions */
    134 	DefaultsTest(const DefaultsTest& other);
    135 	DefaultsTest& operator=(const DefaultsTest& other);
    136 
    137 	/* Function pointers type definitions and declarations. */
    138 	typedef void(GLW_APIENTRY* GetTransformFeedbackiv_ProcAddress)(glw::GLuint xfb, glw::GLenum pname,
    139 																   glw::GLint* param);
    140 	typedef void(GLW_APIENTRY* GetTransformFeedbacki_v_ProcAddress)(glw::GLuint xfb, glw::GLenum pname,
    141 																	glw::GLuint index, glw::GLint* param);
    142 	typedef void(GLW_APIENTRY* GetTransformFeedbacki64_v_ProcAddress)(glw::GLuint xfb, glw::GLenum pname,
    143 																	  glw::GLuint index, glw::GLint64* param);
    144 
    145 	GetTransformFeedbackiv_ProcAddress	m_gl_getTransformFeedbackiv;
    146 	GetTransformFeedbacki_v_ProcAddress   m_gl_getTransformFeedbacki_v;
    147 	GetTransformFeedbacki64_v_ProcAddress m_gl_getTransformFeedbacki64_v;
    148 
    149 	/* Private member variables */
    150 	glw::GLuint m_xfb_dsa;
    151 	glw::GLint  m_xfb_indexed_binding_points_count;
    152 
    153 	/* Private member functions. */
    154 	void prepare();
    155 	bool testBuffersBindingPoints();
    156 	bool testBuffersDimensions();
    157 	bool testActive();
    158 	bool testPaused();
    159 	void clean();
    160 };
    161 /* DefaultsTest class */
    162 
    163 /** @class BuffersTest
    164  *
    165  *  @brief Direct State Access Transform Feedback Buffer Objects binding test cases.
    166  *         The test follows the steps:
    167  *
    168  *             Create transform feedback object with CreateTransformFeedbacks function.
    169  *
    170  *             Create two buffer objects using GenBuffers and BindBuffer functions.
    171  *             Allocate storage for them using BufferData.
    172  *
    173  *             Bind the first buffer to transform feedback object indexed binding point
    174  *             0 using TransformFeedbackBufferBase function.
    175  *
    176  *             Bind a first half of the second buffer to transform feedback object
    177  *             indexed binding point 1 using TransformFeedbackBufferRange.
    178  *
    179  *             Bind a second half of the second buffer to transform feedback object
    180  *             indexed binding point 12 using TransformFeedbackBufferRange.
    181  *
    182  *             Query parameter TRANSFORM_FEEDBACK_BUFFER_BINDING using
    183  *             GetTransformFeedbacki_v for all 1st, 2nd and 3rd indexed binding point.
    184  *             For all queries, expect value equal to the corresponding buffers'
    185  *             identifiers.
    186  *
    187  *             Query parameters:
    188  *              -  TRANSFORM_FEEDBACK_BUFFER_START and
    189  *              -  TRANSFORM_FEEDBACK_BUFFER_SIZE
    190  *             using GetTransformFeedbacki64_v for indexed binding points 0, 1 and 2.
    191  *             Verify returned values.
    192  */
    193 class BuffersTest : public deqp::TestCase
    194 {
    195 public:
    196 	/* Public member functions */
    197 	BuffersTest(deqp::Context& context);
    198 
    199 	virtual tcu::TestNode::IterateResult iterate();
    200 
    201 private:
    202 	/* Private member functions */
    203 	BuffersTest(const BuffersTest& other);
    204 	BuffersTest& operator=(const BuffersTest& other);
    205 
    206 	/* Function pointers type definitions and declarations. */
    207 	typedef void(GLW_APIENTRY* GetTransformFeedbacki_v_ProcAddress)(glw::GLuint xfb, glw::GLenum pname,
    208 																	glw::GLuint index, glw::GLint* param);
    209 	typedef void(GLW_APIENTRY* GetTransformFeedbacki64_v_ProcAddress)(glw::GLuint xfb, glw::GLenum pname,
    210 																	  glw::GLuint index, glw::GLint64* param);
    211 	typedef void(GLW_APIENTRY* TransformFeedbackBufferBase_ProcAddress)(glw::GLuint xfb, glw::GLuint index,
    212 																		glw::GLuint buffer);
    213 	typedef void(GLW_APIENTRY* TransformFeedbackBufferRange_ProcAddress)(glw::GLuint xfb, glw::GLuint index,
    214 																		 glw::GLuint buffer, glw::GLintptr offset,
    215 																		 glw::GLsizei size);
    216 
    217 	GetTransformFeedbacki_v_ProcAddress		 m_gl_getTransformFeedbacki_v;
    218 	GetTransformFeedbacki64_v_ProcAddress	m_gl_getTransformFeedbacki64_v;
    219 	TransformFeedbackBufferBase_ProcAddress  m_gl_TransformFeedbackBufferBase;
    220 	TransformFeedbackBufferRange_ProcAddress m_gl_TransformFeedbackBufferRange;
    221 
    222 	/* Private member variables */
    223 	glw::GLuint m_xfb_dsa;
    224 	glw::GLuint m_bo_a;
    225 	glw::GLuint m_bo_b;
    226 
    227 	/* Private static variables */
    228 	static const glw::GLuint s_bo_size;
    229 
    230 	/* Private member functions. */
    231 	void prepareObjects();
    232 	bool prepareTestSetup();
    233 	bool testBindingPoint(glw::GLuint const index, glw::GLint const expected_value,
    234 						  glw::GLchar const* const tested_function_name);
    235 	bool testStart(glw::GLuint const index, glw::GLint const expected_value,
    236 				   glw::GLchar const* const tested_function_name);
    237 	bool testSize(glw::GLuint const index, glw::GLint const expected_value,
    238 				  glw::GLchar const* const tested_function_name);
    239 	void clean();
    240 };
    241 /* BuffersTest class */
    242 
    243 /** @class ErrorsTest
    244  *
    245  *  @brief Direct State Access Transform Feedback Negative test cases.
    246  *         The test follows steps:
    247  *
    248  *              Check that CreateTransformFeedbacks generates INVALID_VALUE error if
    249  *              number of transform feedback objects to create is negative.
    250  *
    251  *              Check that GetTransformFeedbackiv, GetTransformFeedbacki_v and
    252  *              GetTransformFeedbacki64_v generate INVALID_OPERATION error if xfb is not
    253  *              zero or the name of an existing transform feedback object.
    254  *
    255  *              Check that GetTransformFeedbackiv generates INVALID_ENUM error if pname
    256  *              is not TRANSFORM_FEEDBACK_PAUSED or TRANSFORM_FEEDBACK_ACTIVE.
    257  *
    258  *              Check that GetTransformFeedbacki_v generates INVALID_ENUM error if pname
    259  *              is not TRANSFORM_FEEDBACK_BUFFER_BINDING.
    260  *
    261  *              Check that GetTransformFeedbacki64_v generates INVALID_ENUM error if
    262  *              pname is not TRANSFORM_FEEDBACK_BUFFER_START or
    263  *              TRANSFORM_FEEDBACK_BUFFER_SIZE.
    264  *
    265  *              Check that GetTransformFeedbacki_v and GetTransformFeedbacki64_v
    266  *              generate INVALID_VALUE error by GetTransformFeedbacki_v and
    267  *              GetTransformFeedbacki64_v if index is greater than or equal to the
    268  *              number of binding points for transform feedback (the value of
    269  *              MAX_TRANSFORM_FEEDBACK_BUFFERS).
    270  */
    271 class ErrorsTest : public deqp::TestCase
    272 {
    273 public:
    274 	/* Public member functions */
    275 	ErrorsTest(deqp::Context& context);
    276 
    277 	virtual tcu::TestNode::IterateResult iterate();
    278 
    279 private:
    280 	/* Private member functions */
    281 	ErrorsTest(const ErrorsTest& other);
    282 	ErrorsTest& operator=(const ErrorsTest& other);
    283 
    284 	/* Function pointers type definitions and declarations. */
    285 	typedef void(GLW_APIENTRY* GetTransformFeedbackiv_ProcAddress)(glw::GLuint xfb, glw::GLenum pname,
    286 																   glw::GLint* param);
    287 	typedef void(GLW_APIENTRY* GetTransformFeedbacki_v_ProcAddress)(glw::GLuint xfb, glw::GLenum pname,
    288 																	glw::GLuint index, glw::GLint* param);
    289 	typedef void(GLW_APIENTRY* GetTransformFeedbacki64_v_ProcAddress)(glw::GLuint xfb, glw::GLenum pname,
    290 																	  glw::GLuint index, glw::GLint64* param);
    291 
    292 	GetTransformFeedbackiv_ProcAddress	m_gl_getTransformFeedbackiv;
    293 	GetTransformFeedbacki_v_ProcAddress   m_gl_getTransformFeedbacki_v;
    294 	GetTransformFeedbacki64_v_ProcAddress m_gl_getTransformFeedbacki64_v;
    295 
    296 	/* Private member functions. */
    297 	void prepareFunctionPointers();
    298 	void cleanErrors();
    299 
    300 	bool testCreateTransformFeedbacksForInvalidNumberOfObjects();
    301 	bool testQueriesForInvalidNameOfObject();
    302 	bool testGetTransformFeedbackivQueryForInvalidParameterName();
    303 	bool testGetTransformFeedbacki_vQueryForInvalidParameterName();
    304 	bool testGetTransformFeedbacki64_vQueryForInvalidParameterName();
    305 	bool testIndexedQueriesForInvalidBindingPoint();
    306 };
    307 /* BuffersTest class */
    308 
    309 /** @class FunctionalTest
    310  *
    311  *  @brief Direct State Access Transform Feedback Functional test cases.
    312  *
    313  *  @note  The test follows steps:
    314  *
    315  *             Create transform feedback object with CreateTransformFeedbacks function.
    316  *
    317  *             Create buffer object using GenBuffers and BindBuffer functions.
    318  *             Allocate storage for it using BufferData.
    319  *
    320  *             Bind the buffer to transform feedback object indexed binding point 0
    321  *             using TransformFeedbackBufferBase function.
    322  *
    323  *             Prepare program with vertex shader which outputs VertexID to transform
    324  *             feedback varying.
    325  *
    326  *             Create and bind empty vertex array object.
    327  *
    328  *             Begin transform feedback environment.
    329  *
    330  *             Using the program with discarded rasterizer, draw array of 4 indices
    331  *             using POINTS.
    332  *
    333  *             Pause transform feedback environment.
    334  *
    335  *             Query parameter TRANSFORM_FEEDBACK_PAUSED using GetTransformFeedbackiv.
    336  *             Expect value equal to TRUE.
    337  *
    338  *             Query parameter TRANSFORM_FEEDBACK_PAUSED using GetTransformFeedbackiv.
    339  *             Expect value equal to FALSE.
    340  *
    341  *             Resume transform feedback environment.
    342  *
    343  *             Query parameter TRANSFORM_FEEDBACK_PAUSED using GetTransformFeedbackiv.
    344  *             Expect value equal to FALSE.
    345  *
    346  *             Query parameter TRANSFORM_FEEDBACK_PAUSED using GetTransformFeedbackiv.
    347  *             Expect value equal to TRUE.
    348  *
    349  *             End Transform feedback environment.
    350  *
    351  *             Verify data in the buffer using MapBuffer function.
    352  */
    353 class FunctionalTest : public deqp::TestCase
    354 {
    355 public:
    356 	/* Public member functions */
    357 	FunctionalTest(deqp::Context& context);
    358 
    359 	virtual tcu::TestNode::IterateResult iterate();
    360 
    361 private:
    362 	/* Private member functions */
    363 	FunctionalTest(const FunctionalTest& other);
    364 	FunctionalTest& operator=(const FunctionalTest& other);
    365 
    366 	/* Function pointers type definitions and declarations. */
    367 	typedef void(GLW_APIENTRY* GetTransformFeedbackiv_ProcAddress)(glw::GLuint xfb, glw::GLenum pname,
    368 																   glw::GLint* param);
    369 	typedef void(GLW_APIENTRY* TransformFeedbackBufferBase_ProcAddress)(glw::GLuint xfb, glw::GLuint index,
    370 																		glw::GLuint buffer);
    371 
    372 	GetTransformFeedbackiv_ProcAddress		m_gl_getTransformFeedbackiv;
    373 	TransformFeedbackBufferBase_ProcAddress m_gl_TransformFeedbackBufferBase;
    374 
    375 	/* Private member variables. */
    376 	glw::GLuint m_xfb_dsa;
    377 	glw::GLuint m_bo;
    378 	glw::GLuint m_po;
    379 	glw::GLuint m_vao;
    380 
    381 	/* Private member functions. */
    382 	void prepareFunctionPointers();
    383 	void prepareTransformFeedback();
    384 	void prepareBuffer();
    385 	void prepareProgram();
    386 	void prepareVertexArrayObject();
    387 
    388 	bool draw();
    389 	bool testTransformFeedbackStatus(glw::GLenum parameter_name, glw::GLint expected_value);
    390 	bool verifyBufferContent();
    391 
    392 	void clean();
    393 
    394 	/* Private static variables. */
    395 	static const glw::GLuint		s_bo_size;
    396 	static const glw::GLchar		s_vertex_shader[];
    397 	static const glw::GLchar		s_fragment_shader[];
    398 	static const glw::GLchar* const s_xfb_varying;
    399 };
    400 /* FunctionalTest class */
    401 } /* xfb namespace */
    402 
    403 namespace Samplers
    404 {
    405 /** @class CreationTest
    406  *
    407  *  @brief Direct State Access Sampler Objects Creation test cases.
    408  *
    409  *  Test follows the steps:
    410  *
    411  *       Create at least two Sampler Objects names using GenSamplers function.
    412  *       Check them without binding, using IsSampler function. Expect GL_FALSE.
    413  *
    414  *       Create at least two Sampler Objects using CreateSamplers function. Check
    415  *       them without binding, using IsSampler function. Expect GL_TRUE.
    416  *
    417  *       Release objects.
    418  */
    419 class CreationTest : public deqp::TestCase
    420 {
    421 public:
    422 	/* Public member functions */
    423 	CreationTest(deqp::Context& context);
    424 
    425 	virtual tcu::TestNode::IterateResult iterate();
    426 
    427 private:
    428 	/* Private member functions */
    429 	CreationTest(const CreationTest& other);
    430 	CreationTest& operator=(const CreationTest& other);
    431 };
    432 /* CreationTest class */
    433 
    434 /** @class DefaultsTest
    435  *
    436  *  @brief Direct State Access Sampler Objects Default State test.
    437  *
    438  *         Test follows the steps:
    439  *
    440  *             Create Sampler Object with CreateSamplers function.
    441  *
    442  *             Verify that default value of TEXTURE_BORDER_COLOR queried with function
    443  *             GetSamplerParameterfv is 0.0, 0.0, 0.0, 0.0.
    444  *
    445  *             Verify that default value of TEXTURE_COMPARE_FUNC queried with function
    446  *             GetSamplerParameteriv is LEQUAL.
    447  *
    448  *             Verify that default value of TEXTURE_COMPARE_MODE queried with function
    449  *             GetSamplerParameteriv is NONE.
    450  *
    451  *             Verify that default value of TEXTURE_LOD_BIAS queried with function
    452  *             GetSamplerParameterfv is 0.0.
    453  *
    454  *             Verify that default value of TEXTURE_MAX_LOD queried with function
    455  *             GetSamplerParameterfv is 1000.
    456  *
    457  *             Verify that default value of TEXTURE_MAG_FILTER queried with function
    458  *             GetSamplerParameteriv is LINEAR.
    459  *
    460  *             Verify that default value of TEXTURE_MIN_FILTER queried with function
    461  *             GetSamplerParameteriv is NEAREST_MIPMAP_LINEAR.
    462  *
    463  *             Verify that default value of TEXTURE_MIN_LOD queried with function
    464  *             GetSamplerParameterfv is -1000.
    465  *
    466  *             Verify that default value of TEXTURE_WRAP_S queried with function
    467  *             GetSamplerParameteriv is REPEAT.
    468  *
    469  *             Verify that default value of TEXTURE_WRAP_T queried with function
    470  *             GetSamplerParameteriv is REPEAT.
    471  *
    472  *             Verify that default value of TEXTURE_WRAP_R queried with function
    473  *             GetSamplerParameteriv is REPEAT.
    474  *
    475  *             Release objects.
    476  */
    477 class DefaultsTest : public deqp::TestCase
    478 {
    479 public:
    480 	/* Public member functions */
    481 	DefaultsTest(deqp::Context& context);
    482 
    483 	virtual tcu::TestNode::IterateResult iterate();
    484 
    485 private:
    486 	/* Private member functions */
    487 	DefaultsTest(const DefaultsTest& other);
    488 	DefaultsTest& operator=(const DefaultsTest& other);
    489 
    490 	/* Private member variables */
    491 	glw::GLuint m_sampler_dsa;
    492 
    493 	/* Private member functions. */
    494 	void prepare();
    495 	bool testSamplerIntegerParameter(glw::GLenum pname, glw::GLint expected_value);
    496 	bool testSamplerFloatParameter(glw::GLenum pname, glw::GLfloat expected_value);
    497 	bool testSamplerFloatVectorParameter(glw::GLenum pname, glw::GLfloat expected_value[4]);
    498 	void clean();
    499 };
    500 /* DefaultsTest class */
    501 
    502 /** @class ErrorsTest
    503  *
    504  *  @brief Direct State Access Samplers Negative test.
    505  *
    506  *         The test follows steps:
    507  *
    508  *             Check that CreateSamplers generates INVALID_VALUE error if
    509  *             number of sampler objects to create is negative.
    510  */
    511 class ErrorsTest : public deqp::TestCase
    512 {
    513 public:
    514 	/* Public member functions */
    515 	ErrorsTest(deqp::Context& context);
    516 
    517 	virtual tcu::TestNode::IterateResult iterate();
    518 
    519 private:
    520 	/* Private member functions */
    521 	ErrorsTest(const ErrorsTest& other);
    522 	ErrorsTest& operator=(const ErrorsTest& other);
    523 };
    524 /* ErrorsTest class */
    525 
    526 /** @class FunctionalTest
    527  *
    528  *  @brief Direct State Access Samplers Functional test cases.
    529  *
    530  *  @note  The test follows steps:
    531  *
    532  *             Create framebuffer with renderbuffer with color attachment and 1x1 pixel
    533  *             size. Clean framebuffer content with black color.
    534  *
    535  *             Create and bind empty vertex array object.
    536  *
    537  *             Build and use simple GLSL program drawing full screen textured quad
    538  *             depending on VertexID. Fragment shader shall output texture point at
    539  *             (1/3, 1/3).
    540  *
    541  *             Create texture 2 x 2 texels in size. Bind it. Upload texture with
    542  *             following color data:
    543  *                 RED,    GREEN,
    544  *                 BLUE,   YELLOW.
    545  *
    546  *             Create Sampler object using CreateSamplers function and bind it to the
    547  *             texture unit. Setup following sampler parameters:
    548  *              *  TEXTURE_WRAP_S to the value of REPEAT,
    549  *              *  TEXTURE_WRAP_T to REPEAT,
    550  *              *  TEXTURE_MIN_FILTER to NEAREST,
    551  *              *  TEXTURE_MAG_FILTER to NEAREST.
    552  *
    553  *             Draw full screen quad.
    554  *
    555  *             Fetch framebuffer content with ReadPixels function. Check that,
    556  *             framebuffer is filled with red color.
    557  *
    558  *             Release objects.
    559  */
    560 class FunctionalTest : public deqp::TestCase
    561 {
    562 public:
    563 	/* Public member functions */
    564 	FunctionalTest(deqp::Context& context);
    565 
    566 	virtual tcu::TestNode::IterateResult iterate();
    567 
    568 private:
    569 	/* Private member functions. */
    570 	FunctionalTest(const FunctionalTest& other);
    571 	FunctionalTest& operator=(const FunctionalTest& other);
    572 
    573 	void prepareFramebuffer();
    574 	void prepareVertexArrayObject();
    575 	void prepareProgram();
    576 	void prepareTexture();
    577 	void prepareSampler();
    578 	void draw();
    579 	bool checkFramebufferContent();
    580 	void clean();
    581 
    582 	/* Private member variables. */
    583 	glw::GLuint m_fbo;
    584 	glw::GLuint m_rbo;
    585 	glw::GLuint m_vao;
    586 	glw::GLuint m_to;
    587 	glw::GLuint m_so;
    588 	glw::GLuint m_po;
    589 
    590 	/* Private static variables. */
    591 	static const glw::GLchar  s_vertex_shader[];
    592 	static const glw::GLchar  s_fragment_shader[];
    593 	static const glw::GLchar  s_uniform_sampler[];
    594 	static const glw::GLubyte s_texture_data[];
    595 };
    596 /* FunctionalTest class */
    597 } /* Samplers namespace */
    598 
    599 namespace ProgramPipelines
    600 {
    601 /** @class CreationTest
    602  *
    603  *  @brief Direct State Access Program Pipeline Objects Creation test cases.
    604  *
    605  *  @note Test follows the steps:
    606  *
    607  *            Create at least two Program Pipeline Objects names using
    608  *            GenProgramPipelines function. Check them without binding, using
    609  *            IsProgramPipeline function. Expect GL_FALSE.
    610  *
    611  *            Create at least two Program Pipeline Objects using
    612  *            CreateProgramPipelines function. Check them without binding, using
    613  *            IsProgramPipeline function. Expect GL_TRUE.
    614  *
    615  *            Release objects.
    616  */
    617 class CreationTest : public deqp::TestCase
    618 {
    619 public:
    620 	/* Public member functions */
    621 	CreationTest(deqp::Context& context);
    622 
    623 	virtual tcu::TestNode::IterateResult iterate();
    624 
    625 private:
    626 	/* Private member functions */
    627 	CreationTest(const CreationTest& other);
    628 	CreationTest& operator=(const CreationTest& other);
    629 };
    630 /* CreationTest class */
    631 
    632 /** @class DefaultsTest
    633  *
    634  *  @brief Direct State Access Program Pipeline Objects Default State test.
    635  *
    636  *  @note Test follows the steps:
    637  *
    638  *            Create Program Pipeline Object with CreateProgramPipelines function.
    639  *
    640  *            Verify that default value of ACTIVE_PROGRAM queried with function
    641  *            GetProgramPipelineiv is 0.
    642  *
    643  *            Verify that default value of VERTEX_SHADER queried with function
    644  *            GetProgramPipelineiv is 0.
    645  *
    646  *            Verify that default value of GEOMETRY_SHADER queried with function
    647  *            GetProgramPipelineiv is 0.
    648  *
    649  *            Verify that default value of FRAGMENT_SHADER queried with function
    650  *            GetProgramPipelineiv is 0.
    651  *
    652  *            Verify that default value of COMPUTE_SHADER queried with function
    653  *            GetProgramPipelineiv is 0.
    654  *
    655  *            Verify that default value of TESS_CONTROL_SHADER queried with function
    656  *            GetProgramPipelineiv is 0.
    657  *
    658  *            Verify that default value of TESS_EVALUATION_SHADER queried with
    659  *            function GetProgramPipelineiv is 0.
    660  *
    661  *            Verify that default value of VALIDATE_STATUS queried with function
    662  *            GetProgramPipelineiv is 0.
    663  *
    664  *            Verify that default value of info log queried with function
    665  *            GetProgramPiplineInfoLog is 0.
    666  *
    667  *            Verify that default value of INFO_LOG_LENGTH queried with function
    668  *            GetProgramPipelineiv is 0.
    669  *
    670  *            Release object.
    671  */
    672 class DefaultsTest : public deqp::TestCase
    673 {
    674 public:
    675 	/* Public member functions */
    676 	DefaultsTest(deqp::Context& context);
    677 
    678 	virtual tcu::TestNode::IterateResult iterate();
    679 
    680 private:
    681 	/* Private member functions */
    682 	DefaultsTest(const DefaultsTest& other);
    683 	DefaultsTest& operator=(const DefaultsTest& other);
    684 
    685 	/* Private member variables */
    686 	glw::GLuint m_program_pipeline_dsa;
    687 
    688 	/* Private member functions. */
    689 	void prepare();
    690 	bool testProgramPipelineParameter(glw::GLenum pname, glw::GLint expected_value);
    691 	bool testProgramPipelineInfoLog(glw::GLchar* expected_value);
    692 	void clean();
    693 };
    694 /* DefaultsTest class */
    695 
    696 /** @class ErrorsTest
    697  *
    698  *  @brief Direct State Access Program Pipeline Negative test.
    699  *
    700  *         The test follows steps:
    701  *
    702  *             Check that CreateProgramPipelines generates INVALID_VALUE error if
    703  *             number of program pipeline objects to create is negative.
    704  */
    705 class ErrorsTest : public deqp::TestCase
    706 {
    707 public:
    708 	/* Public member functions */
    709 	ErrorsTest(deqp::Context& context);
    710 
    711 	virtual tcu::TestNode::IterateResult iterate();
    712 
    713 private:
    714 	/* Private member functions */
    715 	ErrorsTest(const ErrorsTest& other);
    716 	ErrorsTest& operator=(const ErrorsTest& other);
    717 };
    718 /* ErrorsTest class */
    719 
    720 /** @class FunctionalTest
    721  *
    722  *  @brief Direct State Access Program Pipeline Functional test cases.
    723  *
    724  *  @note  The test follows steps:
    725  *
    726  *             Create framebuffer with renderbuffer with color attachment and 1x1 pixel
    727  *             size. Clean framebuffer content with black color.
    728  *
    729  *             Create and bind empty vertex array object.
    730  *
    731  *             Make sure that no GLSL program is being used.
    732  *
    733  *             Create two shader programs (with CreateShaderProgramv) - one vertex
    734  *             shader and one fragment shader. The vertex shader shall output full
    735  *             screen quad depending on VertexID. The fragment shader shall output red
    736  *             color.
    737  *
    738  *             Create the Program Pipeline Object using CreateProgramPipelines
    739  *             function. Bind it using BindProgramPipeline. Setup Program Pipeline
    740  *             with the created shader programs using UseProgramStages.
    741  *
    742  *             Draw full screen quad.
    743  *
    744  *             Fetch framebuffer content with ReadPixels function. Check that,
    745  *             framebuffer is filled with red color.
    746  *
    747  *             Release objects.
    748  */
    749 class FunctionalTest : public deqp::TestCase
    750 {
    751 public:
    752 	/* Public member functions */
    753 	FunctionalTest(deqp::Context& context);
    754 
    755 	virtual tcu::TestNode::IterateResult iterate();
    756 
    757 private:
    758 	/* Private member functions. */
    759 	FunctionalTest(const FunctionalTest& other);
    760 	FunctionalTest& operator=(const FunctionalTest& other);
    761 
    762 	void prepareFramebuffer();
    763 	void prepareVertexArrayObject();
    764 	void prepareShaderPrograms();
    765 	void preparePipeline();
    766 	void draw();
    767 	bool checkFramebufferContent();
    768 	void clean();
    769 
    770 	/* Private member variables. */
    771 	glw::GLuint m_fbo;
    772 	glw::GLuint m_rbo;
    773 	glw::GLuint m_vao;
    774 	glw::GLuint m_spo_v;
    775 	glw::GLuint m_spo_f;
    776 	glw::GLuint m_ppo;
    777 
    778 	/* Private static variables. */
    779 	static const glw::GLchar* s_vertex_shader;
    780 	static const glw::GLchar* s_fragment_shader;
    781 };
    782 /* FunctionalTest class */
    783 } /* ProgramPipelines namespace */
    784 
    785 namespace Queries
    786 {
    787 /** @class CreationTest
    788  *
    789  *  @brief Direct State Access Queries Creation test cases.
    790  *
    791  *  @note Test follows the steps:
    792  *
    793  *            Create at least two Query Objects names using GenQueries function.
    794  *            Check them without binding, using IsQuery function. Expect GL_FALSE.
    795  *
    796  *            Create at least two Query Objects using CreateQueries function. Check
    797  *            them without binding, using IsQuery function. Expect GL_TRUE.
    798  *
    799  *            Release objects.
    800  *
    801  *            Repeat test for all of following supported targets:
    802  *             -  SAMPLES_PASSED,
    803  *             -  ANY_SAMPLES_PASSED,
    804  *             -  ANY_SAMPLES_PASSED_CONSERVATIVE,
    805  *             -  TIME_ELAPSED,
    806  *             -  TIMESTAMP,
    807  *             -  PRIMITIVES_GENERATED and
    808  *             -  TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN.
    809  *
    810  *  See Ref. OpenGL 4.5 Core Profile, Section 4.2.
    811  */
    812 class CreationTest : public deqp::TestCase
    813 {
    814 public:
    815 	/* Public member functions */
    816 	CreationTest(deqp::Context& context);
    817 
    818 	virtual tcu::TestNode::IterateResult iterate();
    819 
    820 private:
    821 	/* Private member functions */
    822 	CreationTest(const CreationTest& other);
    823 	CreationTest& operator=(const CreationTest& other);
    824 };
    825 /* CreationTest class */
    826 
    827 /** @class DefaultsTest
    828  *
    829  *  @brief Direct State Access Queries Default State test.
    830  *
    831  *  @note Test follows the steps:
    832  *
    833  *            Create Query Object with CreateQueries function.
    834  *
    835  *            Verify that default value of QUERY_RESULT queried with function
    836  *            GetQueryObjectuiv is 0 or FALSE.
    837  *
    838  *            Verify that default value of QUERY_RESULT_AVAILABLE queried with
    839  *            function GetQueryObjectiv is TRUE.
    840  *
    841  *            Release object.
    842  *
    843  *            Repeat test for all of following supported targets:
    844  *             -  SAMPLES_PASSED,
    845  *             -  ANY_SAMPLES_PASSED,
    846  *             -  ANY_SAMPLES_PASSED_CONSERVATIVE,
    847  *             -  TIME_ELAPSED,
    848  *             -  TIMESTAMP,
    849  *             -  PRIMITIVES_GENERATED and
    850  *             -  TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN.
    851  *
    852  *  See Ref. OpenGL 4.5 Core Profile, Section 4.2.
    853  */
    854 class DefaultsTest : public deqp::TestCase
    855 {
    856 public:
    857 	/* Public member functions */
    858 	DefaultsTest(deqp::Context& context);
    859 
    860 	virtual tcu::TestNode::IterateResult iterate();
    861 
    862 private:
    863 	/* Private member functions */
    864 	DefaultsTest(const DefaultsTest& other);
    865 	DefaultsTest& operator=(const DefaultsTest& other);
    866 
    867 	/* Private member variables */
    868 	glw::GLuint m_query_dsa;
    869 
    870 	/* Private member functions. */
    871 	void prepare(const glw::GLenum target);
    872 	bool testQueryParameter(const glw::GLenum pname, const glw::GLuint expected_value, const glw::GLchar* target_name);
    873 	void clean();
    874 };
    875 /* DefaultsTest class */
    876 
    877 /** @class ErrorsTest
    878  *
    879  *  @brief Direct State Access Queries Negative test.
    880  *
    881  *  @note The test follows steps:
    882  *
    883  *            Check that CreateQueries generates INVALID_VALUE error if number of
    884  *            query objects to create is negative.
    885  *
    886  *            Check that CreateQueries generates INVALID_ENUM error if target is not
    887  *            one of accepted values:
    888  *             -  SAMPLES_PASSED,
    889  *             -  ANY_SAMPLES_PASSED,
    890  *             -  ANY_SAMPLES_PASSED_CONSERVATIVE,
    891  *             -  TIME_ELAPSED,
    892  *             -  TIMESTAMP,
    893  *             -  PRIMITIVES_GENERATED or
    894  *             -  TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN.
    895  *
    896  *            Check that GetQueryBufferObjectiv, GetQueryBufferObjectuiv,
    897  *            GetQueryBufferObjecti64v and GetQueryBufferObjectui64v generate
    898  *            INVALID_OPERATION error if <id> is not the name of a query object, or
    899  *            if the query object named by <id> is currently active.
    900  *
    901  *            Check that GetQueryBufferObjectiv, GetQueryBufferObjectuiv,
    902  *            GetQueryBufferObjecti64v and GetQueryBufferObjectui64v generate
    903  *            INVALID_OPERATION error if <buffer> is not the name of an existing
    904  *            buffer object.
    905  *
    906  *            Check that GetQueryBufferObjectiv, GetQueryBufferObjectuiv,
    907  *            GetQueryBufferObjecti64v and GetQueryBufferObjectui64v generate
    908  *            INVALID_ENUM error if <pname> is not QUERY_RESULT,
    909  *            QUERY_RESULT_AVAILABLE, QUERY_RESULT_NO_WAIT or QUERY_TARGET.
    910  *
    911  *            Check that GetQueryBufferObjectiv, GetQueryBufferObjectuiv,
    912  *            GetQueryBufferObjecti64v and GetQueryBufferObjectui64v generate
    913  *            INVALID_OPERATION error if the query writes to a buffer object, and the
    914  *            specified buffer offset would cause data to be written beyond the bounds
    915  *            of that buffer object.
    916  *
    917  *            Check that GetQueryBufferObjectiv, GetQueryBufferObjectuiv,
    918  *            GetQueryBufferObjecti64v and GetQueryBufferObjectui64v generate
    919  *            INVALID_VALUE error if <offset> is negative.
    920  *
    921  *  See Ref. OpenGL 4.5 Core Profile, Section 4.2.
    922  */
    923 class ErrorsTest : public deqp::TestCase
    924 {
    925 public:
    926 	/* Public member functions */
    927 	ErrorsTest(deqp::Context& context);
    928 
    929 	virtual tcu::TestNode::IterateResult iterate();
    930 
    931 private:
    932 	/* Private member functions */
    933 	ErrorsTest(const ErrorsTest& other);
    934 	ErrorsTest& operator=(const ErrorsTest& other);
    935 
    936 	/* Private member functions. */
    937 	bool testNegativeNumberOfObjects();
    938 	bool testInvalidTarget();
    939 	bool testInvalidQueryName();
    940 	bool testInvalidBufferName();
    941 	bool testInvalidParameterName();
    942 	bool testBufferOverflow();
    943 	bool testBufferNegativeOffset();
    944 
    945 	bool isTarget(glw::GLenum maybe_target);
    946 	bool isParameterName(glw::GLenum maybe_pname);
    947 
    948 	/* Function pointers. */
    949 	typedef void(GLW_APIENTRY* PFNGLGETQUERYBUFFEROBJECT)(glw::GLuint id, glw::GLuint buffer, glw::GLenum pname,
    950 														  glw::GLintptr offset);
    951 
    952 	PFNGLGETQUERYBUFFEROBJECT m_pGetQueryBufferObjectiv;
    953 	PFNGLGETQUERYBUFFEROBJECT m_pGetQueryBufferObjectuiv;
    954 	PFNGLGETQUERYBUFFEROBJECT m_pGetQueryBufferObjecti64v;
    955 	PFNGLGETQUERYBUFFEROBJECT m_pGetQueryBufferObjectui64v;
    956 
    957 	/* Private static variables. */
    958 	static const glw::GLenum  s_targets[];
    959 	static const glw::GLchar* s_target_names[];
    960 	static const glw::GLuint  s_targets_count;
    961 };
    962 /* ErrorsTest class */
    963 
    964 /** @class FunctionalTest
    965  *
    966  *  @brief Direct State Access Queries Functional test cases.
    967  *
    968  *  @note The test follows steps:
    969  *
    970  *            Create framebuffer with renderbuffer with color attachment and 1x1 pixel
    971  *            size. Clean framebuffer content with black color.
    972  *
    973  *            Create and bind empty vertex array object.
    974  *
    975  *            Create buffer object. Bind it to TRANFORM_FEEDBACK_BUFFER binding point.
    976  *            Bind buffer base to TRANFORM_FEEDBACK_BUFFER binding point with index 0.
    977  *            Setup data storage of the buffer with size equal to 6 * sizeof(int).
    978  *
    979  *            Build GLSL program consisting of vertex and fragment shader stages.
    980  *            Vertex shader shall output full screen quad depending on VertexID. The
    981  *            VertexID shall be saved to transform feedback varying. Fragment shader
    982  *            shall output red color.
    983  *
    984  *            Create query objects with CreateQueries function for following targets:
    985  *             -  SAMPLES_PASSED,
    986  *             -  PRIMITIVES_GENERATED,
    987  *             -  TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN,
    988  *             -  TIME_ELAPSED.
    989  *
    990  *            Begin query for every target.
    991  *
    992  *            Begin transform feedback for TRIANGLES primitive type.
    993  *
    994  *            Draw full screen quad with TRIANGLE_STRIP primitive type.
    995  *
    996  *            End transform feedback.
    997  *
    998  *            End all queries.
    999  *
   1000  *            Call Finish function.
   1001  *
   1002  *            Check that framebuffer is filled with red color.
   1003  *
   1004  *            Check that transform feedback buffer contains successive primitive
   1005  *            vertex ids (0, 1, 2,  2, 1, 3).
   1006  *
   1007  *            For every query objects, using GetQueryBufferObjectiv,
   1008  *            GetQueryBufferObjectuiv, GetQueryBufferObjecti64v,
   1009  *            GetQueryBufferObjectui64v functions do following comparisons:
   1010  *
   1011  *                Check that value of parameter QUERY_TARGET is equal to target.
   1012  *
   1013  *                Check that value of parameter QUERY_RESULT_AVAILABLE is TRUE.
   1014  *
   1015  *                Check that value of parameter QUERY_RESULT and QUERY_RESULT_NO_WAIT:
   1016  *                 -  is equal to 1 if target is SAMPLES_PASSED; or
   1017  *                 -  is equal to 2 if target is PRIMITIVES_GENERATED or
   1018  *                    TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN; or
   1019  *                 -  is positive if target is TIME_ELAPSED.
   1020  *
   1021  *            Release objects.
   1022  */
   1023 class FunctionalTest : public deqp::TestCase
   1024 {
   1025 public:
   1026 	/* Public member functions */
   1027 	FunctionalTest(deqp::Context& context);
   1028 
   1029 	virtual tcu::TestNode::IterateResult iterate();
   1030 
   1031 private:
   1032 	/* Private member functions. */
   1033 	FunctionalTest(const FunctionalTest& other);
   1034 	FunctionalTest& operator=(const FunctionalTest& other);
   1035 
   1036 	/* Function pointers. */
   1037 	typedef void(GLW_APIENTRY* PFNGLGETQUERYBUFFEROBJECT)(glw::GLuint id, glw::GLuint buffer, glw::GLenum pname,
   1038 														  glw::GLintptr offset);
   1039 
   1040 	PFNGLGETQUERYBUFFEROBJECT m_pGetQueryBufferObjectiv;
   1041 	PFNGLGETQUERYBUFFEROBJECT m_pGetQueryBufferObjectuiv;
   1042 	PFNGLGETQUERYBUFFEROBJECT m_pGetQueryBufferObjecti64v;
   1043 	PFNGLGETQUERYBUFFEROBJECT m_pGetQueryBufferObjectui64v;
   1044 
   1045 	/* Private templated functions. */
   1046 	template <typename T>
   1047 	static bool equal(T, T);
   1048 
   1049 	template <typename T>
   1050 	static bool less(T, T);
   1051 
   1052 	template <typename T>
   1053 	void GetQueryBufferObject(glw::GLuint id, glw::GLuint buffer, glw::GLenum pname, glw::GLintptr offset);
   1054 
   1055 	template <typename T>
   1056 	bool checkQueryBufferObject(glw::GLuint query, glw::GLenum pname, T expected_value, bool (*comparison)(T, T));
   1057 
   1058 	/* Private member functions. */
   1059 	void prepareView();
   1060 	void prepareVertexArray();
   1061 	void prepareBuffers();
   1062 	void prepareQueries();
   1063 	void prepareProgram();
   1064 	void draw();
   1065 	bool checkView();
   1066 	bool checkXFB();
   1067 	void clean();
   1068 
   1069 	/* Private member variables. */
   1070 	glw::GLuint  m_fbo;
   1071 	glw::GLuint  m_rbo;
   1072 	glw::GLuint  m_vao;
   1073 	glw::GLuint  m_bo_query;
   1074 	glw::GLuint  m_bo_xfb;
   1075 	glw::GLuint* m_qo;
   1076 	glw::GLuint  m_po;
   1077 
   1078 	/* Private static variables. */
   1079 	static const glw::GLenum s_targets[];
   1080 	static const glw::GLuint s_targets_count;
   1081 
   1082 	static const glw::GLint s_results[];
   1083 
   1084 	static const glw::GLchar  s_vertex_shader[];
   1085 	static const glw::GLchar  s_fragment_shader[];
   1086 	static const glw::GLchar* s_xfb_varying_name;
   1087 };
   1088 /* FunctionalTest class */
   1089 } /* Queries namespace */
   1090 
   1091 namespace Buffers
   1092 {
   1093 /** @class CreationTest
   1094  *
   1095  *  @brief Direct State Access Buffers Creation test cases.
   1096  *
   1097  *         Test follows the steps:
   1098  *
   1099  *             Create at least two buffer objects using GenBuffers function. Check
   1100  *             them without binding, using IsBuffer function. Expect GL_FALSE.
   1101  *
   1102  *             Create at least two buffer objects using CreateBuffers function. Check
   1103  *             them without binding, using IsBuffer function. Expect GL_TRUE.
   1104  *
   1105  *             Release objects.
   1106  */
   1107 class CreationTest : public deqp::TestCase
   1108 {
   1109 public:
   1110 	/* Public member functions */
   1111 	CreationTest(deqp::Context& context);
   1112 
   1113 	virtual tcu::TestNode::IterateResult iterate();
   1114 
   1115 private:
   1116 	/* Private member functions */
   1117 	CreationTest(const CreationTest& other);
   1118 	CreationTest& operator=(const CreationTest& other);
   1119 };
   1120 /* CreationTest class */
   1121 
   1122 /** @class DataTest
   1123  *
   1124  *  @brief Direct State Access Buffers Data test cases.
   1125  *
   1126  *         Test follows the steps:
   1127  *
   1128  *             Prepare test case with following steps:
   1129  *
   1130  *             Create buffer object using CreateBuffers.
   1131  *
   1132  *             Create data storage using given function and reference data.
   1133  *
   1134  *             Bind buffer.
   1135  *
   1136  *             Check buffer content using MapBuffer function.
   1137  *
   1138  *             Release objects.
   1139  *
   1140  *             Repeat the test case with function for data creation:
   1141  *              -  NamedBufferData,
   1142  *              -  NamedBufferData and it with NamedBufferSubData,
   1143  *              -  NamedBufferStorage,
   1144  *              -  CopyNamedBufferSubData from auxiliary buffer.
   1145  *
   1146  *             If NamedBufferData function is used then repeat the test case for
   1147  *             usage:
   1148  *              -  STREAM_DRAW,
   1149  *              -  STREAM_READ,
   1150  *              -  STREAM_COPY,
   1151  *              -  STATIC_DRAW,
   1152  *              -  STATIC_READ,
   1153  *              -  STATIC_COPY,
   1154  *              -  DYNAMIC_DRAW,
   1155  *              -  DYNAMIC_READ, and
   1156  *              -  DYNAMIC_COPY.
   1157  *
   1158  *             If NamedBufferStorage function is used then repeat the test case using
   1159  *             flag MAP_READ_BIT and one of following:
   1160  *              -  DYNAMIC_STORAGE_BIT,
   1161  *              -  MAP_WRITE_BIT,
   1162  *              -  MAP_PERSISTENT_BIT,
   1163  *              -  MAP_COHERENT_BIT and
   1164  *              -  CLIENT_STORAGE_BIT.
   1165  */
   1166 class DataTest : public deqp::TestCase
   1167 {
   1168 public:
   1169 	/* Public member functions */
   1170 	DataTest(deqp::Context& context);
   1171 
   1172 	virtual tcu::TestNode::IterateResult iterate();
   1173 
   1174 private:
   1175 	/* Private member functions */
   1176 	DataTest(const DataTest& other);
   1177 	DataTest& operator=(const DataTest& other);
   1178 
   1179 	typedef void(GLW_APIENTRY* PFNGLNAMEDBUFFERDATA)(glw::GLuint buffer, glw::GLsizei size, const glw::GLvoid* data,
   1180 													 glw::GLenum usage);
   1181 	typedef void(GLW_APIENTRY* PFNGLNAMEDBUFFERSUBDATA)(glw::GLuint buffer, glw::GLintptr offset, glw::GLsizei size,
   1182 														const glw::GLvoid* data);
   1183 	typedef void(GLW_APIENTRY* PFNGLNAMEDBUFFERSTORAGE)(glw::GLuint buffer, glw::GLsizeiptr size,
   1184 														const glw::GLvoid* data, glw::GLbitfield flags);
   1185 	typedef void(GLW_APIENTRY* PFNGLCOPYNAMEDBUFFERSUBDATA)(glw::GLuint readBuffer, glw::GLuint writeBuffer,
   1186 															glw::GLintptr readOffset, glw::GLintptr writeOffset,
   1187 															glw::GLsizeiptr size);
   1188 
   1189 	PFNGLNAMEDBUFFERDATA		m_pNamedBufferData;
   1190 	PFNGLNAMEDBUFFERSUBDATA		m_pNamedBufferSubData;
   1191 	PFNGLNAMEDBUFFERSTORAGE		m_pNamedBufferStorage;
   1192 	PFNGLCOPYNAMEDBUFFERSUBDATA m_pCopyNamedBufferSubData;
   1193 
   1194 	bool TestCase(void (DataTest::*UploadDataFunction)(glw::GLuint, glw::GLenum), glw::GLenum parameter);
   1195 
   1196 	void UploadUsingNamedBufferData(glw::GLuint id, glw::GLenum parameter);
   1197 	void UploadUsingNamedBufferSubData(glw::GLuint id, glw::GLenum parameter);
   1198 	void UploadUsingNamedBufferStorage(glw::GLuint id, glw::GLenum parameter);
   1199 	void UploadUsingCopyNamedBufferSubData(glw::GLuint id, glw::GLenum parameter);
   1200 
   1201 	bool compare(const glw::GLuint* data, const glw::GLuint* reference, const glw::GLsizei count);
   1202 	void LogFail(void (DataTest::*UploadDataFunction)(glw::GLuint, glw::GLenum), glw::GLenum parameter,
   1203 				 const glw::GLuint* data, const glw::GLuint* reference, const glw::GLsizei count);
   1204 	void LogError(void (DataTest::*UploadDataFunction)(glw::GLuint, glw::GLenum), glw::GLenum parameter);
   1205 
   1206 	static const glw::GLuint  s_reference[];
   1207 	static const glw::GLsizei s_reference_size;
   1208 	static const glw::GLsizei s_reference_count;
   1209 };
   1210 /* DataTest class */
   1211 
   1212 /** @class ClearTest
   1213  *
   1214  *  @brief Direct State Access Buffers Clear test cases.
   1215  *
   1216  *         Test follows the steps:
   1217  *
   1218  *             Prepare test case with following steps:
   1219  *
   1220  *                 Create buffer object using CreateBuffers.
   1221  *
   1222  *                 Create data storage using NamedBufferData without data
   1223  *                 specification.
   1224  *
   1225  *                 Clear buffer content using given function.
   1226  *
   1227  *                 Bind buffer.
   1228  *
   1229  *                 Check buffer content using MapBuffer function.
   1230  *
   1231  *                 Release objects.
   1232  *
   1233  *             Repeat test case for following clear functions:
   1234  *              -  ClearNamedBufferData and
   1235  *              -  ClearNamedBufferSubData.
   1236  *
   1237  *             Repeat test case for following internal formats:
   1238  *              -  GL_R8,
   1239  *              -  GL_R16,
   1240  *              -  GL_R16F,
   1241  *              -  GL_R32F,
   1242  *              -  GL_R8I,
   1243  *              -  GL_R16I,
   1244  *              -  GL_R32I,
   1245  *              -  GL_R8UI,
   1246  *              -  GL_R16UI,
   1247  *              -  GL_R32UI,
   1248  *              -  GL_RG8,
   1249  *              -  GL_RG16,
   1250  *              -  GL_RG16F,
   1251  *              -  GL_RG32F,
   1252  *              -  GL_RG8I,
   1253  *              -  GL_RG16I,
   1254  *              -  GL_RG32I,
   1255  *              -  GL_RG8UI,
   1256  *              -  GL_RG16UI,
   1257  *              -  GL_RG32UI,
   1258  *              -  GL_RGB32F,
   1259  *              -  GL_RGB32I,
   1260  *              -  GL_RGB32UI,
   1261  *              -  GL_RGBA8,
   1262  *              -  GL_RGBA16,
   1263  *              -  GL_RGBA16F,
   1264  *              -  GL_RGBA32F,
   1265  *              -  GL_RGBA8I,
   1266  *              -  GL_RGBA16I,
   1267  *              -  GL_RGBA32I,
   1268  *              -  GL_RGBA8UI,
   1269  *              -  GL_RGBA16UI and
   1270  *              -  GL_RGBA32UI.
   1271  */
   1272 class ClearTest : public deqp::TestCase
   1273 {
   1274 public:
   1275 	/* Public member functions */
   1276 	ClearTest(deqp::Context& context);
   1277 
   1278 	virtual tcu::TestNode::IterateResult iterate();
   1279 
   1280 private:
   1281 	/* Private member functions */
   1282 	ClearTest(const ClearTest& other);
   1283 	ClearTest& operator=(const ClearTest& other);
   1284 
   1285 	typedef void(GLW_APIENTRY* PFNGLNAMEDBUFFERDATA)(glw::GLuint buffer, glw::GLsizei size, const glw::GLvoid* data,
   1286 													 glw::GLenum usage);
   1287 	typedef void(GLW_APIENTRY* PFNGLCLEARNAMEDBUFFERDATA)(glw::GLuint buffer, glw::GLenum internalformat,
   1288 														  glw::GLenum format, glw::GLenum type,
   1289 														  const glw::GLvoid* data);
   1290 	typedef void(GLW_APIENTRY* PFNGLCLEARNAMEDBUFFERSUBDATA)(glw::GLuint buffer, glw::GLenum internalformat,
   1291 															 glw::GLintptr offset, glw::GLsizei size,
   1292 															 glw::GLenum format, glw::GLenum type,
   1293 															 const glw::GLvoid* data);
   1294 
   1295 	PFNGLNAMEDBUFFERDATA		 m_pNamedBufferData;
   1296 	PFNGLCLEARNAMEDBUFFERDATA	m_pClearNamedBufferData;
   1297 	PFNGLCLEARNAMEDBUFFERSUBDATA m_pClearNamedBufferSubData;
   1298 
   1299 	template <typename T, bool USE_SUB_DATA>
   1300 	bool TestClearNamedBufferData(glw::GLenum internalformat, glw::GLsizei count, glw::GLenum format, glw::GLenum type,
   1301 								  T* data);
   1302 
   1303 	template <bool USE_SUB_DATA>
   1304 	void ClearNamedBuffer(glw::GLuint buffer, glw::GLenum internalformat, glw::GLsizei size, glw::GLenum format,
   1305 						  glw::GLenum type, glw::GLvoid* data);
   1306 
   1307 	template <typename T>
   1308 	bool Compare(const T* data, const T* reference, const glw::GLsizei count);
   1309 
   1310 	template <typename T>
   1311 	void LogFail(bool use_sub_data, glw::GLenum internalformat, const T* data, const T* reference,
   1312 				 const glw::GLsizei count);
   1313 
   1314 	void LogError(bool use_sub_data, glw::GLenum internalformat);
   1315 };
   1316 /* ClearTest class */
   1317 
   1318 /** @class MapReadOnlyTest
   1319  *
   1320  *  @brief Direct State Access Buffers Map Read Only test cases.
   1321  *
   1322  *         Test follows the steps:
   1323  *
   1324  *             Create buffer object using CreateBuffers.
   1325  *
   1326  *             Create data storage using NamedBufferData function and reference
   1327  *             data.
   1328  *
   1329  *             Map buffer with MapNamedBuffer function and READ_ONLY access flag.
   1330  *
   1331  *             Compare mapped buffer content with reference data.
   1332  *
   1333  *             Unmap buffer using UnmapNamedBuffer. Test if UnmapNamedBuffer
   1334  *             returned GL_TRUE.
   1335  *
   1336  *             Release buffer.
   1337  */
   1338 class MapReadOnlyTest : public deqp::TestCase
   1339 {
   1340 public:
   1341 	/* Public member functions */
   1342 	MapReadOnlyTest(deqp::Context& context);
   1343 
   1344 	virtual tcu::TestNode::IterateResult iterate();
   1345 
   1346 private:
   1347 	/* Private member functions */
   1348 	MapReadOnlyTest(const MapReadOnlyTest& other);
   1349 	MapReadOnlyTest& operator=(const MapReadOnlyTest& other);
   1350 
   1351 	/* API entry points. */
   1352 	typedef void(GLW_APIENTRY* PFNGLNAMEDBUFFERDATA)(glw::GLuint buffer, glw::GLsizei size, const glw::GLvoid* data,
   1353 													 glw::GLenum usage);
   1354 	typedef void*(GLW_APIENTRY* PFNGLMAPNAMEDBUFFER)(glw::GLuint buffer, glw::GLenum access);
   1355 	typedef glw::GLboolean(GLW_APIENTRY* PFNGLUNMAPNAMEDBUFFER)(glw::GLuint buffer);
   1356 
   1357 	PFNGLNAMEDBUFFERDATA  m_pNamedBufferData;
   1358 	PFNGLMAPNAMEDBUFFER   m_pMapNamedBuffer;
   1359 	PFNGLUNMAPNAMEDBUFFER m_pUnmapNamedBuffer;
   1360 
   1361 	static const glw::GLuint  s_reference[];	 //<! Reference data.
   1362 	static const glw::GLsizei s_reference_size;  //<! Reference data size.
   1363 	static const glw::GLsizei s_reference_count; //<! Reference data count (number of GLuint elements).
   1364 };
   1365 /* MapReadOnlyTest class */
   1366 
   1367 /** @class MapReadWriteTest
   1368  *
   1369  *  @brief Direct State Access Buffers Map Read Write test cases.
   1370  *
   1371  *         Test follows the steps:
   1372  *
   1373  *             Create buffer object using CreateBuffers.
   1374  *
   1375  *             Create data storage using NamedBufferData function and reference
   1376  *             data.
   1377  *
   1378  *             Map buffer with MapNamedBuffer function and READ_WRITE access flag.
   1379  *
   1380  *             Compare mapped buffer content with reference.
   1381  *
   1382  *             Write to the mapped buffer inverted reference content.
   1383  *
   1384  *             Unmap buffer.
   1385  *
   1386  *             Map buffer with MapNamedBuffer function and READ_WRITE access flag.
   1387  *
   1388  *             Compare mapped buffer content with inverted reference.
   1389  *
   1390  *             Unmap buffer.
   1391  *
   1392  *             Release buffer.
   1393  */
   1394 class MapReadWriteTest : public deqp::TestCase
   1395 {
   1396 public:
   1397 	/* Public member functions */
   1398 	MapReadWriteTest(deqp::Context& context);
   1399 
   1400 	virtual tcu::TestNode::IterateResult iterate();
   1401 
   1402 private:
   1403 	/* Private member functions */
   1404 	MapReadWriteTest(const MapReadWriteTest& other);
   1405 	MapReadWriteTest& operator=(const MapReadWriteTest& other);
   1406 
   1407 	/* API entry points. */
   1408 	typedef void(GLW_APIENTRY* PFNGLNAMEDBUFFERDATA)(glw::GLuint buffer, glw::GLsizei size, const glw::GLvoid* data,
   1409 													 glw::GLenum usage);
   1410 	typedef void*(GLW_APIENTRY* PFNGLMAPNAMEDBUFFER)(glw::GLuint buffer, glw::GLenum access);
   1411 	typedef glw::GLboolean(GLW_APIENTRY* PFNGLUNMAPNAMEDBUFFER)(glw::GLuint buffer);
   1412 
   1413 	PFNGLNAMEDBUFFERDATA  m_pNamedBufferData;
   1414 	PFNGLMAPNAMEDBUFFER   m_pMapNamedBuffer;
   1415 	PFNGLUNMAPNAMEDBUFFER m_pUnmapNamedBuffer;
   1416 
   1417 	static const glw::GLuint  s_reference[];	 //<! Reference data.
   1418 	static const glw::GLsizei s_reference_size;  //<! Reference data size.
   1419 	static const glw::GLsizei s_reference_count; //<! Reference data count (number of GLuint elements).
   1420 };
   1421 /* MapReadWriteTest class */
   1422 
   1423 /** @class MapWriteOnlyTest
   1424  *
   1425  *  @brief Direct State Access Buffers Map Write Only test cases.
   1426  *
   1427  *         Test follows the steps:
   1428  *
   1429  *             Create buffer object using CreateBuffers.
   1430  *
   1431  *             Create data storage using NamedBufferData function.
   1432  *
   1433  *             Map buffer with MapNamedBuffer function and WRITE_ONLY access flag.
   1434  *
   1435  *             Write reference data.
   1436  *
   1437  *             Unmap buffer.
   1438  *
   1439  *             Bind buffer to the binding point.
   1440  *
   1441  *             Map buffer with MapBuffer function and READ_ONLY access flag.
   1442  *
   1443  *             Compare mapped buffer content with reference.
   1444  *
   1445  *             Unmap buffer.
   1446  *
   1447  *             Release buffer.
   1448  */
   1449 class MapWriteOnlyTest : public deqp::TestCase
   1450 {
   1451 public:
   1452 	/* Public member functions */
   1453 	MapWriteOnlyTest(deqp::Context& context);
   1454 
   1455 	virtual tcu::TestNode::IterateResult iterate();
   1456 
   1457 private:
   1458 	/* Private member functions */
   1459 	MapWriteOnlyTest(const MapWriteOnlyTest& other);
   1460 	MapWriteOnlyTest& operator=(const MapWriteOnlyTest& other);
   1461 
   1462 	/* API entry points. */
   1463 	typedef void(GLW_APIENTRY* PFNGLNAMEDBUFFERDATA)(glw::GLuint buffer, glw::GLsizei size, const glw::GLvoid* data,
   1464 													 glw::GLenum usage);
   1465 	typedef void*(GLW_APIENTRY* PFNGLMAPNAMEDBUFFER)(glw::GLuint buffer, glw::GLenum access);
   1466 	typedef glw::GLboolean(GLW_APIENTRY* PFNGLUNMAPNAMEDBUFFER)(glw::GLuint buffer);
   1467 
   1468 	PFNGLNAMEDBUFFERDATA  m_pNamedBufferData;
   1469 	PFNGLMAPNAMEDBUFFER   m_pMapNamedBuffer;
   1470 	PFNGLUNMAPNAMEDBUFFER m_pUnmapNamedBuffer;
   1471 
   1472 	static const glw::GLuint  s_reference[];	 //<! Reference data.
   1473 	static const glw::GLsizei s_reference_size;  //<! Reference data size.
   1474 	static const glw::GLsizei s_reference_count; //<! Reference data count (number of GLuint elements).
   1475 };
   1476 /* MapReadOnlyTest class */
   1477 
   1478 /** @class MapRangeReadBitTest
   1479  *
   1480  *  @brief Direct State Access Buffers Range Map Read Bit test cases.
   1481  *
   1482  *         Test follows the steps:
   1483  *
   1484  *             Create buffer object using CreateBuffers.
   1485  *
   1486  *             Create data storage using NamedBufferStorage function, reference
   1487  *             data and MAP_READ_BIT access flag.
   1488  *
   1489  *             Map first half of buffer with MapNamedBufferRange and MAP_READ_BIT
   1490  *             access flag.
   1491  *
   1492  *             Compare mapped buffer content with reference.
   1493  *
   1494  *             Unmap buffer.
   1495  *
   1496  *             Map second half of buffer with MapNamedBufferRange and MAP_READ_BIT
   1497  *             access flag.
   1498  *
   1499  *             Compare mapped buffer content with reference.
   1500  *
   1501  *             Unmap buffer.
   1502  *
   1503  *             Release buffer.
   1504  *
   1505  *             Repeat the test with also MAP_PERSISTENT_BIT flag turned on.
   1506  *
   1507  *             Repeat the test with also MAP_PERSISTENT_BIT and MAP_COHERENT_BIT
   1508  *             flags turned on.
   1509  */
   1510 class MapRangeReadBitTest : public deqp::TestCase
   1511 {
   1512 public:
   1513 	/* Public member functions */
   1514 	MapRangeReadBitTest(deqp::Context& context);
   1515 
   1516 	virtual tcu::TestNode::IterateResult iterate();
   1517 
   1518 private:
   1519 	/* Private member functions */
   1520 	MapRangeReadBitTest(const MapRangeReadBitTest& other);
   1521 	MapRangeReadBitTest& operator=(const MapRangeReadBitTest& other);
   1522 
   1523 	/* API entry points. */
   1524 	typedef void(GLW_APIENTRY* PFNGLNAMEDBUFFERSTORAGE)(glw::GLuint buffer, glw::GLsizeiptr size,
   1525 														const glw::GLvoid* data, glw::GLbitfield flags);
   1526 	typedef void*(GLW_APIENTRY* PFNGLMAPNAMEDBUFFERRANGE)(glw::GLuint buffer, glw::GLintptr offset, glw::GLsizei length,
   1527 														  glw::GLbitfield access);
   1528 	typedef glw::GLboolean(GLW_APIENTRY* PFNGLUNMAPNAMEDBUFFER)(glw::GLuint buffer);
   1529 
   1530 	PFNGLNAMEDBUFFERSTORAGE  m_pNamedBufferStorage;
   1531 	PFNGLMAPNAMEDBUFFERRANGE m_pMapNamedBufferRange;
   1532 	PFNGLUNMAPNAMEDBUFFER	m_pUnmapNamedBuffer;
   1533 
   1534 	bool CompareWithReference(glw::GLuint* data, glw::GLintptr offset, glw::GLsizei length);
   1535 
   1536 	static const glw::GLuint  s_reference[];	 //<! Reference data.
   1537 	static const glw::GLsizei s_reference_size;  //<! Reference data size.
   1538 	static const glw::GLsizei s_reference_count; //<! Reference data count (number of GLuint elements).
   1539 };
   1540 /* MapRangeReadBitTest class */
   1541 
   1542 /** @class MapRangeWriteBitTest
   1543  *
   1544  *  @brief Direct State Access Buffers Range Map Read Bit test cases.
   1545  *
   1546  *         Test follows the steps:
   1547  *
   1548  *             Create buffer object using CreateBuffers.
   1549  *
   1550  *             Create data storage using NamedBufferStorage function, reference
   1551  *             data and (MAP_READ_BIT | MAP_WRITE_BIT) access flag.
   1552  *
   1553  *             Map first half of buffer with MapNamedBufferRange and MAP_WRITE_BIT
   1554  *             access flag.
   1555  *
   1556  *             Write reference data.
   1557  *
   1558  *             Unmap buffer.
   1559  *
   1560  *             Map second half of buffer with MapNamedBufferRange and MAP_WRITE_BIT
   1561  *             access flag.
   1562  *
   1563  *             Write reference data.
   1564  *
   1565  *             Unmap buffer.
   1566  *
   1567  *             Bind buffer to the binding point.
   1568  *
   1569  *             Map buffer with MapBuffer function and READ_ONLY access flag.
   1570  *
   1571  *             Compare mapped buffer content with reference.
   1572  *
   1573  *             Unmap buffer.
   1574  *
   1575  *             Release buffer.
   1576  *
   1577  *             Repeat the test with also MAP_INVALIDATE_RANGE_BIT flag turned on.
   1578  *
   1579  *             Repeat the test with also MAP_INVALIDATE_BUFFER_BIT flag turned on with
   1580  *             only the first mapping.
   1581  *
   1582  *             Repeat the test with also MAP_FLUSH_EXPLICIT_BIT flag turned on. Make
   1583  *             sure that all writes are flushed using FlushNamedMappedBufferRange
   1584  *             function.
   1585  *
   1586  *             Repeat the test with also MAP_UNSYNCHRONIZED_BIT flag turned on with
   1587  *             only the second mapping.
   1588  */
   1589 class MapRangeWriteBitTest : public deqp::TestCase
   1590 {
   1591 public:
   1592 	/* Public member functions */
   1593 	MapRangeWriteBitTest(deqp::Context& context);
   1594 
   1595 	virtual tcu::TestNode::IterateResult iterate();
   1596 
   1597 private:
   1598 	/* Private member functions */
   1599 	MapRangeWriteBitTest(const MapRangeWriteBitTest& other);
   1600 	MapRangeWriteBitTest& operator=(const MapRangeWriteBitTest& other);
   1601 
   1602 	/* API entry points. */
   1603 	typedef void(GLW_APIENTRY* PFNGLNAMEDBUFFERSTORAGE)(glw::GLuint buffer, glw::GLsizeiptr size,
   1604 														const glw::GLvoid* data, glw::GLbitfield flags);
   1605 	typedef void*(GLW_APIENTRY* PFNGLMAPNAMEDBUFFERRANGE)(glw::GLuint buffer, glw::GLintptr offset, glw::GLsizei length,
   1606 														  glw::GLbitfield access);
   1607 	typedef glw::GLboolean(GLW_APIENTRY* PFNGLUNMAPNAMEDBUFFER)(glw::GLuint buffer);
   1608 	typedef void(GLW_APIENTRY* PFNGLFLUSHMAPPEDNAMEDBUFFERRANGE)(glw::GLuint buffer, glw::GLintptr offset,
   1609 																 glw::GLsizei length);
   1610 
   1611 	PFNGLNAMEDBUFFERSTORAGE			 m_pNamedBufferStorage;
   1612 	PFNGLMAPNAMEDBUFFERRANGE		 m_pMapNamedBufferRange;
   1613 	PFNGLUNMAPNAMEDBUFFER			 m_pUnmapNamedBuffer;
   1614 	PFNGLFLUSHMAPPEDNAMEDBUFFERRANGE m_pFlushMappedNamedBufferRange;
   1615 
   1616 	bool CompareWithReference(glw::GLuint buffer, glw::GLbitfield access_flag);
   1617 
   1618 	static const glw::GLuint  s_reference[];	 //<! Reference data.
   1619 	static const glw::GLsizei s_reference_size;  //<! Reference data size.
   1620 	static const glw::GLsizei s_reference_count; //<! Reference data count (number of GLuint elements).
   1621 };
   1622 /* MapRangeWriteBitTest class */
   1623 
   1624 /** @class SubDataQueryTest
   1625  *
   1626  *  @brief Direct State Access GetNamedBufferSubData Query test cases.
   1627  *
   1628  *         Test follows the steps:
   1629  *
   1630  *             Create buffer object using CreateBuffers.
   1631  *
   1632  *             Create data storage using NamedBufferData function and reference data.
   1633  *
   1634  *             Fetch first half of the buffer using GetNamedBufferSubData function.
   1635  *
   1636  *             Fetch second half of the buffer using GetNamedBufferSubData function.
   1637  *
   1638  *             Compare fetched data with reference values.
   1639  *
   1640  *             Release object.
   1641  */
   1642 class SubDataQueryTest : public deqp::TestCase
   1643 {
   1644 public:
   1645 	/* Public member functions */
   1646 	SubDataQueryTest(deqp::Context& context);
   1647 
   1648 	virtual tcu::TestNode::IterateResult iterate();
   1649 
   1650 private:
   1651 	/* Private member functions */
   1652 	SubDataQueryTest(const SubDataQueryTest& other);
   1653 	SubDataQueryTest& operator=(const SubDataQueryTest& other);
   1654 
   1655 	/* API entry points. */
   1656 	typedef void(GLW_APIENTRY* PFNGLNAMEDBUFFERDATA)(glw::GLuint buffer, glw::GLsizei size, const glw::GLvoid* data,
   1657 													 glw::GLenum usage);
   1658 	typedef void*(GLW_APIENTRY* PFNGLGETNAMEDBUFFERSUBDATA)(glw::GLuint buffer, glw::GLintptr offset, glw::GLsizei size,
   1659 															glw::GLvoid* data);
   1660 
   1661 	PFNGLNAMEDBUFFERDATA	   m_pNamedBufferData;
   1662 	PFNGLGETNAMEDBUFFERSUBDATA m_pGetNamedBufferSubData;
   1663 
   1664 	static const glw::GLuint  s_reference[];	 //<! Reference data.
   1665 	static const glw::GLsizei s_reference_size;  //<! Reference data size.
   1666 	static const glw::GLsizei s_reference_count; //<! Reference data count (number of GLuint elements).
   1667 };
   1668 /* SubDataQueryTest class */
   1669 
   1670 /** @class DefaultsTest
   1671  *
   1672  *  @brief Direct State Access Buffer Objects Default Values Test.
   1673  *
   1674  *         Test follows the steps:
   1675  *
   1676  *             Create buffer object using CreateBuffers.
   1677  *
   1678  *             Check that GetNamedBufferParameteriv and GetNamedBufferParameteri64v
   1679  *             function called with parameter name
   1680  *              -  BUFFER_SIZE returns value equal to 0;
   1681  *              -  BUFFER_USAGE returns value equal to STATIC_DRAW;
   1682  *              -  BUFFER_ACCESS returns value equal to READ_WRITE;
   1683  *              -  BUFFER_ACCESS_FLAGS returns value equal to 0;
   1684  *              -  BUFFER_IMMUTABLE_STORAGE returns value equal to FALSE;
   1685  *              -  BUFFER_MAPPED returns value equal to FALSE;
   1686  *              -  BUFFER_MAP_OFFSET returns value equal to 0;
   1687  *              -  BUFFER_MAP_LENGTH returns value equal to 0;
   1688  *              -  BUFFER_STORAGE_FLAGS returns value equal to 0.
   1689  *
   1690  *            Check that GetNamedBufferPointerv function called with parameter name
   1691  *            BUFFER_MAP_POINTER returns value equal to NULL;
   1692  */
   1693 class DefaultsTest : public deqp::TestCase
   1694 {
   1695 public:
   1696 	/* Public member functions */
   1697 	DefaultsTest(deqp::Context& context);
   1698 
   1699 	virtual tcu::TestNode::IterateResult iterate();
   1700 
   1701 private:
   1702 	/* Private member functions */
   1703 	DefaultsTest(const DefaultsTest& other);
   1704 	DefaultsTest& operator=(const DefaultsTest& other);
   1705 
   1706 	bool CheckParameterError(const glw::GLchar* pname_string, const glw::GLchar* function_string);
   1707 
   1708 	template <typename T>
   1709 	bool CheckValue(const T value, const T reference_value, const glw::GLchar* pname_string,
   1710 					const glw::GLchar* function_string);
   1711 
   1712 	/* API entry points. */
   1713 	typedef void(GLW_APIENTRY* PFNGLNAMEDBUFFERDATA)(glw::GLuint buffer, glw::GLsizei size, const glw::GLvoid* data,
   1714 													 glw::GLenum usage);
   1715 	typedef void(GLW_APIENTRY* PFNGLGETNAMEDBUFFERPARAMETERI64V)(glw::GLuint buffer, glw::GLenum pname,
   1716 																 glw::GLint64* data);
   1717 	typedef void(GLW_APIENTRY* PFNGLGETNAMEDBUFFERPARAMETERIV)(glw::GLuint buffer, glw::GLenum pname, glw::GLint* data);
   1718 	typedef void(GLW_APIENTRY* PFNGLGETNAMEDBUFFERPOINTERV)(glw::GLuint buffer, glw::GLenum pname,
   1719 															glw::GLvoid** params);
   1720 
   1721 	PFNGLNAMEDBUFFERDATA			 m_pNamedBufferData;
   1722 	PFNGLGETNAMEDBUFFERPARAMETERI64V m_pGetNamedBufferParameteri64v;
   1723 	PFNGLGETNAMEDBUFFERPARAMETERIV   m_pGetNamedBufferParameteriv;
   1724 	PFNGLGETNAMEDBUFFERPOINTERV		 m_pGetNamedBufferPointerv;
   1725 };
   1726 /* DefaultsTest class */
   1727 
   1728 /** @class ErrorsTest
   1729  *
   1730  *  @brief Direct State Access Buffer Objects Errors Test.
   1731  *
   1732  *         Test follows the steps:
   1733  *
   1734  *                     Check that INVALID_VALUE is generated by CreateBuffers if n is negative.
   1735  *
   1736  *
   1737  *                     Check that INVALID_OPERATION is generated by NamedBufferStorage if
   1738  *                     buffer is not the name of an existing buffer object.
   1739  *
   1740  *                     Check that INVALID_VALUE is generated by NamedBufferStorage if size is
   1741  *                     less than or equal to zero.
   1742  *
   1743  *                     Check that INVALID_VALUE is generated by NamedBufferStorage if flags has
   1744  *                     any bits set other than DYNAMIC_STORAGE_BIT, MAP_READ_BIT,
   1745  *                     MAP_WRITE_BIT, MAP_PERSISTENT_BIT, MAP_COHERENT_BIT or
   1746  *                     CLIENT_STORAGE_BIT.
   1747  *
   1748  *                     Check that INVALID_VALUE error is generated by NamedBufferStorage if
   1749  *                     flags contains MAP_PERSISTENT_BIT but does not contain at least one of
   1750  *                     MAP_READ_BIT or MAP_WRITE_BIT.
   1751  *
   1752  *                     Check that INVALID_VALUE is generated by NamedBufferStorage if flags
   1753  *                     contains MAP_COHERENT_BIT, but does not also contain MAP_PERSISTENT_BIT.
   1754  *
   1755  *                     Check that OUT_OF_MEMORY is generated if the GL is unable to create a
   1756  *                     data store with the specified size. Do not set result, if out of memory
   1757  *                     situation was impossible to generate or unable to verify.
   1758  *
   1759  *
   1760  *                     Check that INVALID_OPERATION is generated by NamedBufferData if buffer
   1761  *                     is not the name of an existing buffer object.
   1762  *
   1763  *                     Check that INVALID_ENUM is generated by NamedBufferData if usage is not
   1764  *                     STREAM_DRAW, STREAM_READ, STREAM_COPY, STATIC_DRAW, STATIC_READ,
   1765  *                     STATIC_COPY, DYNAMIC_DRAW, DYNAMIC_READ or DYNAMIC_COPY.
   1766  *
   1767  *                     Check that INVALID_VALUE is generated by NamedBufferData if size is
   1768  *                     negative.
   1769  *
   1770  *                     Check that INVALID_OPERATION is generated by NamedBufferData if the
   1771  *                     BUFFER_IMMUTABLE_STORAGE flag of the buffer object is TRUE.
   1772  *
   1773  *                     Check that OUT_OF_MEMORY is generated if the GL is unable to create a
   1774  *                     data store with the specified size. Do not set result, if out of memory
   1775  *                     situation was impossible to generate or unable to verify.
   1776  *
   1777  *
   1778  *                     Check that INVALID_OPERATION is generated by NamedBufferSubData if
   1779  *                     buffer is not the name of an existing buffer object.
   1780  *
   1781  *                     Check that INVALID_VALUE is generated by NamedBufferSubData if offset or
   1782  *                     size is negative, or if offset+size is greater than the value of
   1783  *                     BUFFER_SIZE for the specified buffer object.
   1784  *
   1785  *                     Check that INVALID_OPERATION is generated by NamedBufferSubData if any
   1786  *                     part of the specified range of the buffer object is mapped with
   1787  *                     MapBufferRange or MapBuffer, unless it was mapped with the
   1788  *                     MAP_PERSISTENT_BIT bit set in the MapBufferRange access flags.
   1789  *
   1790  *                     Check that INVALID_OPERATION is generated by NamedBufferSubData if the
   1791  *                     value of the BUFFER_IMMUTABLE_STORAGE flag of the buffer object is TRUE
   1792  *                     and the value of BUFFER_STORAGE_FLAGS for the buffer object does not
   1793  *                     have the DYNAMIC_STORAGE_BIT bit set.
   1794  *
   1795  *
   1796  *                     Check that INVALID_OPERATION is generated by ClearNamedBufferData if
   1797  *                     buffer is not the name of an existing buffer object.
   1798  *
   1799  *                     Check that INVALID_ENUM is generated by ClearNamedBufferData if
   1800  *                     internal format is not one of the valid sized internal formats listed in
   1801  *                     the table above.
   1802  *
   1803  *                     Check that INVALID_OPERATION is generated by ClearNamedBufferData if
   1804  *                     any part of the specified range of the buffer object is mapped with
   1805  *                     MapBufferRange or MapBuffer, unless it was mapped with the
   1806  *                     MAP_PERSISTENT_BIT bit set in the MapBufferRange access flags.
   1807  *
   1808  *                     Check that INVALID_VALUE is generated by ClearNamedBufferData if
   1809  *                     format is not a valid format, or type is not a valid type.
   1810  *
   1811  *
   1812  *                     Check that INVALID_OPERATION is generated by ClearNamedBufferSubData
   1813  *                     if buffer is not the name of an existing buffer object.
   1814  *
   1815  *                     Check that INVALID_ENUM is generated by ClearNamedBufferSubData if
   1816  *                     internal format is not one of the valid sized internal formats listed in
   1817  *                     the table above.
   1818  *
   1819  *                     Check that INVALID_VALUE is generated by ClearNamedBufferSubData if
   1820  *                     offset or range are not multiples of the number of basic machine units
   1821  *                     per-element for the internal format specified by internal format. This
   1822  *                     value may be computed by multiplying the number of components for
   1823  *                     internal format from the table by the size of the base type from the
   1824  *                     specification table.
   1825  *
   1826  *                     Check that INVALID_VALUE is generated by ClearNamedBufferSubData if
   1827  *                     offset or size is negative, or if offset+size is greater than the value
   1828  *                     of BUFFER_SIZE for the buffer object.
   1829  *
   1830  *                     Check that INVALID_OPERATION is generated by ClearNamedBufferSubData
   1831  *                     if any part of the specified range of the buffer object is mapped with
   1832  *                     MapBufferRange or MapBuffer, unless it was mapped with the
   1833  *                     MAP_PERSISTENT_BIT bit set in the MapBufferRange access flags.
   1834  *
   1835  *                     Check that INVALID_VALUE is generated by ClearNamedBufferSubData if
   1836  *                     format is not a valid format, or type is not a valid type.
   1837  *
   1838  *
   1839  *                     Check that INVALID_OPERATION is generated by CopyNamedBufferSubData if
   1840  *                     readBuffer or writeBuffer is not the name of an existing buffer object.
   1841  *
   1842  *                     Check that INVALID_VALUE is generated by CopyNamedBufferSubData if any of
   1843  *                     readOffset, writeOffset or size is negative, if readOffset+size is
   1844  *                     greater than the size of the source buffer object (its value of
   1845  *                     BUFFER_SIZE), or if writeOffset+size is greater than the size of the
   1846  *                     destination buffer object.
   1847  *
   1848  *                     Check that INVALID_VALUE is generated by CopyNamedBufferSubData if the
   1849  *                     source and destination are the same buffer object, and the ranges
   1850  *                     [readOffset,readOffset+size) and [writeOffset,writeOffset+size) overlap.
   1851  *
   1852  *                     Check that INVALID_OPERATION is generated by CopyNamedBufferSubData if
   1853  *                     either the source or destination buffer object is mapped with
   1854  *                     MapBufferRange or MapBuffer, unless they were mapped with the
   1855  *                     MAP_PERSISTENT bit set in the MapBufferRange access flags.
   1856  *
   1857  *
   1858  *                     Check that INVALID_OPERATION is generated by MapNamedBuffer if buffer is
   1859  *                     not the name of an existing buffer object.
   1860  *
   1861  *                     Check that INVALID_ENUM is generated by MapNamedBuffer if access is not
   1862  *                     READ_ONLY, WRITE_ONLY, or READ_WRITE.
   1863  *
   1864  *                     Check that INVALID_OPERATION is generated by MapNamedBuffer if the
   1865  *                     buffer object is in a mapped state.
   1866  *
   1867  *
   1868  *                     Check that INVALID_OPERATION is generated by MapNamedBufferRange if
   1869  *                     buffer is not the name of an existing buffer object.
   1870  *
   1871  *                     Check that INVALID_VALUE is generated by MapNamedBufferRange if offset
   1872  *                     or length is negative, if offset+length is greater than the value of
   1873  *                     BUFFER_SIZE for the buffer object, or if access has any bits set other
   1874  *                     than those defined above.
   1875  *
   1876  *                     Check that INVALID_OPERATION is generated by MapNamedBufferRange for any
   1877  *                     of the following conditions:
   1878  *                      -  length is zero.
   1879  *                      -  The buffer object is already in a mapped state.
   1880  *                      -  Neither MAP_READ_BIT nor MAP_WRITE_BIT is set.
   1881  *                      -  MAP_READ_BIT is set and any of MAP_INVALIDATE_RANGE_BIT,
   1882  *                         MAP_INVALIDATE_BUFFER_BIT or MAP_UNSYNCHRONIZED_BIT is set.
   1883  *                      -  MAP_FLUSH_EXPLICIT_BIT is set and MAP_WRITE_BIT is not set.
   1884  *                      -  Any of MAP_READ_BIT, MAP_WRITE_BIT, MAP_PERSISTENT_BIT, or
   1885  *                         MAP_COHERENT_BIT are set, but the same bit is not included in the
   1886  *                         buffer's storage flags.
   1887  *
   1888  *
   1889  *                     Check that INVALID_OPERATION is generated by UnmapNamedBuffer if buffer
   1890  *                     is not the name of an existing buffer object.
   1891  *
   1892  *                     Check that INVALID_OPERATION is generated by UnmapNamedBuffer if the
   1893  *                     buffer object is not in a mapped state.
   1894  *
   1895  *
   1896  *                     Check that INVALID_OPERATION is generated by FlushMappedNamedBufferRange
   1897  *                     if buffer is not the name of an existing buffer object.
   1898  *
   1899  *                     Check that INVALID_VALUE is generated by FlushMappedNamedBufferRange if
   1900  *                     offset or length is negative, or if offset + length exceeds the size of
   1901  *                     the mapping.
   1902  *
   1903  *                     Check that INVALID_OPERATION is generated by FlushMappedNamedBufferRange
   1904  *                     if the buffer object is not mapped, or is mapped without the
   1905  *                     MAP_FLUSH_EXPLICIT_BIT flag.
   1906  *
   1907  *
   1908  *                     Check that INVALID_OPERATION is generated by GetNamedBufferParameter* if
   1909  *                     buffer is not the name of an existing buffer object.
   1910  *
   1911  *                     Check that INVALID_ENUM is generated by GetNamedBufferParameter* if
   1912  *                     pname is not one of the buffer object parameter names: BUFFER_ACCESS,
   1913  *                     BUFFER_ACCESS_FLAGS, BUFFER_IMMUTABLE_STORAGE, BUFFER_MAPPED,
   1914  *                     BUFFER_MAP_LENGTH, BUFFER_MAP_OFFSET, BUFFER_SIZE, BUFFER_STORAGE_FLAGS,
   1915  *                     BUFFER_USAGE.
   1916  *
   1917  *
   1918  *                     Check that INVALID_OPERATION is generated by GetNamedBufferPointerv
   1919  *                     if buffer is not the name of an existing buffer object.
   1920  *
   1921  *
   1922  *                     Check that INVALID_OPERATION is generated by GetNamedBufferSubData if
   1923  *                     buffer is not the name of an existing buffer object.
   1924  *
   1925  *                     Check that INVALID_VALUE is generated by GetNamedBufferSubData if offset
   1926  *                     or size is negative, or if offset+size is greater than the value of
   1927  *                     BUFFER_SIZE for the buffer object.
   1928  *
   1929  *                     Check that INVALID_OPERATION is generated by GetNamedBufferSubData if
   1930  *                     the buffer object is mapped with MapBufferRange or MapBuffer, unless it
   1931  *                     was mapped with the MAP_PERSISTENT_BIT bit set in the MapBufferRange
   1932  *                     access flags.
   1933  */
   1934 class ErrorsTest : public deqp::TestCase
   1935 {
   1936 public:
   1937 	/* Public member functions */
   1938 	ErrorsTest(deqp::Context& context);
   1939 
   1940 	virtual tcu::TestNode::IterateResult iterate();
   1941 
   1942 private:
   1943 	/* Private member functions */
   1944 	ErrorsTest(const ErrorsTest& other);
   1945 	ErrorsTest& operator=(const ErrorsTest& other);
   1946 
   1947 	/* API entry points. */
   1948 	typedef void(GLW_APIENTRY* PFNGLCLEARNAMEDBUFFERDATA)(glw::GLuint buffer, glw::GLenum internalformat,
   1949 														  glw::GLenum format, glw::GLenum type,
   1950 														  const glw::GLvoid* data);
   1951 	typedef void(GLW_APIENTRY* PFNGLCLEARNAMEDBUFFERSUBDATA)(glw::GLuint buffer, glw::GLenum internalformat,
   1952 															 glw::GLintptr offset, glw::GLsizei size,
   1953 															 glw::GLenum format, glw::GLenum type,
   1954 															 const glw::GLvoid* data);
   1955 	typedef void(GLW_APIENTRY* PFNGLCOPYNAMEDBUFFERSUBDATA)(glw::GLuint readBuffer, glw::GLuint writeBuffer,
   1956 															glw::GLintptr readOffset, glw::GLintptr writeOffset,
   1957 															glw::GLsizeiptr size);
   1958 	typedef void(GLW_APIENTRY* PFNGLFLUSHMAPPEDNAMEDBUFFERRANGE)(glw::GLuint buffer, glw::GLintptr offset,
   1959 																 glw::GLsizei length);
   1960 	typedef void(GLW_APIENTRY* PFNGLGETNAMEDBUFFERPARAMETERI64V)(glw::GLuint buffer, glw::GLenum pname,
   1961 																 glw::GLint64* data);
   1962 	typedef void(GLW_APIENTRY* PFNGLGETNAMEDBUFFERPARAMETERIV)(glw::GLuint buffer, glw::GLenum pname, glw::GLint* data);
   1963 	typedef void(GLW_APIENTRY* PFNGLGETNAMEDBUFFERPOINTERV)(glw::GLuint buffer, glw::GLenum pname,
   1964 															glw::GLvoid** params);
   1965 	typedef void*(GLW_APIENTRY* PFNGLGETNAMEDBUFFERSUBDATA)(glw::GLuint buffer, glw::GLintptr offset, glw::GLsizei size,
   1966 															glw::GLvoid* data);
   1967 	typedef void*(GLW_APIENTRY* PFNGLMAPNAMEDBUFFER)(glw::GLuint buffer, glw::GLenum access);
   1968 	typedef void*(GLW_APIENTRY* PFNGLMAPNAMEDBUFFERRANGE)(glw::GLuint buffer, glw::GLintptr offset, glw::GLsizei length,
   1969 														  glw::GLbitfield access);
   1970 	typedef void(GLW_APIENTRY* PFNGLNAMEDBUFFERDATA)(glw::GLuint buffer, glw::GLsizeiptr size, const glw::GLvoid* data,
   1971 													 glw::GLenum usage);
   1972 	typedef void(GLW_APIENTRY* PFNGLNAMEDBUFFERSTORAGE)(glw::GLuint buffer, glw::GLsizeiptr size,
   1973 														const glw::GLvoid* data, glw::GLbitfield flags);
   1974 	typedef void(GLW_APIENTRY* PFNGLNAMEDBUFFERSUBDATA)(glw::GLuint buffer, glw::GLintptr offset, glw::GLsizei size,
   1975 														const glw::GLvoid* data);
   1976 	typedef glw::GLboolean(GLW_APIENTRY* PFNGLUNMAPNAMEDBUFFER)(glw::GLuint buffer);
   1977 
   1978 	PFNGLCLEARNAMEDBUFFERDATA		 m_pClearNamedBufferData;
   1979 	PFNGLCLEARNAMEDBUFFERSUBDATA	 m_pClearNamedBufferSubData;
   1980 	PFNGLCOPYNAMEDBUFFERSUBDATA		 m_pCopyNamedBufferSubData;
   1981 	PFNGLFLUSHMAPPEDNAMEDBUFFERRANGE m_pFlushMappedNamedBufferRange;
   1982 	PFNGLGETNAMEDBUFFERPARAMETERI64V m_pGetNamedBufferParameteri64v;
   1983 	PFNGLGETNAMEDBUFFERPARAMETERIV   m_pGetNamedBufferParameteriv;
   1984 	PFNGLGETNAMEDBUFFERPOINTERV		 m_pGetNamedBufferPointerv;
   1985 	PFNGLGETNAMEDBUFFERSUBDATA		 m_pGetNamedBufferSubData;
   1986 	PFNGLMAPNAMEDBUFFER				 m_pMapNamedBuffer;
   1987 	PFNGLMAPNAMEDBUFFERRANGE		 m_pMapNamedBufferRange;
   1988 	PFNGLNAMEDBUFFERDATA			 m_pNamedBufferData;
   1989 	PFNGLNAMEDBUFFERSTORAGE			 m_pNamedBufferStorage;
   1990 	PFNGLNAMEDBUFFERSUBDATA			 m_pNamedBufferSubData;
   1991 	PFNGLUNMAPNAMEDBUFFER			 m_pUnmapNamedBuffer;
   1992 
   1993 	/* Private member functions */
   1994 	bool TestErrorsOfClearNamedBufferData();
   1995 	bool TestErrorsOfClearNamedBufferSubData();
   1996 	bool TestErrorsOfCopyNamedBufferSubData();
   1997 	bool TestErrorsOfCreateBuffers();
   1998 	bool TestErrorsOfFlushMappedNamedBufferRange();
   1999 	bool TestErrorsOfGetNamedBufferParameter();
   2000 	bool TestErrorsOfGetNamedBufferPointerv();
   2001 	bool TestErrorsOfGetNamedBufferSubData();
   2002 	bool TestErrorsOfMapNamedBuffer();
   2003 	bool TestErrorsOfMapNamedBufferRange();
   2004 	bool TestErrorsOfNamedBufferData();
   2005 	bool TestErrorsOfNamedBufferStorage();
   2006 	bool TestErrorsOfNamedBufferSubData();
   2007 	bool TestErrorsOfUnmapNamedBuffer();
   2008 
   2009 	bool ErrorCheckAndLog(const glw::GLchar* function_name, const glw::GLenum expected_error,
   2010 						  const glw::GLchar* when_shall_be_generated);
   2011 };
   2012 /* ErrorsTest class */
   2013 
   2014 /** @class FunctionalTest
   2015  *
   2016  *  @brief Direct State Access Buffer Objects Functional Test.
   2017  *
   2018  *         This test verifies basic usage in rendering pipeline of the tested
   2019  *         functions:
   2020  *         -  ClearNamedBufferData,
   2021  *         -  ClearNamedBufferSubData,
   2022  *         -  CopyNamedBufferSubData,
   2023  *         -  FlushMappedNamedBufferRange,
   2024  *         -  GetNamedBufferParameteri64v,
   2025  *         -  GetNamedBufferParameteriv,
   2026  *         -  GetNamedBufferPointerv,
   2027  *         -  GetNamedBufferSubData,
   2028  *         -  MapNamedBuffer,
   2029  *         -  MapNamedBufferRange,
   2030  *         -  NamedBufferData,
   2031  *         -  NamedBufferStorage,
   2032  *         -  NamedBufferSubData and
   2033  *         -  UnmapNamedBuffer.
   2034  *
   2035  *         Test follows the steps:
   2036  *
   2037  *             Prepare program with vertex shader and fragment shader. Fragment shader
   2038  *             shall be pass-trough. Vertex shader shall have one integer input
   2039  *             variable. Vertex shader shall output (to transform feedback) square of
   2040  *             input variable. gl_Position shall be set up to vec4(0.0, 0.0, 0.0, 1.0).
   2041  *             Build and use the program.
   2042  *
   2043  *             Create and bind empty vertex array object.
   2044  *
   2045  *             Prepare one buffer using CreateBuffers and NamedBufferStorage with size
   2046  *             of 6 integers and passing pointer to data {1, 2, 3, 4, 5, 5} and dynamic
   2047  *             storage flag set on. Clear (with 0) the first element with
   2048  *             ClearNamedBufferSubData. Set second data element to 1 using
   2049  *             NamedBufferSubData. Set third data element to 2 using MapNamedBuffer
   2050  *             and UnmapNamedBuffer. Bind it to ARRAY_BUFFER binding point. Copy forth
   2051  *             element into fifth element using CopyNamedBufferSubData. Set fourth data
   2052  *             element using MapNamedBufferRange and FlushMappedNamedBuffer to 3.
   2053  *             During mapping check that GetNamedBufferPointerv called with
   2054  *             BUFFER_MAP_POINTER returns proper pointer. Unmap it using
   2055  *             UnmapNamedBuffer function. Setup buffer as an input attribute to GLSL
   2056  *             program. Consequently, the resulting buffer shall be {0, 1, 2, 3, 4, 5}.
   2057  *
   2058  *             Prepare one buffer using GenBuffers. Bind it to transform feedback.
   2059  *             Allocate it's storage using NamedBufferData with size of 7 integers and
   2060  *             passing pointer to data {0, 0, 0, 0, 0, 0, 36}. Set up this buffer as
   2061  *             transform feedback output.
   2062  *
   2063  *             Begin transform feedback.
   2064  *
   2065  *             Draw six indices using points.
   2066  *
   2067  *             End transform feedback.
   2068  *
   2069  *             Query array buffer's parameter BUFFER_IMMUTABLE_STORAGE with
   2070  *             GetNamedBufferParameteriv and compare with previous setup.
   2071  *
   2072  *             Query transform feedback buffer size with GetNamedBufferParameteri64v
   2073  *             and compare with previous setup.
   2074  *
   2075  *             Fetch transform feedback buffer content using GetNamedBufferSubData and
   2076  *             queried size.
   2077  *
   2078  *             Check that fetched data is equal to {0, 1, 4, 9, 16, 25, 36}.
   2079  *
   2080  *             If any check fails, test shall fail.
   2081  *
   2082  *             If any of the tested functions generates error, test shall fail.
   2083  */
   2084 class FunctionalTest : public deqp::TestCase
   2085 {
   2086 public:
   2087 	/* Public member functions */
   2088 	FunctionalTest(deqp::Context& context);
   2089 
   2090 	virtual tcu::TestNode::IterateResult iterate();
   2091 
   2092 private:
   2093 	/* Private member functions */
   2094 	FunctionalTest(const FunctionalTest& other);
   2095 	FunctionalTest& operator=(const FunctionalTest& other);
   2096 
   2097 	/* API entry points. */
   2098 	typedef void(GLW_APIENTRY* PFNGLCLEARNAMEDBUFFERDATA)(glw::GLuint buffer, glw::GLenum internalformat,
   2099 														  glw::GLenum format, glw::GLenum type,
   2100 														  const glw::GLvoid* data);
   2101 	typedef void(GLW_APIENTRY* PFNGLCLEARNAMEDBUFFERSUBDATA)(glw::GLuint buffer, glw::GLenum internalformat,
   2102 															 glw::GLintptr offset, glw::GLsizei size,
   2103 															 glw::GLenum format, glw::GLenum type,
   2104 															 const glw::GLvoid* data);
   2105 	typedef void(GLW_APIENTRY* PFNGLCOPYNAMEDBUFFERSUBDATA)(glw::GLuint readBuffer, glw::GLuint writeBuffer,
   2106 															glw::GLintptr readOffset, glw::GLintptr writeOffset,
   2107 															glw::GLsizeiptr size);
   2108 	typedef void(GLW_APIENTRY* PFNGLFLUSHMAPPEDNAMEDBUFFERRANGE)(glw::GLuint buffer, glw::GLintptr offset,
   2109 																 glw::GLsizei length);
   2110 	typedef void(GLW_APIENTRY* PFNGLGETNAMEDBUFFERPARAMETERI64V)(glw::GLuint buffer, glw::GLenum pname,
   2111 																 glw::GLint64* data);
   2112 	typedef void(GLW_APIENTRY* PFNGLGETNAMEDBUFFERPARAMETERIV)(glw::GLuint buffer, glw::GLenum pname, glw::GLint* data);
   2113 	typedef void(GLW_APIENTRY* PFNGLGETNAMEDBUFFERPOINTERV)(glw::GLuint buffer, glw::GLenum pname,
   2114 															glw::GLvoid** params);
   2115 	typedef void*(GLW_APIENTRY* PFNGLGETNAMEDBUFFERSUBDATA)(glw::GLuint buffer, glw::GLintptr offset, glw::GLsizei size,
   2116 															glw::GLvoid* data);
   2117 	typedef void*(GLW_APIENTRY* PFNGLMAPNAMEDBUFFER)(glw::GLuint buffer, glw::GLenum access);
   2118 	typedef void*(GLW_APIENTRY* PFNGLMAPNAMEDBUFFERRANGE)(glw::GLuint buffer, glw::GLintptr offset, glw::GLsizei length,
   2119 														  glw::GLbitfield access);
   2120 	typedef void(GLW_APIENTRY* PFNGLNAMEDBUFFERDATA)(glw::GLuint buffer, glw::GLsizeiptr size, const glw::GLvoid* data,
   2121 													 glw::GLenum usage);
   2122 	typedef void(GLW_APIENTRY* PFNGLNAMEDBUFFERSTORAGE)(glw::GLuint buffer, glw::GLsizeiptr size,
   2123 														const glw::GLvoid* data, glw::GLbitfield flags);
   2124 	typedef void(GLW_APIENTRY* PFNGLNAMEDBUFFERSUBDATA)(glw::GLuint buffer, glw::GLintptr offset, glw::GLsizei size,
   2125 														const glw::GLvoid* data);
   2126 	typedef glw::GLboolean(GLW_APIENTRY* PFNGLUNMAPNAMEDBUFFER)(glw::GLuint buffer);
   2127 
   2128 	PFNGLCLEARNAMEDBUFFERDATA		 m_pClearNamedBufferData;
   2129 	PFNGLCLEARNAMEDBUFFERSUBDATA	 m_pClearNamedBufferSubData;
   2130 	PFNGLCOPYNAMEDBUFFERSUBDATA		 m_pCopyNamedBufferSubData;
   2131 	PFNGLFLUSHMAPPEDNAMEDBUFFERRANGE m_pFlushMappedNamedBufferRange;
   2132 	PFNGLGETNAMEDBUFFERPARAMETERI64V m_pGetNamedBufferParameteri64v;
   2133 	PFNGLGETNAMEDBUFFERPARAMETERIV   m_pGetNamedBufferParameteriv;
   2134 	PFNGLGETNAMEDBUFFERPOINTERV		 m_pGetNamedBufferPointerv;
   2135 	PFNGLGETNAMEDBUFFERSUBDATA		 m_pGetNamedBufferSubData;
   2136 	PFNGLMAPNAMEDBUFFER				 m_pMapNamedBuffer;
   2137 	PFNGLMAPNAMEDBUFFERRANGE		 m_pMapNamedBufferRange;
   2138 	PFNGLNAMEDBUFFERDATA			 m_pNamedBufferData;
   2139 	PFNGLNAMEDBUFFERSTORAGE			 m_pNamedBufferStorage;
   2140 	PFNGLNAMEDBUFFERSUBDATA			 m_pNamedBufferSubData;
   2141 	PFNGLUNMAPNAMEDBUFFER			 m_pUnmapNamedBuffer;
   2142 
   2143 	/* Private member variables. */
   2144 	glw::GLuint m_po;
   2145 	glw::GLuint m_vao;
   2146 	glw::GLuint m_bo_in;
   2147 	glw::GLuint m_bo_out;
   2148 	glw::GLint  m_attrib_location;
   2149 
   2150 	/* Private static variables. */
   2151 	static const glw::GLchar  s_vertex_shader[];
   2152 	static const glw::GLchar  s_fragment_shader[];
   2153 	static const glw::GLchar  s_vertex_shader_input_name[];
   2154 	static const glw::GLchar* s_vertex_shader_output_name;
   2155 
   2156 	static const glw::GLint s_initial_data_a[];
   2157 	static const glw::GLint s_initial_data_b[];
   2158 	static const glw::GLint s_expected_data[];
   2159 
   2160 	/* Private member functions */
   2161 	void BuildProgram();
   2162 	void PrepareVertexArrayObject();
   2163 	bool PrepareInputBuffer();
   2164 	bool PrepareOutputBuffer();
   2165 	void Draw();
   2166 	bool CheckArrayBufferImmutableFlag();
   2167 	bool CheckTransformFeedbackBufferSize();
   2168 	bool CheckTransformFeedbackResult();
   2169 	void Cleanup();
   2170 };
   2171 /* FunctionalTest class */
   2172 } /* Buffers namespace */
   2173 
   2174 namespace Framebuffers
   2175 {
   2176 /** Framebuffer Creation
   2177  *
   2178  *      Create at least two framebuffer objects using GenFramebuffers function.
   2179  *      Check them without binding, using IsFramebuffer function. Expect FALSE.
   2180  *
   2181  *      Create at least two framebuffer objects using CreateFramebuffers
   2182  *      function. Check them without binding, using IsFramebuffer function.
   2183  *      Expect TRUE.
   2184  *
   2185  *      Release objects.
   2186  */
   2187 class CreationTest : public deqp::TestCase
   2188 {
   2189 public:
   2190 	/* Public member functions */
   2191 	CreationTest(deqp::Context& context);
   2192 
   2193 	virtual tcu::TestNode::IterateResult iterate();
   2194 
   2195 private:
   2196 	/* Private member functions */
   2197 	CreationTest(const CreationTest& other);
   2198 	CreationTest& operator=(const CreationTest& other);
   2199 };
   2200 /* CreationTest class */
   2201 
   2202 /** Framebuffer Renderbuffer Attachment
   2203  *
   2204  *      Create renderbuffer using GenRenderbuffers function. Bind it. Prepare
   2205  *      its storage using RenderbufferStorage. Unbind it.
   2206  *
   2207  *      Create framebuffer using CreateFramebuffers. Setup renderbuffer storage.
   2208  *      Attach the renderbuffer to the framebuffer using
   2209  *      NamedFramebufferRenderbuffer function.
   2210  *
   2211  *      Bind framebuffer and check its status using CheckFramebufferStatus
   2212  *      function call.
   2213  *
   2214  *      Clear the framebuffer's content with the reference value. Fetch the
   2215  *      framebuffer's content using ReadPixels and compare it with reference
   2216  *      values.
   2217  *
   2218  *      Repeat the test for following attachment types:
   2219  *       -  COLOR_ATTACHMENTi for i from 0 to value of MAX_COLOR_ATTACHMENTS
   2220  *          minus one,
   2221  *       -  DEPTH_ATTACHMENT,
   2222  *       -  STENCIL_ATTACHMENT and
   2223  *       -  DEPTH_STENCIL_ATTACHMENT.
   2224  */
   2225 class RenderbufferAttachmentTest : public deqp::TestCase
   2226 {
   2227 public:
   2228 	/* Public member functions */
   2229 	RenderbufferAttachmentTest(deqp::Context& context);
   2230 
   2231 	virtual tcu::TestNode::IterateResult iterate();
   2232 
   2233 private:
   2234 	/* Private member functions */
   2235 	RenderbufferAttachmentTest(const RenderbufferAttachmentTest& other);
   2236 	RenderbufferAttachmentTest& operator=(const RenderbufferAttachmentTest& other);
   2237 
   2238 	bool Test(glw::GLenum attachment, glw::GLenum internalformat);
   2239 	void Clean();
   2240 
   2241 	/* Private member variables. */
   2242 	glw::GLuint m_fbo;
   2243 	glw::GLuint m_rbo;
   2244 };
   2245 /* RenderbufferAttachmentTest class */
   2246 
   2247 /** Named Framebuffer Texture Attachment
   2248  *
   2249  *      Create texture using CreateTexture function. Prepare its storage using
   2250  *      TexStorage*D*.
   2251  *
   2252  *      Create framebuffer using CreateFramebuffers. Attach the texture to
   2253  *      the framebuffer using NamedFramebufferTexture function. Repeat
   2254  *      attachment for all texture levels.
   2255  *
   2256  *      Bind framebuffer and check its status using CheckFramebufferStatus
   2257  *      function call.
   2258  *
   2259  *      Clear the framebuffer's content with the reference value. Fetch the
   2260  *      framebuffer's content using ReadPixels and compare it with reference
   2261  *      values.
   2262  *
   2263  *      Repeat the test for following attachment types:
   2264  *       -  COLOR_ATTACHMENTi for i from 0 to value of MAX_COLOR_ATTACHMENTS
   2265  *          minus one,
   2266  *       -  DEPTH_ATTACHMENT,
   2267  *       -  STENCIL_ATTACHMENT and
   2268  *       -  DEPTH_STENCIL_ATTACHMENT.
   2269  *
   2270  *      Repeat the test for following texture targets:
   2271  *       -  TEXTURE_RECTANGLE,
   2272  *       -  TEXTURE_2D,
   2273  *       -  TEXTURE_2D_MULTISAMPLE,
   2274  *       -  TEXTURE_CUBE_MAP.
   2275  *
   2276  *      Repeat the test with each possible texture level, that is:
   2277  *       -  0 for TEXTURE_RECTANGLE and TEXTURE_2D_MULTISAMPLE targets;
   2278  *       -  from zero to value one less than base 2 logarithm of the value of
   2279  *          MAX_3D_TEXTURE_SIZE for TEXTURE_2D target
   2280  *       -  from zero to value one less than base 2 logarithm of the value of
   2281  *          MAX_CUBE_MAP_TEXTURE_SIZE for TEXTURE_CUBE_MAP target.
   2282  */
   2283 class TextureAttachmentTest : public deqp::TestCase
   2284 {
   2285 public:
   2286 	/* Public member functions */
   2287 	TextureAttachmentTest(deqp::Context& context);
   2288 
   2289 	virtual tcu::TestNode::IterateResult iterate();
   2290 
   2291 private:
   2292 	/* Private member functions */
   2293 	TextureAttachmentTest(const TextureAttachmentTest& other);
   2294 	TextureAttachmentTest& operator=(const TextureAttachmentTest& other);
   2295 
   2296 	bool Test(glw::GLenum attachment, bool is_color_attachment, glw::GLenum texture_target, glw::GLenum internalformat,
   2297 			  glw::GLuint levels);
   2298 	bool SubTestAttachmentError(glw::GLenum attachment, glw::GLenum texture_target, glw::GLuint level,
   2299 								glw::GLuint levels);
   2300 	bool SubTestStatus(glw::GLenum attachment, glw::GLenum texture_target, glw::GLuint level, glw::GLuint levels);
   2301 	bool SubTestContent(glw::GLenum attachment, glw::GLenum texture_target, glw::GLenum internalformat,
   2302 						glw::GLuint level, glw::GLuint levels);
   2303 	glw::GLuint MaxTextureLevels(glw::GLenum texture_target);
   2304 	void Clear();
   2305 	void Clean();
   2306 
   2307 	/* Private member variables. */
   2308 	glw::GLuint m_fbo;
   2309 	glw::GLuint m_to;
   2310 
   2311 	/* Static private variables. */
   2312 	static const glw::GLenum s_targets[];
   2313 	static const glw::GLuint s_targets_count;
   2314 
   2315 	static const glw::GLfloat s_reference_color[4];
   2316 	static const glw::GLint   s_reference_color_integer[4];
   2317 	static const glw::GLfloat s_reference_depth;
   2318 	static const glw::GLint   s_reference_stencil;
   2319 };
   2320 /* TextureAttachmentTest class */
   2321 
   2322 /** Named Framebuffer Texture Layer Attachment
   2323  *
   2324  *      Create texture using CreateTexture function. Prepare its storage using
   2325  *      TexStorage*D*.
   2326  *
   2327  *      Create framebuffer using CreateFramebuffers. Attach the texture to the
   2328  *      framebuffer using NamedFramebufferTextureLayer function.
   2329  *
   2330  *      Bind framebuffer and check its status using CheckFramebufferStatus
   2331  *      function call.
   2332  *
   2333  *      For non multisample target, clean the framebuffer's content with the
   2334  *      reference value. Fetch one pixel from framebuffer's content using
   2335  *      ReadPixels and compare it with reference values.
   2336  *
   2337  *      Repeat the test for following attachment types:
   2338  *       -  COLOR_ATTACHMENTi for i from 0 to value of MAX_COLOR_ATTACHMENTS
   2339  *          minus one,
   2340  *       -  DEPTH_ATTACHMENT,
   2341  *       -  STENCIL_ATTACHMENT and
   2342  *       -  DEPTH_STENCIL_ATTACHMENT.
   2343  *
   2344  *      Repeat the test for following texture targets:
   2345  *       -  TEXTURE_2D_MULTISAMPLE_ARRAY,
   2346  *       -  TEXTURE_2D_ARRAY,
   2347  *       -  TEXTURE_CUBE_MAP_ARRAY,
   2348  *       -  TEXTURE_3D.
   2349  *
   2350  *      Repeat the test for texture levels from zero to value one less than base
   2351  *      2 logarithm of the value of MAX_3D_TEXTURE_SIZE.
   2352  *
   2353  *      Repeat with texture which has number of layers:
   2354  *       -  1,
   2355  *       -  256,
   2356  *       -  value of MAX_CUBE_MAP_TEXTURE_SIZE for TEXTURE_CUBE_ARRAY or value
   2357  *          of MAX_3D_TEXTURE_SIZE.
   2358  *      Test only limited set of the layers of the above textures to reduce time
   2359  *      complexity of the test.
   2360  */
   2361 class TextureLayerAttachmentTest : public deqp::TestCase
   2362 {
   2363 public:
   2364 	/* Public member functions */
   2365 	TextureLayerAttachmentTest(deqp::Context& context);
   2366 
   2367 	virtual tcu::TestNode::IterateResult iterate();
   2368 
   2369 private:
   2370 	/* Private member functions */
   2371 	TextureLayerAttachmentTest(const TextureLayerAttachmentTest& other);
   2372 	TextureLayerAttachmentTest& operator=(const TextureLayerAttachmentTest& other);
   2373 
   2374 	bool Test(glw::GLenum attachment, bool is_color_attachment, glw::GLenum texture_target, glw::GLenum internalformat,
   2375 			  glw::GLuint levels, glw::GLint layers);
   2376 	bool SubTestAttachmentError(glw::GLenum attachment, glw::GLenum texture_target, glw::GLuint level, glw::GLint layer,
   2377 								glw::GLuint levels, glw::GLint layers);
   2378 	bool SubTestStatus(glw::GLenum attachment, glw::GLenum texture_target, glw::GLuint level, glw::GLint layer,
   2379 					   glw::GLuint levels, glw::GLint layers);
   2380 	bool SubTestContent(glw::GLenum attachment, glw::GLenum texture_target, glw::GLenum internalformat,
   2381 						glw::GLuint level, glw::GLint layer, glw::GLuint levels, glw::GLint layers);
   2382 	void		Clear();
   2383 	glw::GLuint MaxTextureLevels(glw::GLenum texture_target);
   2384 	glw::GLuint MaxTextureLayers(glw::GLenum texture_target);
   2385 	void Clean();
   2386 
   2387 	/* Private member variables. */
   2388 	glw::GLuint m_fbo;
   2389 	glw::GLuint m_to;
   2390 
   2391 	/* Static private variables. */
   2392 	static const glw::GLenum s_targets[];
   2393 	static const glw::GLuint s_targets_count;
   2394 
   2395 	static const glw::GLfloat s_reference_color[4];
   2396 	static const glw::GLint   s_reference_color_integer[4];
   2397 	static const glw::GLfloat s_reference_depth;
   2398 	static const glw::GLint   s_reference_stencil;
   2399 };
   2400 /* TextureLayerAttachmentTest class */
   2401 
   2402 /** Named Framebuffer Draw Read Buffer
   2403  *
   2404  *      Create named framebuffer with maximum number of color attachments (use
   2405  *      named renderbuffer storage).
   2406  *
   2407  *      For each color attachment use NamedFramebufferDrawBuffer to set up it as
   2408  *      a draw buffer. Clear it with unique color.
   2409  *
   2410  *      For each color attachment use NamedFramebufferReadBuffer to set up it as
   2411  *      a read buffer. Fetch the pixel data and compare that it contains unique
   2412  *      color with the attachment was cleared
   2413  *
   2414  *      Check that NamedFramebufferDrawBuffer and NamedFramebufferReadBuffer
   2415  *      accept GL_NONE as mode without error.
   2416  *
   2417  *      Release all objects.
   2418  */
   2419 class DrawReadBufferTest : public deqp::TestCase
   2420 {
   2421 public:
   2422 	/* Public member functions */
   2423 	DrawReadBufferTest(deqp::Context& context);
   2424 
   2425 	virtual tcu::TestNode::IterateResult iterate();
   2426 
   2427 private:
   2428 	/* Private member functions */
   2429 	DrawReadBufferTest(const DrawReadBufferTest& other);
   2430 	DrawReadBufferTest& operator=(const DrawReadBufferTest& other);
   2431 };
   2432 /* DrawReadBufferTest class */
   2433 
   2434 /** Named Framebuffer Draw Buffers
   2435  *
   2436  *      Create named framebuffer with maximum number of color attachments (use
   2437  *      named renderbuffer storage).
   2438  *
   2439  *      Set up all attachments as a draw buffer using the function
   2440  *      NamedFramebufferDrawBuffers. Then clear them at once with unique color.
   2441  *
   2442  *      For each color attachment fetch pixel data and compare that contain
   2443  *      the same unique color.
   2444  *
   2445  *      Release all objects.
   2446  */
   2447 class DrawBuffersTest : public deqp::TestCase
   2448 {
   2449 public:
   2450 	/* Public member functions */
   2451 	DrawBuffersTest(deqp::Context& context);
   2452 
   2453 	virtual tcu::TestNode::IterateResult iterate();
   2454 
   2455 private:
   2456 	/* Private member functions */
   2457 	DrawBuffersTest(const DrawBuffersTest& other);
   2458 	DrawBuffersTest& operator=(const DrawBuffersTest& other);
   2459 
   2460 	/* Private static constants. */
   2461 	static const glw::GLfloat s_rgba[4];
   2462 };
   2463 /* DrawReadBuffersTest class */
   2464 
   2465 /** Invalidate Named Framebuffer Data
   2466  *
   2467  *      For default framebuffer try to invalidate each of COLOR, DEPTH, and
   2468  *      STENCIL attachments. Expect no error.
   2469  *
   2470  *      For default framebuffer try to invalidate all (COLOR, DEPTH, and
   2471  *      STENCIL) attachments. Expect no error.
   2472  *
   2473  *      Create named framebuffer with maximum number of color attachments (use
   2474  *      named renderbuffer storage), depth attachment and stencil attachment.
   2475  *
   2476  *      Clear all attachments.
   2477  *
   2478  *      Try to invalidate content of all attachments using
   2479  *      InvalidateNamedFramebufferData. Expect no error.
   2480  *
   2481  *      Try to invalidate content of each attachment using
   2482  *      InvalidateNamedFramebufferData. Expect no error.
   2483  *
   2484  *      Release all objects.
   2485  */
   2486 class InvalidateDataTest : public deqp::TestCase
   2487 {
   2488 public:
   2489 	/* Public member functions */
   2490 	InvalidateDataTest(deqp::Context& context);
   2491 
   2492 	virtual tcu::TestNode::IterateResult iterate();
   2493 
   2494 private:
   2495 	/* Private member functions */
   2496 	InvalidateDataTest(const InvalidateDataTest& other);
   2497 	InvalidateDataTest& operator=(const InvalidateDataTest& other);
   2498 
   2499 	bool CheckErrorAndLog(const glw::GLenum attachment);
   2500 	bool CheckErrorAndLog(const glw::GLenum attachments[], const glw::GLuint count);
   2501 };
   2502 /* InvalidateDataTest class */
   2503 
   2504 /** Invalidate Named Framebuffer SubData
   2505  *
   2506  *      For default framebuffer try to invalidate part of each of COLOR, DEPTH,
   2507  *      and STENCIL attachments. Expect no error.
   2508  *
   2509  *      For default framebuffer try to invalidate part of all (COLOR, DEPTH, and
   2510  *      STENCIL) attachments. Expect no error.
   2511  *
   2512  *      Create named framebuffer with maximum number of color attachments (use
   2513  *      named renderbuffer storage), depth attachment and stencil attachment.
   2514  *
   2515  *      Clear all attachments.
   2516  *
   2517  *      Try to invalidate content of part of all attachments using
   2518  *      InvalidateNamedFramebufferData. Expect no error.
   2519  *
   2520  *      Try to invalidate content of part of each attachment using
   2521  *      InvalidateNamedFramebufferData. Expect no error.
   2522  *
   2523  *      Release all objects.
   2524  */
   2525 class InvalidateSubDataTest : public deqp::TestCase
   2526 {
   2527 public:
   2528 	/* Public member functions */
   2529 	InvalidateSubDataTest(deqp::Context& context);
   2530 
   2531 	virtual tcu::TestNode::IterateResult iterate();
   2532 
   2533 private:
   2534 	/* Private member functions */
   2535 	InvalidateSubDataTest(const InvalidateSubDataTest& other);
   2536 	InvalidateSubDataTest& operator=(const InvalidateSubDataTest& other);
   2537 
   2538 	bool CheckErrorAndLog(const glw::GLenum attachment);
   2539 	bool CheckErrorAndLog(const glw::GLenum attachments[], const glw::GLuint count);
   2540 };
   2541 /* InvalidateSubDataTest class */
   2542 
   2543 /** Clear Named Framebuffer
   2544  *
   2545  *      Repeat following steps for fixed-point, floating-point, signed integer,
   2546  *      and unsigned integer color attachments.
   2547  *
   2548  *          Create named framebuffer with maximum number of color attachments
   2549  *          (use named renderbuffer storage).
   2550  *
   2551  *          Clear each of the color attachment with unique color using proper
   2552  *          ClearNamedFramebuffer* function.
   2553  *
   2554  *          For each color attachment fetch pixel data and compare that contain
   2555  *          unique color with which it was cleared.
   2556  *
   2557  *          Release all objects.
   2558  *
   2559  *      Next, do following steps:
   2560  *
   2561  *          Create named framebuffer with depth attachment and stencil
   2562  *          attachment.
   2563  *
   2564  *          Clear each of the attachments with unique value using proper
   2565  *          ClearNamedFramebufferfi function.
   2566  *
   2567  *          Fetch pixel data of each attachment and compare that contain unique
   2568  *          value with which it was cleared.
   2569  *
   2570  *          Release all objects.
   2571  */
   2572 class ClearTest : public deqp::TestCase
   2573 {
   2574 public:
   2575 	/* Public member functions */
   2576 	ClearTest(deqp::Context& context);
   2577 
   2578 	virtual tcu::TestNode::IterateResult iterate();
   2579 
   2580 private:
   2581 	/* Private member functions */
   2582 	ClearTest(const ClearTest& other);
   2583 	ClearTest& operator=(const ClearTest& other);
   2584 
   2585 	void PrepareFramebuffer(glw::GLenum buffer, glw::GLenum internalformat);
   2586 
   2587 	template <typename T>
   2588 	bool TestClearColor(glw::GLenum buffer, glw::GLenum attachment, T value);
   2589 
   2590 	template <typename T>
   2591 	bool ClearColor(glw::GLenum buffer, glw::GLint drawbuffer, T value);
   2592 
   2593 	bool TestClearDepthAndStencil(glw::GLfloat depth, glw::GLint stencil);
   2594 
   2595 	template <typename T>
   2596 	glw::GLenum Format();
   2597 
   2598 	template <typename T>
   2599 	glw::GLenum Type();
   2600 
   2601 	template <typename T>
   2602 	bool Compare(const T first, const T second);
   2603 
   2604 	void Clean();
   2605 
   2606 	/* Private member variables. */
   2607 	glw::GLuint  m_fbo;
   2608 	glw::GLuint* m_renderbuffers;
   2609 	glw::GLuint  m_renderbuffers_count;
   2610 };
   2611 /* ClearTest class */
   2612 
   2613 /** Blit Named Framebuffer
   2614  *
   2615  *      Create named framebuffer with color, depth and stencil attachments with
   2616  *      size 2x2 pixels(use named renderbuffer storage).
   2617  *
   2618  *      Create named framebuffer with color, depth and stencil attachments with
   2619  *      size 2x3 pixels(use named renderbuffer storage).
   2620  *
   2621  *      Clear the first framebuffer with red color, 0.5 depth and 1 as a stencil
   2622  *      index.
   2623  *
   2624  *      Blit one pixel of the first framebuffer to the second framebuffer to the
   2625  *      pixel at (0, 0) position with NEAREST filter.
   2626  *
   2627  *      Clear first the framebuffer with green color, 0.25 depth and 2 as a
   2628  *      stencil index.
   2629  *
   2630  *      Blit one pixel of the first framebuffer to the second framebuffer to the
   2631  *      pixel at (1, 0) position with LINEAR filter for color attachment, but
   2632  *      NEAREST filter for depth and stencil attachments.
   2633  *
   2634  *      Clear the first framebuffer with blue color, 0.125 depth and 3 as a
   2635  *      stencil index.
   2636  *
   2637  *      Blit the whole first framebuffer to the second framebuffer by shrinking
   2638  *      it to the single pixel at (2, 0) position.
   2639  *
   2640  *      Clear the first framebuffer with yellow color, 0.0625 depth and 4 as a
   2641  *      stencil index.
   2642  *
   2643  *      Blit one pixel of the framebuffer to the second framebuffer by expanding
   2644  *      it to the three pixel constructing horizontal line at (0, 1) position.
   2645  *
   2646  *      Expect no error.
   2647  *
   2648  *      Check that color attachment of the second framebuffer has following
   2649  *      values:
   2650  *          red,    green,  blue,
   2651  *          yellow, yellow, yellow.
   2652  *
   2653  *      Check that depth attachment of the second framebuffer has following
   2654  *      values:
   2655  *          0.5,    0.25,   0.125
   2656  *          0.0625, 0.0625, 0.0625.
   2657  *
   2658  *      Check that stencil attachment of the second framebuffer has following
   2659  *      values:
   2660  *          1,  2,  3
   2661  *          4,  4,  4.
   2662  *
   2663  *      Release all objects.
   2664  */
   2665 class BlitTest : public deqp::TestCase
   2666 {
   2667 public:
   2668 	/* Public member functions */
   2669 	BlitTest(deqp::Context& context);
   2670 
   2671 	virtual tcu::TestNode::IterateResult iterate();
   2672 
   2673 private:
   2674 	/* Private member functions */
   2675 	BlitTest(const BlitTest& other);
   2676 	BlitTest& operator=(const BlitTest& other);
   2677 
   2678 	void PrepareFramebuffers();
   2679 	bool Test();
   2680 	void ClearFramebuffer(glw::GLfloat red, glw::GLfloat green, glw::GLfloat blue, glw::GLfloat depth,
   2681 						  glw::GLint stencil);
   2682 	bool CheckErrorAndLog();
   2683 	bool CheckColor();
   2684 	bool CheckDepth();
   2685 	bool CheckStencil();
   2686 	void Clean();
   2687 
   2688 	/* Private member variables. */
   2689 	glw::GLuint m_fbo_src;
   2690 	glw::GLuint m_rbo_color_src;
   2691 	glw::GLuint m_rbo_depth_stencil_src;
   2692 	glw::GLuint m_fbo_dst;
   2693 	glw::GLuint m_rbo_color_dst;
   2694 	glw::GLuint m_rbo_depth_stencil_dst;
   2695 };
   2696 /* BlitTest class */
   2697 
   2698 /** Check Named Framebuffer Status
   2699  *
   2700  *      Do following test cases:
   2701  *
   2702  *          Incomplete attachment case
   2703  *
   2704  *              Prepare framebuffer with one incomplete attachment.
   2705  *
   2706  *              Check the framebuffer status using CheckNamedFramebufferStatus.
   2707  *              Expect FRAMEBUFFER_INCOMPLETE_ATTACHMENT return value.
   2708  *
   2709  *              Release all objects.
   2710  *
   2711  *              Repeat the test case for all possible color, depth and stencil
   2712  *              attachments.
   2713  *
   2714  *          Missing attachment case
   2715  *
   2716  *              Prepare framebuffer without any attachment.
   2717  *
   2718  *              Check the framebuffer status using CheckNamedFramebufferStatus.
   2719  *              Expect FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT return value.
   2720  *
   2721  *              Release all objects.
   2722  *
   2723  *          Incomplete multisample renderbuffer case
   2724  *
   2725  *              Prepare framebuffer with two multisampled renderbuffer color
   2726  *              attachments which have different number of samples.
   2727  *
   2728  *              Check the framebuffer status using CheckNamedFramebufferStatus.
   2729  *              Expect FRAMEBUFFER_INCOMPLETE_MULTISAMPLE return value. If the
   2730  *              check fails return TEST_RESULT_COMPATIBILITY_WARNING.
   2731  *
   2732  *              Release all objects.
   2733  *
   2734  *          Incomplete multisample texture case
   2735  *
   2736  *              Prepare framebuffer with two multisampled texture color
   2737  *              attachments and one multisampled renderbuffer which all have
   2738  *              different number of sample locations. One of the textures shall
   2739  *              have fixed sample locations set, one not.
   2740  *
   2741  *              Check the framebuffer status using CheckNamedFramebufferStatus.
   2742  *              Expect FRAMEBUFFER_INCOMPLETE_MULTISAMPLE return value. If the
   2743  *              check fails return TEST_RESULT_COMPATIBILITY_WARNING.
   2744  *
   2745  *              Release all objects.
   2746  *
   2747  *          Incomplete layer targets case
   2748  *
   2749  *              Prepare framebuffer with one 3D texture and one 2D texture.
   2750  *
   2751  *              Check the framebuffer status using CheckNamedFramebufferStatus.
   2752  *              Expect FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS return value. If the
   2753  *              check fails return TEST_RESULT_COMPATIBILITY_WARNING.
   2754  *
   2755  *              Release all objects.
   2756  *
   2757  *      Note
   2758  *
   2759  *      The specification is not clear about framebuffer completeness. The
   2760  *      OpenGL 4.5 Core Profile Specification in chapter 9.4.2 says:
   2761  *
   2762  *          "The framebuffer object bound to target is said to be framebuffer
   2763  *          complete if all the following conditions are true [...]"
   2764  *
   2765  *      It does not say that framebuffer is incomplete when any of the
   2766  *      conditions are not met. Due to this wording, except for obvious cases
   2767  *      (incomplete attachment and missing attachments) other tests are optional
   2768  *      and may result in QP_TEST_RESULT_COMPATIBILITY_WARNING when fail.
   2769  */
   2770 class CheckStatusTest : public deqp::TestCase
   2771 {
   2772 public:
   2773 	/* Public member functions */
   2774 	CheckStatusTest(deqp::Context& context);
   2775 
   2776 	virtual tcu::TestNode::IterateResult iterate();
   2777 
   2778 private:
   2779 	/* Private member functions */
   2780 	CheckStatusTest(const CheckStatusTest& other);
   2781 	CheckStatusTest& operator=(const CheckStatusTest& other);
   2782 
   2783 	bool IncompleteAttachmentTestCase();
   2784 	bool MissingAttachmentTestCase();
   2785 	bool IncompleteMultisampleRenderbufferTestCase();
   2786 	bool IncompleteMultisampleTextureTestCase();
   2787 	bool IncompleteLayerTargetsTestCase();
   2788 };
   2789 /* CheckStatusTest class */
   2790 
   2791 /** Get Named Framebuffer Parameters
   2792  *
   2793  *      Prepare framebuffer with read and write buffers and renderbuffer color
   2794  *      attachment.
   2795  *
   2796  *      Do following checks for the created framebuffer:
   2797  *
   2798  *          Check that GetNamedFramebufferParameteriv called with parameter name
   2799  *          FRAMEBUFFER_DEFAULT_WIDTH returns the value of
   2800  *          FRAMEBUFFER_DEFAULT_WIDTH for the framebuffer object.
   2801  *
   2802  *          Check that GetNamedFramebufferParameteriv called with parameter name
   2803  *          FRAMEBUFFER_DEFAULT_HEIGHT returns the value of
   2804  *          FRAMEBUFFER_DEFAULT_HEIGHT for the framebuffer object.
   2805  *
   2806  *          Check that GetNamedFramebufferParameteriv called with parameter name
   2807  *          FRAMEBUFFER_DEFAULT_LAYERS returns the value of
   2808  *          FRAMEBUFFER_DEFAULT_LAYERS for the framebuffer object.
   2809  *          Check that GetNamedFramebufferParameteriv called with parameter name
   2810  *          FRAMEBUFFER_DEFAULT_SAMPLES returns the value of
   2811  *          FRAMEBUFFER_DEFAULT_SAMPLES for the framebuffer object.
   2812  *          Check that GetNamedFramebufferParameteriv called with parameter name
   2813  *          FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS returns the boolean value
   2814  *          of FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS.
   2815  *
   2816  *      Do following checks for the created and default (if available)
   2817  *      framebuffer:
   2818  *
   2819  *          Check that GetNamedFramebufferParameteriv called with parameter name
   2820  *          DOUBLEBUFFER returns a boolean value indicating whether double
   2821  *          buffering is supported for the framebuffer object.
   2822  *
   2823  *          Check that GetNamedFramebufferParameteriv called with parameter name
   2824  *          IMPLEMENTATION_COLOR_READ_FORMAT returns a GLenum value indicating
   2825  *          the preferred pixel data format for the framebuffer object.
   2826  *
   2827  *          Check that GetNamedFramebufferParameteriv called with parameter name
   2828  *          IMPLEMENTATION_COLOR_READ_TYPE returns a GLenum value indicating the
   2829  *          implementation's preferred pixel data type for the framebuffer
   2830  *          object.
   2831  *
   2832  *          Check that GetNamedFramebufferParameteriv called with parameter name
   2833  *          SAMPLES returns an integer value indicating the coverage mask size
   2834  *          for the framebuffer object.
   2835  *
   2836  *          Check that GetNamedFramebufferParameteriv called with parameter name
   2837  *          SAMPLE_BUFFERS returns an integer value indicating the number of
   2838  *          sample buffers associated with the framebuffer object.
   2839  *
   2840  *          Check that GetNamedFramebufferParameteriv called with parameter name
   2841  *          STEREO returns a boolean value indicating whether stereo buffers
   2842  *          (left and right) are supported for the framebuffer object.
   2843  *
   2844  *      Release all objects.
   2845  */
   2846 class GetParametersTest : public deqp::TestCase
   2847 {
   2848 public:
   2849 	/* Public member functions */
   2850 	GetParametersTest(deqp::Context& context);
   2851 
   2852 	virtual tcu::TestNode::IterateResult iterate();
   2853 
   2854 private:
   2855 	/* Private member functions */
   2856 	GetParametersTest(const GetParametersTest& other);
   2857 	GetParametersTest& operator=(const GetParametersTest& other);
   2858 
   2859 	void PrepareFramebuffer();
   2860 	bool TestDefaultFramebuffer();
   2861 	bool TestCustomFramebuffer();
   2862 	void Clean();
   2863 
   2864 	/* Private member variables. */
   2865 	glw::GLuint m_fbo;
   2866 	glw::GLuint m_rbo;
   2867 };
   2868 /* GetParametersTest class */
   2869 
   2870 /** Get Named Framebuffer Attachment Parameters
   2871  *
   2872  *      For default framebuffer, for all attachments:
   2873  *          FRONT_LEFT,
   2874  *          FRONT_RIGHT,
   2875  *          BACK_LEFT,
   2876  *          BACK_RIGHT,
   2877  *          DEPTH,
   2878  *          STENCIL
   2879  *      query FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE using
   2880  *      GetNamedFramebufferAttachmentParameteriv function. Expect
   2881  *      FRAMEBUFFER_DEFAULT return value (as queried with non-DSA way).
   2882  *
   2883  *      For any attachments not equal to GL_NONE do following queries using
   2884  *      GetNamedFramebufferAttachmentParameteriv function:
   2885  *          FRAMEBUFFER_ATTACHMENT_RED_SIZE,
   2886  *          FRAMEBUFFER_ATTACHMENT_GREEN_SIZE,
   2887  *          FRAMEBUFFER_ATTACHMENT_BLUE_SIZE,
   2888  *          FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE,
   2889  *          FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE,
   2890  *          FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE,
   2891  *          FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE,
   2892  *          FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING.
   2893  *      Expect value equal to framebuffers setup (as queried with non-DSA way).
   2894  *      Expect no error.
   2895  *
   2896  *      Create 3 framebuffer objects with renderbuffer color attachment, and
   2897  *      depth or stencil or depth-stencil attachments.
   2898  *
   2899  *      For each of framebuffers, for each of following attachments:
   2900  *          DEPTH_ATTACHMENT,
   2901  *          STENCIL_ATTACHMENT,
   2902  *          DEPTH_STENCIL_ATTACHMENT,
   2903  *          COLOR_ATTACHMENT0,
   2904  *          COLOR_ATTACHMENT1
   2905  *      query FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE using
   2906  *      GetNamedFramebufferAttachmentParameteriv function. Expect the same
   2907  *      return value as queried with non-DSA way.
   2908  *
   2909  *      For each of framebuffers, for any attachments not equal to GL_NONE do
   2910  *      following queries using GetNamedFramebufferAttachmentParameteriv
   2911  *      function:
   2912  *          FRAMEBUFFER_ATTACHMENT_OBJECT_NAME,
   2913  *          FRAMEBUFFER_ATTACHMENT_RED_SIZE,
   2914  *          FRAMEBUFFER_ATTACHMENT_GREEN_SIZE,
   2915  *          FRAMEBUFFER_ATTACHMENT_BLUE_SIZE,
   2916  *          FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE,
   2917  *          FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE,
   2918  *          FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE,
   2919  *          FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE,
   2920  *          FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING
   2921  *      Expect value equal to framebuffers setup (as queried with non-DSA way).
   2922  *      Expect no error.
   2923  *
   2924  *      Release objects.
   2925  *
   2926  *      Create 3 framebuffer objects with texture color attachment, and
   2927  *      depth or stencil or depth-stencil attachments.
   2928  *
   2929  *      For each of framebuffers, for each of following attachments:
   2930  *          DEPTH_ATTACHMENT,
   2931  *          STENCIL_ATTACHMENT,
   2932  *          DEPTH_STENCIL_ATTACHMENT,
   2933  *          COLOR_ATTACHMENT0,
   2934  *          COLOR_ATTACHMENT1
   2935  *      query FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE using
   2936  *      GetNamedFramebufferAttachmentParameteriv function. Expect the same
   2937  *      return value as queried with non-DSA way.
   2938  *
   2939  *      For each of framebuffers, for any attachments not equal to GL_NONE do
   2940  *      following queries using GetNamedFramebufferAttachmentParameteriv
   2941  *      function:
   2942  *          FRAMEBUFFER_ATTACHMENT_OBJECT_NAME,
   2943  *          FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL,
   2944  *          FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE,
   2945  *          FRAMEBUFFER_ATTACHMENT_LAYERED,
   2946  *          FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER,
   2947  *          FRAMEBUFFER_ATTACHMENT_RED_SIZE,
   2948  *          FRAMEBUFFER_ATTACHMENT_GREEN_SIZE,
   2949  *          FRAMEBUFFER_ATTACHMENT_BLUE_SIZE,
   2950  *          FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE,
   2951  *          FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE,
   2952  *          FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE,
   2953  *          FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE,
   2954  *          FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING
   2955  *      Expect value equal to framebuffers setup (as queried with non-DSA way).
   2956  *      Expect no error.
   2957  *
   2958  *      Release objects.
   2959  *
   2960  *      Additional conditions:
   2961  *
   2962  *          Do not query DEPTH_STENCIL_ATTACHMENT attachment if the renderbuffer
   2963  *          or texture is not depth-stencil.
   2964  *
   2965  *          Do not query FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE pname with
   2966  *          DEPTH_STENCIL_ATTACHMENT attachment.
   2967  */
   2968 class GetAttachmentParametersTest : public deqp::TestCase
   2969 {
   2970 public:
   2971 	/* Public member functions */
   2972 	GetAttachmentParametersTest(deqp::Context& context);
   2973 
   2974 	virtual tcu::TestNode::IterateResult iterate();
   2975 
   2976 private:
   2977 	/* Private member functions */
   2978 	GetAttachmentParametersTest(const GetAttachmentParametersTest& other);
   2979 	GetAttachmentParametersTest& operator=(const GetAttachmentParametersTest& other);
   2980 
   2981 	void CreateRenderbufferFramebuffer(bool depth, bool stencil);
   2982 	void CreateTextureFramebuffer(bool depth, bool stencil);
   2983 	bool TestDefaultFramebuffer();
   2984 	bool TestRenderbufferFramebuffer(bool depth_stencil);
   2985 	bool TestTextureFramebuffer(bool depth_stencil);
   2986 	void Clean();
   2987 
   2988 	/* Private member variables. */
   2989 	glw::GLuint m_fbo;
   2990 	glw::GLuint m_rbo[2];
   2991 	glw::GLuint m_to[2];
   2992 };
   2993 /* GetParametersTest class */
   2994 
   2995 /** Create Named Framebuffers Errors
   2996  *
   2997  *      Check that INVALID_VALUE is generated by CreateFramebuffers if n is
   2998  *      negative.
   2999  */
   3000 class CreationErrorsTest : public deqp::TestCase
   3001 {
   3002 public:
   3003 	/* Public member functions */
   3004 	CreationErrorsTest(deqp::Context& context);
   3005 
   3006 	virtual tcu::TestNode::IterateResult iterate();
   3007 
   3008 private:
   3009 	/* Private member functions */
   3010 	CreationErrorsTest(const CreationErrorsTest& other);
   3011 	CreationErrorsTest& operator=(const CreationErrorsTest& other);
   3012 };
   3013 /* CreationErrorsTest class */
   3014 
   3015 /** Named Framebuffer Renderbuffer Errors
   3016  *
   3017  *      Check that INVALID_OPERATION is generated by
   3018  *      NamedFramebufferRenderbuffer if framebuffer is not the name of an
   3019  *      existing framebuffer object.
   3020  *
   3021  *      Check that INVALID_OPERATION is generated by NamedFramebufferRenderbuffer
   3022  *      if attachment is COLOR_ATTACHMENTm where m is greater than or equal to
   3023  *      the value of MAX_COLOR_ATTACHMENTS.
   3024  *
   3025  *      Check that INVALID_ENUM is generated by NamedFramebufferRenderbuffer if
   3026  *      attachment is not one of the attachments in table 9.2, and attachment is
   3027  *      not COLOR_ATTACHMENTm where m is greater than or equal to the value of
   3028  *      MAX_COLOR_ATTACHMENTS.
   3029  *
   3030  *      Check that INVALID_ENUM is generated by NamedFramebufferRenderbuffer if
   3031  *      renderbuffer target is not RENDERBUFFER.
   3032  *
   3033  *      Check that INVALID_OPERATION is generated by
   3034  *      NamedFramebufferRenderbuffer if renderbuffer target is not zero or the
   3035  *      name of an existing renderbuffer object of type RENDERBUFFER.
   3036  */
   3037 class RenderbufferAttachmentErrorsTest : public deqp::TestCase
   3038 {
   3039 public:
   3040 	/* Public member functions */
   3041 	RenderbufferAttachmentErrorsTest(deqp::Context& context);
   3042 
   3043 	virtual tcu::TestNode::IterateResult iterate();
   3044 
   3045 private:
   3046 	/* Private member functions */
   3047 	RenderbufferAttachmentErrorsTest(const RenderbufferAttachmentErrorsTest& other);
   3048 	RenderbufferAttachmentErrorsTest& operator=(const RenderbufferAttachmentErrorsTest& other);
   3049 
   3050 	void PrepareObjects();
   3051 	bool ExpectError(glw::GLenum expected_error, bool framebuffer, bool attachment, bool color_attachment,
   3052 					 bool renderbuffertarget, bool renderbuffer);
   3053 	void Clean();
   3054 
   3055 	/* Private member variables. */
   3056 	glw::GLuint m_fbo_valid;
   3057 	glw::GLuint m_rbo_valid;
   3058 	glw::GLuint m_fbo_invalid;
   3059 	glw::GLuint m_rbo_invalid;
   3060 	glw::GLenum m_color_attachment_invalid;
   3061 	glw::GLenum m_attachment_invalid;
   3062 	glw::GLenum m_renderbuffer_target_invalid;
   3063 };
   3064 /* RenderbufferAttachmentErrorsTest class */
   3065 
   3066 /** Named Framebuffer Texture Errors
   3067  *
   3068  *      Check that GL_INVALID_OPERATION is generated by glNamedFramebufferTexture and glNamedFramebufferTextureLayer
   3069  *      if framebuffer is not the name of an existing framebuffer object.
   3070  *
   3071  *      Check that INVALID_OPERATION is generated by glNamedFramebufferTexture and glNamedFramebufferTextureLayer
   3072  *      if attachment is COLOR_ATTACHMENTm where m is greater than or equal to
   3073  *      the value of MAX_COLOR_ATTACHMENTS.
   3074  *
   3075  *      Check that INVALID_ENUM is generated by glNamedFramebufferTexture and glNamedFramebufferTextureLayer if
   3076  *      attachment is not one of the attachments in table 9.2, and attachment is
   3077  *      not COLOR_ATTACHMENTm where m is greater than or equal to the value of
   3078  *      MAX_COLOR_ATTACHMENTS.
   3079  *
   3080  *      Check that INVALID_VALUE is generated by glNamedFramebufferTexture if texture is not zero or the name
   3081  *      of an existing texture object.
   3082  *
   3083  *      Check that INVALID_OPERATION is generated by glNamedFramebufferTextureLayer if texture is not zero or
   3084  *      the name of an existing texture object.
   3085  *
   3086  *      Check that INVALID_VALUE is generated by glNamedFramebufferTexture and glNamedFramebufferTextureLayer if
   3087  *      texture is not zero and level is not a supported texture level for
   3088  *      texture.
   3089  *
   3090  *      Check that INVALID_OPERATION is generated by glNamedFramebufferTexture and glNamedFramebufferTextureLayer
   3091  *      if texture is a buffer texture.
   3092  *
   3093  *      Check that INVALID_VALUE error is generated by NamedFramebufferTextureLayer if texture is a three-dimensional
   3094  *      texture, and layer is larger than the value of MAX_3D_TEXTURE_SIZE minus one.
   3095  *
   3096  *      Check that INVALID_VALUE error is generated by NamedFramebufferTextureLayer if texture is an array texture,
   3097  *      and layer is larger than the value of MAX_ARRAY_TEXTURE_LAYERS minus one.
   3098  *
   3099  *      Check that INVALID_VALUE error is generated by NamedFramebufferTextureLayer if texture is a cube map array texture,
   3100  *      and (layer / 6) is larger than the value of MAX_CUBE_MAP_TEXTURE_SIZE minus one (see section 9.8).
   3101  *      Check that INVALID_VALUE error is generated by NamedFramebufferTextureLayer if texture is non-zero
   3102  *      and layer is negative.
   3103  *
   3104  *      Check that INVALID_OPERATION error is generated by NamedFramebufferTextureLayer if texture is non-zero
   3105  *      and is not the name of a three-dimensional, two-dimensional multisample array, one- or two-dimensional array,
   3106  *      or cube map array texture.
   3107  */
   3108 class TextureAttachmentErrorsTest : public deqp::TestCase
   3109 {
   3110 public:
   3111 	/* Public member functions */
   3112 	TextureAttachmentErrorsTest(deqp::Context& context);
   3113 
   3114 	virtual tcu::TestNode::IterateResult iterate();
   3115 
   3116 private:
   3117 	/* Private member functions */
   3118 	TextureAttachmentErrorsTest(const TextureAttachmentErrorsTest& other);
   3119 	TextureAttachmentErrorsTest& operator=(const TextureAttachmentErrorsTest& other);
   3120 
   3121 	void PrepareObjects();
   3122 	bool ExpectError(glw::GLenum expected_error, const glw::GLchar* function_name, bool framebuffer, bool attachment,
   3123 					 bool color_attachment, bool texture, bool level, const glw::GLchar* texture_type, bool layer);
   3124 	void Clean();
   3125 
   3126 	/* Private member variables. */
   3127 	glw::GLuint m_fbo_valid;
   3128 	glw::GLuint m_to_valid;
   3129 	glw::GLuint m_to_3d_valid;
   3130 	glw::GLuint m_to_array_valid;
   3131 	glw::GLuint m_to_cubearray_valid;
   3132 	glw::GLuint m_tbo_valid;
   3133 	glw::GLuint m_fbo_invalid;
   3134 	glw::GLuint m_to_invalid;
   3135 	glw::GLuint m_to_layer_invalid; /* it is valid rectangle texture, but invalid for NamedFramebufferTextureLayer */
   3136 	glw::GLenum m_color_attachment_invalid;
   3137 	glw::GLenum m_attachment_invalid;
   3138 	glw::GLint  m_level_invalid;
   3139 	glw::GLint  m_max_3d_texture_size;
   3140 	glw::GLint  m_max_3d_texture_depth;
   3141 	glw::GLint  m_max_array_texture_layers;
   3142 	glw::GLint  m_max_cube_map_texture_size;
   3143 };
   3144 /* TextureAttachmentErrorsTest class */
   3145 
   3146 /** Named Framebuffer Draw Read Buffers Errors
   3147  *
   3148  *      Check that INVALID_OPERATION error is generated by
   3149  *      NamedFramebufferDrawBuffer if framebuffer is not zero or the name of an
   3150  *      existing framebuffer object.
   3151  *
   3152  *      Check that INVALID_ENUM is generated by NamedFramebufferDrawBuffer if
   3153  *      buf is not an accepted value.
   3154  *
   3155  *      Check that INVALID_OPERATION is generated by NamedFramebufferDrawBuffer
   3156  *      if the GL is bound to a draw framebuffer object and the ith argument is
   3157  *      a value other than COLOR_ATTACHMENTi or NONE.
   3158  *
   3159  *      Check that INVALID_OPERATION error is generated by
   3160  *      NamedFramebufferDrawBuffers if framebuffer is not zero or the name of an
   3161  *      existing framebuffer object.
   3162  *
   3163  *      Check that INVALID_VALUE is generated by NamedFramebufferDrawBuffers if
   3164  *      n is less than 0.
   3165  *
   3166  *      Check that INVALID_VALUE is generated by NamedFramebufferDrawBuffers if
   3167  *      n is greater than MAX_DRAW_BUFFERS.
   3168  *
   3169  *      Check that INVALID_ENUM is generated by NamedFramebufferDrawBuffers if
   3170  *      one of the values in bufs is not an accepted value.
   3171  *
   3172  *      Check that INVALID_OPERATION is generated by NamedFramebufferDrawBuffers
   3173  *      if a symbolic constant other than GL_NONE appears more than once in
   3174  *      bufs.
   3175  *
   3176  *      Check that INVALID_ENUM error is generated by
   3177  *      NamedFramebufferDrawBuffers if any value in bufs is FRONT, LEFT, RIGHT,
   3178  *      or FRONT_AND_BACK. This restriction applies to both the default
   3179  *      framebuffer and framebuffer objects, and exists because these constants
   3180  *      may themselves refer to multiple buffers, as shown in table 17.4.
   3181  *
   3182  *      Check that INVALID_OPERATION is generated by NamedFramebufferDrawBuffers
   3183  *      if any value in bufs is BACK, and n is not one.
   3184  *
   3185  *      Check that INVALID_OPERATION is generated by NamedFramebufferDrawBuffers
   3186  *      if the API call refers to a framebuffer object and one or more of the
   3187  *      values in bufs is anything other than NONE or one of the
   3188  *      COLOR_ATTACHMENTn tokens.
   3189  *
   3190  *      Check that INVALID_OPERATION is generated by NamedFramebufferDrawBuffers
   3191  *      if the API call refers to the default framebuffer and one or more of the
   3192  *      values in bufs is one of the COLOR_ATTACHMENTn tokens.
   3193  *
   3194  *      Check that INVALID_OPERATION is generated by NamedFramebufferReadBuffer
   3195  *      if framebuffer is not zero or the name of an existing framebuffer
   3196  *      object.
   3197  *
   3198  *      Check that INVALID_ENUM is generated by NamedFramebufferReadBuffer if
   3199  *      src is not one of the accepted values (tables 17.4 and 17.5 of OpenGL
   3200  *      4.5 Core Profile Specification).
   3201  *
   3202  *      Check that INVALID_OPERATION is generated by NamedFramebufferReadBuffer
   3203  *      if the default framebuffer is affected and src is a value (other than
   3204  *      NONE) that does not indicate any of the color buffers allocated to the
   3205  *      default framebuffer.
   3206  *
   3207  *      Check that INVALID_OPERATION is generated by NamedFramebufferReadBuffer
   3208  *      if a framebuffer object is affected, and src is one of the  constants
   3209  *      from table 17.4 (other than NONE, or COLOR_ATTACHMENTm where m is
   3210  *      greater than or equal to the value of MAX_COLOR_ATTACHMENTS).
   3211  */
   3212 class DrawReadBuffersErrorsTest : public deqp::TestCase
   3213 {
   3214 public:
   3215 	/* Public member functions */
   3216 	DrawReadBuffersErrorsTest(deqp::Context& context);
   3217 
   3218 	virtual tcu::TestNode::IterateResult iterate();
   3219 
   3220 private:
   3221 	/* Private member functions */
   3222 	DrawReadBuffersErrorsTest(const DrawReadBuffersErrorsTest& other);
   3223 	DrawReadBuffersErrorsTest operator=(const DrawReadBuffersErrorsTest& other);
   3224 
   3225 	void PrepareObjects();
   3226 	bool ExpectError(glw::GLenum expected_error, const glw::GLchar* function, const glw::GLchar* conditions);
   3227 	void Clean();
   3228 
   3229 	/* Private member variables. */
   3230 	glw::GLuint  m_fbo_valid;
   3231 	glw::GLuint  m_fbo_invalid;
   3232 	glw::GLenum  m_attachment_color;
   3233 	glw::GLenum  m_attachment_back_left;
   3234 	glw::GLenum  m_attachment_right;
   3235 	glw::GLenum  m_attachment_left;
   3236 	glw::GLenum  m_attachment_front;
   3237 	glw::GLenum  m_attachment_front_and_back;
   3238 	glw::GLenum  m_attachment_back;
   3239 	glw::GLenum  m_attachment_invalid;
   3240 	glw::GLenum  m_attachments_invalid[2];
   3241 	glw::GLenum  m_attachments_back_invalid[2];
   3242 	glw::GLint   m_attachments_too_many_count;
   3243 	glw::GLenum* m_attachments_too_many;
   3244 	glw::GLint   m_max_color_attachments;
   3245 };
   3246 /* DrawReadBuffersErrorsTest class */
   3247 
   3248 /** Invalidate Framebuffer Data and SubData Errors
   3249 
   3250  Check that INVALID_OPERATION error is generated by
   3251  InvalidateNamedFramebufferData if framebuffer is not zero or the name of
   3252  an existing framebuffer object.
   3253 
   3254  Check that INVALID_ENUM error is generated by
   3255  InvalidateNamedFramebufferData if a framebuffer object is affected, and
   3256  any element of of attachments is not one of the values
   3257  {COLOR_ATTACHMENTi, DEPTH_ATTACHMENT, STENCIL_ATTACHMENT,
   3258  DEPTH_STENCIL_ATTACHMENT}.
   3259 
   3260  Check that INVALID_OPERATION error is generated by
   3261  InvalidateNamedFramebufferData if attachments contains COLOR_ATTACHMENTm
   3262  where m is greater than or equal to the value of MAX_COLOR_ATTACHMENTS.
   3263 
   3264  Check that INVALID_ENUM error is generated by
   3265  InvalidateNamedFramebufferData if the default framebuffer is affected,
   3266  and any elements of attachments are not one of:
   3267  -  FRONT_LEFT, FRONT_RIGHT, BACK_LEFT, and BACK_RIGHT, identifying that
   3268  specific buffer,
   3269  -  COLOR, which is treated as BACK_LEFT for a double-buffered context
   3270  and FRONT_LEFT for a single-buffered context,
   3271  -  DEPTH, identifying the depth buffer,
   3272  -  STENCIL, identifying the stencil buffer.
   3273 
   3274  Check that INVALID_OPERATION error is generated by
   3275  InvalidateNamedSubFramebuffer if framebuffer is not zero or the name of
   3276  an existing framebuffer object.
   3277 
   3278  Check that INVALID_VALUE error is generated by
   3279  InvalidateNamedSubFramebuffer if numAttachments, width, or height is
   3280  negative.
   3281 
   3282  Check that INVALID_ENUM error is generated by
   3283  InvalidateNamedSubFramebuffer if a framebuffer object is affected, and
   3284  any element of attachments is not one of the values {COLOR_ATTACHMENTi,
   3285  DEPTH_ATTACHMENT, STENCIL_ATTACHMENT, DEPTH_STENCIL_ATTACHMENT}.
   3286 
   3287  Check that INVALID_OPERATION error is generated by
   3288  InvalidateNamedSubFramebuffer if attachments contains COLOR_ATTACHMENTm
   3289  where m is greater than or equal to the value of MAX_COLOR_ATTACHMENTS.
   3290 
   3291  Check that INVALID_ENUM error is generated by
   3292  InvalidateNamedSubFramebuffer if the default framebuffer is affected,
   3293  and any elements of attachments are not one of:
   3294  -  FRONT_LEFT, FRONT_RIGHT, BACK_LEFT, and BACK_RIGHT, identifying that
   3295  specific buffer,
   3296  -  COLOR, which is treated as BACK_LEFT for a double-buffered context
   3297  and FRONT_LEFT for a single-buffered context,
   3298  -  DEPTH, identifying the depth buffer,
   3299  -  STENCIL, identifying the stencil buffer.
   3300  */
   3301 class InvalidateDataAndSubDataErrorsTest : public deqp::TestCase
   3302 {
   3303 public:
   3304 	/* Public member functions */
   3305 	InvalidateDataAndSubDataErrorsTest(deqp::Context& context);
   3306 
   3307 	virtual tcu::TestNode::IterateResult iterate();
   3308 
   3309 private:
   3310 	/* Private member functions */
   3311 	InvalidateDataAndSubDataErrorsTest(const InvalidateDataAndSubDataErrorsTest& other);
   3312 	InvalidateDataAndSubDataErrorsTest operator=(const InvalidateDataAndSubDataErrorsTest& other);
   3313 
   3314 	void PrepareObjects();
   3315 	bool ExpectError(glw::GLenum expected_error, const glw::GLchar* function, const glw::GLchar* conditions);
   3316 	void Clean();
   3317 
   3318 	/* Private member variables. */
   3319 	glw::GLuint m_fbo_valid;
   3320 	glw::GLuint m_rbo;
   3321 	glw::GLuint m_fbo_invalid;
   3322 	glw::GLenum m_fbo_attachment_valid;
   3323 	glw::GLenum m_fbo_attachment_invalid;
   3324 	glw::GLenum m_color_attachment_invalid;
   3325 	glw::GLenum m_default_attachment_invalid;
   3326 };
   3327 /* InvalidateDataAndSubDataErrorsTest class */
   3328 
   3329 /** Clear Named Framebuffer Errors
   3330  *
   3331  *      Check that INVALID_OPERATION is generated by ClearNamedFramebuffer* if
   3332  *      framebuffer is not zero or the name of an existing framebuffer object.
   3333  *
   3334  *      Check that INVALID_ENUM is generated by ClearNamedFramebufferiv buffer
   3335  *      is not COLOR or STENCIL.
   3336  *
   3337  *      Check that INVALID_ENUM is generated by ClearNamedFramebufferuiv buffer
   3338  *      is not COLOR.
   3339  *
   3340  *      Check that INVALID_ENUM is generated by ClearNamedFramebufferfv buffer
   3341  *      is not COLOR or DEPTH.
   3342  *
   3343  *      Check that INVALID_ENUM is generated by ClearNamedFramebufferfi buffer
   3344  *      is not DEPTH_STENCIL.
   3345  *
   3346  *      Check that INVALID_VALUE is generated if buffer is COLOR drawbuffer is
   3347  *      negative, or greater than the value of MAX_DRAW_BUFFERS minus one.
   3348  *
   3349  *      Check that INVALID_VALUE is generated if buffer is DEPTH, STENCIL or
   3350  *      DEPTH_STENCIL and drawbuffer is not zero.
   3351  */
   3352 class ClearNamedFramebufferErrorsTest : public deqp::TestCase
   3353 {
   3354 public:
   3355 	/* Public member functions */
   3356 	ClearNamedFramebufferErrorsTest(deqp::Context& context);
   3357 
   3358 	virtual tcu::TestNode::IterateResult iterate();
   3359 
   3360 private:
   3361 	/* Private member functions */
   3362 	ClearNamedFramebufferErrorsTest(const ClearNamedFramebufferErrorsTest& other);
   3363 	ClearNamedFramebufferErrorsTest& operator=(const ClearNamedFramebufferErrorsTest& other);
   3364 
   3365 	void PrepareObjects();
   3366 	bool ExpectError(glw::GLenum expected_error, const glw::GLchar* function, const glw::GLchar* conditions);
   3367 	void Clean();
   3368 
   3369 	/* Private member variables. */
   3370 	glw::GLuint m_fbo_valid;
   3371 	glw::GLuint m_rbo_color;
   3372 	glw::GLuint m_rbo_depth_stencil;
   3373 	glw::GLuint m_fbo_invalid;
   3374 };
   3375 /* ClearNamedFramebufferErrorsTest class */
   3376 
   3377 /** Check Named Framebuffer Status Errors
   3378  *
   3379  *      Check that INVALID_ENUM is generated by CheckNamedFramebufferStatus if
   3380  *      target is not DRAW_FRAMEBUFFER, READ_FRAMEBUFFER or FRAMEBUFFER.
   3381  *
   3382  *      Check that INVALID_OPERATION is generated by CheckNamedFramebufferStatus
   3383  *      if framebuffer is not zero or the name of an existing framebuffer
   3384  *      object.
   3385  */
   3386 class CheckStatusErrorsTest : public deqp::TestCase
   3387 {
   3388 public:
   3389 	/* Public member functions */
   3390 	CheckStatusErrorsTest(deqp::Context& context);
   3391 
   3392 	virtual tcu::TestNode::IterateResult iterate();
   3393 
   3394 private:
   3395 	/* Private member functions */
   3396 	CheckStatusErrorsTest(const CheckStatusErrorsTest& other);
   3397 	CheckStatusErrorsTest& operator=(const CheckStatusErrorsTest& other);
   3398 
   3399 	void PrepareObjects();
   3400 	bool ExpectError(glw::GLenum expected_error, const glw::GLchar* function, const glw::GLchar* conditions);
   3401 	void Clean();
   3402 
   3403 	/* Private member variables. */
   3404 	glw::GLuint m_fbo_valid;
   3405 	glw::GLuint m_fbo_invalid;
   3406 	glw::GLuint m_target_invalid;
   3407 };
   3408 /* CheckStatusErrorsTest class */
   3409 
   3410 /** Get Named Framebuffer Parameter Errors
   3411  *
   3412  *      Check that INVALID_OPERATION is generated by
   3413  *      GetNamedFramebufferParameteriv if framebuffer is not zero or the name of
   3414  *      an existing framebuffer object.
   3415  *
   3416  *      Check that INVALID_ENUM is generated by GetNamedFramebufferParameteriv
   3417  *      if pname is not one of the accepted parameter names.
   3418  *
   3419  *      Check that INVALID_OPERATION is generated if a default framebuffer is
   3420  *      queried, and pname is not one of DOUBLEBUFFER,
   3421  *      IMPLEMENTATION_COLOR_READ_FORMAT, IMPLEMENTATION_COLOR_READ_TYPE,
   3422  *      SAMPLES, SAMPLE_BUFFERS or STEREO.
   3423  */
   3424 class GetParameterErrorsTest : public deqp::TestCase
   3425 {
   3426 public:
   3427 	/* Public member functions */
   3428 	GetParameterErrorsTest(deqp::Context& context);
   3429 
   3430 	virtual tcu::TestNode::IterateResult iterate();
   3431 
   3432 private:
   3433 	/* Private member functions */
   3434 	GetParameterErrorsTest(const GetParameterErrorsTest& other);
   3435 	GetParameterErrorsTest& operator=(const GetParameterErrorsTest& other);
   3436 
   3437 	void PrepareObjects();
   3438 	bool ExpectError(glw::GLenum expected_error, const glw::GLchar* function, const glw::GLchar* conditions);
   3439 	void Clean();
   3440 
   3441 	/* Private member variables. */
   3442 	glw::GLuint m_fbo_valid;
   3443 	glw::GLuint m_fbo_invalid;
   3444 	glw::GLuint m_parameter_invalid;
   3445 };
   3446 /* GetParameterErrorsTest class */
   3447 
   3448 /** Get Named Framebuffer Attachment Parameter Errors
   3449  *
   3450  *      Check that GL_INVALID_OPERATION is generated by
   3451  *      GetNamedFramebufferAttachmentParameteriv if framebuffer is not zero or
   3452  *      the name of an existing framebuffer object.
   3453  *
   3454  *      Check that INVALID_ENUM is generated by
   3455  *      GetNamedFramebufferAttachmentParameteriv if pname is not valid for the
   3456  *      value of GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, as described above.
   3457  *
   3458  *      Check that INVALID_ENUM error is generated if a framebuffer object is queried, attachment
   3459  *      is not one of the attachments in table 9.2 (COLOR_ATTACHMENTi, DEPTH_ATTACHMENT, STENCIL_ATTACHMENT, DEPTH_STENCIL_ATTACHMENT), and attachment is not
   3460  *      COLOR_ATTACHMENTm where m is greater than or equal to the value of MAX_COLOR_ATTACHMENTS.
   3461  *
   3462  *      Check that INVALID_OPERATION is generated by
   3463  *      GetNamedFramebufferAttachmentParameteriv if the value of
   3464  *      FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE is GL_NONE and pname is not
   3465  *      FRAMEBUFFER_ATTACHMENT_OBJECT_NAME or
   3466  *      FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE.
   3467  *
   3468  *      Check that INVALID_OPERATION is generated by
   3469  *      GetNamedFramebufferAttachmentParameteriv if attachment is
   3470  *      DEPTH_STENCIL_ATTACHMENT and pname is
   3471  *      FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE.
   3472  *
   3473  *      Check that an INVALID_ENUM error is generated if the default framebuffer is
   3474  *      queried and attachment is not one the values specified in table 9.1.
   3475  *
   3476  *      Check that an INVALID_OPERATION error is generated if a framebuffer object is
   3477  *      bound to target and attachment is COLOR_ATTACHMENTm where m is greater than or
   3478  *      equal to the value of MAX_COLOR_ATTACHMENTS.
   3479  *
   3480  *      Check that an INVALID_ENUM error is generated if a framebuffer object is
   3481  *      queried, attachment is not one of the attachments in table 9.2, and attachment
   3482  *      is not COLOR_ATTACHMENTm where m is greater than or equal to the value of
   3483  *      MAX_COLOR_ATTACHMENTS.
   3484  */
   3485 class GetAttachmentParameterErrorsTest : public deqp::TestCase
   3486 {
   3487 public:
   3488 	/* Public member functions */
   3489 	GetAttachmentParameterErrorsTest(deqp::Context& context);
   3490 
   3491 	virtual tcu::TestNode::IterateResult iterate();
   3492 
   3493 private:
   3494 	/* Private member functions */
   3495 	GetAttachmentParameterErrorsTest(const GetAttachmentParameterErrorsTest& other);
   3496 	GetAttachmentParameterErrorsTest& operator=(const GetAttachmentParameterErrorsTest& other);
   3497 
   3498 	void PrepareObjects();
   3499 	bool ExpectError(glw::GLenum expected_error, const glw::GLchar* function, const glw::GLchar* conditions);
   3500 	void Clean();
   3501 
   3502 	/* Private member variables. */
   3503 	glw::GLuint m_fbo_valid;
   3504 	glw::GLuint m_rbo_color;
   3505 	glw::GLuint m_rbo_depth_stencil;
   3506 	glw::GLuint m_fbo_invalid;
   3507 	glw::GLuint m_parameter_invalid;
   3508 	glw::GLenum m_attachment_invalid;
   3509 	glw::GLenum m_default_attachment_invalid;
   3510 	glw::GLint  m_max_color_attachments;
   3511 };
   3512 /* GetAttachmentParameterErrorsTest class */
   3513 
   3514 /** Framebuffer and Renderbuffer Functional
   3515  *
   3516  *      Create two framebuffer objects using CreateFramebuffers.
   3517  *
   3518  *      Setup first framebuffer with renderbuffer color, depth and stencil
   3519  *      attachments. Setup storage size with width and height equal to 8. Set
   3520  *      them as draw and read buffers. Clean up it, use black color. Check the
   3521  *      framebuffer status.
   3522  *
   3523  *      Setup second framebuffer with texture color attachment. Setup storage
   3524  *      size with width equal to 4 and height equal to 3.  Check the framebuffer
   3525  *      status.
   3526  *
   3527  *      Prepare GLSL program which can draw triangles using orthographic
   3528  *      projection. Fragment shader
   3529  *
   3530  *      Clean both framebuffers using ClearNamedFramebuffer* functions.
   3531  *
   3532  *      Use first framebuffer.
   3533  *
   3534  *      Draw to stencil a quad with screen positions [-0.5, -0.5], [-0.5, 0.5],
   3535  *      [0.5, -0.5] and [0.5, 0.5].
   3536  *
   3537  *      Draw to depth buffer a quad with positions [-1, -1, -1], [-1, 1, -1],
   3538  *      [1, -1, 0] and [1, 1, 0].
   3539  *
   3540  *      Turn on depth and stencil tests. Depth test shall pass if incoming depth
   3541  *      value is LESS than stored. The Stencil test shall pass only for any
   3542  *      stencil pass.
   3543  *
   3544  *      Draw Full screen quad to draw buffer with z = 0.5.
   3545  *
   3546  *      Blit the color content of the first framebuffer to the second with
   3547  *      nearest filter.
   3548  *
   3549  *      Fetch data. Expect that second framebuffer contain following data
   3550  *          black,  black,  black,  black,
   3551  *          black,  black,  white,  black,
   3552  *          black,  black,  black,  black.
   3553  */
   3554 class FunctionalTest : public deqp::TestCase
   3555 {
   3556 public:
   3557 	/* Public member functions */
   3558 	FunctionalTest(deqp::Context& context);
   3559 
   3560 	virtual tcu::TestNode::IterateResult iterate();
   3561 
   3562 private:
   3563 	/* Private member functions */
   3564 	FunctionalTest(const FunctionalTest& other);
   3565 	FunctionalTest& operator=(const FunctionalTest& other);
   3566 
   3567 	bool PrepareFirstFramebuffer();
   3568 	bool PrepareSecondFramebuffer();
   3569 	bool ClearFramebuffers();
   3570 	void PrepareProgram();
   3571 	void PrepareBuffersAndVertexArrays();
   3572 	bool DrawAndBlit();
   3573 	bool CheckSecondFramebufferContent();
   3574 	void Clean();
   3575 
   3576 	/* Private member variables. */
   3577 	glw::GLuint m_fbo_1st;
   3578 	glw::GLuint m_fbo_2nd;
   3579 	glw::GLuint m_rbo_color;
   3580 	glw::GLuint m_rbo_depth_stencil;
   3581 	glw::GLuint m_to_color;
   3582 	glw::GLuint m_po;
   3583 	glw::GLuint m_vao_stencil_pass_quad;
   3584 	glw::GLuint m_vao_depth_pass_quad;
   3585 	glw::GLuint m_vao_color_pass_quad;
   3586 	glw::GLuint m_bo_stencil_pass_quad;
   3587 	glw::GLuint m_bo_depth_pass_quad;
   3588 	glw::GLuint m_bo_color_pass_quad;
   3589 
   3590 	/* Private static variables. */
   3591 	static const glw::GLchar  s_vertex_shader[];
   3592 	static const glw::GLchar  s_fragment_shader[];
   3593 	static const glw::GLchar  s_attribute[];
   3594 	static const glw::GLfloat s_stencil_pass_quad[];
   3595 	static const glw::GLfloat s_depth_pass_quad[];
   3596 	static const glw::GLfloat s_color_pass_quad[];
   3597 	static const glw::GLuint  s_stencil_pass_quad_size;
   3598 	static const glw::GLuint  s_depth_pass_quad_size;
   3599 	static const glw::GLuint  s_color_pass_quad_size;
   3600 };
   3601 /* FunctionalTest class */
   3602 } /* Framebuffers namespace */
   3603 
   3604 namespace Renderbuffers
   3605 {
   3606 /** Renderbuffer Creation
   3607  *
   3608  *      Create at least two renderbuffer objects using GenRenderbuffers
   3609  *      function. Check them without binding, using IsRenderbuffer function.
   3610  *      Expect FALSE.
   3611  *
   3612  *      Create at least two renderbuffer objects using CreateRenderbuffers
   3613  *      function. Check them without binding, using IsRenderbuffer function.
   3614  *      Expect TRUE.
   3615  *
   3616  *      Release objects.
   3617  */
   3618 class CreationTest : public deqp::TestCase
   3619 {
   3620 public:
   3621 	/* Public member functions */
   3622 	CreationTest(deqp::Context& context);
   3623 
   3624 	virtual tcu::TestNode::IterateResult iterate();
   3625 
   3626 private:
   3627 	/* Private member functions */
   3628 	CreationTest(const CreationTest& other);
   3629 	CreationTest& operator=(const CreationTest& other);
   3630 };
   3631 /* CreationTest class */
   3632 
   3633 /** Named Renderbuffer Storage
   3634  *
   3635  *      Create renderbuffer object. Prepare its storage using
   3636  *      NamedRenderbufferStorage function.
   3637  *
   3638  *      Create framebuffer object. Attach renderbuffer to proper attachment
   3639  *      point.
   3640  *
   3641  *      Clear framebuffer's renderbuffer attachment with reference value. Fetch
   3642  *      the data from framebuffer's attachment using ReadPixels. Compare the
   3643  *      fetched values with the reference.
   3644  *
   3645  *      Release all objects.
   3646  *
   3647  *      Repeat the test for following internal formats:
   3648  *
   3649  *          R8, R16, RG8, RG16, RGB565, RGBA4, RGB5_A1, RGBA8, RGB10_A2,
   3650  *          RGB10_A2UI, RGBA16, SRGB8_ALPHA8, R16F, RG16F, RGBA16F, R32F, RG32F,
   3651  *          RGBA32F, R11F_G11F_B10F, R8I, R8UI, R16I, R16UI, R32I, R32UI, RG8I,
   3652  *          RG8UI, RG16I, RG16UI, RG32I, RG32UI, RGBA8I, RGBA8UI, RGBA16I,
   3653  *          RGBA16UI, RGBA32I, RGBA32UI, DEPTH_COMPONENT16, DEPTH_COMPONENT24,
   3654  *          DEPTH_COMPONENT32F, DEPTH24_STENCIL8, DEPTH32F_STENCIL8 and
   3655  *          STENCIL_INDEX8.
   3656  *
   3657  *      Repeat the test for following width and height:
   3658  *          width = 1 and height = 1;
   3659  *          width = 256 and height = 512;
   3660  *          width = 1280 and height = 720;
   3661  *          width = value of MAX_RENDERBUFFER_SIZE and height = 1;
   3662  *          width = 1 and height = value of MAX_RENDERBUFFER_SIZE.
   3663  */
   3664 class StorageTest : public deqp::TestCase
   3665 {
   3666 public:
   3667 	/* Public member functions */
   3668 	StorageTest(deqp::Context& context);
   3669 
   3670 	virtual tcu::TestNode::IterateResult iterate();
   3671 
   3672 private:
   3673 	/* Private static variables. */
   3674 	static const struct RenderbufferInternalFormatConfiguration
   3675 	{
   3676 		glw::GLenum		   internalformat;
   3677 		const glw::GLchar* internalformat_name;
   3678 		bool			   hasRedComponent;
   3679 		bool			   hasGreenComponent;
   3680 		bool			   hasBlueComponent;
   3681 		bool			   hasAlphaComponent;
   3682 		bool			   hasDepthComponent;
   3683 		bool			   hasStencilComponent;
   3684 		bool			   isColorIntegralFormat;
   3685 	} s_renderbuffer_internalformat_configuration[];
   3686 
   3687 	static const glw::GLuint s_renderbuffer_internalformat_configuration_count;
   3688 
   3689 	static const glw::GLfloat s_reference_color[4];
   3690 	static const glw::GLint   s_reference_color_integer[4];
   3691 	static const glw::GLfloat s_reference_depth;
   3692 	static const glw::GLint   s_reference_stencil;
   3693 
   3694 	/* Private member functions */
   3695 	StorageTest(const StorageTest& other);
   3696 	StorageTest& operator=(const StorageTest& other);
   3697 
   3698 	bool PrepareRenderbuffer(StorageTest::RenderbufferInternalFormatConfiguration format, glw::GLuint width,
   3699 							 glw::GLuint height);
   3700 	void Clear(bool isIntegralFormat);
   3701 	bool Check(StorageTest::RenderbufferInternalFormatConfiguration format, glw::GLuint width, glw::GLuint height);
   3702 	void Clean();
   3703 
   3704 	/* Private member variables. */
   3705 	glw::GLuint m_fbo;
   3706 	glw::GLuint m_rbo;
   3707 };
   3708 /* StorageTest class */
   3709 
   3710 /** Named Renderbuffer Storage Multisample
   3711  *
   3712  *      Create two renderbuffer objects. Prepare storage of the first one using
   3713  *      NamedRenderbufferStorageMultisample function. Prepare storage of the
   3714  *      second one using NamedRenderbufferStorage function.
   3715  *
   3716  *      Create two framebuffer objects. Attach multisampled renderbuffer to
   3717  *      proper attachment points of the first framebuffer. Attach second
   3718  *      renderbuffer to proper attachment points of the second framebuffer.
   3719  *
   3720  *      Clear framebuffer's renderbuffer attachment with reference value. Blit
   3721  *      surface of the first framebuffer (multisampled renderbuffer) to the
   3722  *      second framebuffer. Fetch the data from the second framebuffer using
   3723  *      ReadPixels function. Compare the fetched values with the reference.
   3724  *
   3725  *      Release all objects.
   3726  *
   3727  *      Repeat the test for following internal formats:
   3728  *
   3729  *          R8, R16, RG8, RG16, RGB565, RGBA4, RGB5_A1, RGBA8, RGB10_A2,
   3730  *          RGB10_A2UI, RGBA16, SRGB8_ALPHA8, R16F, RG16F, RGBA16F, R32F, RG32F,
   3731  *          RGBA32F, R11F_G11F_B10F, R8I, R8UI, R16I, R16UI, R32I, R32UI, RG8I,
   3732  *          RG8UI, RG16I, RG16UI, RG32I, RG32UI, RGBA8I, RGBA8UI, RGBA16I,
   3733  *          RGBA16UI, RGBA32I, RGBA32UI, DEPTH_COMPONENT16, DEPTH_COMPONENT24,
   3734  *          DEPTH_COMPONENT32F, DEPTH24_STENCIL8, DEPTH32F_STENCIL8 and
   3735  *          STENCIL_INDEX8.
   3736  *
   3737  *      Repeat the test for following width and height:
   3738  *          width = 1 and height = 1;
   3739  *          width = value of MAX_RENDERBUFFER_SIZE and height = 1;
   3740  *          width = 1 and height = value of MAX_RENDERBUFFER_SIZE.
   3741  *
   3742  *      Repeat the test for number of samples in range from 1 to value of
   3743  *      MAX_INTEGER_SAMPLES for signed and unsigned integer internal formats or
   3744  *      in range from 1 to value of MAX_SAMPLES for all other internal formats.
   3745  */
   3746 class StorageMultisampleTest : public deqp::TestCase
   3747 {
   3748 public:
   3749 	/* Public member functions */
   3750 	StorageMultisampleTest(deqp::Context& context);
   3751 
   3752 	virtual tcu::TestNode::IterateResult iterate();
   3753 
   3754 private:
   3755 	/* Private static variables. */
   3756 	static const struct RenderbufferInternalFormatConfiguration
   3757 	{
   3758 		glw::GLenum		   internalformat;
   3759 		const glw::GLchar* internalformat_name;
   3760 		bool			   hasRedComponent;
   3761 		bool			   hasGreenComponent;
   3762 		bool			   hasBlueComponent;
   3763 		bool			   hasAlphaComponent;
   3764 		bool			   hasDepthComponent;
   3765 		bool			   hasStencilComponent;
   3766 		bool			   isColorIntegralFormat;
   3767 	} s_renderbuffer_internalformat_configuration[];
   3768 
   3769 	static const glw::GLuint s_renderbuffer_internalformat_configuration_count;
   3770 
   3771 	static const glw::GLfloat s_reference_color[4];
   3772 	static const glw::GLint   s_reference_color_integer[4];
   3773 	static const glw::GLfloat s_reference_depth;
   3774 	static const glw::GLint   s_reference_stencil;
   3775 
   3776 	/* Private member functions */
   3777 	StorageMultisampleTest(const StorageMultisampleTest& other);
   3778 	StorageMultisampleTest& operator=(const StorageMultisampleTest& other);
   3779 
   3780 	bool PrepareRenderbuffer(StorageMultisampleTest::RenderbufferInternalFormatConfiguration format, glw::GLuint width,
   3781 							 glw::GLuint height, glw::GLsizei samples);
   3782 	void Bind(glw::GLenum target, glw::GLuint selector);
   3783 	void Blit(glw::GLuint width, glw::GLuint height);
   3784 	void Clear(bool isIntegralFormat);
   3785 	bool Check(StorageMultisampleTest::RenderbufferInternalFormatConfiguration format, glw::GLuint width,
   3786 			   glw::GLuint height);
   3787 	void Clean();
   3788 
   3789 	/* Private member variables. */
   3790 	glw::GLuint m_fbo[2];
   3791 	glw::GLuint m_rbo[2];
   3792 };
   3793 /* StorageMultisampleTest class */
   3794 
   3795 /** Get Named Renderbuffer Parameter
   3796  *
   3797  *      Create named renderbuffer object with varying width = 1,
   3798  *      height = 2, and varying internalformat.
   3799  *
   3800  *      For following parameter names:
   3801  *       -  RENDERBUFFER_WIDTH,
   3802  *       -  RENDERBUFFER_HEIGHT,
   3803  *       -  RENDERBUFFER_INTERNAL_FORMAT,
   3804  *       -  RENDERBUFFER_SAMPLES,
   3805  *       -  RENDERBUFFER_RED_SIZE,
   3806  *       -  RENDERBUFFER_GREEN_SIZE,
   3807  *       -  RENDERBUFFER_BLUE_SIZE,
   3808  *       -  RENDERBUFFER_ALPHA_SIZE,
   3809  *       -  RENDERBUFFER_DEPTH_SIZE,
   3810  *       -  RENDERBUFFER_STENCIL_SIZE
   3811  *      query value using GetNamedRenderbufferParameteriv. Expect no error.
   3812  *      Compare it with value returned in non-DSA way. Expect equality.
   3813  *
   3814  *      Repeat test for following internalformats:
   3815  *       -  RGBA8,
   3816  *       -  DEPTH_COMPONENT24,
   3817  *       -  STENCIL_INDEX8,
   3818  *       -  DEPTH24_STENCIL8.
   3819  *
   3820  *      Release objects.
   3821  */
   3822 class GetParametersTest : public deqp::TestCase
   3823 {
   3824 public:
   3825 	/* Public member functions */
   3826 	GetParametersTest(deqp::Context& context);
   3827 
   3828 	virtual tcu::TestNode::IterateResult iterate();
   3829 
   3830 private:
   3831 	/* Private member functions */
   3832 	GetParametersTest(const GetParametersTest& other);
   3833 	GetParametersTest& operator=(const GetParametersTest& other);
   3834 
   3835 	/* Private member variables. */
   3836 	glw::GLuint m_fbo;
   3837 	glw::GLuint m_rbo;
   3838 };
   3839 /* GetParametersTest class */
   3840 
   3841 /** Create Renderbuffer Errors
   3842  *
   3843  *      Check that INVALID_VALUE is generated by CreateRenderbuffers if n is
   3844  *      negative.
   3845  */
   3846 class CreationErrorsTest : public deqp::TestCase
   3847 {
   3848 public:
   3849 	/* Public member functions */
   3850 	CreationErrorsTest(deqp::Context& context);
   3851 
   3852 	virtual tcu::TestNode::IterateResult iterate();
   3853 
   3854 private:
   3855 	/* Private member functions */
   3856 	CreationErrorsTest(const CreationErrorsTest& other);
   3857 	CreationErrorsTest& operator=(const CreationErrorsTest& other);
   3858 };
   3859 /* CreationErrorsTest class */
   3860 
   3861 /** Named Renderbuffer Storage Errors
   3862  *
   3863  *      Check that INVALID_OPERATION is generated by NamedRenderbufferStorage if
   3864  *      renderbuffer is not the name of an existing renderbuffer object.
   3865  *
   3866  *      Check that INVALID_VALUE is generated by NamedRenderbufferStorage if
   3867  *      either of width or height is negative, or greater than the value of
   3868  *      MAX_RENDERBUFFER_SIZE.
   3869  */
   3870 class StorageErrorsTest : public deqp::TestCase
   3871 {
   3872 public:
   3873 	/* Public member functions */
   3874 	StorageErrorsTest(deqp::Context& context);
   3875 
   3876 	virtual tcu::TestNode::IterateResult iterate();
   3877 
   3878 private:
   3879 	/* Private member functions */
   3880 	StorageErrorsTest(const StorageErrorsTest& other);
   3881 	StorageErrorsTest& operator=(const StorageErrorsTest& other);
   3882 
   3883 	void PrepareObjects();
   3884 	bool ExpectError(glw::GLenum expected_error, const glw::GLchar* function, const glw::GLchar* conditions);
   3885 	void Clean();
   3886 
   3887 	/* Private member variables. */
   3888 	glw::GLuint m_rbo_valid;
   3889 	glw::GLuint m_rbo_invalid;
   3890 	glw::GLenum m_internalformat_invalid;
   3891 };
   3892 /* StorageErrorsTest class */
   3893 
   3894 /** Named Renderbuffer Storage Multisample Errors
   3895  *
   3896  *      Check that INVALID_OPERATION is generated by
   3897  *      NamedRenderbufferStorageMultisample function if renderbuffer is not the
   3898  *      name of an existing renderbuffer object.
   3899  *
   3900  *      Check that INVALID_VALUE is generated by
   3901  *      NamedRenderbufferStorageMultisample if samples is greater than
   3902  *      MAX_SAMPLES.
   3903  *
   3904  *      Check that INVALID_ENUM is generated by
   3905  *      NamedRenderbufferStorageMultisample if internalformat is not a
   3906  *      color-renderable, depth-renderable, or stencil-renderable format.
   3907  *
   3908  *      Check that INVALID_OPERATION is generated by
   3909  *      NamedRenderbufferStorageMultisample if internalformat is a signed or
   3910  *      unsigned integer format and samples is greater than the value of
   3911  *      MAX_INTEGER_SAMPLES.
   3912  *
   3913  *      Check that INVALID_VALUE is generated by
   3914  *      NamedRenderbufferStorageMultisample if either of width or height is
   3915  *      negative, or greater than the value of GL_MAX_RENDERBUFFER_SIZE.
   3916  */
   3917 class StorageMultisampleErrorsTest : public deqp::TestCase
   3918 {
   3919 public:
   3920 	/* Public member functions */
   3921 	StorageMultisampleErrorsTest(deqp::Context& context);
   3922 
   3923 	virtual tcu::TestNode::IterateResult iterate();
   3924 
   3925 private:
   3926 	/* Private member functions */
   3927 	StorageMultisampleErrorsTest(const StorageMultisampleErrorsTest& other);
   3928 	StorageMultisampleErrorsTest& operator=(const StorageMultisampleErrorsTest& other);
   3929 
   3930 	void PrepareObjects();
   3931 	bool ExpectError(glw::GLenum expected_error, const glw::GLchar* function, const glw::GLchar* conditions);
   3932 	void Clean();
   3933 
   3934 	/* Private member variables. */
   3935 	glw::GLuint m_rbo_valid;
   3936 	glw::GLuint m_rbo_invalid;
   3937 	glw::GLenum m_internalformat_invalid;
   3938 	glw::GLint  m_max_samples;
   3939 	glw::GLint  m_max_integer_samples;
   3940 };
   3941 /* StorageMultisampleErrorsTest class */
   3942 
   3943 /** Get Named Renderbuffer Parameter Errors
   3944  *
   3945  *      Check that INVALID_OPERATION is generated by
   3946  *      GetNamedRenderbufferParameteriv if renderbuffer is not the name of an
   3947  *      existing renderbuffer object.
   3948  *
   3949  *      Check that INVALID_ENUM is generated by GetNamedRenderbufferParameteriv
   3950  *      if parameter name is not one of the accepted parameter names described
   3951  *      in specification.
   3952  */
   3953 class GetParameterErrorsTest : public deqp::TestCase
   3954 {
   3955 public:
   3956 	/* Public member functions */
   3957 	GetParameterErrorsTest(deqp::Context& context);
   3958 
   3959 	virtual tcu::TestNode::IterateResult iterate();
   3960 
   3961 private:
   3962 	/* Private member functions */
   3963 	GetParameterErrorsTest(const GetParameterErrorsTest& other);
   3964 	GetParameterErrorsTest& operator=(const GetParameterErrorsTest& other);
   3965 
   3966 	void PrepareObjects();
   3967 	bool ExpectError(glw::GLenum expected_error, const glw::GLchar* function, const glw::GLchar* conditions);
   3968 	void Clean();
   3969 
   3970 	/* Private member variables. */
   3971 	glw::GLuint m_rbo_valid;
   3972 	glw::GLuint m_rbo_invalid;
   3973 	glw::GLenum m_parameter_invalid;
   3974 };
   3975 /* GetParameterErrorsTest class */
   3976 } /* Renderbuffers namespace */
   3977 
   3978 namespace VertexArrays
   3979 {
   3980 /** Vertex Array Object Creation
   3981  *
   3982  *     Create at least two vertex array objects using GenVertexArrays function.
   3983  *     Check them without binding, using IsVertexArray function. Expect FALSE.
   3984  *
   3985  *     Create at least two vertex array objects using CreateVertexArrays
   3986  *     function. Check them without binding, using IsVertexArray function.
   3987  *     Expect TRUE.
   3988  *
   3989  *     Release objects.
   3990  */
   3991 class CreationTest : public deqp::TestCase
   3992 {
   3993 public:
   3994 	/* Public member functions */
   3995 	CreationTest(deqp::Context& context);
   3996 
   3997 	virtual tcu::TestNode::IterateResult iterate();
   3998 
   3999 private:
   4000 	/* Private member functions */
   4001 	CreationTest(const CreationTest& other);
   4002 	CreationTest& operator=(const CreationTest& other);
   4003 };
   4004 /* CreationTest class */
   4005 
   4006 /** Vertex Array Object Enable Disable Attributes
   4007  *
   4008  *      Prepare vertex shader with (MAX_VERTEX_ATTRIBS / 2) attribute variables.
   4009  *      Vertex shader shall sum all input attribute variables and pass the sum
   4010  *      to transform feedback varying. Build program in two versions:
   4011  *          1) with attribute variable names bound to even attribute indexes;
   4012  *          2) with attribute variable names bound to odd attribute indexes.
   4013  *
   4014  *      Prepare and bind vertex array object.
   4015  *
   4016  *      Prepare buffer object with MAX_VERTEX_ATTRIBS of consecutive numbers.
   4017  *      Bound each of the numbers to separate index. Prepare second object for
   4018  *      transform feedback result.
   4019  *
   4020  *      Unbind vertex array object.
   4021  *
   4022  *      Enable even attribute indexes using EnableVertexArrayAttrib. Expect no
   4023  *      error.
   4024  *
   4025  *      Bind vertex array object.
   4026  *
   4027  *      Use first program. Draw single point using transform feedback. Expect
   4028  *      sum of numbers at even positions in the input (reference) buffer object.
   4029  *
   4030  *      Unbind vertex array object.
   4031  *
   4032  *      Disable even attribute indexes using DisableVertexArrayAttrib. Expect no
   4033  *      error.
   4034  *
   4035  *      Enable odd attribute indexes using EnableVertexArrayAttrib. Expect no
   4036  *      error.
   4037  *
   4038  *      Bind vertex array object.
   4039  *
   4040  *      Use second program. Draw single point using transform feedback. Expect
   4041  *      sum of numbers at odd positions in the input (reference) buffer object.
   4042  *
   4043  *      Unbind vertex array object.
   4044  *
   4045  *      Release all objects.
   4046  */
   4047 class EnableDisableAttributesTest : public deqp::TestCase
   4048 {
   4049 public:
   4050 	/* Public member functions */
   4051 	EnableDisableAttributesTest(deqp::Context& context);
   4052 
   4053 	virtual tcu::TestNode::IterateResult iterate();
   4054 
   4055 private:
   4056 	/* Private member functions. */
   4057 	EnableDisableAttributesTest(const EnableDisableAttributesTest& other);
   4058 	EnableDisableAttributesTest& operator=(const EnableDisableAttributesTest& other);
   4059 
   4060 	glw::GLuint PrepareProgram(const bool bind_even_or_odd);
   4061 	glw::GLuint BuildProgram(const char* vertex_shader, const bool bind_even_or_odd);
   4062 	void PrepareVAO();
   4063 	void PrepareXFB();
   4064 	bool DrawAndCheck(bool bind_even_or_odd);
   4065 	bool TurnOnAttributes(bool enable_even, bool enable_odd);
   4066 	void Clean();
   4067 
   4068 	/* Private member variables. */
   4069 	glw::GLuint m_po_even;
   4070 	glw::GLuint m_po_odd;
   4071 	glw::GLuint m_vao;
   4072 	glw::GLuint m_bo;
   4073 	glw::GLuint m_bo_xfb;
   4074 	glw::GLint  m_max_attributes;
   4075 
   4076 	/* Private static constants. */
   4077 	static const glw::GLchar s_vertex_shader_template[];
   4078 	static const glw::GLchar s_fragment_shader[];
   4079 };
   4080 /* EnableDisableAttributesTest class */
   4081 
   4082 /** Vertex Array Object Element Buffer
   4083  *
   4084  *      Prepare GLSL program which passes input attribute to transform feedback
   4085  *      varying.
   4086  *
   4087  *      Create and bind vertex array object.
   4088  *
   4089  *      Prepare buffer object with integer data {2, 1, 0}. Set this buffer as an
   4090  *      input attribute. Use non-DSA functions.
   4091  *
   4092  *      Unbind vertex array object.
   4093  *
   4094  *      Prepare buffer object with integer data {2, 1, 0}. Set this buffer as an
   4095  *      element buffer using VertexArrayElementBuffer function.
   4096  *
   4097  *      Bind vertex array object.
   4098  *
   4099  *      Use the program. Draw three points using transform feedback. Expect
   4100  *      result equal to {0, 1, 2}.
   4101  *
   4102  *      Release all objects.
   4103  */
   4104 class ElementBufferTest : public deqp::TestCase
   4105 {
   4106 public:
   4107 	/* Public member functions */
   4108 	ElementBufferTest(deqp::Context& context);
   4109 
   4110 	virtual tcu::TestNode::IterateResult iterate();
   4111 
   4112 private:
   4113 	/* Private member functions. */
   4114 	ElementBufferTest(const ElementBufferTest& other);
   4115 	ElementBufferTest& operator=(const ElementBufferTest& other);
   4116 
   4117 	void PrepareProgram();
   4118 	bool PrepareVAO();
   4119 	void PrepareXFB();
   4120 	bool DrawAndCheck();
   4121 	void Clean();
   4122 
   4123 	/* Private member variables. */
   4124 	glw::GLuint m_po;
   4125 	glw::GLuint m_vao;
   4126 	glw::GLuint m_bo_array;
   4127 	glw::GLuint m_bo_elements;
   4128 	glw::GLuint m_bo_xfb;
   4129 
   4130 	/* Private static constants. */
   4131 	static const glw::GLchar s_vertex_shader[];
   4132 	static const glw::GLchar s_fragment_shader[];
   4133 };
   4134 /* ElementBufferTest class */
   4135 
   4136 /** Vertex Array Object Vertex Buffer and Buffers
   4137  *
   4138  *      Prepare GLSL program which passes sum of three input integer attributes
   4139  *      to the transform feedback varying.
   4140  *
   4141  *      Prepare two vertex buffer objects. Setup first buffer with data {0, 1,
   4142  *      2, 3}.
   4143  *      Setup second buffer with data {4, 5}.
   4144  *
   4145  *      Create vertex array object. Setup three vertex attributes. Set first
   4146  *      buffer object as an input attribute 0 and 1 in interleaved way using
   4147  *      VertexArrayVertexBuffer function. Set second buffer object as an input
   4148  *      attribute 2 using VertexArrayVertexBuffer function.
   4149  *
   4150  *      Use program. Draw 2 points using transform feedback. Query results.
   4151  *      Expect two values {0+2+4, 1+3+5}.
   4152  *
   4153  *      Release all data.
   4154  *
   4155  *      Repeat the test using VertexArrayVertexBuffers function instead of
   4156  *      VertexArrayVertexBuffer.
   4157  */
   4158 class VertexBuffersTest : public deqp::TestCase
   4159 {
   4160 public:
   4161 	/* Public member functions */
   4162 	VertexBuffersTest(deqp::Context& context);
   4163 
   4164 	virtual tcu::TestNode::IterateResult iterate();
   4165 
   4166 private:
   4167 	/* Private member functions. */
   4168 	VertexBuffersTest(const VertexBuffersTest& other);
   4169 	VertexBuffersTest& operator=(const VertexBuffersTest& other);
   4170 
   4171 	void PrepareProgram();
   4172 	bool PrepareVAO(bool use_multiple_buffers_function);
   4173 	void PrepareXFB();
   4174 	bool DrawAndCheck();
   4175 	void Clean();
   4176 
   4177 	/* Private member variables. */
   4178 	glw::GLuint m_po;
   4179 	glw::GLuint m_vao;
   4180 	glw::GLuint m_bo_array_0;
   4181 	glw::GLuint m_bo_array_1;
   4182 	glw::GLuint m_bo_xfb;
   4183 
   4184 	/* Private static constants. */
   4185 	static const glw::GLchar s_vertex_shader[];
   4186 	static const glw::GLchar s_fragment_shader[];
   4187 };
   4188 /* VertexBuffersTest class */
   4189 
   4190 /** Vertex Array Object Attribute Format
   4191  *
   4192  *      Prepare GLSL program which passes sum of two input attributes to the
   4193  *      transform feedback varying.
   4194  *
   4195  *      Create vertex array object.
   4196  *
   4197  *      Prepare vertex buffer object with reference data of two interleaved
   4198  *      arrays. Setup it as input interleaved attributes.
   4199  *
   4200  *      Setup two consecutive attributes using VertexArrayAttribFormat function.
   4201  *
   4202  *      Use program. Draw 2 points using transform feedback. Query results.
   4203  *      Expect sum of adequate reference values.
   4204  *
   4205  *      Release all data.
   4206  *
   4207  *      Repeat the test using VertexArrayAttribIFormat VertexArrayAttribLFormat
   4208  *      function instead of VertexArrayAttribFormat.
   4209  *
   4210  *      Repeat the test using size 1, 2, 3, and 4 (if possible by type).
   4211  *
   4212  *      Repeat the test using type BYTE, SHORT, INT, FLOAT, DOUBLE,
   4213  *      UNSIGNED_BYTE, UNSIGNED_SHORT, UNSIGNED_INT.
   4214  *
   4215  *      For test with VertexArrayAttribFormat function repeat for normalized and
   4216  *      not normalized values.
   4217  */
   4218 class AttributeFormatTest : public deqp::TestCase
   4219 {
   4220 public:
   4221 	/* Public member functions */
   4222 	AttributeFormatTest(deqp::Context& context);
   4223 
   4224 	virtual tcu::TestNode::IterateResult iterate();
   4225 
   4226 private:
   4227 	/* Private state enumerations. */
   4228 	enum AtributeFormatFunctionType
   4229 	{
   4230 		ATTRIBUTE_FORMAT_FUNCTION_FLOAT,
   4231 		ATTRIBUTE_FORMAT_FUNCTION_DOUBLE,
   4232 		ATTRIBUTE_FORMAT_FUNCTION_INTEGER,
   4233 		ATTRIBUTE_FORMAT_FUNCTION_COUNT /* Must be last */
   4234 	};
   4235 
   4236 	/* Private member functions. */
   4237 	AttributeFormatTest(const AttributeFormatTest& other);
   4238 	AttributeFormatTest& operator=(const AttributeFormatTest& other);
   4239 
   4240 	template <typename T>
   4241 	bool compare(T a, T b);
   4242 
   4243 	void PrepareProgram(glw::GLint size, AtributeFormatFunctionType function_selector);
   4244 
   4245 	template <typename T>
   4246 	glw::GLdouble NormalizationScaleFactor();
   4247 
   4248 	template <typename T>
   4249 	bool PrepareVAO(glw::GLint size, glw::GLenum type_gl_name, bool normalized,
   4250 					AtributeFormatFunctionType function_selector);
   4251 
   4252 	void PrepareXFB();
   4253 
   4254 	template <typename T>
   4255 	bool DrawAndCheck(glw::GLint size, bool normalized);
   4256 
   4257 	void CleanVAO();
   4258 	void CleanProgram();
   4259 	void CleanXFB();
   4260 
   4261 	/* Private member variables. */
   4262 	glw::GLuint m_po;
   4263 	glw::GLuint m_vao;
   4264 	glw::GLuint m_bo_array;
   4265 	glw::GLuint m_bo_xfb;
   4266 
   4267 	/* Private static constants. */
   4268 	static const glw::GLchar* s_vertex_shader_head;
   4269 	static const glw::GLchar* s_vertex_shader_body;
   4270 	static const glw::GLchar* s_vertex_shader_declaration[ATTRIBUTE_FORMAT_FUNCTION_COUNT][4 /* sizes count */];
   4271 	static const glw::GLchar* s_fragment_shader;
   4272 };
   4273 /* AttributeFormatTest class */
   4274 
   4275 /** Vertex Array Attribute Binding
   4276  *
   4277  *      Prepare GLSL program which passes two integer input attributes to the
   4278  *      two-component transform feedback varying vector. Bind first attribute
   4279  *      to attribute index 0. Bind second attribute to attribute index 1.
   4280  *
   4281  *      Create vertex array object.
   4282  *
   4283  *      Prepare vertex buffer object. Setup the buffer with data {1, 0}.
   4284  *      Setup two integer attribute pointers in consecutive way.
   4285  *
   4286  *      Using VertexArrayAttribBinding function, set up binding index 0 to the
   4287  *      attribute index 1. Using VertexArrayAttribBinding function, set up
   4288  *      binding index 1 to the attribute index 0.
   4289  *
   4290  *      Prepare transform feedback buffer object.
   4291  *
   4292  *      Release all data.
   4293  */
   4294 class AttributeBindingTest : public deqp::TestCase
   4295 {
   4296 public:
   4297 	/* Public member functions */
   4298 	AttributeBindingTest(deqp::Context& context);
   4299 
   4300 	virtual tcu::TestNode::IterateResult iterate();
   4301 
   4302 private:
   4303 	/* Private member functions. */
   4304 	AttributeBindingTest(const AttributeBindingTest& other);
   4305 	AttributeBindingTest& operator=(const AttributeBindingTest& other);
   4306 
   4307 	void PrepareProgram();
   4308 	bool PrepareVAO();
   4309 	void PrepareXFB();
   4310 	bool DrawAndCheck();
   4311 	void Clean();
   4312 
   4313 	/* Private member variables. */
   4314 	glw::GLuint m_po;
   4315 	glw::GLuint m_vao;
   4316 	glw::GLuint m_bo_array;
   4317 	glw::GLuint m_bo_xfb;
   4318 
   4319 	/* Private static constants. */
   4320 	static const glw::GLchar s_vertex_shader[];
   4321 	static const glw::GLchar s_fragment_shader[];
   4322 };
   4323 /* AttributeBindingTest class */
   4324 
   4325 class AttributeBindingDivisorTest : public deqp::TestCase
   4326 {
   4327 public:
   4328 	/* Public member functions */
   4329 	AttributeBindingDivisorTest(deqp::Context& context);
   4330 
   4331 	virtual tcu::TestNode::IterateResult iterate();
   4332 
   4333 private:
   4334 	/* Private member functions. */
   4335 	AttributeBindingDivisorTest(const AttributeBindingDivisorTest& other);
   4336 	AttributeBindingDivisorTest& operator=(const AttributeBindingDivisorTest& other);
   4337 
   4338 	void PrepareProgram();
   4339 	void PrepareVAO();
   4340 	void PrepareXFB();
   4341 	void Draw(glw::GLuint number_of_points, glw::GLuint number_of_instances);
   4342 	bool SetDivisor(glw::GLuint divisor);
   4343 	bool CheckXFB(const glw::GLuint count, const glw::GLint expected[], const glw::GLchar* log_message);
   4344 	void Clean();
   4345 
   4346 	/* Private member variables. */
   4347 	glw::GLuint m_po;
   4348 	glw::GLuint m_vao;
   4349 	glw::GLuint m_bo_array;
   4350 	glw::GLuint m_bo_xfb;
   4351 
   4352 	/* Private static constants. */
   4353 	static const glw::GLchar s_vertex_shader[];
   4354 	static const glw::GLchar s_fragment_shader[];
   4355 };
   4356 /* AttributeBindingDivisorTest class */
   4357 
   4358 /* Get Vertex Array
   4359  *
   4360  *      Create vertex array object.
   4361  *
   4362  *      Create buffer object. Set this buffer as an element buffer of the vertex
   4363  *      array object.
   4364  *
   4365  *      Query ELEMENT_ARRAY_BUFFER_BINDING using GetVertexArrayiv. Expect buffer
   4366  *      ID.
   4367  *
   4368  *      Release all objects.
   4369  */
   4370 class GetVertexArrayTest : public deqp::TestCase
   4371 {
   4372 public:
   4373 	/* Public member functions */
   4374 	GetVertexArrayTest(deqp::Context& context);
   4375 
   4376 	virtual tcu::TestNode::IterateResult iterate();
   4377 
   4378 private:
   4379 	/* Private member functions. */
   4380 	GetVertexArrayTest(const GetVertexArrayTest& other);
   4381 	GetVertexArrayTest& operator=(const GetVertexArrayTest& other);
   4382 };
   4383 /* GetVertexArrayTest class */
   4384 
   4385 /** Get Vertex Array Indexed
   4386  *
   4387  *      Create vertex array object.
   4388  *
   4389  *      Enable attribute indexes 0, 1, 2 and 3.
   4390  *
   4391  *      Create 4 buffer objects. Set these buffer as attribute arrays:
   4392  *          -  attribute 0 with size 1, type BYTE, normalized, stride 0, offset 0,
   4393  *          relative offset 0, binding divisor to 3;
   4394  *          -  integer attribute 1 with size 2, type SHORT, stride 2, offset 2,
   4395  *          relative offset 0, binding divisor to 2;
   4396  *          -  attribute 2 with size 3, type FLOAT, not normalized, stride 0,
   4397  *          offset 8, relative offset 4, binding divisor to 1;
   4398  *          -  attribute 3 with size 4, type UNSIGNED_INT_2_10_10_10_REV, not
   4399  *          normalized, stride 8, offset 4, relative offset 0,
   4400  *          binding divisor to 0.
   4401  *
   4402  *      Query VERTEX_ATTRIB_ARRAY_ENABLED using GetVertexArrayIndexediv. Expect
   4403  *      TRUE for consecutive indexes 0-3 and FALSE for index 4.
   4404  *
   4405  *      Query VERTEX_ATTRIB_ARRAY_SIZE using GetVertexArrayIndexediv. Expect
   4406  *      1, 2, 3, 4 for consecutive indexes.
   4407  *
   4408  *      Query VERTEX_ATTRIB_ARRAY_STRIDE using GetVertexArrayIndexediv. Expect
   4409  *      0, 2, 0, 8 for consecutive indexes.
   4410  *
   4411  *      Query VERTEX_ATTRIB_ARRAY_TYPE using GetVertexArrayIndexediv. Expect
   4412  *      BYTE, SHORT, FLOAT, UNSIGNED_INT_2_10_10_10_REV for consecutive indexes.
   4413  *
   4414  *      Query VERTEX_ATTRIB_ARRAY_NORMALIZED using GetVertexArrayIndexediv.
   4415  *      Expect true, false, false, false for consecutive indexes.
   4416  *
   4417  *      Query VERTEX_ATTRIB_ARRAY_INTEGER using GetVertexArrayIndexediv.
   4418  *      Expect true, true, false, true for consecutive indexes.
   4419  *
   4420  *      Query VERTEX_ATTRIB_ARRAY_LONG using GetVertexArrayIndexediv. Expect
   4421  *      false for consecutive indexes.
   4422  *
   4423  *      Query VERTEX_ATTRIB_ARRAY_DIVISOR using GetVertexArrayIndexediv. Expect
   4424  *      3, 2, 1, 0 for consecutive indexes.
   4425  *
   4426  *      Query VERTEX_ATTRIB_RELATIVE_OFFSET using GetVertexArrayIndexediv.
   4427  *      Expect 0, 0, 4, 0 for consecutive indexes.
   4428  *
   4429  *      Query VERTEX_BINDING_OFFSET using GetVertexArrayIndexed64iv. Expect 0,
   4430  *      2, 8, 4 for consecutive indexes.
   4431  *
   4432  *      Release all objects.
   4433  */
   4434 class GetVertexArrayIndexedTest : public deqp::TestCase
   4435 {
   4436 public:
   4437 	/* Public member functions */
   4438 	GetVertexArrayIndexedTest(deqp::Context& context);
   4439 
   4440 	virtual tcu::TestNode::IterateResult iterate();
   4441 
   4442 private:
   4443 	/* Private member functions. */
   4444 	GetVertexArrayIndexedTest(const GetVertexArrayIndexedTest& other);
   4445 	GetVertexArrayIndexedTest& operator=(const GetVertexArrayIndexedTest& other);
   4446 
   4447 	void PrepareVAO();
   4448 	bool Check(const glw::GLenum pname, const glw::GLuint index, const glw::GLint expected);
   4449 	bool Check64(const glw::GLenum pname, const glw::GLuint index, const glw::GLint64 expected);
   4450 
   4451 	/* Private member variables. */
   4452 	glw::GLuint m_vao;
   4453 	glw::GLuint m_bo[4];
   4454 };
   4455 /* GetVertexArrayIndexedTest class */
   4456 
   4457 /** Vertex Array Defaults
   4458  *
   4459  *      Create empty vertex array object using CreateVertexArrays function.
   4460  *
   4461  *      Check that parameter VERTEX_ATTRIB_ARRAY_ENABLED for all possible
   4462  *      attributes is equal to value FALSE.
   4463  *
   4464  *      Check that parameter VERTEX_ATTRIB_ARRAY_SIZE for all possible
   4465  *      attributes is equal to value 4.
   4466  *
   4467  *      Check that parameter VERTEX_ATTRIB_ARRAY_STRIDE for all possible
   4468  *      attributes is equal to value 0.
   4469  *
   4470  *      Check that parameter VERTEX_ATTRIB_ARRAY_TYPE for all possible
   4471  *      attributes is equal to value FLOAT.
   4472  *
   4473  *      Check that parameter VERTEX_ATTRIB_ARRAY_NORMALIZED for all possible
   4474  *      attributes is equal to value FALSE.
   4475  *
   4476  *      Check that parameter VERTEX_ATTRIB_ARRAY_INTEGER for all possible
   4477  *      attributes is equal to value FALSE.
   4478  *
   4479  *      Check that parameter VERTEX_ATTRIB_ARRAY_LONG for all possible
   4480  *      attributes is equal to value FALSE.
   4481  *
   4482  *      Check that parameter VERTEX_ATTRIB_ARRAY_DIVISOR for all possible
   4483  *      attributes is equal to value 0.
   4484  *
   4485  *      Check that parameter VERTEX_ATTRIB_RELATIVE_OFFSET for all possible
   4486  *      attributes is equal to value 0.
   4487  *
   4488  *      Check that parameter VERTEX_BINDING_OFFSET for all possible attributes
   4489  *      is equal to value 0.
   4490  *
   4491  *      Check that parameter ELEMENT_ARRAY_BUFFER_BINDING is equal to value 0.
   4492  *
   4493  *      Release vertex array object.
   4494  */
   4495 class DefaultsTest : public deqp::TestCase
   4496 {
   4497 public:
   4498 	/* Public member functions */
   4499 	DefaultsTest(deqp::Context& context);
   4500 
   4501 	virtual tcu::TestNode::IterateResult iterate();
   4502 
   4503 private:
   4504 	/* Private member functions. */
   4505 	DefaultsTest(const DefaultsTest& other);
   4506 	DefaultsTest& operator=(const DefaultsTest& other);
   4507 
   4508 	void PrepareVAO();
   4509 	bool Check(const glw::GLenum pname, const glw::GLint expected);
   4510 	bool CheckIndexed(const glw::GLenum pname, const glw::GLuint index, const glw::GLint expected);
   4511 	bool CheckIndexed64(const glw::GLenum pname, const glw::GLuint index, const glw::GLint64 expected);
   4512 
   4513 	/* Private member variables. */
   4514 	glw::GLuint m_vao;
   4515 };
   4516 /* DefaultsTest class */
   4517 
   4518 /** Vertex Array Object Creation Error
   4519  *
   4520  *      Check that INVALID_VALUE is generated if n is negative.
   4521  */
   4522 class CreationErrorTest : public deqp::TestCase
   4523 {
   4524 public:
   4525 	/* Public member functions */
   4526 	CreationErrorTest(deqp::Context& context);
   4527 
   4528 	virtual tcu::TestNode::IterateResult iterate();
   4529 
   4530 private:
   4531 	/* Private member functions. */
   4532 	CreationErrorTest(const CreationErrorTest& other);
   4533 	CreationErrorTest& operator=(const CreationErrorTest& other);
   4534 
   4535 	bool CheckError(const glw::GLenum expected, const glw::GLchar* log_message);
   4536 };
   4537 /* CreationErrorTest class */
   4538 
   4539 /** Vertex Array Object Enable Disable Attribute Errors
   4540  *
   4541  *      Check that INVALID_OPERATION is generated by EnableVertexArrayAttrib and
   4542  *      DisableVertexArrayAttrib if vaobj is not the name of an existing vertex
   4543  *      array object.
   4544  *
   4545  *      Check that INVALID_VALUE is generated if index is greater than or equal
   4546  *      to MAX_VERTEX_ATTRIBS.
   4547  */
   4548 class EnableDisableAttributeErrorsTest : public deqp::TestCase
   4549 {
   4550 public:
   4551 	/* Public member functions */
   4552 	EnableDisableAttributeErrorsTest(deqp::Context& context);
   4553 
   4554 	virtual tcu::TestNode::IterateResult iterate();
   4555 
   4556 private:
   4557 	/* Private member functions. */
   4558 	EnableDisableAttributeErrorsTest(const EnableDisableAttributeErrorsTest& other);
   4559 	EnableDisableAttributeErrorsTest& operator=(const EnableDisableAttributeErrorsTest& other);
   4560 
   4561 	bool CheckError(const glw::GLenum expected, const glw::GLchar* log_message);
   4562 };
   4563 /* EnableDisableAttributeErrorsTest class */
   4564 
   4565 /** Vertex Array Object Element Buffer Errors
   4566  *
   4567  *      Check that INVALID_OPERATION error is generated by VertexArrayElementBuffer if vaobj is not the name
   4568  *      of an existing vertex array object.
   4569  *
   4570  *      Check that INVALID_OPERATION error is generated by VertexArrayElementBuffer if buffer is not zero or
   4571  *      the name of an existing buffer object.
   4572  */
   4573 class ElementBufferErrorsTest : public deqp::TestCase
   4574 {
   4575 public:
   4576 	/* Public member functions */
   4577 	ElementBufferErrorsTest(deqp::Context& context);
   4578 
   4579 	virtual tcu::TestNode::IterateResult iterate();
   4580 
   4581 private:
   4582 	/* Private member functions. */
   4583 	ElementBufferErrorsTest(const ElementBufferErrorsTest& other);
   4584 	ElementBufferErrorsTest& operator=(const ElementBufferErrorsTest& other);
   4585 
   4586 	bool CheckError(const glw::GLenum expected, const glw::GLchar* log_message);
   4587 };
   4588 /* ElementBuffersErrorsTest class */
   4589 
   4590 /** Vertex Array Object Buffer and Buffers Errors
   4591  *
   4592  *      Check that INVALID_OPERATION is generated by VertexArrayVertexBuffer and
   4593  *      VertexArrayVertexBuffers if vaobj is not the name of an existing vertex
   4594  *      array object.
   4595  *
   4596  *      Check that INVALID_VALUE is generated by VertexArrayVertexBuffer if
   4597  *      buffer is not zero or the name of an existing buffer object (as returned
   4598  *      by GenBuffers or CreateBuffers).
   4599  *
   4600  *      Check that INVALID_OPERATION is generated by VertexArrayVertexBuffers if
   4601  *      any value in buffers is not zero or the name of an existing buffer
   4602  *      object.
   4603  *
   4604  *      Check that INVALID_VALUE is generated by VertexArrayVertexBuffer if
   4605  *      bindingindex is greater than or equal to the value of
   4606  *      MAX_VERTEX_ATTRIB_BINDINGS.
   4607  *
   4608  *      Check that INVALID_OPERATION is generated by VertexArrayVertexBuffers if
   4609  *      first+count is greater than the value of MAX_VERTEX_ATTRIB_BINDINGS.
   4610  *
   4611  *      Check that INVALID_VALUE is generated by VertexArrayVertexBuffer if
   4612  *      offset or stride is less than zero, or if stride is greater than the
   4613  *      value of MAX_VERTEX_ATTRIB_STRIDE.
   4614  *
   4615  *      Check that INVALID_VALUE is generated by VertexArrayVertexBuffers if any
   4616  *      value in offsets or strides is negative, or if a value is stride is
   4617  *      greater than the value of MAX_VERTEX_ATTRIB_STRIDE.
   4618  */
   4619 class VertexBuffersErrorsTest : public deqp::TestCase
   4620 {
   4621 public:
   4622 	/* Public member functions */
   4623 	VertexBuffersErrorsTest(deqp::Context& context);
   4624 
   4625 	virtual tcu::TestNode::IterateResult iterate();
   4626 
   4627 private:
   4628 	/* Private member functions. */
   4629 	VertexBuffersErrorsTest(const VertexBuffersErrorsTest& other);
   4630 	VertexBuffersErrorsTest& operator=(const VertexBuffersErrorsTest& other);
   4631 
   4632 	bool CheckError(const glw::GLenum expected, const glw::GLchar* log_message);
   4633 };
   4634 /* VertexBuffersErrorsTest class */
   4635 
   4636 /** Vertex Array Object Attribute Format Errors
   4637  *
   4638  *      Check that INVALID_VALUE is generated by VertexArrayAttrib*Format if
   4639  *      attribindex is greater than or equal to the value of MAX_VERTEX_ATTRIBS.
   4640  *
   4641  *      Check that INVALID_VALUE is generated by VertexArrayAttrib*Format if
   4642  *      size is not one of the accepted values.
   4643  *
   4644  *      Check that INVALID_VALUE is generated by VertexArrayAttrib*Format if
   4645  *      relativeoffset is greater than the value of
   4646  *      MAX_VERTEX_ATTRIB_RELATIVE_OFFSET.
   4647  *
   4648  *      Check that INVALID_ENUM is generated by VertexArrayAttrib*Format if type
   4649  *      is not one of the accepted tokens.
   4650  *
   4651  *      Check that INVALID_ENUM is generated by VertexArrayAttrib{IL}Format if
   4652  *      type is UNSIGNED_INT_10F_11F_11F_REV.
   4653  *
   4654  *      Check that INVALID_OPERATION is generated by VertexArrayAttrib*Format if
   4655  *      vaobj is not the name of an existing vertex array object.
   4656  *
   4657  *      Check that INVALID_OPERATION is generated by VertexArrayAttribFormat
   4658  *      under any of the following conditions:
   4659  *       -  size is BGRA and type is not UNSIGNED_BYTE, INT_2_10_10_10_REV or
   4660  *          UNSIGNED_INT_2_10_10_10_REV,
   4661  *       -  type is INT_2_10_10_10_REV or UNSIGNED_INT_2_10_10_10_REV, and size
   4662  *          is neither 4 nor BGRA,
   4663  *       -  type is UNSIGNED_INT_10F_11F_11F_REV and size is not 3,
   4664  *       -  size is BGRA and normalized is FALSE.
   4665  */
   4666 class AttributeFormatErrorsTest : public deqp::TestCase
   4667 {
   4668 public:
   4669 	/* Public member functions */
   4670 	AttributeFormatErrorsTest(deqp::Context& context);
   4671 
   4672 	virtual tcu::TestNode::IterateResult iterate();
   4673 
   4674 private:
   4675 	/* Private member functions. */
   4676 	AttributeFormatErrorsTest(const AttributeFormatErrorsTest& other);
   4677 	AttributeFormatErrorsTest& operator=(const AttributeFormatErrorsTest& other);
   4678 
   4679 	bool CheckError(const glw::GLenum expected, const glw::GLchar* log_message);
   4680 };
   4681 /* AttributeFormatErrorsTest class */
   4682 
   4683 /** Vertex Array Attribute Binding Errors
   4684  *
   4685  *      Check that INVALID_OPERATION is generated by VertexArrayAttribBinding if
   4686  *      vaobj is not the name of an existing vertex array object.
   4687  *
   4688  *      Check that INVALID_VALUE is generated by VertexArrayAttribBinding if
   4689  *      attribindex is greater than or equal to the value of MAX_VERTEX_ATTRIBS.
   4690  *
   4691  *      Check that INVALID_VALUE is generated by VertexArrayAttribBinding if
   4692  *      bindingindex is greater than or equal to the value of
   4693  *      MAX_VERTEX_ATTRIB_BINDINGS.
   4694  */
   4695 class AttributeBindingErrorsTest : public deqp::TestCase
   4696 {
   4697 public:
   4698 	/* Public member functions */
   4699 	AttributeBindingErrorsTest(deqp::Context& context);
   4700 
   4701 	virtual tcu::TestNode::IterateResult iterate();
   4702 
   4703 private:
   4704 	/* Private member functions. */
   4705 	AttributeBindingErrorsTest(const AttributeBindingErrorsTest& other);
   4706 	AttributeBindingErrorsTest& operator=(const AttributeBindingErrorsTest& other);
   4707 
   4708 	bool CheckError(const glw::GLenum expected, const glw::GLchar* log_message);
   4709 };
   4710 /* AttributeBindingErrorsTest class */
   4711 
   4712 /** Vertex Array Binding Divisor Errors
   4713  *
   4714  *      Check that INVALID_VALUE is generated by VertexArrayBindingDivisor if
   4715  *      bindingindex is greater than or equal to the value of
   4716  *      MAX_VERTEX_ATTRIB_BINDINGS.
   4717  *
   4718  *      Check that INVALID_OPERATION is generated by VertexArrayBindingDivisor
   4719  *      if vaobj is not the name of an existing vertex array object.
   4720  */
   4721 class AttributeBindingDivisorErrorsTest : public deqp::TestCase
   4722 {
   4723 public:
   4724 	/* Public member functions */
   4725 	AttributeBindingDivisorErrorsTest(deqp::Context& context);
   4726 
   4727 	virtual tcu::TestNode::IterateResult iterate();
   4728 
   4729 private:
   4730 	/* Private member functions. */
   4731 	AttributeBindingDivisorErrorsTest(const AttributeBindingDivisorErrorsTest& other);
   4732 	AttributeBindingDivisorErrorsTest& operator=(const AttributeBindingDivisorErrorsTest& other);
   4733 
   4734 	bool CheckError(const glw::GLenum expected, const glw::GLchar* log_message);
   4735 };
   4736 /* AttributeBindingDivisorErrorsTest class */
   4737 
   4738 /** Get Vertex Array Errors
   4739  *
   4740  *      Check that INVALID_OPERATION error is generated by GetVertexArrayiv if
   4741  *      vaobj is not the name of an existing vertex array object.
   4742  *
   4743  *      Check that INVALID_ENUM error is generated by GetVertexArrayiv if pname
   4744  *      is not ELEMENT_ARRAY_BUFFER_BINDING.
   4745  */
   4746 class GetVertexArrayErrorsTest : public deqp::TestCase
   4747 {
   4748 public:
   4749 	/* Public member functions */
   4750 	GetVertexArrayErrorsTest(deqp::Context& context);
   4751 
   4752 	virtual tcu::TestNode::IterateResult iterate();
   4753 
   4754 private:
   4755 	/* Private member functions. */
   4756 	GetVertexArrayErrorsTest(const GetVertexArrayErrorsTest& other);
   4757 	GetVertexArrayErrorsTest& operator=(const GetVertexArrayErrorsTest& other);
   4758 
   4759 	bool CheckError(const glw::GLenum expected, const glw::GLchar* log_message);
   4760 };
   4761 /* GetVertexArrayErrorsTest class */
   4762 
   4763 /** Get Vertex Array Indexed Errors
   4764  *
   4765  *      Check that INVALID_OPERATION error is generated by
   4766  *      GetVertexArrayIndexediv and GetVertexArrayIndexed64iv if vaobj is not
   4767  *      the name of an existing vertex array object.
   4768  *
   4769  *      Check that INVALID_VALUE error is generated by GetVertexArrayIndexediv
   4770  *      and GetVertexArrayIndexed64iv if index is greater than or equal to the
   4771  *      value of MAX_VERTEX_ATTRIBS.
   4772  *
   4773  *      Check that INVALID_ENUM error is generated by GetVertexArrayIndexediv if
   4774  *      pname is not one of the valid values:
   4775  *       -  VERTEX_ATTRIB_ARRAY_ENABLED,
   4776  *       -  VERTEX_ATTRIB_ARRAY_SIZE,
   4777  *       -  VERTEX_ATTRIB_ARRAY_STRIDE,
   4778  *       -  VERTEX_ATTRIB_ARRAY_TYPE,
   4779  *       -  VERTEX_ATTRIB_ARRAY_NORMALIZED,
   4780  *       -  VERTEX_ATTRIB_ARRAY_INTEGER,
   4781  *       -  VERTEX_ATTRIB_ARRAY_LONG,
   4782  *       -  VERTEX_ATTRIB_ARRAY_DIVISOR,
   4783  *       -  VERTEX_ATTRIB_RELATIVE_OFFSET.
   4784  *
   4785  *      Check that INVALID_ENUM error is generated by GetVertexArrayIndexed64iv
   4786  *      if pname is not VERTEX_BINDING_OFFSET.
   4787  */
   4788 class GetVertexArrayIndexedErrorsTest : public deqp::TestCase
   4789 {
   4790 public:
   4791 	/* Public member functions */
   4792 	GetVertexArrayIndexedErrorsTest(deqp::Context& context);
   4793 
   4794 	virtual tcu::TestNode::IterateResult iterate();
   4795 
   4796 private:
   4797 	/* Private member functions. */
   4798 	GetVertexArrayIndexedErrorsTest(const GetVertexArrayIndexedErrorsTest& other);
   4799 	GetVertexArrayIndexedErrorsTest& operator=(const GetVertexArrayIndexedErrorsTest& other);
   4800 
   4801 	bool CheckError(const glw::GLenum expected, const glw::GLchar* log_message);
   4802 };
   4803 /* GetVertexArrayIndexedErrorsTest class */
   4804 
   4805 namespace Utilities
   4806 {
   4807 std::string itoa(glw::GLuint i);
   4808 std::string replace(const std::string& src, const std::string& key, const std::string& value);
   4809 } /* Vertex Arrays utilities class */
   4810 } /* VertexArrays namespace */
   4811 
   4812 /* Direct State Access Textures Tests */
   4813 namespace Textures
   4814 {
   4815 /** @class CreationTest
   4816  *
   4817  *  @brief Direct State Access Texture Creation test cases.
   4818  *
   4819  *  Test follows the steps:
   4820  *
   4821  *      Create at least two texture objects using GenTextures function. Check
   4822  *      them without binding, using IsTexture function. Expect FALSE.
   4823  *
   4824  *      Create at least two texture objects using CreateTextures function. Check
   4825  *      them without binding, using IsTexture function. Expect TRUE. Repeat this
   4826  *      step for all targets:
   4827  *          -  TEXTURE_1D,
   4828  *          -  TEXTURE_2D,
   4829  *          -  TEXTURE_3D,
   4830  *          -  TEXTURE_1D_ARRAY,
   4831  *          -  TEXTURE_2D_ARRAY,
   4832  *          -  TEXTURE_RECTANGLE,
   4833  *          -  TEXTURE_CUBE_MAP,
   4834  *          -  TEXTURE_CUBE_MAP_ARRAY,
   4835  *          -  TEXTURE_BUFFER,
   4836  *          -  TEXTURE_2D_MULTISAMPLE and
   4837  *          -  TEXTURE_2D_MULTISAMPLE_ARRAY.
   4838  *
   4839  *      Release objects.
   4840  */
   4841 class CreationTest : public deqp::TestCase
   4842 {
   4843 public:
   4844 	/* Public member functions */
   4845 	CreationTest(deqp::Context& context);
   4846 
   4847 	virtual tcu::TestNode::IterateResult iterate();
   4848 
   4849 private:
   4850 	/* Private member functions */
   4851 	CreationTest(const CreationTest& other);
   4852 	CreationTest& operator=(const CreationTest& other);
   4853 };
   4854 /* CreationTest class */
   4855 
   4856 class Reference
   4857 {
   4858 public:
   4859 	template <typename T, glw::GLint S, bool N>
   4860 	static glw::GLenum InternalFormat();
   4861 
   4862 	template <glw::GLint S, bool N>
   4863 	static glw::GLenum Format();
   4864 
   4865 	template <typename T>
   4866 	static glw::GLenum Type();
   4867 
   4868 	template <typename T, bool N>
   4869 	static const T* ReferenceData();
   4870 
   4871 	static glw::GLuint ReferenceDataCount();
   4872 
   4873 	template <typename T>
   4874 	static glw::GLuint ReferenceDataSize();
   4875 
   4876 	template <typename T>
   4877 	static bool Compare(const T a, const T b);
   4878 
   4879 private:
   4880 	static const glw::GLuint s_reference_count = 2 /* 1D */ * 3 /* 2D */ * 4 /* 3D */ * 4 /* components */;
   4881 };
   4882 
   4883 /** @class BufferTest
   4884  *
   4885  *  @brief Direct State Access of texture buffers.
   4886  *
   4887  *  @tparam T      Type.
   4888  *  @tparam S      Size.
   4889  *  @tparam N      Is normalized.
   4890  *
   4891  *  Test follows the steps:
   4892  *
   4893  *      Make test for following DSA functions:
   4894  *        -  TextureBuffer,
   4895  *        -  TextureBufferRange
   4896  *       and following texture internal formats:
   4897  *        -  R8,
   4898  *        -  R16,
   4899  *        -  R16F,
   4900  *        -  R32F,
   4901  *        -  R8I,
   4902  *        -  R16I,
   4903  *        -  R32I,
   4904  *        -  R8UI,
   4905  *        -  R16UI,
   4906  *        -  R32UI,
   4907  *        -  RG8,
   4908  *        -  RG16,
   4909  *        -  RG16F,
   4910  *        -  RG32F,
   4911  *        -  RG8I,
   4912  *        -  RG16I,
   4913  *        -  RG32I,
   4914  *        -  RG8UI,
   4915  *        -  RG16UI,
   4916  *        -  RG32UI,
   4917  *        -  RGB32F,
   4918  *        -  RGB32I,
   4919  *        -  RGB32UI,
   4920  *        -  RGBA8,
   4921  *        -  RGBA16,
   4922  *        -  RGBA16F,
   4923  *        -  RGBA32F,
   4924  *        -  RGBA8I,
   4925  *        -  RGBA16I,
   4926  *        -  RGBA32I,
   4927  *        -  RGBA8UI,
   4928  *        -  RGBA16UI,
   4929  *        -  RGBA32UI.
   4930  *
   4931  *          Prepare program which draws textured quad 6 x 1 pixels in size. The
   4932  *          sampled texture shall be buffer texture which linearly store two rows
   4933  *          of three pixels.
   4934  *
   4935  *          Prepare framebuffer 6 x 1 pixels in size.
   4936  *
   4937  *          Prepare texture object with attached buffer object as a storage using
   4938  *          TextureBuffer or TextureBufferRange function. When TextureBufferRange is
   4939  *          being used, test non-zero offset setup. The buffer object shall contain
   4940  *          unique reference values. Texture filtering shall be set to NEAREST.
   4941  *
   4942  *          Using prepared GL objects draw a quad. Fetch framebuffer data using
   4943  *          ReadPixels function. Compare the results with the reference data. Expect
   4944  *          equality.
   4945  *
   4946  *          Release all objects.
   4947  */
   4948 template <typename T, glw::GLint S, bool N>
   4949 class BufferTest : public deqp::TestCase, Reference
   4950 {
   4951 public:
   4952 	/* Public member functions. */
   4953 	BufferTest(deqp::Context& context, const char* name);
   4954 
   4955 	virtual tcu::TestNode::IterateResult iterate();
   4956 
   4957 private:
   4958 	/* Private constructors. */
   4959 	BufferTest(const BufferTest& other);
   4960 	BufferTest& operator=(const BufferTest& other);
   4961 
   4962 	/* Private member functions. */
   4963 	static glw::GLuint   TestReferenceDataCount();
   4964 
   4965 	static glw::GLuint TestReferenceDataSize();
   4966 
   4967 	static const glw::GLchar* FragmentShaderDeclaration();
   4968 
   4969 	bool CreateBufferTexture(bool use_range_version);
   4970 
   4971 	bool Check();
   4972 
   4973 	bool Test(bool use_range_version);
   4974 
   4975 	bool PrepareFramebuffer(const glw::GLenum internal_format);
   4976 	void PrepareProgram(const glw::GLchar* variable_declaration);
   4977 	void PrepareVertexArray();
   4978 	void Draw();
   4979 	void CleanBufferTexture();
   4980 	void CleanFramebuffer();
   4981 	void CleanProgram();
   4982 	void CleanErrors();
   4983 	void CleanVertexArray();
   4984 
   4985 	/* Private member variables. */
   4986 	glw::GLuint m_fbo;
   4987 	glw::GLuint m_rbo;
   4988 	glw::GLuint m_po;
   4989 	glw::GLuint m_to;
   4990 	glw::GLuint m_bo;
   4991 	glw::GLuint m_vao;
   4992 
   4993 	/* Private static constants. */
   4994 	static const glw::GLuint  s_fbo_size_x = 6;
   4995 	static const glw::GLuint  s_fbo_size_y = 1;
   4996 	static const glw::GLchar* s_vertex_shader;
   4997 	static const glw::GLchar* s_fragment_shader_head;
   4998 	static const glw::GLchar* s_fragment_shader_fdecl_lowp;
   4999 	static const glw::GLchar* s_fragment_shader_idecl_lowp;
   5000 	static const glw::GLchar* s_fragment_shader_udecl_lowp;
   5001 	static const glw::GLchar* s_fragment_shader_fdecl_mediump;
   5002 	static const glw::GLchar* s_fragment_shader_idecl_mediump;
   5003 	static const glw::GLchar* s_fragment_shader_udecl_mediump;
   5004 	static const glw::GLchar* s_fragment_shader_fdecl_highp;
   5005 	static const glw::GLchar* s_fragment_shader_idecl_highp;
   5006 	static const glw::GLchar* s_fragment_shader_udecl_highp;
   5007 	static const glw::GLchar* s_fragment_shader_tail;
   5008 };
   5009 
   5010 /** @brief Fragment shader part selector.
   5011  *
   5012  *  @return Array of characters with source code.
   5013  */
   5014 template <typename T, glw::GLint S, bool N>
   5015 const glw::GLchar* BufferTest<T, S, N>::FragmentShaderDeclaration()
   5016 {
   5017 	if (typeid(T) == typeid(glw::GLbyte))
   5018 	{
   5019 		return s_fragment_shader_idecl_lowp;
   5020 	}
   5021 
   5022 	if (typeid(T) == typeid(glw::GLubyte))
   5023 	{
   5024 		return N ? s_fragment_shader_fdecl_lowp : s_fragment_shader_udecl_lowp;
   5025 	}
   5026 
   5027 	if (typeid(T) == typeid(glw::GLshort))
   5028 	{
   5029 		return s_fragment_shader_idecl_mediump;
   5030 	}
   5031 
   5032 	if (typeid(T) == typeid(glw::GLushort))
   5033 	{
   5034 		return N ? s_fragment_shader_fdecl_mediump : s_fragment_shader_udecl_mediump;
   5035 	}
   5036 
   5037 	if (typeid(T) == typeid(glw::GLint))
   5038 	{
   5039 		return s_fragment_shader_idecl_highp;
   5040 	}
   5041 
   5042 	if (typeid(T) == typeid(glw::GLuint))
   5043 	{
   5044 		return s_fragment_shader_udecl_highp;
   5045 	}
   5046 
   5047 	return s_fragment_shader_fdecl_highp;
   5048 }
   5049 
   5050 /* BufferTest class */
   5051 
   5052 /** @class StorageAndSubImageTest
   5053  *
   5054  *  @tparam T      Type.
   5055  *  @tparam S      Size.
   5056  *  @tparam N      Is normalized.
   5057  *  @tparam D      Texture dimension.
   5058  *  @tparam I      Choose between SubImage and Storage tests.
   5059  *
   5060  *      Make test for following DSA storage functions:
   5061  *       -  TextureStorage1D,
   5062  *       -  TextureStorage2D,
   5063  *       -  TextureStorage3D
   5064  *      and DSA SubImage functions:
   5065  *       -  TextureSubImage1D,
   5066  *       -  TextureSubImage2D,
   5067  *       -  TextureSubImage3D.
   5068  *
   5069  *      Test following internal formats:
   5070  *       -  R8,
   5071  *       -  R16,
   5072  *       -  R16F,
   5073  *       -  R32F,
   5074  *       -  R8I,
   5075  *       -  R16I,
   5076  *       -  R32I,
   5077  *       -  R8UI,
   5078  *       -  R16UI,
   5079  *       -  R32UI,
   5080  *       -  RG8,
   5081  *       -  RG16,
   5082  *       -  RG16F,
   5083  *       -  RG32F,
   5084  *       -  RG8I,
   5085  *       -  RG16I,
   5086  *       -  RG32I,
   5087  *       -  RG8UI,
   5088  *       -  RG16UI,
   5089  *       -  RG32UI,
   5090  *       -  RGB32F,
   5091  *       -  RGB32I,
   5092  *       -  RGB32UI,
   5093  *       -  RGBA8,
   5094  *       -  RGBA16,
   5095  *       -  RGBA16F,
   5096  *       -  RGBA32F,
   5097  *       -  RGBA8I,
   5098  *       -  RGBA16I,
   5099  *       -  RGBA32I,
   5100  *       -  RGBA8UI,
   5101  *       -  RGBA16UI,
   5102  *       -  RGBA32UI.
   5103  *
   5104  *      Create texture and prepare its storage with the tested function and
   5105  *      reference data. The texture dimensions shall be 2x3x4 texels in
   5106  *      corresponding directions (if available).
   5107  *
   5108  *      Prepare GLSL program with fragment shader which fetches texture and passes
   5109  *      it to the framebuffer in serialized way.
   5110  *
   5111  *      Prepare framebuffer 24 x 1 pixels in size.
   5112  *
   5113  *      Make draw call with prepared texture and program. Fetch framebuffer and
   5114  *      compare values with the reference data. Expect equality.
   5115  *
   5116  *      Release all objects.
   5117  */
   5118 template <typename T, glw::GLint S, bool N, glw::GLuint D, bool I>
   5119 class StorageAndSubImageTest : public deqp::TestCase, Reference
   5120 {
   5121 public:
   5122 	/* Public member functions. */
   5123 	StorageAndSubImageTest(deqp::Context& context, const char* name);
   5124 
   5125 	virtual tcu::TestNode::IterateResult iterate();
   5126 
   5127 private:
   5128 	/* Private constructors. */
   5129 	StorageAndSubImageTest(const StorageAndSubImageTest& other);
   5130 	StorageAndSubImageTest& operator=(const StorageAndSubImageTest& other);
   5131 
   5132 	/* Private member functions. */
   5133 	static glw::GLuint TestReferenceDataCount();
   5134 
   5135 	static glw::GLuint	TestReferenceDataWidth();
   5136 
   5137 	static glw::GLuint	TestReferenceDataHeight();
   5138 
   5139 	static glw::GLuint	TestReferenceDataDepth();
   5140 
   5141 	static glw::GLuint TestReferenceDataSize();
   5142 
   5143 	static const glw::GLchar* FragmentShaderDeclaration();
   5144 
   5145 	static const glw::GLchar* FragmentShaderTail();
   5146 
   5147 	static glw::GLenum	TextureTarget();
   5148 
   5149 	bool TextureSubImage(glw::GLenum target, glw::GLuint texture, glw::GLint level,
   5150 						 glw::GLsizei width, glw::GLsizei height, glw::GLsizei depth, glw::GLenum format,
   5151 						 glw::GLenum type, const glw::GLvoid* data);
   5152 
   5153 	bool TextureStorage(glw::GLenum target, glw::GLuint texture, glw::GLsizei levels, glw::GLenum internalformat,
   5154 						glw::GLsizei width, glw::GLsizei height, glw::GLsizei depth);
   5155 
   5156 	bool CreateTexture();
   5157 
   5158 	bool Check();
   5159 
   5160 	bool Test();
   5161 
   5162 	void PrepareFramebuffer(const glw::GLenum internal_format);
   5163 	void PrepareProgram(const glw::GLchar* variable_declaration, const glw::GLchar* tail);
   5164 	void PrepareVertexArray();
   5165 	void Draw();
   5166 	void CleanTexture();
   5167 	void CleanFramebuffer();
   5168 	void CleanProgram();
   5169 	void CleanErrors();
   5170 	void CleanVertexArray();
   5171 
   5172 	/* Private member variables. */
   5173 	glw::GLuint m_fbo;
   5174 	glw::GLuint m_rbo;
   5175 	glw::GLuint m_po;
   5176 	glw::GLuint m_to;
   5177 	glw::GLuint m_vao;
   5178 
   5179 	/* Private static constants. */
   5180 	static const glw::GLchar* s_vertex_shader;
   5181 	static const glw::GLchar* s_fragment_shader_head;
   5182 	static const glw::GLchar* s_fragment_shader_1D_fdecl_lowp;
   5183 	static const glw::GLchar* s_fragment_shader_1D_idecl_lowp;
   5184 	static const glw::GLchar* s_fragment_shader_1D_udecl_lowp;
   5185 	static const glw::GLchar* s_fragment_shader_1D_fdecl_mediump;
   5186 	static const glw::GLchar* s_fragment_shader_1D_idecl_mediump;
   5187 	static const glw::GLchar* s_fragment_shader_1D_udecl_mediump;
   5188 	static const glw::GLchar* s_fragment_shader_1D_fdecl_highp;
   5189 	static const glw::GLchar* s_fragment_shader_1D_idecl_highp;
   5190 	static const glw::GLchar* s_fragment_shader_1D_udecl_highp;
   5191 	static const glw::GLchar* s_fragment_shader_2D_fdecl_lowp;
   5192 	static const glw::GLchar* s_fragment_shader_2D_idecl_lowp;
   5193 	static const glw::GLchar* s_fragment_shader_2D_udecl_lowp;
   5194 	static const glw::GLchar* s_fragment_shader_2D_fdecl_mediump;
   5195 	static const glw::GLchar* s_fragment_shader_2D_idecl_mediump;
   5196 	static const glw::GLchar* s_fragment_shader_2D_udecl_mediump;
   5197 	static const glw::GLchar* s_fragment_shader_2D_fdecl_highp;
   5198 	static const glw::GLchar* s_fragment_shader_2D_idecl_highp;
   5199 	static const glw::GLchar* s_fragment_shader_2D_udecl_highp;
   5200 	static const glw::GLchar* s_fragment_shader_3D_fdecl_lowp;
   5201 	static const glw::GLchar* s_fragment_shader_3D_idecl_lowp;
   5202 	static const glw::GLchar* s_fragment_shader_3D_udecl_lowp;
   5203 	static const glw::GLchar* s_fragment_shader_3D_fdecl_mediump;
   5204 	static const glw::GLchar* s_fragment_shader_3D_idecl_mediump;
   5205 	static const glw::GLchar* s_fragment_shader_3D_udecl_mediump;
   5206 	static const glw::GLchar* s_fragment_shader_3D_fdecl_highp;
   5207 	static const glw::GLchar* s_fragment_shader_3D_idecl_highp;
   5208 	static const glw::GLchar* s_fragment_shader_3D_udecl_highp;
   5209 	static const glw::GLchar* s_fragment_shader_1D_tail;
   5210 	static const glw::GLchar* s_fragment_shader_2D_tail;
   5211 	static const glw::GLchar* s_fragment_shader_3D_tail;
   5212 };
   5213 /* StorageAndSubImageTest class */
   5214 
   5215 /** class StorageMultisampleTest
   5216  *
   5217  *      @tparam T      Type.
   5218  *      @tparam S      Size.
   5219  *      @tparam N      Is normalized.
   5220  *      @tparam D      Texture dimension.
   5221  *
   5222  *      Make test for following DSA functions:
   5223  *       -  TextureStorage2DMultisample and
   5224  *       -  TextureStorage3DMultisample.
   5225  *
   5226  *      Test following internal formats:
   5227  *       -  R8,
   5228  *       -  R16,
   5229  *       -  R16F,
   5230  *       -  R32F,
   5231  *       -  R8I,
   5232  *       -  R16I,
   5233  *       -  R32I,
   5234  *       -  R8UI,
   5235  *       -  R16UI,
   5236  *       -  R32UI,
   5237  *       -  RG8,
   5238  *       -  RG16,
   5239  *       -  RG16F,
   5240  *       -  RG32F,
   5241  *       -  RG8I,
   5242  *       -  RG16I,
   5243  *       -  RG32I,
   5244  *       -  RG8UI,
   5245  *       -  RG16UI,
   5246  *       -  RG32UI,
   5247  *       -  RGB32F,
   5248  *       -  RGB32I,
   5249  *       -  RGB32UI,
   5250  *       -  RGBA8,
   5251  *       -  RGBA16,
   5252  *       -  RGBA16F,
   5253  *       -  RGBA32F,
   5254  *       -  RGBA8I,
   5255  *       -  RGBA16I,
   5256  *       -  RGBA32I,
   5257  *       -  RGBA8UI,
   5258  *       -  RGBA16UI,
   5259  *       -  RGBA32UI.
   5260  *
   5261  *      Create multisample texture and prepare its storage with the tested
   5262  *      function. The texture dimensions shall be 2x3x4 texels in corresponding
   5263  *      directions (if available) and two samples per texel.
   5264  *
   5265  *      Prepare two framebuffers. The first one with the multisample texture
   5266  *      as a color attachment with size 2x3 pixels and 4 color attachments
   5267  *      (layers). The second one with non-multisample renderbuffer storage
   5268  *      similar in size.
   5269  *
   5270  *      Prepare GLSL program which draws explicitly reference data to
   5271  *      multisample texture framebuffer.
   5272  *
   5273  *      Use program to draw the reference data into multisample texture.
   5274  *
   5275  *      Prepare second GLSL program with fragment shader which passes samples of
   5276  *      the input texture to the separate framebuffer pixels.
   5277  *
   5278  *      Use the second program to draw the multisample texture into
   5279  *      renderbuffer.
   5280  *
   5281  *      Fetch framebuffer data and compare with the reference values. Expect
   5282  *      equality.
   5283  *
   5284  *      Release all objects.
   5285  */
   5286 template <typename T, glw::GLint S, bool N, glw::GLuint D>
   5287 class StorageMultisampleTest : public deqp::TestCase, Reference
   5288 {
   5289 public:
   5290 	/* Public member functions. */
   5291 	StorageMultisampleTest(deqp::Context& context, const char *name);
   5292 
   5293 	virtual tcu::TestNode::IterateResult iterate();
   5294 
   5295 private:
   5296 	/* Private constructors. */
   5297 	StorageMultisampleTest(const StorageMultisampleTest& other);
   5298 	StorageMultisampleTest& operator=(const StorageMultisampleTest& other);
   5299 
   5300 	/* Private member functions. */
   5301 	static glw::GLuint TestReferenceDataCount();
   5302 
   5303 	static glw::GLuint	TestReferenceDataWidth();
   5304 
   5305 	static glw::GLuint	TestReferenceDataHeight();
   5306 
   5307 	static glw::GLuint	TestReferenceDataDepth();
   5308 
   5309 	static glw::GLuint TestReferenceDataSize();
   5310 
   5311 	static const glw::GLchar* FragmentShaderDeclarationMultisample();
   5312 
   5313 	static const glw::GLchar* FragmentShaderDeclarationAuxiliary();
   5314 
   5315 	static const glw::GLchar* FragmentShaderTail();
   5316 
   5317 	static glw::GLenum	InputTextureTarget();
   5318 
   5319 	static glw::GLenum	MultisampleTextureTarget();
   5320 
   5321 	void InputTextureImage(const glw::GLenum internal_format, const glw::GLuint width, const glw::GLuint height,
   5322 						   const glw::GLuint depth, const glw::GLenum format, const glw::GLenum type,
   5323 						   const glw::GLvoid* data);
   5324 
   5325 	void CreateInputTexture();
   5326 
   5327 	bool Check();
   5328 
   5329 	bool Test();
   5330 
   5331 	bool PrepareFramebufferMultisample(const glw::GLenum internal_format);
   5332 
   5333 	void PrepareFramebufferAuxiliary(const glw::GLenum internal_format);
   5334 
   5335 	glw::GLuint PrepareProgram(const glw::GLchar* variable_declaration, const glw::GLchar* tail);
   5336 	void PrepareVertexArray();
   5337 
   5338 	void Draw();
   5339 
   5340 	void CleanInputTexture();
   5341 	void CleanAuxiliaryTexture();
   5342 	void CleanFramebuffers();
   5343 	void CleanPrograms();
   5344 	void CleanErrors();
   5345 	void CleanVertexArray();
   5346 
   5347 	/* Private member variables. */
   5348 	glw::GLuint m_fbo_ms;
   5349 	glw::GLuint m_fbo_aux;
   5350 	glw::GLuint m_to_ms;
   5351 	glw::GLuint m_po_ms;
   5352 	glw::GLuint m_po_aux;
   5353 	glw::GLuint m_to;
   5354 	glw::GLuint m_to_aux;
   5355 	glw::GLuint m_vao;
   5356 
   5357 	/* Private static constants. */
   5358 	static const glw::GLchar* s_vertex_shader;
   5359 	static const glw::GLchar* s_fragment_shader_head;
   5360 	static const glw::GLchar* s_fragment_shader_ms_2D_fdecl_lowp;
   5361 	static const glw::GLchar* s_fragment_shader_ms_2D_idecl_lowp;
   5362 	static const glw::GLchar* s_fragment_shader_ms_2D_udecl_lowp;
   5363 	static const glw::GLchar* s_fragment_shader_ms_2D_fdecl_mediump;
   5364 	static const glw::GLchar* s_fragment_shader_ms_2D_idecl_mediump;
   5365 	static const glw::GLchar* s_fragment_shader_ms_2D_udecl_mediump;
   5366 	static const glw::GLchar* s_fragment_shader_ms_2D_fdecl_highp;
   5367 	static const glw::GLchar* s_fragment_shader_ms_2D_idecl_highp;
   5368 	static const glw::GLchar* s_fragment_shader_ms_2D_udecl_highp;
   5369 
   5370 	static const glw::GLchar* s_fragment_shader_ms_3D_fdecl_lowp;
   5371 	static const glw::GLchar* s_fragment_shader_ms_3D_idecl_lowp;
   5372 	static const glw::GLchar* s_fragment_shader_ms_3D_udecl_lowp;
   5373 	static const glw::GLchar* s_fragment_shader_ms_3D_fdecl_mediump;
   5374 	static const glw::GLchar* s_fragment_shader_ms_3D_idecl_mediump;
   5375 	static const glw::GLchar* s_fragment_shader_ms_3D_udecl_mediump;
   5376 	static const glw::GLchar* s_fragment_shader_ms_3D_fdecl_highp;
   5377 	static const glw::GLchar* s_fragment_shader_ms_3D_idecl_highp;
   5378 	static const glw::GLchar* s_fragment_shader_ms_3D_udecl_highp;
   5379 
   5380 	static const glw::GLchar* s_fragment_shader_aux_2D_fdecl_lowp;
   5381 	static const glw::GLchar* s_fragment_shader_aux_2D_idecl_lowp;
   5382 	static const glw::GLchar* s_fragment_shader_aux_2D_udecl_lowp;
   5383 	static const glw::GLchar* s_fragment_shader_aux_2D_fdecl_mediump;
   5384 	static const glw::GLchar* s_fragment_shader_aux_2D_idecl_mediump;
   5385 	static const glw::GLchar* s_fragment_shader_aux_2D_udecl_mediump;
   5386 	static const glw::GLchar* s_fragment_shader_aux_2D_fdecl_highp;
   5387 	static const glw::GLchar* s_fragment_shader_aux_2D_idecl_highp;
   5388 	static const glw::GLchar* s_fragment_shader_aux_2D_udecl_highp;
   5389 
   5390 	static const glw::GLchar* s_fragment_shader_aux_3D_fdecl_lowp;
   5391 	static const glw::GLchar* s_fragment_shader_aux_3D_idecl_lowp;
   5392 	static const glw::GLchar* s_fragment_shader_aux_3D_udecl_lowp;
   5393 	static const glw::GLchar* s_fragment_shader_aux_3D_fdecl_mediump;
   5394 	static const glw::GLchar* s_fragment_shader_aux_3D_idecl_mediump;
   5395 	static const glw::GLchar* s_fragment_shader_aux_3D_udecl_mediump;
   5396 	static const glw::GLchar* s_fragment_shader_aux_3D_fdecl_highp;
   5397 	static const glw::GLchar* s_fragment_shader_aux_3D_idecl_highp;
   5398 	static const glw::GLchar* s_fragment_shader_aux_3D_udecl_highp;
   5399 	static const glw::GLchar* s_fragment_shader_tail_2D;
   5400 	static const glw::GLchar* s_fragment_shader_tail_3D;
   5401 };
   5402 /* StorageMultisampleTest class */
   5403 
   5404 /**  @class CompressedSubImage
   5405  *
   5406  *    Make test for following DSA functions:
   5407  *        -  CompressedTextureSubImage1D,
   5408  *        -  CompressedTextureSubImage2D,
   5409  *        -  CompressedTextureSubImage3D.
   5410  *
   5411  *    Make test for following uncompressed internal formats:
   5412  *        -  R8,
   5413  *        -  R8_SNORM,
   5414  *        -  R16,
   5415  *        -  R16_SNORM,
   5416  *        -  RG8,
   5417  *        -  RG8_SNORM,
   5418  *        -  RG16,
   5419  *        -  RG16_SNORM,
   5420  *        -  R3_G3_B2,
   5421  *        -  RGB4,
   5422  *        -  RGB5,
   5423  *        -  RGB8,
   5424  *        -  RGB8_SNORM,
   5425  *        -  RGB10,
   5426  *        -  RGB12,
   5427  *        -  RGB16_SNORM,
   5428  *        -  RGBA2,
   5429  *        -  RGBA4,
   5430  *        -  RGB5_A1,
   5431  *        -  RGBA8,
   5432  *        -  RGBA8_SNORM,
   5433  *        -  RGB10_A2,
   5434  *        -  RGB10_A2UI,
   5435  *        -  RGBA12,
   5436  *        -  RGBA16,
   5437  *        -  SRGB8,
   5438  *        -  SRGB8_ALPHA8,
   5439  *        -  R16F,
   5440  *        -  RG16F,
   5441  *        -  RGB16F,
   5442  *        -  RGBA16F,
   5443  *        -  R32F,
   5444  *        -  RG32F,
   5445  *        -  RGB32F,
   5446  *        -  RGBA32F,
   5447  *        -  R11F_G11F_B10F,
   5448  *        -  RGB9_E5,
   5449  *        -  R8I,
   5450  *        -  R8UI,
   5451  *        -  R16I,
   5452  *        -  R16UI,
   5453  *        -  R32I,
   5454  *        -  R32UI,
   5455  *        -  RG8I,
   5456  *        -  RG8UI,
   5457  *        -  RG16I,
   5458  *        -  RG16UI,
   5459  *        -  RG32I,
   5460  *        -  RG32UI,
   5461  *        -  RGB8I,
   5462  *        -  RGB8UI,
   5463  *        -  RGB16I,
   5464  *        -  RGB16UI,
   5465  *        -  RGB32I,
   5466  *        -  RGB32UI,
   5467  *        -  RGBA8I,
   5468  *        -  RGBA8UI,
   5469  *        -  RGBA16I,
   5470  *        -  RGBA16UI,
   5471  *        -  RGBA32I,
   5472  *        -  RGBA32UI.
   5473  *    and compressed internal formats:
   5474  *        -  COMPRESSED_RGBA8_ETC2_EAC.
   5475  *
   5476  *    Create texture and setup its storage and data using tested function with
   5477  *    size 2x3 pixels.
   5478  *
   5479  *    Prepare framebuffer with renderbuffer color attachment with floating
   5480  *    point internal format and with size 2x3 pixels
   5481  *
   5482  *    Prepare GLSL program with fragment shader which passes input texture to
   5483  *    the framebuffer.
   5484  *
   5485  *    Draw a full screen quad with the prepared texture, program and
   5486  *    framebuffer. Read the framebuffer content. Compare framebuffer's values
   5487  *    with the reference values. Take normalization and precision into
   5488  *    account. Expect equality.
   5489  *
   5490  *    Release all objects.
   5491  */
   5492 class CompressedSubImageTest : public deqp::TestCase
   5493 {
   5494 public:
   5495 	/* Public member functions. */
   5496 	CompressedSubImageTest(deqp::Context& context);
   5497 
   5498 	virtual tcu::TestNode::IterateResult iterate();
   5499 
   5500 private:
   5501 	/* Private constructors. */
   5502 	CompressedSubImageTest(const CompressedSubImageTest& other);
   5503 	CompressedSubImageTest& operator=(const CompressedSubImageTest& other);
   5504 
   5505 	void CreateTextures(glw::GLenum target);
   5506 
   5507 	template <glw::GLuint D>
   5508 	glw::GLenum			  TextureTarget();
   5509 
   5510 	template <glw::GLuint D>
   5511 	void TextureImage(glw::GLint internalformat);
   5512 
   5513 	template <glw::GLuint D>
   5514 	void CompressedTexImage(glw::GLint internalformat);
   5515 
   5516 	template <glw::GLuint D>
   5517 	bool CompressedTextureSubImage(glw::GLint internalformat);
   5518 
   5519 	template <glw::GLuint D>
   5520 	void PrepareReferenceData(glw::GLenum internalformat);
   5521 
   5522 	template <glw::GLuint D>
   5523 	void PrepareStorage(glw::GLenum internalformat);
   5524 
   5525 	template <glw::GLuint D>
   5526 	bool CheckData(glw::GLenum internalformat);
   5527 	void		CleanAll();
   5528 	std::string DataToString(glw::GLuint count, const glw::GLubyte data[]);
   5529 
   5530 	template <glw::GLuint D>
   5531 	bool Test(glw::GLenum internalformat);
   5532 
   5533 	/* Private member variables. */
   5534 	glw::GLuint   m_to;
   5535 	glw::GLuint   m_to_aux;
   5536 	glw::GLubyte* m_compressed_texture_data;
   5537 	glw::GLubyte* m_reference;
   5538 	glw::GLubyte* m_result;
   5539 	glw::GLuint   m_reference_size;
   5540 	glw::GLuint   m_reference_internalformat;
   5541 
   5542 	/* Private static constants. */
   5543 	static const glw::GLubyte s_texture_data[];
   5544 	static const glw::GLuint  s_texture_width;
   5545 	static const glw::GLuint  s_texture_height;
   5546 	static const glw::GLuint  s_texture_depth;
   5547 	static const glw::GLuint  s_block_count;
   5548 	static const glw::GLuint  s_block_2d_size_x;
   5549 	static const glw::GLuint  s_block_2d_size_y;
   5550 	static const glw::GLuint  s_block_3d_size;
   5551 };
   5552 /* CompressedSubImageTest class */
   5553 
   5554 /** @class CopyTest
   5555  *
   5556  *      Make test for following DSA functions:
   5557  *       -  CopyTextureSubImage1D,
   5558  *       -  CopyTextureSubImage2D and
   5559  *       -  CopyTextureSubImage3D.
   5560  *
   5561  *      Prepare two textures 2x3x4 texels in size for corresponding directions
   5562  *      (if available). Setup the first one with reference data.
   5563  *
   5564  *      Prepare framebuffer with the first texture attached to the a color
   5565  *      attachment point. Bind the framebuffer.
   5566  *
   5567  *      Copy framebuffer content to the texture using tested function. The
   5568  *      images shall be copied in ranges, two per direction (to test offsets,
   5569  *      positions and size variables). For 3D textures copy each layer
   5570  *      substituting the framebuffer attachment.
   5571  *
   5572  *      After the copy fetch texture data and compare it with the reference
   5573  *      values. Expect equality.
   5574  *
   5575  *      Release all objects.
   5576  */
   5577 class CopyTest : public deqp::TestCase
   5578 {
   5579 public:
   5580 	/* Public member functions. */
   5581 	CopyTest(deqp::Context& context);
   5582 
   5583 	virtual tcu::TestNode::IterateResult iterate();
   5584 
   5585 private:
   5586 	/* Private constructors. */
   5587 	CopyTest(const CopyTest& other);
   5588 	CopyTest& operator=(const CopyTest& other);
   5589 
   5590 	/* Private member functions. */
   5591 	template <glw::GLuint D>
   5592 	glw::GLenum			  TextureTarget();
   5593 
   5594 	bool CopyTextureSubImage1DAndCheckErrors(glw::GLuint texture, glw::GLint level, glw::GLint xoffset, glw::GLint x,
   5595 											 glw::GLint y, glw::GLsizei width);
   5596 	bool CopyTextureSubImage2DAndCheckErrors(glw::GLuint texture, glw::GLint level, glw::GLint xoffset,
   5597 											 glw::GLint yoffset, glw::GLint x, glw::GLint y, glw::GLsizei width,
   5598 											 glw::GLsizei height);
   5599 	bool CopyTextureSubImage3DAndCheckErrors(glw::GLuint texture, glw::GLint level, glw::GLint xoffset,
   5600 											 glw::GLint yoffset, glw::GLint zoffset, glw::GLint x, glw::GLint y,
   5601 											 glw::GLsizei width, glw::GLsizei height);
   5602 
   5603 	template <glw::GLuint D>
   5604 	void				  CreateSourceTexture();
   5605 
   5606 	template <glw::GLuint D>
   5607 	void				  CreateDestinationTexture();
   5608 
   5609 	template <glw::GLuint D>
   5610 	void				  CreateSourceFramebuffer();
   5611 
   5612 	template <glw::GLuint D>
   5613 	void				  CreateAll();
   5614 
   5615 	template <glw::GLuint D>
   5616 	bool				  Test();
   5617 
   5618 	bool CheckData(glw::GLenum target, glw::GLuint size);
   5619 	std::string DataToString(glw::GLuint count, const glw::GLubyte data[]);
   5620 	void CleanAll();
   5621 
   5622 	/* Private member variables. */
   5623 	glw::GLuint   m_fbo;
   5624 	glw::GLuint   m_to_src;
   5625 	glw::GLuint   m_to_dst;
   5626 	glw::GLubyte* m_result;
   5627 
   5628 	/* Private static constants. */
   5629 	static const glw::GLubyte s_texture_data[];
   5630 	static const glw::GLuint  s_texture_width;
   5631 	static const glw::GLuint  s_texture_height;
   5632 	static const glw::GLuint  s_texture_depth;
   5633 };
   5634 /* CopyTest class */
   5635 
   5636 /** @class GetSetParameterTest
   5637  *
   5638  *  Do following:
   5639  *      Prepare texture object.
   5640  *
   5641  *      Prepare the following test case.
   5642  *
   5643  *          Prepare test case which sets a parameter to the desired value using
   5644  *          one of the following functions (depending on the parameter type):
   5645  *           -  TextureParameterf,
   5646  *           -  TextureParameterfv,
   5647  *           -  TextureParameteri,
   5648  *           -  TextureParameterIiv,
   5649  *           -  TextureParameterIuiv,
   5650  *           -  TextureParameteriv.
   5651  *
   5652  *          Read back the texture parameter using one of the DSA-like functions
   5653  *           -  GetTextureParameterfv,
   5654  *           -  GetTextureParameteriv,
   5655  *           -  GetTextureParameterIiv,
   5656  *           -  GetTextureParameterIuiv.
   5657  *          Expect equality.
   5658  *
   5659  *      Run the test case for following parameters and values:
   5660  *       -  parameter DEPTH_STENCIL_TEXTURE_MODE with value DEPTH_COMPONENT;
   5661  *       -  parameter TEXTURE_BASE_LEVEL with value 2;
   5662  *       -  parameter TEXTURE_BORDER_COLOR with value {0.25, 0.5, 0.75, 1.0}
   5663  *       -  parameter TEXTURE_COMPARE_FUNC with value LEQUAL;
   5664  *       -  parameter TEXTURE_COMPARE_MODE with value COMPARE_REF_TO_TEXTURE;
   5665  *       -  parameter TEXTURE_LOD_BIAS with value -2.0 (which is
   5666  *          minimum required implementation maximum value);
   5667  *       -  parameter TEXTURE_MIN_FILTER with value LINEAR_MIPMAP_NEAREST;
   5668  *       -  parameter TEXTURE_MAG_FILTER with value NEAREST;
   5669  *       -  parameter TEXTURE_MIN_LOD with value -100;
   5670  *       -  parameter TEXTURE_MAX_LOD with value 100;
   5671  *       -  parameter TEXTURE_MAX_LEVEL with value 100;
   5672  *       -  parameter TEXTURE_SWIZZLE_R with value BLUE;
   5673  *       -  parameter TEXTURE_SWIZZLE_G with value ALPHA;
   5674  *       -  parameter TEXTURE_SWIZZLE_B with value RED;
   5675  *       -  parameter TEXTURE_SWIZZLE_A with value GREEN;
   5676  *       -  parameter TEXTURE_SWIZZLE_RGBA with value { ZERO, ONE, ZERO, ONE };
   5677  *       -  parameter TEXTURE_WRAP_S with value MIRROR_CLAMP_TO_EDGE;
   5678  *       -  parameter TEXTURE_WRAP_T with value CLAMP_TO_EDGE;
   5679  *       -  parameter TEXTURE_WRAP_R with value CLAMP_TO_EDGE.
   5680  *
   5681  *      Release the texture object.
   5682  */
   5683 class GetSetParameterTest : public deqp::TestCase
   5684 {
   5685 public:
   5686 	/* Public member functions. */
   5687 	GetSetParameterTest(deqp::Context& context);
   5688 
   5689 	virtual tcu::TestNode::IterateResult iterate();
   5690 
   5691 private:
   5692 	/* Private constructors. */
   5693 	GetSetParameterTest(const GetSetParameterTest& other);
   5694 	GetSetParameterTest& operator=(const GetSetParameterTest& other);
   5695 
   5696 	bool CheckErrorAndLog(const glw::GLchar* fname, glw::GLenum pname);
   5697 	bool CompareAndLog(glw::GLint value_src, glw::GLint value_dst, glw::GLenum pname);
   5698 	bool CompareAndLog(glw::GLuint value_src, glw::GLuint value_dst, glw::GLenum pname);
   5699 	bool CompareAndLog(glw::GLfloat value_src, glw::GLfloat value_dst, glw::GLenum pname);
   5700 	bool CompareAndLog(glw::GLfloat value_src[4], glw::GLfloat value_dst[4], glw::GLenum pname);
   5701 	bool CompareAndLog(glw::GLint value_src[4], glw::GLint value_dst[4], glw::GLenum pname);
   5702 	bool CompareAndLog(glw::GLuint value_src[4], glw::GLuint value_dst[4], glw::GLenum pname);
   5703 };
   5704 /* GetSetParameterTest class */
   5705 
   5706 /** @class DefaultsTest
   5707  *
   5708  *      Create texture object with CreateTextures. Do not bind it.
   5709  *
   5710  *      Using one of the functions
   5711  *       -  GetTextureParameterfv,
   5712  *       -  GetTextureParameteriv,
   5713  *       -  GetTextureParameterIiv,
   5714  *       -  GetTextureParameterIuiv
   5715  *      check that initial object parameter values are set to the following
   5716  *      defaults:
   5717  *       -  for parameter DEPTH_STENCIL_TEXTURE_MODE initial value is
   5718  *          DEPTH_COMPONENT;
   5719  *       -  for parameter TEXTURE_BASE_LEVEL initial value is 0;
   5720  *       -  for parameter TEXTURE_BORDER_COLOR initial value is {0.0, 0.0, 0.0,
   5721  *          0.0};
   5722  *       -  for parameter TEXTURE_COMPARE_FUNC initial value is LEQUAL;
   5723  *       -  for parameter TEXTURE_COMPARE_MODE initial value is NONE;
   5724  *       -  for parameter TEXTURE_LOD_BIAS initial value is 0.0;
   5725  *       -  for parameter TEXTURE_MIN_FILTER initial value is
   5726  *          NEAREST_MIPMAP_LINEAR;
   5727  *       -  for parameter TEXTURE_MAG_FILTER initial value is LINEAR;
   5728  *       -  for parameter TEXTURE_MIN_LOD initial value is -1000;
   5729  *       -  for parameter TEXTURE_MAX_LOD initial value is 1000;
   5730  *       -  for parameter TEXTURE_MAX_LEVEL initial value is 1000;
   5731  *       -  for parameter TEXTURE_SWIZZLE_R initial value is RED;
   5732  *       -  for parameter TEXTURE_SWIZZLE_G initial value is GREEN;
   5733  *       -  for parameter TEXTURE_SWIZZLE_B initial value is BLUE;
   5734  *       -  for parameter TEXTURE_SWIZZLE_A initial value is ALPHA;
   5735  *       -  for parameter TEXTURE_WRAP_S initial value is REPEAT;
   5736  *       -  for parameter TEXTURE_WRAP_T initial value is REPEAT;
   5737  *       -  for parameter TEXTURE_WRAP_R initial value is REPEAT.
   5738  */
   5739 class DefaultsTest : public deqp::TestCase
   5740 {
   5741 public:
   5742 	/* Public member functions. */
   5743 	DefaultsTest(deqp::Context& context);
   5744 
   5745 	virtual tcu::TestNode::IterateResult iterate();
   5746 
   5747 private:
   5748 	/* Private constructors. */
   5749 	DefaultsTest(const DefaultsTest& other);
   5750 	DefaultsTest& operator=(const DefaultsTest& other);
   5751 
   5752 	bool CompareAndLog(glw::GLint value_ref, glw::GLint value_dst, glw::GLenum pname);
   5753 	bool CompareAndLog(glw::GLuint value_ref, glw::GLuint value_dst, glw::GLenum pname);
   5754 	bool CompareAndLog(glw::GLfloat value_ref, glw::GLfloat value_dst, glw::GLenum pname);
   5755 	bool CompareAndLog(glw::GLfloat value_ref[4], glw::GLfloat value_dst[4], glw::GLenum pname);
   5756 	bool CompareAndLog(glw::GLint value_ref[4], glw::GLint value_dst[4], glw::GLenum pname);
   5757 	bool CompareAndLog(glw::GLuint value_ref[4], glw::GLuint value_dst[4], glw::GLenum pname);
   5758 };
   5759 /* DefaultsTest class */
   5760 
   5761 /** @class GenerateMipmapTest
   5762  *
   5763  *      Create one dimensional texture. Setup its image data with successive
   5764  *      numbers {0..255} stored as red color.
   5765  *
   5766  *      Generate mipmaps for the texture using GenerateTextureMipmap function.
   5767  *
   5768  *      Download each of the generated mipmap levels. Check that each of the
   5769  *      mipmaps contains series of not decreasing values.
   5770  *
   5771  *      Release texture object.
   5772  */
   5773 class GenerateMipmapTest : public deqp::TestCase
   5774 {
   5775 public:
   5776 	/* Public member functions. */
   5777 	GenerateMipmapTest(deqp::Context& context);
   5778 
   5779 	virtual tcu::TestNode::IterateResult iterate();
   5780 
   5781 private:
   5782 	/* Private constructors. */
   5783 	GenerateMipmapTest(const GenerateMipmapTest& other);
   5784 	GenerateMipmapTest& operator=(const GenerateMipmapTest& other);
   5785 
   5786 	/* Private static constants. */
   5787 	static const glw::GLubyte s_texture_data[];
   5788 	static const glw::GLuint  s_texture_width;
   5789 	static const glw::GLuint  s_texture_width_log;
   5790 };
   5791 /* GenerateMipmapTest class */
   5792 
   5793 /** @class BindUnitTest
   5794  *
   5795  *      Create four 2D textures, filled with 2x3 texels of reference data in RED
   5796  *      format and R8 internal format.
   5797  *
   5798  *      Create framebuffer 2x3 pixels of size with the same internal format as
   5799  *      textures but RGBA format.
   5800  *
   5801  *      Bind each texture to the separate unit using BindTextureUnit function.
   5802  *
   5803  *      Prepare GLSL program which draws full screen quad. A fragment shader of
   5804  *      the program shall pass each of the four input texture red values into
   5805  *      separate RGBA channel of the output framebuffer.
   5806  *
   5807  *      Make a draw call with prepared objects.
   5808  *
   5809  *      Fetch framebuffer data. Expect interleaved reference data.
   5810  *
   5811  *      Release all objects.
   5812  */
   5813 class BindUnitTest : public deqp::TestCase
   5814 {
   5815 public:
   5816 	/* Public member functions. */
   5817 	BindUnitTest(deqp::Context& context);
   5818 
   5819 	virtual tcu::TestNode::IterateResult iterate();
   5820 
   5821 private:
   5822 	/* Private constructors. */
   5823 	BindUnitTest(const BindUnitTest& other);
   5824 	BindUnitTest& operator=(const BindUnitTest& other);
   5825 
   5826 	void		CreateProgram();
   5827 	void		CreateTextures();
   5828 	void		CreateFrambuffer();
   5829 	void		CreateVertexArray();
   5830 	bool		Draw();
   5831 	bool		Check();
   5832 	void		CleanAll();
   5833 	std::string DataToString(glw::GLuint count, const glw::GLubyte data[]);
   5834 
   5835 	/* Private member variables. */
   5836 	glw::GLuint   m_po;
   5837 	glw::GLuint   m_to[4];
   5838 	glw::GLuint   m_fbo;
   5839 	glw::GLuint   m_rbo;
   5840 	glw::GLuint   m_vao;
   5841 	glw::GLubyte* m_result;
   5842 
   5843 	/* Private static constants. */
   5844 	static const glw::GLubyte s_texture_data_r[];
   5845 	static const glw::GLubyte s_texture_data_g[];
   5846 	static const glw::GLubyte s_texture_data_b[];
   5847 	static const glw::GLubyte s_texture_data_a[];
   5848 	static const glw::GLubyte s_texture_data_rgba[];
   5849 	static const glw::GLuint  s_texture_width;
   5850 	static const glw::GLuint  s_texture_height;
   5851 	static const glw::GLuint  s_texture_count_rgba;
   5852 	static const glw::GLchar* s_vertex_shader;
   5853 	static const glw::GLchar* s_fragment_shader;
   5854 	static const glw::GLchar* s_fragment_shader_samplers[4];
   5855 };
   5856 /* GenerateMipmapTest class */
   5857 
   5858 /** @class GetImageTest
   5859  *
   5860  *          Make test for following DSA functions:
   5861  *       -  GetTextureImage,
   5862  *       -  GetCompressedTextureImage.
   5863  *
   5864  *      Create two 2D textures, one with compressed reference image, one with
   5865  *      uncompressed reference image.
   5866  *
   5867  *      Fetch textures with corresponding test functions. Compare fetched values
   5868  *      with the reference data. Expect equality.
   5869  *
   5870  *      Release textures.
   5871  */
   5872 class GetImageTest : public deqp::TestCase
   5873 {
   5874 public:
   5875 	/* Public member functions. */
   5876 	GetImageTest(deqp::Context& context);
   5877 
   5878 	virtual tcu::TestNode::IterateResult iterate();
   5879 
   5880 private:
   5881 	/* Private constructors. */
   5882 	GetImageTest(const GetImageTest& other);
   5883 	GetImageTest& operator=(const GetImageTest& other);
   5884 
   5885 	std::string DataToString(glw::GLuint count, const glw::GLubyte data[]);
   5886 
   5887 	/* Private static constants. */
   5888 	static const glw::GLubyte s_texture_data[];
   5889 	static const glw::GLubyte s_texture_data_compressed[];
   5890 	static const glw::GLuint  s_texture_width;
   5891 	static const glw::GLuint  s_texture_height;
   5892 	static const glw::GLuint  s_texture_size;
   5893 	static const glw::GLuint  s_texture_size_compressed;
   5894 	static const glw::GLuint  s_texture_count;
   5895 	static const glw::GLuint  s_texture_count_compressed;
   5896 };
   5897 /* GetImageTest class */
   5898 
   5899 /** @class GetLevelParameterTest
   5900  *
   5901  *      Make test for following DSA functions:
   5902  *          -  GetTextureLevelParameterfv,
   5903  *          -  GetTextureLevelParameteriv.
   5904  *
   5905  *      Create 3D texture with two levels of detail.
   5906  *
   5907  *      Fetch following parameters with test functions:
   5908  *       -  TEXTURE_WIDTH,
   5909  *       -  TEXTURE_HEIGHT,
   5910  *       -  TEXTURE_DEPTH,
   5911  *       -  TEXTURE_INTERNAL_FORMAT,
   5912  *       -  TEXTURE_RED_TYPE,
   5913  *       -  TEXTURE_GREEN_TYPE,
   5914  *       -  TEXTURE_BLUE_TYPE,
   5915  *       -  TEXTURE_ALPHA_TYPE,
   5916  *       -  TEXTURE_DEPTH_TYPE,
   5917  *       -  TEXTURE_RED_SIZE,
   5918  *       -  TEXTURE_GREEN_SIZE,
   5919  *       -  TEXTURE_BLUE_SIZE,
   5920  *       -  TEXTURE_ALPHA_SIZE,
   5921  *       -  TEXTURE_DEPTH_SIZE and
   5922  *       -  TEXTURE_COMPRESSED
   5923  *      and compare values with expected set.
   5924  *
   5925  *      Release texture.
   5926  */
   5927 class GetLevelParameterTest : public deqp::TestCase
   5928 {
   5929 public:
   5930 	/* Public member functions. */
   5931 	GetLevelParameterTest(deqp::Context& context);
   5932 
   5933 	virtual tcu::TestNode::IterateResult iterate();
   5934 
   5935 private:
   5936 	/* Private constructors. */
   5937 	GetLevelParameterTest(const GetLevelParameterTest& other);
   5938 	GetLevelParameterTest& operator=(const GetLevelParameterTest& other);
   5939 
   5940 	/* Private static constants. */
   5941 	static const glw::GLubyte s_texture_data[];
   5942 	static const glw::GLuint  s_texture_width;
   5943 	static const glw::GLuint  s_texture_height;
   5944 	static const glw::GLuint  s_texture_depth;
   5945 };
   5946 /* GetLevelParameterTest class */
   5947 
   5948 /** @class ErrorsUtilities
   5949  *
   5950  *      This class contain utility methods for all negative tests.
   5951  */
   5952 class ErrorsUtilities
   5953 {
   5954 public:
   5955 	bool CheckErrorAndLog(deqp::Context& context, glw::GLuint expected_error, const glw::GLchar* function_name,
   5956 						  const glw::GLchar* log);
   5957 };
   5958 /* ErrorsUtilities  */
   5959 
   5960 /** @class CreationErrorsTest
   5961  *
   5962  *      Check that INVALID_ENUM is generated if target is not one of the
   5963  *      allowable values.
   5964  *
   5965  *      Check that INVALID_VALUE is generated if n is negative.
   5966  */
   5967 class CreationErrorsTest : public deqp::TestCase, ErrorsUtilities
   5968 {
   5969 public:
   5970 	/* Public member functions. */
   5971 	CreationErrorsTest(deqp::Context& context);
   5972 
   5973 	virtual tcu::TestNode::IterateResult iterate();
   5974 
   5975 private:
   5976 	/* Private constructors. */
   5977 	CreationErrorsTest(const CreationErrorsTest& other);
   5978 	CreationErrorsTest& operator=(const CreationErrorsTest& other);
   5979 
   5980 	glw::GLenum NotATarget();
   5981 };
   5982 /* CreationErrorsTest class */
   5983 
   5984 /** @class BufferErrorsTest
   5985  *
   5986  *      Check that INVALID_OPERATION is generated by glTextureBuffer if texture
   5987  *      is not the name of an existing texture object.
   5988  *
   5989  *      Check that INVALID_ENUM is generated by glTextureBuffer if the effective
   5990  *      target of texture is not TEXTURE_BUFFER.
   5991  *
   5992  *      Check that INVALID_ENUM is generated if internalformat is not one of the
   5993  *      sized internal formats described above.
   5994  *
   5995  *      Check that INVALID_OPERATION is generated if buffer is not zero and is
   5996  *      not the name of an existing buffer object.
   5997  */
   5998 class BufferErrorsTest : public deqp::TestCase, ErrorsUtilities
   5999 {
   6000 public:
   6001 	/* Public member functions. */
   6002 	BufferErrorsTest(deqp::Context& context);
   6003 
   6004 	virtual tcu::TestNode::IterateResult iterate();
   6005 
   6006 private:
   6007 	/* Private constructors. */
   6008 	BufferErrorsTest(const BufferErrorsTest& other);
   6009 	BufferErrorsTest& operator=(const BufferErrorsTest& other);
   6010 };
   6011 /* BufferErrorsTest class */
   6012 
   6013 /** @class BufferRangeErrorsTest
   6014  *
   6015  *      Check that INVALID_OPERATION is generated by TextureBufferRange if
   6016  *      texture is not the name of an existing texture object.
   6017  *
   6018  *      Check that INVALID_ENUM is generated by TextureBufferRange if the
   6019  *      effective target of texture is not TEXTURE_BUFFER.
   6020  *
   6021  *      Check that INVALID_ENUM is generated by TextureBufferRange if
   6022  *      internalformat is not one of the sized internal formats described above.
   6023  *
   6024  *      Check that INVALID_OPERATION is generated by TextureBufferRange if
   6025  *      buffer is not zero and is not the name of an existing buffer object.
   6026  *
   6027  *      Check that INVALID_VALUE is generated by TextureBufferRange if offset
   6028  *      is negative, if size is less than or equal to zero, or if offset + size
   6029  *      is greater than the value of BUFFER_SIZE for buffer.
   6030  *
   6031  *      Check that INVALID_VALUE is generated by TextureBufferRange if offset is
   6032  *      not an integer multiple of the value of TEXTURE_BUFFER_OFFSET_ALIGNMENT.
   6033  */
   6034 class BufferRangeErrorsTest : public deqp::TestCase, ErrorsUtilities
   6035 {
   6036 public:
   6037 	/* Public member functions. */
   6038 	BufferRangeErrorsTest(deqp::Context& context);
   6039 
   6040 	virtual tcu::TestNode::IterateResult iterate();
   6041 
   6042 private:
   6043 	/* Private constructors. */
   6044 	BufferRangeErrorsTest(const BufferRangeErrorsTest& other);
   6045 	BufferRangeErrorsTest& operator=(const BufferRangeErrorsTest& other);
   6046 };
   6047 /* BufferErrorsTest class */
   6048 
   6049 /** @class StorageErrorsTest
   6050  *
   6051  *      Check that INVALID_OPERATION is generated by TextureStorage1D if texture
   6052  *      is not the name of an existing texture object.
   6053  *
   6054  *      Check that INVALID_ENUM is generated by TextureStorage1D if
   6055  *      internalformat is not a valid sized internal format.
   6056  *
   6057  *      Check that INVALID_ENUM is generated by TextureStorage1D if target or
   6058  *      the effective target of texture is not one of the accepted targets
   6059  *      described above.
   6060  *
   6061  *      Check that INVALID_VALUE is generated by TextureStorage1D if width or
   6062  *      levels are less than 1.
   6063  *
   6064  *      Check that INVALID_OPERATION is generated by TextureStorage1D if levels
   6065  *      is greater than log2(width)+1.
   6066  *
   6067  *
   6068  *      Check that INVALID_OPERATION is generated by TextureStorage2D if
   6069  *      texture is not the name of an existing texture object.
   6070  *
   6071  *      Check that INVALID_ENUM is generated by TextureStorage2D if
   6072  *      internalformat is not a valid sized internal format.
   6073  *
   6074  *      Check that INVALID_ENUM is generated by TextureStorage2D if target or
   6075  *      the effective target of texture is not one of the accepted targets
   6076  *      described above.
   6077  *
   6078  *      Check that INVALID_VALUE is generated by TextureStorage2D if width,
   6079  *      height or levels are less than 1.
   6080  *
   6081  *      Check that INVALID_OPERATION is generated by TextureStorage2D if target
   6082  *      is TEXTURE_1D_ARRAY or PROXY_TEXTURE_1D_ARRAY and levels is greater than
   6083  *      log2(width)+1.
   6084  *
   6085  *      Check that INVALID_OPERATION is generated by TextureStorage2D if target
   6086  *      is not TEXTURE_1D_ARRAY or PROXY_TEXTURE_1D_ARRAY and levels is greater
   6087  *      than log2(max(width, height))+1.
   6088  *
   6089  *
   6090  *      Check that INVALID_OPERATION is generated by TextureStorage2DMultisample
   6091  *      if texture is not the name of an existing texture object.
   6092  *
   6093  *      Check that INVALID_ENUM is generated by TextureStorage2DMultisample if
   6094  *      internalformat is not a valid color-renderable, depth-renderable or
   6095  *      stencil-renderable format.
   6096  *
   6097  *      Check that INVALID_ENUM is generated by TextureStorage2DMultisample if
   6098  *      target or the effective target of texture is not one of the accepted
   6099  *      targets described above.
   6100  *
   6101  *      Check that INVALID_VALUE is generated by TextureStorage2DMultisample if
   6102  *      width or height are less than 1 or greater than the value of
   6103  *      MAX_TEXTURE_SIZE.
   6104  *
   6105  *
   6106  *      Check that INVALID_VALUE is generated by TextureStorage2DMultisample if
   6107  *      samples is greater than the value of MAX_SAMPLES.
   6108  *
   6109  *      Check that INVALID_OPERATION is generated by TextureStorage2DMultisample
   6110  *      if the value of TEXTURE_IMMUTABLE_FORMAT for the texture bound to target
   6111  *      is not FALSE.
   6112  *
   6113  *
   6114  *      Check that INVALID_OPERATION is generated by TextureStorage3D if texture
   6115  *      is not the name of an existing texture object.
   6116  *
   6117  *      Check that INVALID_ENUM is generated by TextureStorage3D if
   6118  *      internalformat is not a valid sized internal format.
   6119  *
   6120  *      Check that INVALID_ENUM is generated by TextureStorage3D if target or
   6121  *      the effective target of texture is not one of the accepted targets
   6122  *      described above.
   6123  *
   6124  *      Check that INVALID_VALUE is generated by TextureStorage3D if width,
   6125  *      height, depth or levels are less than 1.
   6126  *
   6127  *      Check that INVALID_OPERATION is generated by TextureStorage3D if target
   6128  *      is TEXTURE_3D or PROXY_TEXTURE_3D and levels is greater than
   6129  *      log2(max(width, height, depth))+1.
   6130  *
   6131  *      Check that INVALID_OPERATION is generated by TextureStorage3D if target
   6132  *      is TEXTURE_2D_ARRAY, PROXY_TEXTURE_2D_ARRAY, TEXURE_CUBE_ARRAY,
   6133  *      or PROXY_TEXTURE_CUBE_MAP_ARRAY and levels is greater than
   6134  *      log2(max(width, height))+1.
   6135  *
   6136  *
   6137  *      Check that INVALID_OPERATION is generated by TextureStorage3DMultisample
   6138  *      if texture is not the name of an existing texture object.
   6139  *
   6140  *      Check that INVALID_ENUM is generated by TextureStorage3DMultisample if
   6141  *      internalformat is not a valid color-renderable, depth-renderable or
   6142  *      stencil-renderable format.
   6143  *
   6144  *      Check that INVALID_ENUM is generated by TextureStorage3DMultisample if
   6145  *      target or the effective target of texture is not one of the accepted
   6146  *      targets described above.
   6147  *
   6148  *      Check that INVALID_VALUE is generated by TextureStorage3DMultisample if
   6149  *      width or height are less than 1 or greater than the value of
   6150  *      MAX_TEXTURE_SIZE.
   6151  *
   6152  *      Check that INVALID_VALUE is generated by TextureStorage3DMultisample if
   6153  *      depth is less than 1 or greater than the value of
   6154  *      MAX_ARRAY_TEXTURE_LAYERS.
   6155  *
   6156  *      Check that INVALID_VALUE is generated by TextureStorage3DMultisample if
   6157  *      samples is greater than the value of MAX_SAMPLES.
   6158  *
   6159  *      Check that INVALID_OPERATION is generated by TextureStorage3DMultisample
   6160  *      if the value of TEXTURE_IMMUTABLE_FORMAT for the texture bound to
   6161  *      target is not FALSE.
   6162  */
   6163 class StorageErrorsTest : public deqp::TestCase, ErrorsUtilities
   6164 {
   6165 public:
   6166 	/* Public member functions. */
   6167 	StorageErrorsTest(deqp::Context& context);
   6168 
   6169 	virtual tcu::TestNode::IterateResult iterate();
   6170 
   6171 private:
   6172 	/* Private constructors. */
   6173 	StorageErrorsTest(const StorageErrorsTest& other);
   6174 	StorageErrorsTest& operator=(const StorageErrorsTest& other);
   6175 
   6176 	glw::GLuint m_to_1D;
   6177 	glw::GLuint m_to_1D_array;
   6178 	glw::GLuint m_to_2D;
   6179 	glw::GLuint m_to_2D_array;
   6180 	glw::GLuint m_to_3D;
   6181 	glw::GLuint m_to_2D_ms;
   6182 	glw::GLuint m_to_2D_ms_immutable;
   6183 	glw::GLuint m_to_3D_ms;
   6184 	glw::GLuint m_to_3D_ms_immutable;
   6185 	glw::GLuint m_to_invalid;
   6186 	glw::GLuint m_internalformat_invalid;
   6187 	glw::GLint  m_max_texture_size;
   6188 	glw::GLint  m_max_samples;
   6189 	glw::GLint  m_max_array_texture_layers;
   6190 
   6191 	void Prepare();
   6192 	bool Test1D();
   6193 	bool Test2D();
   6194 	bool Test3D();
   6195 	bool Test2DMultisample();
   6196 	bool Test3DMultisample();
   6197 	void Clean();
   6198 };
   6199 /* StorageErrorsTest class */
   6200 
   6201 /** @class SubImageErrorsTest
   6202  *
   6203  *          Check that INVALID_OPERATION is generated by TextureSubImage1D if
   6204  *          texture is not the name of an existing texture object.
   6205  *
   6206  *          Check that INVALID_ENUM is generated by TextureSubImage1D if format is
   6207  *          not an accepted format constant.
   6208  *
   6209  *          Check that INVALID_ENUM is generated by TextureSubImage1D if type is not
   6210  *          a type constant.
   6211  *
   6212  *          Check that INVALID_VALUE is generated by TextureSubImage1D if level is
   6213  *          less than 0.
   6214  *
   6215  *          Check that INVALID_VALUE may be generated by TextureSubImage1D if level
   6216  *          is greater than log2 max, where max is the returned value of
   6217  *          MAX_TEXTURE_SIZE.
   6218  *
   6219  *          Check that INVALID_VALUE is generated by TextureSubImage1D if
   6220  *          xoffset<b, or if (xoffset+width)>(wb), where w is the TEXTURE_WIDTH,
   6221  *          and b is the width of the TEXTURE_BORDER of the texture image being
   6222  *          modified. Note that w includes twice the border width.
   6223  *          Check that INVALID_VALUE is generated by TextureSubImage1D if width is
   6224  *          less than 0.
   6225  *
   6226  *          Check that INVALID_OPERATION is generated by TextureSubImage1D if type
   6227  *          is one of UNSIGNED_BYTE_3_3_2, UNSIGNED_BYTE_2_3_3_REV,
   6228  *          UNSIGNED_SHORT_5_6_5, or UNSIGNED_SHORT_5_6_5_REV and format is not RGB.
   6229  *
   6230  *          Check that INVALID_OPERATION is generated by TextureSubImage1D if type
   6231  *          is one of UNSIGNED_SHORT_4_4_4_4, UNSIGNED_SHORT_4_4_4_4_REV,
   6232  *          UNSIGNED_SHORT_5_5_5_1, UNSIGNED_SHORT_1_5_5_5_REV,
   6233  *          UNSIGNED_INT_8_8_8_8, UNSIGNED_INT_8_8_8_8_REV, UNSIGNED_INT_10_10_10_2,
   6234  *          or UNSIGNED_INT_2_10_10_10_REV and format is neither RGBA nor BGRA.
   6235  *
   6236  *          Check that INVALID_OPERATION is generated by TextureSubImage1D if a
   6237  *          non-zero buffer object name is bound to the PIXEL_UNPACK_BUFFER target
   6238  *          and the buffer object's data store is currently mapped.
   6239  *
   6240  *          Check that INVALID_OPERATION is generated by TextureSubImage1D if a
   6241  *          non-zero buffer object name is bound to the PIXEL_UNPACK_BUFFER target
   6242  *          and the data would be unpacked from the buffer object such that the
   6243  *          memory reads required would exceed the data store size.
   6244  *
   6245  *          Check that INVALID_OPERATION is generated by TextureSubImage1D if a
   6246  *          non-zero buffer object name is bound to the PIXEL_UNPACK_BUFFER target
   6247  *          and pixels is not evenly divisible into the number of bytes needed to
   6248  *          store in memory a datum indicated by type.
   6249  *
   6250  *
   6251  *          Check that INVALID_OPERATION is generated by TextureSubImage2D if
   6252  *          texture is not the name of an existing texture object.
   6253  *
   6254  *          Check that INVALID_ENUM is generated by TextureSubImage2D if format is
   6255  *          not an accepted format constant.
   6256  *
   6257  *          Check that INVALID_ENUM is generated if type is not a type constant.
   6258  *
   6259  *          Check that INVALID_VALUE is generated by TextureSubImage2D if level is
   6260  *          less than 0.
   6261  *
   6262  *          Check that INVALID_VALUE may be generated by TextureSubImage2D if level
   6263  *          is greater than log2 max, where max is the returned value of
   6264  *          MAX_TEXTURE_SIZE.
   6265  *          Check that INVALID_VALUE is generated by TextureSubImage2D if
   6266  *          xoffset<b, (xoffset+width)>(wb), yoffset<b, or
   6267  *          (yoffset+height)>(hb), where w is the TEXTURE_WIDTH, h is the
   6268  *          TEXTURE_HEIGHT, and b is the border width of the texture image being
   6269  *          modified. Note that w and h include twice the border width.
   6270  *          Check that INVALID_VALUE is generated by TextureSubImage2D if width or
   6271  *          height is less than 0.
   6272  *
   6273  *          Check that INVALID_OPERATION is generated by TextureSubImage2D if type
   6274  *          is one of UNSIGNED_BYTE_3_3_2, UNSIGNED_BYTE_2_3_3_REV,
   6275  *          UNSIGNED_SHORT_5_6_5, or UNSIGNED_SHORT_5_6_5_REV and format is not RGB.
   6276  *
   6277  *          Check that INVALID_OPERATION is generated by TextureSubImage2D if type
   6278  *          is one of UNSIGNED_SHORT_4_4_4_4, UNSIGNED_SHORT_4_4_4_4_REV,
   6279  *          UNSIGNED_SHORT_5_5_5_1, UNSIGNED_SHORT_1_5_5_5_REV, UNSIGNED_INT_8_8_8_8,
   6280  *          UNSIGNED_INT_8_8_8_8_REV, UNSIGNED_INT_10_10_10_2, or
   6281  *          UNSIGNED_INT_2_10_10_10_REV and format is neither RGBA
   6282  *          nor BGRA.
   6283  *
   6284  *          Check that INVALID_OPERATION is generated by TextureSubImage2D if a
   6285  *          non-zero buffer object name is bound to the PIXEL_UNPACK_BUFFER target
   6286  *          and the buffer object's data store is currently mapped.
   6287  *
   6288  *          Check that INVALID_OPERATION is generated by TextureSubImage2D if a
   6289  *          non-zero buffer object name is bound to the PIXEL_UNPACK_BUFFER target
   6290  *          and the data would be unpacked from the buffer object such that the
   6291  *          memory reads required would exceed the data store size.
   6292  *
   6293  *          Check that INVALID_OPERATION is generated by TextureSubImage2D if a
   6294  *          non-zero buffer object name is bound to the PIXEL_UNPACK_BUFFER target
   6295  *          and pixels is not evenly divisible into the number of bytes needed to
   6296  *          store in memory a datum indicated by type.
   6297  *
   6298  *
   6299  *          Check that INVALID_OPERATION is generated by TextureSubImage3D if
   6300  *          texture is not the name of an existing texture object.
   6301  *
   6302  *          Check that INVALID_ENUM is generated by TextureSubImage3D if format is
   6303  *          not an accepted format constant.
   6304  *
   6305  *          Check that INVALID_ENUM is generated by TextureSubImage3D if type is
   6306  *          not a type constant.
   6307  *
   6308  *          Check that INVALID_VALUE is generated by TextureSubImage3D if level
   6309  *          is less than 0.
   6310  *
   6311  *          Check that INVALID_VALUE may be generated by TextureSubImage3D if level
   6312  *          is greater than log2 max, where max is the returned value of
   6313  *          MAX_TEXTURE_SIZE.
   6314  *
   6315  *          Check that INVALID_VALUE is generated by TextureSubImage3D if
   6316  *          xoffset<b, (xoffset+width)>(wb), yoffset<b, or
   6317  *          (yoffset+height)>(hb), or zoffset<b, or (zoffset+depth)>(db), where w
   6318  *          is the TEXTURE_WIDTH, h is the TEXTURE_HEIGHT, d is the TEXTURE_DEPTH
   6319  *          and b is the border width of the texture image being modified. Note
   6320  *          that w, h, and d include twice the border width.
   6321  *
   6322  *          Check that INVALID_VALUE is generated by TextureSubImage3D if width,
   6323  *          height, or depth is less than 0.
   6324  *
   6325  *          Check that INVALID_OPERATION is generated by TextureSubImage3D if type
   6326  *          is one of UNSIGNED_BYTE_3_3_2, UNSIGNED_BYTE_2_3_3_REV,
   6327  *          UNSIGNED_SHORT_5_6_5, or UNSIGNED_SHORT_5_6_5_REV and format is not RGB.
   6328  *
   6329  *          Check that INVALID_OPERATION is generated by TextureSubImage3D if type
   6330  *          is one of UNSIGNED_SHORT_4_4_4_4, UNSIGNED_SHORT_4_4_4_4_REV,
   6331  *          UNSIGNED_SHORT_5_5_5_1, UNSIGNED_SHORT_1_5_5_5_REV,
   6332  *          UNSIGNED_INT_8_8_8_8, UNSIGNED_INT_8_8_8_8_REV, UNSIGNED_INT_10_10_10_2,
   6333  *          or UNSIGNED_INT_2_10_10_10_REV and format is neither RGBA nor BGRA.
   6334  *
   6335  *          Check that INVALID_OPERATION is generated by TextureSubImage3D if a
   6336  *          non-zero buffer object name is bound to the PIXEL_UNPACK_BUFFER target
   6337  *          and the buffer object's data store is currently mapped.
   6338  *
   6339  *          Check that INVALID_OPERATION is generated by TextureSubImage3D if a
   6340  *          non-zero buffer object name is bound to the PIXEL_UNPACK_BUFFER target
   6341  *          and the data would be unpacked from the buffer object such that the
   6342  *          memory reads required would exceed the data store size.
   6343  *
   6344  *          Check that INVALID_OPERATION is generated by TextureSubImage3D if a
   6345  *          non-zero buffer object name is bound to the PIXEL_UNPACK_BUFFER target
   6346  *          and pixels is not evenly divisible into the number of bytes needed to
   6347  *          store in memory a datum indicated by type.
   6348  *
   6349  *
   6350  *          Check that INVALID_ENUM is generated by CompressedTextureSubImage1D if
   6351  *          internalformat is not one of the generic compressed internal formats:
   6352  *          COMPRESSED_RED, COMPRESSED_RG, COMPRESSED_RGB, COMPRESSED_RGBA.
   6353  *          COMPRESSED_SRGB, or COMPRESSED_SRGB_ALPHA.
   6354  *
   6355  *          Check that INVALID_VALUE is generated by CompressedTextureSubImage1D if
   6356  *          imageSize is not consistent with the format, dimensions, and contents of
   6357  *          the specified compressed image data.
   6358  *
   6359  *          Check that INVALID_OPERATION is generated by CompressedTextureSubImage1D
   6360  *          if parameter combinations are not supported by the specific compressed
   6361  *          internal format as specified in the specific texture compression
   6362  *          extension.
   6363  *
   6364  *          Check that INVALID_OPERATION is generated by CompressedTextureSubImage1D
   6365  *          if a non-zero buffer object name is bound to the PIXEL_UNPACK_BUFFER
   6366  *          target and the buffer object's data store is currently mapped.
   6367  *
   6368  *          Check that INVALID_OPERATION is generated by CompressedTextureSubImage1D
   6369  *          if a non-zero buffer object name is bound to the PIXEL_UNPACK_BUFFER
   6370  *          target and the data would be unpacked from the buffer object such that
   6371  *          the memory reads required would exceed the data store size.
   6372  *
   6373  *          Check that INVALID_OPERATION is generated by CompressedTextureSubImage1D
   6374  *          function if texture is not the name of an existing texture object.
   6375  *
   6376  *
   6377  *          Check that INVALID_OPERATION is generated by CompressedTextureSubImage2D
   6378  *          if texture is not the name of an existing texture object.
   6379  *
   6380  *          Check that INVALID_ENUM is generated by CompressedTextureSubImage2D if
   6381  *          internalformat is of the generic compressed internal formats:
   6382  *          COMPRESSED_RED, COMPRESSED_RG, COMPRESSED_RGB, COMPRESSED_RGBA.
   6383  *          COMPRESSED_SRGB, or COMPRESSED_SRGB_ALPHA.
   6384  *
   6385  *          Check that INVALID_OPERATION is generated by CompressedTextureSubImage2D
   6386  *          if format does not match the internal format of the texture image being
   6387  *          modified, since these commands do not provide for image format
   6388  *          conversion.
   6389  *
   6390  *          Check that INVALID_VALUE is generated by CompressedTextureSubImage2D if
   6391  *          imageSize is not consistent with the format, dimensions, and contents of
   6392  *          the specified compressed image data.
   6393  *
   6394  *          Check that INVALID_OPERATION is generated by CompressedTextureSubImage2D
   6395  *          if a non-zero buffer object name is bound to the PIXEL_UNPACK_BUFFER
   6396  *          target and the buffer object's data store is currently mapped.
   6397  *
   6398  *          Check that INVALID_OPERATION is generated by CompressedTextureSubImage2D
   6399  *          if a non-zero buffer object name is bound to the PIXEL_UNPACK_BUFFER
   6400  *          target and the data would be unpacked from the buffer object such that
   6401  *          the memory reads required would exceed the data store size.
   6402  *
   6403  *          Check that INVALID_OPERATION is generated by CompressedTextureSubImage2D
   6404  *          if the effective target is TEXTURE_RECTANGLE.
   6405  *
   6406  *
   6407  *          Check that INVALID_OPERATION is generated by CompressedTextureSubImage3D
   6408  *          if texture is not the name of an existing texture object.
   6409  *
   6410  *          Check that INVALID_ENUM is generated by CompressedTextureSubImage3D if
   6411  *          internalformat is one of the generic compressed internal formats:
   6412  *          COMPRESSED_RED, COMPRESSED_RG, COMPRESSED_RGB, COMPRESSED_RGBA.
   6413  *          COMPRESSED_SRGB, or COMPRESSED_SRGB_ALPHA.
   6414  *
   6415  *          Check that INVALID_OPERATION is generated by CompressedTextureSubImage3D
   6416  *          if format does not match the internal format of the texture image being
   6417  *          modified, since these commands do not provide for image format
   6418  *          conversion.
   6419  *
   6420  *          Check that INVALID_VALUE is generated by CompressedTextureSubImage3D if
   6421  *          imageSize is not consistent with the format, dimensions, and contents of
   6422  *          the specified compressed image data.
   6423  *
   6424  *          Check that INVALID_OPERATION is generated by CompressedTextureSubImage3D
   6425  *          if a non-zero buffer object name is bound to the PIXEL_UNPACK_BUFFER
   6426  *          target and the buffer object's data store is currently mapped.
   6427  *
   6428  *          Check that INVALID_OPERATION is generated by CompressedTextureSubImage3D
   6429  *          if a non-zero buffer object name is bound to the PIXEL_UNPACK_BUFFER
   6430  *          target and the data would be unpacked from the buffer object such that
   6431  *          the memory reads required would exceed the data store size.
   6432  */
   6433 class SubImageErrorsTest : public deqp::TestCase, ErrorsUtilities
   6434 {
   6435 public:
   6436 	/* Public member functions. */
   6437 	SubImageErrorsTest(deqp::Context& context);
   6438 
   6439 	virtual tcu::TestNode::IterateResult iterate();
   6440 
   6441 private:
   6442 	/* Private constructors. */
   6443 	SubImageErrorsTest(const SubImageErrorsTest& other);
   6444 	SubImageErrorsTest& operator=(const SubImageErrorsTest& other);
   6445 
   6446 	glw::GLuint   m_to_1D_empty;
   6447 	glw::GLuint   m_to_2D_empty;
   6448 	glw::GLuint   m_to_3D_empty;
   6449 	glw::GLuint   m_to_1D;
   6450 	glw::GLuint   m_to_2D;
   6451 	glw::GLuint   m_to_3D;
   6452 	glw::GLuint   m_to_1D_compressed;
   6453 	glw::GLuint   m_to_2D_compressed;
   6454 	glw::GLuint   m_to_3D_compressed;
   6455 	glw::GLuint   m_to_rectangle_compressed;
   6456 	glw::GLuint   m_to_invalid;
   6457 	glw::GLuint   m_bo;
   6458 	glw::GLuint   m_format_invalid;
   6459 	glw::GLuint   m_type_invalid;
   6460 	glw::GLint	m_max_texture_size;
   6461 	glw::GLubyte* m_reference_compressed_1D;
   6462 	glw::GLubyte* m_reference_compressed_2D;
   6463 	glw::GLubyte* m_reference_compressed_3D;
   6464 	glw::GLubyte* m_reference_compressed_rectangle;
   6465 	glw::GLint	m_reference_compressed_1D_size;
   6466 	glw::GLint	m_reference_compressed_2D_size;
   6467 	glw::GLint	m_reference_compressed_3D_size;
   6468 	glw::GLint	m_reference_compressed_rectangle_size;
   6469 	glw::GLint	m_reference_compressed_1D_format;
   6470 	glw::GLint	m_reference_compressed_2D_format;
   6471 	glw::GLint	m_reference_compressed_3D_format;
   6472 	glw::GLint	m_reference_compressed_rectangle_format;
   6473 	glw::GLint	m_not_matching_compressed_1D_format;
   6474 	glw::GLint	m_not_matching_compressed_1D_size;
   6475 	glw::GLint	m_not_matching_compressed_2D_format;
   6476 	glw::GLint	m_not_matching_compressed_2D_size;
   6477 	glw::GLint	m_not_matching_compressed_3D_format;
   6478 	glw::GLint	m_not_matching_compressed_3D_size;
   6479 
   6480 	void Prepare();
   6481 	bool Test1D();
   6482 	bool Test2D();
   6483 	bool Test3D();
   6484 	bool Test1DCompressed();
   6485 	bool Test2DCompressed();
   6486 	bool Test3DCompressed();
   6487 	void Clean();
   6488 
   6489 	static const glw::GLushort s_reference[];
   6490 	static const glw::GLuint   s_reference_width;
   6491 	static const glw::GLuint   s_reference_height;
   6492 	static const glw::GLuint   s_reference_depth;
   6493 	static const glw::GLuint   s_reference_size;
   6494 	static const glw::GLenum   s_reference_internalformat;
   6495 	static const glw::GLenum   s_reference_internalformat_compressed;
   6496 	static const glw::GLenum   s_reference_format;
   6497 	static const glw::GLenum   s_reference_type;
   6498 };
   6499 /* SubImageErrorsTest class */
   6500 
   6501 /** @class CopyErrorsTest
   6502  *
   6503  *          Check that INVALID_FRAMEBUFFER_OPERATION is generated by
   6504  *          CopyTextureSubImage1D if the object bound to READ_FRAMEBUFFER_BINDING is
   6505  *          not framebuffer complete.
   6506  *
   6507  *          Check that INVALID_OPERATION is generated by CopyTextureSubImage1D if
   6508  *          texture is not the name of an existing texture object, or if the
   6509  *          effective target of texture is not TEXTURE_1D.
   6510  *
   6511  *          Check that INVALID_VALUE is generated by CopyTextureSubImage1D if level
   6512  *          is less than 0.
   6513  *
   6514  *          Check that INVALID_VALUE is generated by CopyTextureSubImage1D if
   6515  *          xoffset<0, or (xoffset+width)>w, where w is the TEXTURE_WIDTH of the
   6516  *          texture image being modified.
   6517  *
   6518  *          Check that INVALID_OPERATION is generated by CopyTextureSubImage1D if
   6519  *          the read buffer is NONE, or the value of READ_FRAMEBUFFER_BINDING is
   6520  *          non-zero, and: the read buffer selects an attachment that has no image
   6521  *          attached, or the effective value of SAMPLE_BUFFERS for the read
   6522  *          framebuffer is one.
   6523  *
   6524  *
   6525  *          Check that INVALID_FRAMEBUFFER_OPERATION is generated by
   6526  *          CopyTextureSubImage2D if the object bound to READ_FRAMEBUFFER_BINDING is
   6527  *          not framebuffer complete.
   6528  *
   6529  *          Check that INVALID_OPERATION is generated by CopyTextureSubImage2D if
   6530  *          texture is not the name of an existing texture object.
   6531  *
   6532  *          Check that INVALID_OPERATION is generated by CopyTextureSubImage2D if
   6533  *          the effective target of texture does not correspond to one of the
   6534  *          texture targets supported by the function.
   6535  *
   6536  *          Check that INVALID_VALUE is generated by CopyTextureSubImage2D if level
   6537  *          is less than 0.
   6538  *
   6539  *          Check that INVALID_VALUE is generated by CopyTextureSubImage2D if
   6540  *          xoffset<0, (xoffset+width)>w, yoffset<0, or (yoffset+height)>0, where w
   6541  *          is the TEXTURE_WIDTH, h is the TEXTURE_HEIGHT and of the texture image
   6542  *          being modified.
   6543  *
   6544  *          Check that INVALID_OPERATION is generated by CopyTextureSubImage2D if:
   6545  *          the read buffer is NONE, or the value of READ_FRAMEBUFFER_BINDING is
   6546  *          non-zero, and: the read buffer selects an attachment that has no image
   6547  *          attached, or the effective value of SAMPLE_BUFFERS for the read
   6548  *          framebuffer is one.
   6549  *
   6550  *
   6551  *          Check that INVALID_OPERATION is generated by CopyTextureSubImage3D if
   6552  *          the effective target is not TEXTURE_3D, TEXTURE_2D_ARRAY,
   6553  *          TEXTURE_CUBE_MAP_ARRAY or TEXTURE_CUBE_MAP.
   6554  *
   6555  *          Check that INVALID_FRAMEBUFFER_OPERATION is generated by
   6556  *          CopyTextureSubImage3D if the object bound to READ_FRAMEBUFFER_BINDING is
   6557  *          not framebuffer complete.
   6558  *
   6559  *          Check that INVALID_OPERATION is generated by CopyTextureSubImage3D if
   6560  *          texture is not the name of an existing texture object.
   6561  *
   6562  *          Check that INVALID_VALUE is generated by CopyTextureSubImage3D if level
   6563  *          is less than 0.
   6564  *
   6565  *          Check that INVALID_VALUE is generated by CopyTextureSubImage3D if
   6566  *          xoffset<0, (xoffset+width)>w, yoffset<0, (yoffset+height)>h, zoffset<0,
   6567  *          or (zoffset+1)>d, where w is the TEXTURE_WIDTH, h is the TEXTURE_HEIGHT,
   6568  *          d is the TEXTURE_DEPTH and of the texture image being modified. Note
   6569  *          that w, h, and d include twice the border width.
   6570  *
   6571  *          Check that INVALID_OPERATION is generated by CopyTextureSubImage3D if:
   6572  *          the read buffer is NONE, or the value of READ_FRAMEBUFFER_BINDING is
   6573  *          non-zero, and: the read buffer selects an attachment that has no image
   6574  *          attached, or the effective value of SAMPLE_BUFFERS for the read
   6575  *          framebuffer is one.
   6576  */
   6577 class CopyErrorsTest : public deqp::TestCase, ErrorsUtilities
   6578 {
   6579 public:
   6580 	/* Public member functions. */
   6581 	CopyErrorsTest(deqp::Context& context);
   6582 
   6583 	virtual tcu::TestNode::IterateResult iterate();
   6584 
   6585 private:
   6586 	/* Private constructors. */
   6587 	CopyErrorsTest(const CopyErrorsTest& other);
   6588 	CopyErrorsTest& operator=(const CopyErrorsTest& other);
   6589 
   6590 	glw::GLuint m_fbo;
   6591 	glw::GLuint m_fbo_ms;
   6592 	glw::GLuint m_fbo_incomplete;
   6593 	glw::GLuint m_to_src;
   6594 	glw::GLuint m_to_src_ms;
   6595 	glw::GLuint m_to_1D_dst;
   6596 	glw::GLuint m_to_2D_dst;
   6597 	glw::GLuint m_to_3D_dst;
   6598 	glw::GLuint m_to_invalid;
   6599 
   6600 	void Prepare();
   6601 	bool Test1D();
   6602 	bool Test2D();
   6603 	bool Test3D();
   6604 	void Clean();
   6605 
   6606 	static const glw::GLuint s_width;
   6607 	static const glw::GLuint s_height;
   6608 	static const glw::GLuint s_depth;
   6609 	static const glw::GLuint s_internalformat;
   6610 };
   6611 /* CopyErrorsTest class */
   6612 
   6613 /** @class ParameterSetupErrorsTest
   6614  *
   6615  *      Check that INVALID_ENUM is generated by TextureParameter* if pname is
   6616  *      not one of the accepted defined values.
   6617  *
   6618  *      Check that INVALID_ENUM is generated by TextureParameter* if params
   6619  *      should have a defined constant value (based on the value of pname) and
   6620  *       does not.
   6621  *
   6622  *      Check that INVALID_ENUM is generated if TextureParameter{if} is called
   6623  *      for a non-scalar parameter (pname TEXTURE_BORDER_COLOR or
   6624  *      TEXTURE_SWIZZLE_RGBA).
   6625  *
   6626  *      Check that INVALID_ENUM is generated by TextureParameter* if the
   6627  *      effective target is either TEXTURE_2D_MULTISAMPLE or
   6628  *      TEXTURE_2D_MULTISAMPLE_ARRAY, and pname is any of the sampler states.
   6629  *
   6630  *      Check that INVALID_ENUM is generated by TextureParameter* if the
   6631  *      effective target is TEXTURE_RECTANGLE and either of pnames
   6632  *      TEXTURE_WRAP_S or TEXTURE_WRAP_T is set to either MIRROR_CLAMP_TO_EDGE,
   6633  *      MIRRORED_REPEAT or REPEAT.
   6634  *
   6635  *      Check that INVALID_ENUM is generated by TextureParameter* if the
   6636  *      effective target is TEXTURE_RECTANGLE and pname TEXTURE_MIN_FILTER is
   6637  *      set to a value other than NEAREST or LINEAR (no mipmap filtering is
   6638  *      permitted).
   6639  *
   6640  *      Check that INVALID_OPERATION is generated by TextureParameter* if the
   6641  *      effective target is either TEXTURE_2D_MULTISAMPLE or
   6642  *      TEXTURE_2D_MULTISAMPLE_ARRAY, and pname TEXTURE_BASE_LEVEL is set to a
   6643  *      value other than zero.
   6644  *
   6645  *      Check that INVALID_OPERATION is generated by TextureParameter* if
   6646  *      texture is not the name of an existing texture object.
   6647  *
   6648  *      Check that INVALID_OPERATION is generated by TextureParameter* if the
   6649  *      effective target is TEXTURE_RECTANGLE and pname TEXTURE_BASE_LEVEL is
   6650  *      set to any value other than zero.
   6651  *
   6652  *      Check that INVALID_VALUE is generated by TextureParameter* if pname is
   6653  *      TEXTURE_BASE_LEVEL or TEXTURE_MAX_LEVEL, and param or params is
   6654  *      negative.
   6655  */
   6656 class ParameterSetupErrorsTest : public deqp::TestCase, ErrorsUtilities
   6657 {
   6658 public:
   6659 	/* Public member functions. */
   6660 	ParameterSetupErrorsTest(deqp::Context& context);
   6661 
   6662 	virtual tcu::TestNode::IterateResult iterate();
   6663 
   6664 private:
   6665 	/* Private constructors. */
   6666 	ParameterSetupErrorsTest(const ParameterSetupErrorsTest& other);
   6667 	ParameterSetupErrorsTest& operator=(const ParameterSetupErrorsTest& other);
   6668 
   6669 	glw::GLuint m_to_2D;
   6670 	glw::GLuint m_to_2D_ms;
   6671 	glw::GLuint m_to_rectangle;
   6672 	glw::GLuint m_to_invalid;
   6673 	glw::GLenum m_pname_invalid;
   6674 	glw::GLenum m_depth_stencil_mode_invalid;
   6675 
   6676 	void Prepare();
   6677 	bool Testf();
   6678 	bool Testi();
   6679 	bool Testfv();
   6680 	bool Testiv();
   6681 	bool TestIiv();
   6682 	bool TestIuiv();
   6683 	void Clean();
   6684 
   6685 	static const glw::GLuint s_width;
   6686 	static const glw::GLuint s_height;
   6687 	static const glw::GLuint s_depth;
   6688 	static const glw::GLuint s_internalformat;
   6689 };
   6690 /* ParameterSetupErrorsTest class */
   6691 
   6692 /** @class GenerateMipmapErrorsTest
   6693  *
   6694  *      Check that INVALID_OPERATION is generated by GenerateTextureMipmap if
   6695  *      texture is not the name of an existing texture object.
   6696  *
   6697  *      Check that INVALID_OPERATION is generated by GenerateTextureMipmap if
   6698  *      target is TEXTURE_CUBE_MAP or TEXTURE_CUBE_MAP_ARRAY, and the specified
   6699  *      texture object is not cube complete or cube array complete,
   6700  *      respectively.
   6701  */
   6702 class GenerateMipmapErrorsTest : public deqp::TestCase, ErrorsUtilities
   6703 {
   6704 public:
   6705 	/* Public member functions. */
   6706 	GenerateMipmapErrorsTest(deqp::Context& context);
   6707 
   6708 	virtual tcu::TestNode::IterateResult iterate();
   6709 
   6710 private:
   6711 	/* Private constructors. */
   6712 	GenerateMipmapErrorsTest(const GenerateMipmapErrorsTest& other);
   6713 	GenerateMipmapErrorsTest& operator=(const GenerateMipmapErrorsTest& other);
   6714 
   6715 	static const glw::GLubyte s_reference_data[];
   6716 	static const glw::GLuint  s_reference_width;
   6717 	static const glw::GLuint  s_reference_height;
   6718 	static const glw::GLenum  s_reference_internalformat;
   6719 	static const glw::GLenum  s_reference_format;
   6720 	static const glw::GLenum  s_reference_type;
   6721 };
   6722 /* GenerateMipmapErrorsTest class */
   6723 
   6724 /** @class BindUnitErrorsTest
   6725  *
   6726  *      Check that INVALID_OPERATION error is generated if texture is not zero
   6727  *      or the name of an existing texture object.
   6728  */
   6729 class BindUnitErrorsTest : public deqp::TestCase, ErrorsUtilities
   6730 {
   6731 public:
   6732 	/* Public member functions. */
   6733 	BindUnitErrorsTest(deqp::Context& context);
   6734 
   6735 	virtual tcu::TestNode::IterateResult iterate();
   6736 
   6737 private:
   6738 	/* Private constructors. */
   6739 	BindUnitErrorsTest(const BindUnitErrorsTest& other);
   6740 	BindUnitErrorsTest& operator=(const BindUnitErrorsTest& other);
   6741 };
   6742 /* BindUnitErrorsTest class */
   6743 
   6744 /** @class ImageQueryErrorsTest
   6745  *
   6746  *      Check that INVALID_OPERATION is generated by GetTextureImage if texture
   6747  *      is not the name of an existing texture object.
   6748  *
   6749  *      Check that INVALID_ENUM is generated by GetTextureImage functions if
   6750  *      resulting texture target is not an accepted value TEXTURE_1D,
   6751  *      TEXTURE_2D, TEXTURE_3D, TEXTURE_1D_ARRAY, TEXTURE_2D_ARRAY,
   6752  *      TEXTURE_CUBE_MAP_ARRAY, TEXTURE_RECTANGLE, and TEXTURE_CUBE_MAP.
   6753  *
   6754  *      Check that INVALID_OPERATION error is generated by GetTextureImage if
   6755  *      the effective target is TEXTURE_CUBE_MAP or TEXTURE_CUBE_MAP_ARRAY, and
   6756  *      the texture object is not cube complete or cube array complete,
   6757  *      respectively.
   6758  *
   6759  *      Check that GL_INVALID_VALUE is generated if level is less than 0 or
   6760  *      larger than the maximum allowable level.
   6761  *
   6762  *      Check that INVALID_VALUE error is generated if level is non-zero and the
   6763  *      effective target is TEXTURE_RECTANGLE.
   6764  *
   6765  *      Check that INVALID_OPERATION error is generated if any of the following
   6766  *      mismatches between format and the internal format of the texture image
   6767  *      exist:
   6768  *       -  format is a color format (one of the formats in table 8.3 whose
   6769  *          target is the color buffer) and the base internal format of the
   6770  *          texture image is not a color format.
   6771  *       -  format is DEPTH_COMPONENT and the base internal format is  not
   6772  *          DEPTH_COMPONENT or DEPTH_STENCIL
   6773  *       -  format is DEPTH_STENCIL and the base internal format is not
   6774  *          DEPTH_STENCIL
   6775  *       -  format is STENCIL_INDEX and the base internal format is not
   6776  *          STENCIL_INDEX or DEPTH_STENCIL
   6777  *       -  format is one of the integer formats in table 8.3 and the internal
   6778  *          format of the texture image is not integer, or format is not one of
   6779  *          the integer formats in table 8.3 and the internal format is integer.
   6780  *
   6781  *      Check that INVALID_OPERATION error is generated if a pixel pack buffer
   6782  *      object is bound and packing the texture image into the buffers memory
   6783  *      would exceed the size of the buffer.
   6784  *
   6785  *      Check that INVALID_OPERATION error is generated if a pixel pack buffer
   6786  *      object is bound and pixels is not evenly divisible by the number of
   6787  *      basic machine units needed to store in memory the GL data type
   6788  *      corresponding to type (see table 8.2).
   6789  *
   6790  *      Check that INVALID_OPERATION error is generated by GetTextureImage if
   6791  *      the buffer size required to store the requested data is greater than
   6792  *      bufSize.
   6793  *
   6794  *
   6795  *      Check that INVALID_OPERATION is generated by GetCompressedTextureImage
   6796  *      if texture is not the name of an existing texture object.
   6797  *
   6798  *      Check that INVALID_VALUE is generated by GetCompressedTextureImage if
   6799  *      level is less than zero or greater than the maximum number of LODs
   6800  *      permitted by the implementation.
   6801  *
   6802  *      Check that INVALID_OPERATION is generated if GetCompressedTextureImage
   6803  *      is used to retrieve a texture that is in an uncompressed internal
   6804  *      format.
   6805  *
   6806  *      Check that INVALID_OPERATION is generated by GetCompressedTextureImage
   6807  *      if a non-zero buffer object name is bound to the PIXEL_PACK_BUFFER
   6808  *      target, the buffer storage was not initialized with BufferStorage using
   6809  *      MAP_PERSISTENT_BIT flag, and the buffer object's data store is currently
   6810  *      mapped.
   6811  *
   6812  *      Check that INVALID_OPERATION is generated by GetCompressedTextureImage
   6813  *      if a non-zero buffer object name is bound to the PIXEL_PACK_BUFFER
   6814  *      target and the data would be packed to the buffer object such that the
   6815  *      memory writes required would exceed the data store size.
   6816  */
   6817 class ImageQueryErrorsTest : public deqp::TestCase, ErrorsUtilities
   6818 {
   6819 public:
   6820 	/* Public member functions. */
   6821 	ImageQueryErrorsTest(deqp::Context& context);
   6822 
   6823 	virtual tcu::TestNode::IterateResult iterate();
   6824 
   6825 private:
   6826 	/* Private constructors. */
   6827 	ImageQueryErrorsTest(const ImageQueryErrorsTest& other);
   6828 	ImageQueryErrorsTest& operator=(const ImageQueryErrorsTest& other);
   6829 
   6830 	static const glw::GLuint s_reference_data[];
   6831 	static const glw::GLuint s_reference_width;
   6832 	static const glw::GLuint s_reference_height;
   6833 	static const glw::GLuint s_reference_size;
   6834 	static const glw::GLenum s_reference_internalformat;
   6835 	static const glw::GLenum s_reference_internalformat_int;
   6836 	static const glw::GLenum s_reference_internalformat_compressed;
   6837 	static const glw::GLenum s_reference_format;
   6838 	static const glw::GLenum s_reference_type;
   6839 };
   6840 /* ImageQueryErrorsTest class */
   6841 
   6842 /** @class LevelParameterErrorsTest
   6843  *
   6844  *      Check that INVALID_OPERATION is generated by GetTextureLevelParameterfv
   6845  *      and GetTextureLevelParameteriv functions if texture is not the name of
   6846  *      an existing texture object.
   6847  *
   6848  *      Check that INVALID_VALUE is generated by GetTextureLevelParameter* if
   6849  *      level is less than 0.
   6850  *
   6851  *      Check that INVALID_VALUE may be generated if level is greater than
   6852  *      log2 max, where max is the returned value of MAX_TEXTURE_SIZE.
   6853  *
   6854  *      Check that INVALID_OPERATION is generated by GetTextureLevelParameter*
   6855  *      if TEXTURE_COMPRESSED_IMAGE_SIZE is queried on texture images with an
   6856  *      uncompressed internal format or on proxy targets.
   6857  *
   6858  *      Check that INVALID_ENUM error is generated by GetTextureLevelParameter*
   6859  *      if pname is not one of supported constants.
   6860  */
   6861 class LevelParameterErrorsTest : public deqp::TestCase, ErrorsUtilities
   6862 {
   6863 public:
   6864 	/* Public member functions. */
   6865 	LevelParameterErrorsTest(deqp::Context& context);
   6866 
   6867 	virtual tcu::TestNode::IterateResult iterate();
   6868 
   6869 private:
   6870 	/* Private constructors. */
   6871 	LevelParameterErrorsTest(const LevelParameterErrorsTest& other);
   6872 	LevelParameterErrorsTest& operator=(const LevelParameterErrorsTest& other);
   6873 };
   6874 /* LevelParameterErrorsTest class */
   6875 
   6876 /** @class
   6877  *      Check that INVALID_ENUM is generated by glGetTextureParameter* if pname
   6878  *      is not an accepted value.
   6879  *
   6880  *      Check that INVALID_OPERATION is generated by glGetTextureParameter* if
   6881  *      texture is not the name of an existing texture object.
   6882  *
   6883  *      Check that INVALID_ENUM error is generated if the effective target is
   6884  *      not one of the supported texture targets (eg. TEXTURE_BUFFER).
   6885  */
   6886 class ParameterErrorsTest : public deqp::TestCase, ErrorsUtilities
   6887 {
   6888 public:
   6889 	/* Public member functions. */
   6890 	ParameterErrorsTest(deqp::Context& context);
   6891 
   6892 	virtual tcu::TestNode::IterateResult iterate();
   6893 
   6894 private:
   6895 	/* Private constructors. */
   6896 	ParameterErrorsTest(const ParameterErrorsTest& other);
   6897 	ParameterErrorsTest& operator=(const ParameterErrorsTest& other);
   6898 };
   6899 /* ParameterErrorsTest class */
   6900 } /* Textures namespace */
   6901 } /* DirectStateAccess namespace */
   6902 } /* gl4cts namespace */
   6903 
   6904 #endif // _GL4CDIRECTSTATEACCESSTESTS_HPP
   6905