Home | History | Annotate | Download | only in gl
      1 /*-------------------------------------------------------------------------
      2  * OpenGL Conformance Test Suite
      3  * -----------------------------
      4  *
      5  * Copyright (c) 2015-2016 The Khronos Group Inc.
      6  *
      7  * Licensed under the Apache License, Version 2.0 (the "License");
      8  * you may not use this file except in compliance with the License.
      9  * You may obtain a copy of the License at
     10  *
     11  *      http://www.apache.org/licenses/LICENSE-2.0
     12  *
     13  * Unless required by applicable law or agreed to in writing, software
     14  * distributed under the License is distributed on an "AS IS" BASIS,
     15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     16  * See the License for the specific language governing permissions and
     17  * limitations under the License.
     18  *
     19  */ /*!
     20  * \file
     21  * \brief
     22  */ /*-------------------------------------------------------------------*/
     23 
     24 /**
     25  */ /*!
     26  * \file  gl4cDirectStateAccessBuffersTests.cpp
     27  * \brief Conformance tests for the Direct State Access feature functionality (Buffer access part).
     28  */ /*-----------------------------------------------------------------------------------------------------------*/
     29 
     30 /* Includes. */
     31 #include "gl4cDirectStateAccessTests.hpp"
     32 
     33 #include "deSharedPtr.hpp"
     34 
     35 #include "gluContextInfo.hpp"
     36 #include "gluDefs.hpp"
     37 #include "gluPixelTransfer.hpp"
     38 #include "gluStrUtil.hpp"
     39 
     40 #include "tcuFuzzyImageCompare.hpp"
     41 #include "tcuImageCompare.hpp"
     42 #include "tcuRenderTarget.hpp"
     43 #include "tcuSurface.hpp"
     44 #include "tcuTestLog.hpp"
     45 
     46 #include "glw.h"
     47 #include "glwFunctions.hpp"
     48 
     49 #include <algorithm>
     50 #include <climits>
     51 #include <set>
     52 #include <sstream>
     53 #include <stack>
     54 #include <string>
     55 
     56 /* Scripts have not generated this enum (GL_NV_gpu_multicast / GL_NVX_linked_gpu_multicast is not in the registry gl.xml?). */
     57 #ifndef GL_PER_GPU_STORAGE_BIT_NV
     58 #define GL_PER_GPU_STORAGE_BIT_NV 0x0800
     59 #endif
     60 
     61 namespace gl4cts
     62 {
     63 namespace DirectStateAccess
     64 {
     65 namespace Buffers
     66 {
     67 /******************************** Creation Test Implementation   ********************************/
     68 
     69 /** @brief Creation Test constructor.
     70  *
     71  *  @param [in] context     OpenGL context.
     72  */
     73 CreationTest::CreationTest(deqp::Context& context)
     74 	: deqp::TestCase(context, "buffers_creation", "Buffer Objects Creation Test")
     75 {
     76 	/* Intentionally left blank. */
     77 }
     78 
     79 /** @brief Iterate Creation Test cases.
     80  *
     81  *  @return Iteration result.
     82  */
     83 tcu::TestNode::IterateResult CreationTest::iterate()
     84 {
     85 	/* Shortcut for GL functionality. */
     86 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
     87 
     88 	/* Get context setup. */
     89 	bool is_at_least_gl_45 = (glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::core(4, 5)));
     90 	bool is_arb_direct_state_access = m_context.getContextInfo().isExtensionSupported("GL_ARB_direct_state_access");
     91 
     92 	if ((!is_at_least_gl_45) && (!is_arb_direct_state_access))
     93 	{
     94 		m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "Not Supported");
     95 
     96 		return STOP;
     97 	}
     98 
     99 	/* Running tests. */
    100 	bool is_ok	= true;
    101 	bool is_error = false;
    102 
    103 	/* Buffers' objects */
    104 	static const glw::GLuint buffers_count = 2;
    105 
    106 	glw::GLuint buffers_legacy[buffers_count] = {};
    107 	glw::GLuint buffers_dsa[buffers_count]	= {};
    108 
    109 	try
    110 	{
    111 		/* Check legacy state creation. */
    112 		gl.genBuffers(buffers_count, buffers_legacy);
    113 		GLU_EXPECT_NO_ERROR(gl.getError(), "glGenBuffers have failed");
    114 
    115 		for (glw::GLuint i = 0; i < buffers_count; ++i)
    116 		{
    117 			if (gl.isBuffer(buffers_legacy[i]))
    118 			{
    119 				is_ok = false;
    120 
    121 				/* Log. */
    122 				m_context.getTestContext().getLog()
    123 					<< tcu::TestLog::Message
    124 					<< "GenBuffers has created default objects, but it should create only a names."
    125 					<< tcu::TestLog::EndMessage;
    126 			}
    127 		}
    128 
    129 		/* Check direct state creation. */
    130 		gl.createBuffers(buffers_count, buffers_dsa);
    131 		GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateBuffers have failed");
    132 
    133 		for (glw::GLuint i = 0; i < buffers_count; ++i)
    134 		{
    135 			if (!gl.isBuffer(buffers_dsa[i]))
    136 			{
    137 				is_ok = false;
    138 
    139 				/* Log. */
    140 				m_context.getTestContext().getLog() << tcu::TestLog::Message
    141 													<< "CreateBuffers has not created default objects."
    142 													<< tcu::TestLog::EndMessage;
    143 			}
    144 		}
    145 	}
    146 	catch (...)
    147 	{
    148 		is_ok	= false;
    149 		is_error = true;
    150 	}
    151 
    152 	/* Cleanup. */
    153 	for (glw::GLuint i = 0; i < buffers_count; ++i)
    154 	{
    155 		if (buffers_legacy[i])
    156 		{
    157 			gl.deleteBuffers(1, &buffers_legacy[i]);
    158 
    159 			buffers_legacy[i] = 0;
    160 		}
    161 
    162 		if (buffers_dsa[i])
    163 		{
    164 			gl.deleteBuffers(1, &buffers_dsa[i]);
    165 
    166 			buffers_dsa[i] = 0;
    167 		}
    168 	}
    169 
    170 	/* Errors clean up. */
    171 	while (gl.getError())
    172 		;
    173 
    174 	/* Result's setup. */
    175 	if (is_ok)
    176 	{
    177 		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
    178 	}
    179 	else
    180 	{
    181 		if (is_error)
    182 		{
    183 			m_testCtx.setTestResult(QP_TEST_RESULT_INTERNAL_ERROR, "Error");
    184 		}
    185 		else
    186 		{
    187 			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
    188 		}
    189 	}
    190 
    191 	return STOP;
    192 }
    193 
    194 /******************************** Data Test Implementation   ********************************/
    195 
    196 /** @brief Data Test constructor.
    197  *
    198  *  @param [in] context     OpenGL context.
    199  */
    200 DataTest::DataTest(deqp::Context& context)
    201 	: deqp::TestCase(context, "buffers_data", "Buffer Objects Data Test")
    202 	, m_pNamedBufferData(DE_NULL)
    203 	, m_pNamedBufferSubData(DE_NULL)
    204 	, m_pNamedBufferStorage(DE_NULL)
    205 	, m_pCopyNamedBufferSubData(DE_NULL)
    206 {
    207 	/* Intentionally left blank. */
    208 }
    209 
    210 /** @brief Iterate Data Test cases.
    211  *
    212  *  @return Iteration result.
    213  */
    214 tcu::TestNode::IterateResult DataTest::iterate()
    215 {
    216 	/* Shortcut for GL functionality. */
    217 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
    218 
    219 	/* Get context setup. */
    220 	bool is_at_least_gl_45 = (glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::core(4, 5)));
    221 	bool is_arb_direct_state_access = m_context.getContextInfo().isExtensionSupported("GL_ARB_direct_state_access");
    222 
    223 	if ((!is_at_least_gl_45) && (!is_arb_direct_state_access))
    224 	{
    225 		m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "Not Supported");
    226 
    227 		return STOP;
    228 	}
    229 
    230 	/* Running tests. */
    231 	bool is_ok	= true;
    232 	bool is_error = false;
    233 
    234 	m_pNamedBufferData		  = (PFNGLNAMEDBUFFERDATA)gl.namedBufferData;
    235 	m_pNamedBufferSubData	 = (PFNGLNAMEDBUFFERSUBDATA)gl.namedBufferSubData;
    236 	m_pNamedBufferStorage	 = (PFNGLNAMEDBUFFERSTORAGE)gl.namedBufferStorage;
    237 	m_pCopyNamedBufferSubData = (PFNGLCOPYNAMEDBUFFERSUBDATA)gl.copyNamedBufferSubData;
    238 
    239 	try
    240 	{
    241 		if ((DE_NULL == m_pNamedBufferData) || (DE_NULL == m_pNamedBufferSubData) ||
    242 			(DE_NULL == m_pNamedBufferStorage) || (DE_NULL == m_pCopyNamedBufferSubData))
    243 		{
    244 			throw 0;
    245 		}
    246 
    247 		/* BufferData tests */
    248 		static const glw::GLenum hints[] = { GL_STREAM_DRAW,  GL_STREAM_READ,  GL_STREAM_COPY,
    249 											 GL_STATIC_DRAW,  GL_STATIC_READ,  GL_STATIC_COPY,
    250 											 GL_DYNAMIC_DRAW, GL_DYNAMIC_READ, GL_DYNAMIC_COPY };
    251 		static const glw::GLuint hints_count = sizeof(hints) / sizeof(hints[0]);
    252 
    253 		for (glw::GLuint i = 0; i < hints_count; ++i)
    254 		{
    255 			is_ok &= TestCase(&DataTest::UploadUsingNamedBufferData, hints[i]);
    256 			is_ok &= TestCase(&DataTest::UploadUsingNamedBufferSubData, hints[i]);
    257 			is_ok &= TestCase(&DataTest::UploadUsingCopyNamedBufferSubData, hints[i]);
    258 		}
    259 
    260 		/* BufferStorage Tests */
    261 		static const glw::GLenum bits[] = { GL_MAP_READ_BIT | GL_DYNAMIC_STORAGE_BIT,
    262 											GL_MAP_READ_BIT | GL_MAP_WRITE_BIT, GL_MAP_READ_BIT | GL_MAP_PERSISTENT_BIT,
    263 											GL_MAP_READ_BIT | GL_MAP_COHERENT_BIT | GL_MAP_PERSISTENT_BIT,
    264 											GL_MAP_READ_BIT | GL_CLIENT_STORAGE_BIT };
    265 		static const glw::GLuint bits_count = sizeof(bits) / sizeof(bits[0]);
    266 
    267 		for (glw::GLuint i = 0; i < bits_count; ++i)
    268 		{
    269 			is_ok &= TestCase(&DataTest::UploadUsingNamedBufferStorage, bits[i]);
    270 		}
    271 	}
    272 	catch (...)
    273 	{
    274 		is_ok	= false;
    275 		is_error = true;
    276 	}
    277 
    278 	/* Errors clean up. */
    279 	while (gl.getError())
    280 		;
    281 
    282 	/* Result's setup. */
    283 	if (is_ok)
    284 	{
    285 		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
    286 	}
    287 	else
    288 	{
    289 		if (is_error)
    290 		{
    291 			m_testCtx.setTestResult(QP_TEST_RESULT_INTERNAL_ERROR, "Error");
    292 		}
    293 		else
    294 		{
    295 			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
    296 		}
    297 	}
    298 
    299 	return STOP;
    300 }
    301 
    302 /** @brief Data uploading test case function.
    303  *
    304  *  @param [in] UploadDataFunction      Function pointer to the tested data uploading function.
    305  *  @param [in] parameter               Storage Parameter to be used with the function (function dependent).
    306  *
    307  *  @return True if test case succeeded, false otherwise.
    308  */
    309 bool DataTest::TestCase(void (DataTest::*UploadDataFunction)(glw::GLuint, glw::GLenum), glw::GLenum parameter)
    310 {
    311 	/* Shortcut for GL functionality. */
    312 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
    313 
    314 	glw::GLuint buffer   = 0;
    315 	bool		is_ok	= true;
    316 	bool		is_error = false;
    317 
    318 	try
    319 	{
    320 		gl.createBuffers(1, &buffer);
    321 		GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateBuffers failed.");
    322 
    323 		(this->*UploadDataFunction)(buffer, parameter);
    324 
    325 		gl.bindBuffer(GL_ARRAY_BUFFER, buffer);
    326 		GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer failed.");
    327 
    328 		glw::GLuint* data = (glw::GLuint*)gl.mapBuffer(GL_ARRAY_BUFFER, GL_READ_ONLY);
    329 		GLU_EXPECT_NO_ERROR(gl.getError(), "glMapBuffer failed.");
    330 
    331 		is_ok = compare(data, s_reference, s_reference_count);
    332 
    333 		if (!is_ok)
    334 		{
    335 			LogFail(UploadDataFunction, parameter, data, s_reference, s_reference_count);
    336 		}
    337 
    338 		gl.unmapBuffer(GL_ARRAY_BUFFER);
    339 		GLU_EXPECT_NO_ERROR(gl.getError(), "glUnmapBuffer failed.");
    340 	}
    341 	catch (...)
    342 	{
    343 		is_ok	= false;
    344 		is_error = true;
    345 
    346 		LogError(UploadDataFunction, parameter);
    347 	}
    348 
    349 	if (buffer)
    350 	{
    351 		gl.deleteBuffers(1, &buffer);
    352 		GLU_EXPECT_NO_ERROR(gl.getError(), "glDeleteBuffers failed.");
    353 	}
    354 
    355 	if (is_error)
    356 	{
    357 		throw 0;
    358 	}
    359 
    360 	return is_ok;
    361 }
    362 
    363 /** @brief NamedBufferData data upload function.
    364  *
    365  *  @param [in] id                      Buffer id to be uploaded.
    366  *  @param [in] parameter               Storage Parameter to be used with the function, one of:
    367  *                                       -  GL_STREAM_DRAW,
    368  *                                       -  GL_STREAM_READ,
    369  *                                       -  GL_STREAM_COPY,
    370  *                                       -  GL_STATIC_DRAW,
    371  *                                       -  GL_STATIC_READ,
    372  *                                       -  GL_STATIC_COPY,
    373  *                                       -  GL_DYNAMIC_DRAW,
    374  *                                       -  GL_DYNAMIC_READ and
    375  *                                       -  GL_DYNAMIC_COPY.
    376  */
    377 void DataTest::UploadUsingNamedBufferData(glw::GLuint id, glw::GLenum parameter)
    378 {
    379 	/* Shortcut for GL functionality. */
    380 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
    381 
    382 	m_pNamedBufferData(id, s_reference_size, s_reference, parameter);
    383 	GLU_EXPECT_NO_ERROR(gl.getError(), "glNamedBufferData failed.");
    384 }
    385 
    386 /** @brief NamedBufferSubData data upload function.
    387  *
    388  *  @param [in] id                      Buffer id to be uploaded.
    389  *  @param [in] parameter               Storage parameter to be used with the NamedBufferData for
    390  *                                      the storage allocation (before call to NamedBufferSubData), one of:
    391  *                                       -  GL_STREAM_DRAW,
    392  *                                       -  GL_STREAM_READ,
    393  *                                       -  GL_STREAM_COPY,
    394  *                                       -  GL_STATIC_DRAW,
    395  *                                       -  GL_STATIC_READ,
    396  *                                       -  GL_STATIC_COPY,
    397  *                                       -  GL_DYNAMIC_DRAW,
    398  *                                       -  GL_DYNAMIC_READ and
    399  *                                       -  GL_DYNAMIC_COPY.
    400  */
    401 void DataTest::UploadUsingNamedBufferSubData(glw::GLuint id, glw::GLenum parameter)
    402 {
    403 	/* Shortcut for GL functionality. */
    404 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
    405 
    406 	m_pNamedBufferData(id, s_reference_size, DE_NULL, parameter);
    407 	GLU_EXPECT_NO_ERROR(gl.getError(), "glNamedBufferData failed.");
    408 
    409 	m_pNamedBufferSubData(id, 0, s_reference_size, s_reference);
    410 	GLU_EXPECT_NO_ERROR(gl.getError(), "glNamedBufferSubData failed.");
    411 }
    412 
    413 /** @brief NamedBufferStorage data upload function.
    414  *
    415  *  @param [in] id                      Buffer id to be uploaded.
    416  *  @param [in] parameter               Storage Parameter to be used with the function, one of:
    417  *                                       - GL_MAP_READ_BIT | GL_DYNAMIC_STORAGE_BIT,
    418  *                                       - GL_MAP_READ_BIT | GL_MAP_WRITE_BIT,
    419  *                                       - GL_MAP_READ_BIT | GL_MAP_PERSISTENT_BIT,
    420  *                                       - GL_MAP_READ_BIT | GL_MAP_COHERENT_BIT,
    421  *                                       - GL_MAP_READ_BIT | GL_CLIENT_STORAGE_BIT
    422  */
    423 void DataTest::UploadUsingNamedBufferStorage(glw::GLuint id, glw::GLenum parameter)
    424 {
    425 	/* Shortcut for GL functionality. */
    426 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
    427 
    428 	m_pNamedBufferStorage(id, s_reference_size, s_reference, parameter);
    429 	GLU_EXPECT_NO_ERROR(gl.getError(), "glNamedBufferStorage failed.");
    430 }
    431 
    432 /** @brief CopyNamedBufferSubData data upload function (uses auxiliary buffer object).
    433  *
    434  *  @param [in] id                      Buffer id to be uploaded.
    435  *  @param [in] parameter               Storage parameter to be used with the NamedBufferData for
    436  *                                      the auxiliary buffer object storage allocation
    437  *                                      (before call to CopyNamedBufferSubData), one of:
    438  *                                       -  GL_STREAM_DRAW,
    439  *                                       -  GL_STREAM_READ,
    440  *                                       -  GL_STREAM_COPY,
    441  *                                       -  GL_STATIC_DRAW,
    442  *                                       -  GL_STATIC_READ,
    443  *                                       -  GL_STATIC_COPY,
    444  *                                       -  GL_DYNAMIC_DRAW,
    445  *                                       -  GL_DYNAMIC_READ and
    446  *                                       -  GL_DYNAMIC_COPY.
    447  */
    448 void DataTest::UploadUsingCopyNamedBufferSubData(glw::GLuint id, glw::GLenum parameter)
    449 {
    450 	/* Shortcut for GL functionality. */
    451 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
    452 
    453 	m_pNamedBufferData(id, s_reference_size, DE_NULL, parameter);
    454 	GLU_EXPECT_NO_ERROR(gl.getError(), "glNamedBufferData failed.");
    455 
    456 	glw::GLuint auxiliary_buffer	   = 0;
    457 	bool		auxiliary_buffer_is_ok = true;
    458 
    459 	try
    460 	{
    461 		gl.genBuffers(1, &auxiliary_buffer);
    462 		GLU_EXPECT_NO_ERROR(gl.getError(), "glGenBuffers failed.");
    463 
    464 		gl.bindBuffer(GL_ARRAY_BUFFER, auxiliary_buffer);
    465 		GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer failed.");
    466 
    467 		gl.bufferData(GL_ARRAY_BUFFER, s_reference_size, s_reference, parameter);
    468 		GLU_EXPECT_NO_ERROR(gl.getError(), "glBufferData failed.");
    469 
    470 		m_pCopyNamedBufferSubData(auxiliary_buffer, id, 0, 0, s_reference_size);
    471 		GLU_EXPECT_NO_ERROR(gl.getError(), "glCopyNamedBufferSubData failed.");
    472 	}
    473 	catch (...)
    474 	{
    475 		auxiliary_buffer_is_ok = false;
    476 	}
    477 
    478 	if (auxiliary_buffer)
    479 	{
    480 		gl.deleteBuffers(1, &auxiliary_buffer);
    481 	}
    482 
    483 	if (!auxiliary_buffer_is_ok)
    484 	{
    485 		throw 0;
    486 	}
    487 }
    488 
    489 /** @brief Compare two unsigned integer arrays.
    490  *
    491  *  @param [in] data                    Data to be compared.
    492  *  @param [in] reference               Reference data to be compared to.
    493  *  @param [in] count                   Number of elements to be compared.
    494  *
    495  *  @return True if count of data the elements are equal to reference counterparts, false otherwise.
    496  */
    497 bool DataTest::compare(const glw::GLuint* data, const glw::GLuint* reference, const glw::GLsizei count)
    498 {
    499 	for (glw::GLsizei i = 0; i < count; ++i)
    500 	{
    501 		if (data[i] != reference[i])
    502 		{
    503 			return false;
    504 		}
    505 	}
    506 	return true;
    507 }
    508 
    509 /** @brief Prepare error message and log it.
    510  *
    511  *  @param [in] UploadDataFunction      Upload function pointer which have failed, one of:
    512  *                                       -  DataTest::UploadUsingNamedBufferData,
    513  *                                       -  DataTest::UploadUsingNamedBufferSubData
    514  *                                       -  DataTest::UploadUsingNamedBufferStorage and
    515  *                                       -  DataTest::UploadUsingCopyNamedBufferSubData.
    516  *  @param [in] parameter               Parameter which was passed to function.
    517  *  @param [in] data                    Data which was downloaded.
    518  *  @param [in] reference               Reference data.
    519  *  @param [in] count                   Number of elements compared.
    520  */
    521 void DataTest::LogFail(void (DataTest::*UploadDataFunction)(glw::GLuint, glw::GLenum), glw::GLenum parameter,
    522 					   const glw::GLuint* data, const glw::GLuint* reference, const glw::GLsizei count)
    523 {
    524 	std::string the_log = "The test of ";
    525 
    526 	if (UploadDataFunction == &DataTest::UploadUsingNamedBufferData)
    527 	{
    528 		the_log.append("glNamedBufferData");
    529 	}
    530 	else
    531 	{
    532 		if (UploadDataFunction == &DataTest::UploadUsingNamedBufferSubData)
    533 		{
    534 			the_log.append("glNamedBufferSubData");
    535 		}
    536 		else
    537 		{
    538 			if (UploadDataFunction == &DataTest::UploadUsingNamedBufferStorage)
    539 			{
    540 				the_log.append("glNamedBufferStorage");
    541 			}
    542 			else
    543 			{
    544 				if (UploadDataFunction == &DataTest::UploadUsingCopyNamedBufferSubData)
    545 				{
    546 					the_log.append("glCopyNamedBufferSubData");
    547 				}
    548 				else
    549 				{
    550 					the_log.append("uknown upload function");
    551 				}
    552 			}
    553 		}
    554 	}
    555 
    556 	if (UploadDataFunction == &DataTest::UploadUsingNamedBufferStorage)
    557 	{
    558 		the_log.append(" called with usage parameter ");
    559 
    560 		std::stringstream bitfield_string_stream;
    561 		bitfield_string_stream << glu::getBufferMapFlagsStr(parameter);
    562 		the_log.append(bitfield_string_stream.str());
    563 	}
    564 	else
    565 	{
    566 		the_log.append(" called with usage parameter ");
    567 		the_log.append(glu::getUsageName(parameter));
    568 	}
    569 	the_log.append(". Buffer data is equal to [");
    570 
    571 	for (glw::GLsizei i = 0; i < count; ++i)
    572 	{
    573 		std::stringstream number;
    574 
    575 		number << data[i];
    576 
    577 		the_log.append(number.str());
    578 
    579 		if (i != count - 1)
    580 		{
    581 			the_log.append(", ");
    582 		}
    583 	}
    584 
    585 	the_log.append("], but [");
    586 
    587 	for (glw::GLsizei i = 0; i < count; ++i)
    588 	{
    589 		std::stringstream number;
    590 
    591 		number << reference[i];
    592 
    593 		the_log.append(number.str());
    594 
    595 		if (i != count - 1)
    596 		{
    597 			the_log.append(", ");
    598 		}
    599 	}
    600 
    601 	the_log.append("] was expected.");
    602 
    603 	m_context.getTestContext().getLog() << tcu::TestLog::Message << the_log << tcu::TestLog::EndMessage;
    604 }
    605 
    606 void DataTest::LogError(void (DataTest::*UploadDataFunction)(glw::GLuint, glw::GLenum), glw::GLenum parameter)
    607 {
    608 	std::string the_log = "Unexpected error occurred during the test of ";
    609 
    610 	if (UploadDataFunction == &DataTest::UploadUsingNamedBufferData)
    611 	{
    612 		the_log.append("glNamedBufferData");
    613 	}
    614 	else
    615 	{
    616 		if (UploadDataFunction == &DataTest::UploadUsingNamedBufferSubData)
    617 		{
    618 			the_log.append("glNamedBufferSubData");
    619 		}
    620 		else
    621 		{
    622 			if (UploadDataFunction == &DataTest::UploadUsingNamedBufferStorage)
    623 			{
    624 				the_log.append("glNamedBufferStorage");
    625 			}
    626 			else
    627 			{
    628 				if (UploadDataFunction == &DataTest::UploadUsingCopyNamedBufferSubData)
    629 				{
    630 					the_log.append("glCopyNamedBufferSubData");
    631 				}
    632 				else
    633 				{
    634 					the_log.append("uknown upload function");
    635 				}
    636 			}
    637 		}
    638 	}
    639 
    640 	if (UploadDataFunction == &DataTest::UploadUsingNamedBufferStorage)
    641 	{
    642 		the_log.append(" called with usage parameter ");
    643 
    644 		std::stringstream bitfield_string_stream;
    645 		bitfield_string_stream << glu::getBufferMapFlagsStr(parameter);
    646 		the_log.append(bitfield_string_stream.str());
    647 	}
    648 	else
    649 	{
    650 		the_log.append(" called with usage parameter ");
    651 		the_log.append(glu::getUsageName(parameter));
    652 	}
    653 	the_log.append(".");
    654 
    655 	m_context.getTestContext().getLog() << tcu::TestLog::Message << the_log << tcu::TestLog::EndMessage;
    656 }
    657 
    658 const glw::GLuint DataTest::s_reference[] = {
    659 	0, 1, 2, 4, 8, 16, 64, 128, 256, 512, 1024, 2048, 4096
    660 };																	 //!< Reference data.
    661 const glw::GLsizei DataTest::s_reference_size = sizeof(s_reference); //!< Size of the reference data.
    662 const glw::GLsizei DataTest::s_reference_count =
    663 	s_reference_size / sizeof(s_reference[0]); //!< NUmber of elements of the reference data.
    664 
    665 /******************************** Clear Test Implementation   ********************************/
    666 
    667 /** @brief Data Test constructor.
    668  *
    669  *  @param [in] context     OpenGL context.
    670  */
    671 ClearTest::ClearTest(deqp::Context& context)
    672 	: deqp::TestCase(context, "buffers_clear", "Buffer Objects Clear Test")
    673 	, m_pNamedBufferData(DE_NULL)
    674 	, m_pClearNamedBufferData(DE_NULL)
    675 	, m_pClearNamedBufferSubData(DE_NULL)
    676 {
    677 	/* Intentionally left blank. */
    678 }
    679 
    680 /** @brief ClearNamedBufferData wrapper implementation.
    681  *
    682  *  @note USE_SUB_DATA == false, so ClearNamedBufferData will be used.
    683  *
    684  *  @param [in] buffer                  ID of the buffer to be cleared.
    685  *  @param [in] internalformat          GL internal format for clearing, one of the listed in test class description.
    686  *  @param [in] size                    Size of the data.
    687  *  @param [in] format                  GL Format of the data.
    688  *  @param [in] type                    GL Type of the data element.
    689  *  @param [in] data                    Data to be cleared with.
    690  */
    691 template <>
    692 void ClearTest::ClearNamedBuffer<false>(glw::GLuint buffer, glw::GLenum internalformat, glw::GLsizei size,
    693 										glw::GLenum format, glw::GLenum type, glw::GLvoid* data)
    694 {
    695 	(void)size;
    696 	/* Shortcut for GL functionality. */
    697 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
    698 
    699 	m_pClearNamedBufferData(buffer, internalformat, format, type, data);
    700 	GLU_EXPECT_NO_ERROR(gl.getError(), "glClearNamedBufferData failed.");
    701 }
    702 
    703 /** @brief ClearNamedBufferSubData wrapper implementation.
    704  *
    705  *  @note USE_SUB_DATA == true, so ClearNamedBufferSubData will be used.
    706  *
    707  *  @param [in] buffer                  ID of the buffer to be cleared.
    708  *  @param [in] internalformat          GL internal format for clearing, one of the listed in test class description.
    709  *  @param [in] size                    Size of the data.
    710  *  @param [in] format                  GL Format of the data.
    711  *  @param [in] type                    GL Type of the data element.
    712  *  @param [in] data                    Data to be cleared with.
    713  */
    714 template <>
    715 void ClearTest::ClearNamedBuffer<true>(glw::GLuint buffer, glw::GLenum internalformat, glw::GLsizei size,
    716 									   glw::GLenum format, glw::GLenum type, glw::GLvoid* data)
    717 {
    718 	/* Shortcut for GL functionality. */
    719 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
    720 
    721 	m_pClearNamedBufferSubData(buffer, internalformat, 0, size, format, type, data);
    722 	GLU_EXPECT_NO_ERROR(gl.getError(), "glClearNamedBufferData failed.");
    723 }
    724 
    725 /** @brief Compare two arrays with elements of type T == GLfloat (specialized).
    726  *
    727  *  @param [in] data                    Data to be compared.
    728  *  @param [in] reference               Reference data to be compared to.
    729  *  @param [in] count                   Number of elements to be compared.
    730  *
    731  *  @return True if count of data the elements are equal to reference counterparts, false otherwise.
    732  */
    733 template <>
    734 bool ClearTest::Compare<glw::GLfloat>(const glw::GLfloat* data, const glw::GLfloat* reference, const glw::GLsizei count)
    735 {
    736 	for (glw::GLsizei i = 0; i < count; ++i)
    737 	{
    738 		if (de::abs(data[i] - reference[i]) > 0.00001 /* Precision. */)
    739 		{
    740 			return false;
    741 		}
    742 	}
    743 	return true;
    744 }
    745 
    746 /** @brief Compare two arrays with elements of type T.
    747  *
    748  *  @tparam     T                       Type of data to be compared (anything which is not GLfloat.
    749  *                                      Floating point numbers have another specialized implementation,
    750  *                                      which accounts the precision issues.
    751  *
    752  *  @param [in] data                    Data to be compared.
    753  *  @param [in] reference               Reference data to be compared to.
    754  *  @param [in] count                   Number of elements to be compared.
    755  *
    756  *  @return True if count of data the elements are equal to reference counterparts, false otherwise.
    757  */
    758 template <typename T>
    759 bool ClearTest::Compare(const T* data, const T* reference, const glw::GLsizei count)
    760 {
    761 	for (glw::GLsizei i = 0; i < count; ++i)
    762 	{
    763 		if (data[i] != reference[i])
    764 		{
    765 			return false;
    766 		}
    767 	}
    768 	return true;
    769 }
    770 
    771 /** @brief Prepare error message and log it.
    772  *
    773  *  @tparam     T                       Type of data to which was tested.
    774  *
    775  *  @param [in] internalformat          Internal format used for clearing, one of the listed in test class description.
    776  *  @param [in] data                    Data which was used for clear test.
    777  *  @param [in] reference               Reference data.
    778  *  @param [in] count                   Number of elements to be compared.
    779  */
    780 template <typename T>
    781 void ClearTest::LogFail(bool use_sub_data, glw::GLenum internalformat, const T* data, const T* reference,
    782 						const glw::GLsizei count)
    783 {
    784 	(void)internalformat;
    785 	std::string the_log = "The test of ";
    786 
    787 	if (use_sub_data)
    788 	{
    789 		the_log.append("ClearNamedBufferSubData has failed for internalformat ");
    790 	}
    791 	else
    792 	{
    793 		the_log.append("ClearNamedBufferData has failed for internalformat ");
    794 	}
    795 
    796 	//the_log.append(glu::getPixelFormatName(internalformat));
    797 	the_log.append(". Cleared buffer data is equal to [");
    798 
    799 	for (glw::GLsizei i = 0; i < count; ++i)
    800 	{
    801 		std::stringstream number;
    802 
    803 		number << data[i];
    804 
    805 		the_log.append(number.str());
    806 
    807 		if (i != count - 1)
    808 		{
    809 			the_log.append(", ");
    810 		}
    811 	}
    812 
    813 	the_log.append("], but [");
    814 
    815 	for (glw::GLsizei i = 0; i < count; ++i)
    816 	{
    817 		std::stringstream number;
    818 
    819 		number << reference[i];
    820 
    821 		the_log.append(number.str());
    822 
    823 		if (i != count - 1)
    824 		{
    825 			the_log.append(", ");
    826 		}
    827 	}
    828 
    829 	the_log.append("] was expected.");
    830 
    831 	m_context.getTestContext().getLog() << tcu::TestLog::Message << the_log << tcu::TestLog::EndMessage;
    832 }
    833 
    834 void ClearTest::LogError(bool use_sub_data, glw::GLenum internalformat)
    835 {
    836 	(void)internalformat;
    837 	std::string the_log = "Unexpected error occurred during Test of ";
    838 
    839 	if (use_sub_data)
    840 	{
    841 		the_log.append("ClearNamedBufferSubData with internalformat ");
    842 	}
    843 	else
    844 	{
    845 		the_log.append("ClearNamedBufferData with internalformat ");
    846 	}
    847 
    848 	//the_log.append(glu::getPixelFormatName(internalformat));
    849 
    850 	m_context.getTestContext().getLog() << tcu::TestLog::Message << the_log << tcu::TestLog::EndMessage;
    851 }
    852 
    853 /** @brief Run CLearing test case.
    854  *
    855  *  @tparam     T                       Type of data to which to be tested.
    856  *  @tparam     USE_SUB_DATA            If true ClearNamedBufferSubData will be used, ClearNamedBufferData otherwise.
    857  *
    858  *  @param [in] internalformat          Internal format used for clearing, one of the listed in test class description.
    859  *  @param [in] count                   Number of elements.
    860  *  @param [in] internalformat          Data format to be used for clearing.
    861  *  @param [in] data                    Data to be used with clear test.
    862  *
    863  *  @return True if test case succeeded, false otherwise.
    864  */
    865 template <typename T, bool USE_SUB_DATA>
    866 bool ClearTest::TestClearNamedBufferData(glw::GLenum internalformat, glw::GLsizei count, glw::GLenum format,
    867 										 glw::GLenum type, T* data)
    868 {
    869 	/* Shortcut for GL functionality. */
    870 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
    871 
    872 	glw::GLuint buffer   = 0;
    873 	bool		is_ok	= true;
    874 	bool		is_error = false;
    875 
    876 	try
    877 	{
    878 		gl.createBuffers(1, &buffer);
    879 		GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateBuffers failed.");
    880 
    881 		m_pNamedBufferData(buffer, static_cast<glw::GLsizei>(count * sizeof(T)), NULL, GL_DYNAMIC_COPY);
    882 		GLU_EXPECT_NO_ERROR(gl.getError(), "glNamedBufferData failed.");
    883 
    884 		ClearNamedBuffer<USE_SUB_DATA>(buffer, internalformat, static_cast<glw::GLsizei>(count * sizeof(T)), format,
    885 									   type, data);
    886 
    887 		gl.bindBuffer(GL_ARRAY_BUFFER, buffer);
    888 		GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer failed.");
    889 
    890 		T* _data = (T*)gl.mapBuffer(GL_ARRAY_BUFFER, GL_READ_ONLY);
    891 		GLU_EXPECT_NO_ERROR(gl.getError(), "glMapBuffer failed.");
    892 
    893 		is_ok = Compare<T>(_data, data, count);
    894 
    895 		if (!is_ok)
    896 		{
    897 			/* Log. */
    898 			LogFail<T>(USE_SUB_DATA, internalformat, _data, data, count);
    899 		}
    900 
    901 		gl.unmapBuffer(GL_ARRAY_BUFFER);
    902 		GLU_EXPECT_NO_ERROR(gl.getError(), "glUnmapBuffer failed.");
    903 	}
    904 	catch (...)
    905 	{
    906 		is_ok	= false;
    907 		is_error = true;
    908 
    909 		LogError(USE_SUB_DATA, internalformat);
    910 	}
    911 
    912 	if (buffer)
    913 	{
    914 		gl.deleteBuffers(1, &buffer);
    915 		GLU_EXPECT_NO_ERROR(gl.getError(), "glDeleteBuffers failed.");
    916 	}
    917 
    918 	if (is_error)
    919 	{
    920 		throw 0;
    921 	}
    922 
    923 	return is_ok;
    924 }
    925 
    926 /** @brief Iterate Data Test cases.
    927  *
    928  *  @return Iteration result.
    929  */
    930 tcu::TestNode::IterateResult ClearTest::iterate()
    931 {
    932 	/* Shortcut for GL functionality. */
    933 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
    934 
    935 	/* Get context setup. */
    936 	bool is_at_least_gl_45 = (glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::core(4, 5)));
    937 	bool is_arb_direct_state_access = m_context.getContextInfo().isExtensionSupported("GL_ARB_direct_state_access");
    938 
    939 	if ((!is_at_least_gl_45) && (!is_arb_direct_state_access))
    940 	{
    941 		m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "Not Supported");
    942 
    943 		return STOP;
    944 	}
    945 
    946 	/* Running tests. */
    947 	bool is_ok	= true;
    948 	bool is_error = false;
    949 
    950 	m_pNamedBufferData		   = (PFNGLNAMEDBUFFERDATA)gl.namedBufferData;
    951 	m_pClearNamedBufferData	= (PFNGLCLEARNAMEDBUFFERDATA)gl.clearNamedBufferData;
    952 	m_pClearNamedBufferSubData = (PFNGLCLEARNAMEDBUFFERSUBDATA)gl.clearNamedBufferSubData;
    953 
    954 	try
    955 	{
    956 		if ((DE_NULL == m_pNamedBufferData) || (DE_NULL == m_pClearNamedBufferData) ||
    957 			(DE_NULL == m_pClearNamedBufferSubData))
    958 		{
    959 			throw 0;
    960 		}
    961 
    962 		{
    963 			/* unsigned byte norm component ClearNamedBufferData tests */
    964 			glw::GLubyte reference[4] = { 5, 1, 2, 3 };
    965 
    966 			is_ok &= TestClearNamedBufferData<glw::GLubyte, false>(GL_R8, 1, GL_RED, GL_UNSIGNED_BYTE, reference);
    967 			is_ok &= TestClearNamedBufferData<glw::GLubyte, false>(GL_RG8, 2, GL_RG, GL_UNSIGNED_BYTE, reference);
    968 			is_ok &= TestClearNamedBufferData<glw::GLubyte, false>(GL_RGBA8, 4, GL_RGBA, GL_UNSIGNED_BYTE, reference);
    969 
    970 			/* unsigned byte norm component ClearNamedBufferSubData tests */
    971 			is_ok &= TestClearNamedBufferData<glw::GLubyte, true>(GL_R8, 1, GL_RED, GL_UNSIGNED_BYTE, reference);
    972 			is_ok &= TestClearNamedBufferData<glw::GLubyte, true>(GL_RG8, 2, GL_RG, GL_UNSIGNED_BYTE, reference);
    973 			is_ok &= TestClearNamedBufferData<glw::GLubyte, true>(GL_RGBA8, 4, GL_RGBA, GL_UNSIGNED_BYTE, reference);
    974 
    975 			/* unsigned byte component ClearNamedBufferData tests */
    976 			is_ok &= TestClearNamedBufferData<glw::GLubyte, false>(GL_R8UI, 1, GL_RED_INTEGER, GL_UNSIGNED_BYTE, reference);
    977 			is_ok &= TestClearNamedBufferData<glw::GLubyte, false>(GL_RG8UI, 2, GL_RG_INTEGER, GL_UNSIGNED_BYTE, reference);
    978 			is_ok &= TestClearNamedBufferData<glw::GLubyte, false>(GL_RGBA8UI, 4, GL_RGBA_INTEGER, GL_UNSIGNED_BYTE, reference);
    979 
    980 			/* unsigned byte component ClearNamedBufferSubData tests */
    981 			is_ok &= TestClearNamedBufferData<glw::GLubyte, true>(GL_R8UI, 1, GL_RED_INTEGER, GL_UNSIGNED_BYTE, reference);
    982 			is_ok &= TestClearNamedBufferData<glw::GLubyte, true>(GL_RG8UI, 2, GL_RG_INTEGER, GL_UNSIGNED_BYTE, reference);
    983 			is_ok &= TestClearNamedBufferData<glw::GLubyte, true>(GL_RGBA8UI, 4, GL_RGBA_INTEGER, GL_UNSIGNED_BYTE, reference);
    984 		}
    985 
    986 		{
    987 			/* signed byte component ClearNamedBufferData tests */
    988 			glw::GLbyte reference[4] = { 5, 1, -2, 3 };
    989 
    990 			is_ok &= TestClearNamedBufferData<glw::GLbyte, false>(GL_R8I, 1, GL_RED_INTEGER, GL_BYTE, reference);
    991 			is_ok &= TestClearNamedBufferData<glw::GLbyte, false>(GL_RG8I, 2, GL_RG_INTEGER, GL_BYTE, reference);
    992 			is_ok &= TestClearNamedBufferData<glw::GLbyte, false>(GL_RGBA8I, 4, GL_RGBA_INTEGER, GL_BYTE, reference);
    993 
    994 			/* signed byte component ClearNamedBufferSubData tests */
    995 			is_ok &= TestClearNamedBufferData<glw::GLbyte, true>(GL_R8I, 1, GL_RED_INTEGER, GL_BYTE, reference);
    996 			is_ok &= TestClearNamedBufferData<glw::GLbyte, true>(GL_RG8I, 2, GL_RG_INTEGER, GL_BYTE, reference);
    997 			is_ok &= TestClearNamedBufferData<glw::GLbyte, true>(GL_RGBA8I, 4, GL_RGBA_INTEGER, GL_BYTE, reference);
    998 		}
    999 
   1000 		{
   1001 			/* unsigned short norm component ClearNamedBufferData tests */
   1002 			glw::GLushort reference[4] = { 5, 1, 2, 3 };
   1003 
   1004 			is_ok &= TestClearNamedBufferData<glw::GLushort, false>(GL_R16, 1, GL_RED, GL_UNSIGNED_SHORT, reference);
   1005 			is_ok &= TestClearNamedBufferData<glw::GLushort, false>(GL_RG16, 2, GL_RG, GL_UNSIGNED_SHORT, reference);
   1006 			is_ok &=
   1007 				TestClearNamedBufferData<glw::GLushort, false>(GL_RGBA16, 4, GL_RGBA, GL_UNSIGNED_SHORT, reference);
   1008 
   1009 			/* unsigned short norm component ClearNamedBufferSubData tests */
   1010 			is_ok &= TestClearNamedBufferData<glw::GLushort, true>(GL_R16, 1, GL_RED, GL_UNSIGNED_SHORT, reference);
   1011 			is_ok &= TestClearNamedBufferData<glw::GLushort, true>(GL_RG16, 2, GL_RG, GL_UNSIGNED_SHORT, reference);
   1012 			is_ok &= TestClearNamedBufferData<glw::GLushort, true>(GL_RGBA16, 4, GL_RGBA, GL_UNSIGNED_SHORT, reference);
   1013 
   1014 			/* unsigned short component ClearNamedBufferData tests */
   1015 			is_ok &= TestClearNamedBufferData<glw::GLushort, false>(GL_R16UI, 1, GL_RED_INTEGER, GL_UNSIGNED_SHORT, reference);
   1016 			is_ok &= TestClearNamedBufferData<glw::GLushort, false>(GL_RG16UI, 2, GL_RG_INTEGER, GL_UNSIGNED_SHORT, reference);
   1017 			is_ok &=
   1018 				TestClearNamedBufferData<glw::GLushort, false>(GL_RGBA16UI, 4, GL_RGBA_INTEGER, GL_UNSIGNED_SHORT, reference);
   1019 
   1020 			/* unsigned short component ClearNamedBufferSubData tests */
   1021 			is_ok &= TestClearNamedBufferData<glw::GLushort, true>(GL_R16UI, 1, GL_RED_INTEGER, GL_UNSIGNED_SHORT, reference);
   1022 			is_ok &= TestClearNamedBufferData<glw::GLushort, true>(GL_RG16UI, 2, GL_RG_INTEGER, GL_UNSIGNED_SHORT, reference);
   1023 			is_ok &=
   1024 				TestClearNamedBufferData<glw::GLushort, true>(GL_RGBA16UI, 4, GL_RGBA_INTEGER, GL_UNSIGNED_SHORT, reference);
   1025 		}
   1026 
   1027 		{
   1028 			/* signed short component ClearNamedBufferData tests */
   1029 			glw::GLshort reference[4] = { 5, 1, -2, 3 };
   1030 
   1031 			is_ok &= TestClearNamedBufferData<glw::GLshort, false>(GL_R16I, 1, GL_RED_INTEGER, GL_SHORT, reference);
   1032 			is_ok &= TestClearNamedBufferData<glw::GLshort, false>(GL_RG16I, 2, GL_RG_INTEGER, GL_SHORT, reference);
   1033 			is_ok &= TestClearNamedBufferData<glw::GLshort, false>(GL_RGBA16I, 4, GL_RGBA_INTEGER, GL_SHORT, reference);
   1034 
   1035 			/* signed short component ClearNamedBufferSubData tests */
   1036 			is_ok &= TestClearNamedBufferData<glw::GLshort, true>(GL_R16I, 1, GL_RED_INTEGER, GL_SHORT, reference);
   1037 			is_ok &= TestClearNamedBufferData<glw::GLshort, true>(GL_RG16I, 2, GL_RG_INTEGER, GL_SHORT, reference);
   1038 			is_ok &= TestClearNamedBufferData<glw::GLshort, true>(GL_RGBA16I, 4, GL_RGBA_INTEGER, GL_SHORT, reference);
   1039 		}
   1040 
   1041 		{
   1042 			/* unsigned int component ClearNamedBufferData tests */
   1043 			glw::GLuint reference[4] = { 5, 1, 2, 3 };
   1044 
   1045 			is_ok &= TestClearNamedBufferData<glw::GLuint, false>(GL_R32UI, 1, GL_RED_INTEGER, GL_UNSIGNED_INT, reference);
   1046 			is_ok &= TestClearNamedBufferData<glw::GLuint, false>(GL_RG32UI, 2, GL_RG_INTEGER, GL_UNSIGNED_INT, reference);
   1047 			is_ok &= TestClearNamedBufferData<glw::GLuint, false>(GL_RGB32UI, 3, GL_RGB_INTEGER, GL_UNSIGNED_INT, reference);
   1048 			is_ok &= TestClearNamedBufferData<glw::GLuint, false>(GL_RGBA32UI, 4, GL_RGBA_INTEGER, GL_UNSIGNED_INT, reference);
   1049 
   1050 			/* unsigned int component ClearNamedBufferSubData tests */
   1051 			is_ok &= TestClearNamedBufferData<glw::GLuint, true>(GL_R32UI, 1, GL_RED_INTEGER, GL_UNSIGNED_INT, reference);
   1052 			is_ok &= TestClearNamedBufferData<glw::GLuint, true>(GL_RG32UI, 2, GL_RG_INTEGER, GL_UNSIGNED_INT, reference);
   1053 			is_ok &= TestClearNamedBufferData<glw::GLuint, true>(GL_RGB32UI, 3, GL_RGB_INTEGER, GL_UNSIGNED_INT, reference);
   1054 			is_ok &= TestClearNamedBufferData<glw::GLuint, true>(GL_RGBA32UI, 4, GL_RGBA_INTEGER, GL_UNSIGNED_INT, reference);
   1055 		}
   1056 
   1057 		{
   1058 			/* signed int component ClearNamedBufferData tests */
   1059 			glw::GLint reference[4] = { 5, 1, -2, 3 };
   1060 
   1061 			is_ok &= TestClearNamedBufferData<glw::GLint, false>(GL_R32I, 1, GL_RED_INTEGER, GL_INT, reference);
   1062 			is_ok &= TestClearNamedBufferData<glw::GLint, false>(GL_RG32I, 2, GL_RG_INTEGER, GL_INT, reference);
   1063 			is_ok &= TestClearNamedBufferData<glw::GLint, false>(GL_RGB32I, 3, GL_RGB_INTEGER, GL_INT, reference);
   1064 			is_ok &= TestClearNamedBufferData<glw::GLint, false>(GL_RGBA32I, 4, GL_RGBA_INTEGER, GL_INT, reference);
   1065 
   1066 			/* signed int component ClearNamedBufferSubData tests */
   1067 			is_ok &= TestClearNamedBufferData<glw::GLint, true>(GL_R32I, 1, GL_RED_INTEGER, GL_INT, reference);
   1068 			is_ok &= TestClearNamedBufferData<glw::GLint, true>(GL_RG32I, 2, GL_RG_INTEGER, GL_INT, reference);
   1069 			is_ok &= TestClearNamedBufferData<glw::GLint, true>(GL_RGB32I, 3, GL_RGB_INTEGER, GL_INT, reference);
   1070 			is_ok &= TestClearNamedBufferData<glw::GLint, true>(GL_RGBA32I, 4, GL_RGBA_INTEGER, GL_INT, reference);
   1071 		}
   1072 
   1073 		{
   1074 			/* half float component ClearNamedBufferData tests */
   1075 			glw::GLhalf reference[4] = { 0x3C00 /* 1.0hf */, 0x0000 /* 0.0hf */, 0xC000 /* -2.0hf */,
   1076 										 0x3555 /* 0.333333333hf */ };
   1077 
   1078 			is_ok &= TestClearNamedBufferData<glw::GLhalf, false>(GL_R16F, 1, GL_RED, GL_HALF_FLOAT, reference);
   1079 			is_ok &= TestClearNamedBufferData<glw::GLhalf, false>(GL_RG16F, 2, GL_RG, GL_HALF_FLOAT, reference);
   1080 			is_ok &= TestClearNamedBufferData<glw::GLhalf, false>(GL_RGBA16F, 4, GL_RGBA, GL_HALF_FLOAT, reference);
   1081 
   1082 			/* half float component ClearNamedBufferSubData tests */
   1083 			is_ok &= TestClearNamedBufferData<glw::GLhalf, true>(GL_R16F, 1, GL_RED, GL_HALF_FLOAT, reference);
   1084 			is_ok &= TestClearNamedBufferData<glw::GLhalf, true>(GL_RG16F, 2, GL_RG, GL_HALF_FLOAT, reference);
   1085 			is_ok &= TestClearNamedBufferData<glw::GLhalf, true>(GL_RGBA16F, 4, GL_RGBA, GL_HALF_FLOAT, reference);
   1086 		}
   1087 
   1088 		{
   1089 			/* float component ClearNamedBufferData tests */
   1090 			glw::GLfloat reference[4] = { 1.f, 0.f, -2.f, 0.3333333333f };
   1091 
   1092 			is_ok &= TestClearNamedBufferData<glw::GLfloat, false>(GL_R32F, 1, GL_RED, GL_FLOAT, reference);
   1093 			is_ok &= TestClearNamedBufferData<glw::GLfloat, false>(GL_RG32F, 2, GL_RG, GL_FLOAT, reference);
   1094 			is_ok &= TestClearNamedBufferData<glw::GLfloat, false>(GL_RGB32F, 3, GL_RGB, GL_FLOAT, reference);
   1095 			is_ok &= TestClearNamedBufferData<glw::GLfloat, false>(GL_RGBA32F, 4, GL_RGBA, GL_FLOAT, reference);
   1096 
   1097 			/* float component ClearNamedBufferSubData tests */
   1098 			is_ok &= TestClearNamedBufferData<glw::GLfloat, true>(GL_R32F, 1, GL_RED, GL_FLOAT, reference);
   1099 			is_ok &= TestClearNamedBufferData<glw::GLfloat, true>(GL_RG32F, 2, GL_RG, GL_FLOAT, reference);
   1100 			is_ok &= TestClearNamedBufferData<glw::GLfloat, true>(GL_RGB32F, 3, GL_RGB, GL_FLOAT, reference);
   1101 			is_ok &= TestClearNamedBufferData<glw::GLfloat, true>(GL_RGBA32F, 4, GL_RGBA, GL_FLOAT, reference);
   1102 		}
   1103 	}
   1104 	catch (...)
   1105 	{
   1106 		is_ok	= false;
   1107 		is_error = true;
   1108 	}
   1109 
   1110 	/* Errors clean up. */
   1111 	while (gl.getError())
   1112 		;
   1113 
   1114 	/* Result's setup. */
   1115 	if (is_ok)
   1116 	{
   1117 		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
   1118 	}
   1119 	else
   1120 	{
   1121 		if (is_error)
   1122 		{
   1123 			m_testCtx.setTestResult(QP_TEST_RESULT_INTERNAL_ERROR, "Error");
   1124 		}
   1125 		else
   1126 		{
   1127 			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
   1128 		}
   1129 	}
   1130 
   1131 	return STOP;
   1132 }
   1133 
   1134 /******************************** Map Read Only Test Implementation   ********************************/
   1135 
   1136 /** @brief Map Read Only Test constructor.
   1137  *
   1138  *  @param [in] context     OpenGL context.
   1139  */
   1140 MapReadOnlyTest::MapReadOnlyTest(deqp::Context& context)
   1141 	: deqp::TestCase(context, "buffers_map_read_only", "Buffer Objects Map Read Only Test")
   1142 	, m_pNamedBufferData(DE_NULL)
   1143 	, m_pMapNamedBuffer(DE_NULL)
   1144 	, m_pUnmapNamedBuffer(DE_NULL)
   1145 {
   1146 	/* Intentionally left blank. */
   1147 }
   1148 
   1149 /** @brief Iterate Map Read Only Test cases.
   1150  *
   1151  *  @return Iteration result.
   1152  */
   1153 tcu::TestNode::IterateResult MapReadOnlyTest::iterate()
   1154 {
   1155 	/* Shortcut for GL functionality. */
   1156 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
   1157 
   1158 	/* Get context setup. */
   1159 	bool is_at_least_gl_45 = (glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::core(4, 5)));
   1160 	bool is_arb_direct_state_access = m_context.getContextInfo().isExtensionSupported("GL_ARB_direct_state_access");
   1161 
   1162 	if ((!is_at_least_gl_45) && (!is_arb_direct_state_access))
   1163 	{
   1164 		m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "Not Supported");
   1165 
   1166 		return STOP;
   1167 	}
   1168 
   1169 	/* Running tests. */
   1170 	bool is_ok	= true;
   1171 	bool is_error = false;
   1172 
   1173 	glw::GLuint buffer = 0;
   1174 
   1175 	m_pNamedBufferData  = (PFNGLNAMEDBUFFERDATA)gl.namedBufferData;
   1176 	m_pMapNamedBuffer   = (PFNGLMAPNAMEDBUFFER)gl.mapNamedBuffer;
   1177 	m_pUnmapNamedBuffer = (PFNGLUNMAPNAMEDBUFFER)gl.unmapNamedBuffer;
   1178 
   1179 	try
   1180 	{
   1181 		if ((DE_NULL == m_pNamedBufferData) || (DE_NULL == m_pMapNamedBuffer) || (DE_NULL == m_pUnmapNamedBuffer))
   1182 		{
   1183 			throw 0;
   1184 		}
   1185 
   1186 		/* Buffer creation. */
   1187 		gl.createBuffers(1, &buffer);
   1188 		GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateBuffers failed.");
   1189 
   1190 		/* Buffer's storage allocation and reference data upload. */
   1191 		m_pNamedBufferData(buffer, s_reference_size, s_reference, GL_DYNAMIC_COPY);
   1192 		GLU_EXPECT_NO_ERROR(gl.getError(), "glNamedBufferData failed.");
   1193 
   1194 		/* Mapping with new named buffer map function. */
   1195 		glw::GLuint* data = (glw::GLuint*)m_pMapNamedBuffer(buffer, GL_READ_ONLY);
   1196 		GLU_EXPECT_NO_ERROR(gl.getError(), "glMapNamedBuffer failed.");
   1197 
   1198 		if (DE_NULL == data)
   1199 		{
   1200 			/* Log. */
   1201 			m_context.getTestContext().getLog()
   1202 				<< tcu::TestLog::Message << "glMapNamedBuffer returned NULL pointer, but buffer's data was expected."
   1203 				<< tcu::TestLog::EndMessage;
   1204 		}
   1205 		else
   1206 		{
   1207 			/* Comparison results with reference data. */
   1208 			for (glw::GLsizei i = 0; i < s_reference_count; ++i)
   1209 			{
   1210 				is_ok &= (data[i] == s_reference[i]);
   1211 			}
   1212 
   1213 			if (!is_ok)
   1214 			{
   1215 				/* Log. */
   1216 				m_context.getTestContext().getLog()
   1217 					<< tcu::TestLog::Message
   1218 					<< "glMapNamedBuffer returned pointer to data which is not identical to reference data."
   1219 					<< tcu::TestLog::EndMessage;
   1220 			}
   1221 
   1222 			/* Unmapping with new named buffer unmap function. */
   1223 			if (GL_TRUE != m_pUnmapNamedBuffer(buffer))
   1224 			{
   1225 				is_ok = false;
   1226 
   1227 				/* Log. */
   1228 				m_context.getTestContext().getLog()
   1229 					<< tcu::TestLog::Message
   1230 					<< "glUnmapNamedBuffer called on mapped buffer has returned GL_FALSE, but GL_TRUE was expected."
   1231 					<< tcu::TestLog::EndMessage;
   1232 			}
   1233 			GLU_EXPECT_NO_ERROR(gl.getError(), "glUnmapNamedBuffer failed.");
   1234 		}
   1235 	}
   1236 	catch (...)
   1237 	{
   1238 		is_ok	= false;
   1239 		is_error = true;
   1240 	}
   1241 
   1242 	/* Clean up. */
   1243 	if (buffer)
   1244 	{
   1245 		gl.deleteBuffers(1, &buffer);
   1246 
   1247 		buffer = false;
   1248 	}
   1249 
   1250 	/* Errors clean up. */
   1251 	while (gl.getError())
   1252 		;
   1253 
   1254 	/* Result's setup. */
   1255 	if (is_ok)
   1256 	{
   1257 		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
   1258 	}
   1259 	else
   1260 	{
   1261 		if (is_error)
   1262 		{
   1263 			m_testCtx.setTestResult(QP_TEST_RESULT_INTERNAL_ERROR, "Error");
   1264 		}
   1265 		else
   1266 		{
   1267 			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
   1268 		}
   1269 	}
   1270 
   1271 	return STOP;
   1272 }
   1273 
   1274 const glw::GLuint  MapReadOnlyTest::s_reference[]	 = { 0, 1, 2, 4, 8, 16, 64, 128, 256, 512, 1024, 2048, 4096 };
   1275 const glw::GLsizei MapReadOnlyTest::s_reference_size  = sizeof(s_reference);
   1276 const glw::GLsizei MapReadOnlyTest::s_reference_count = s_reference_size / sizeof(s_reference[0]);
   1277 
   1278 /******************************** Map Read Write Test Implementation   ********************************/
   1279 
   1280 /** @brief Map Read Write Test constructor.
   1281  *
   1282  *  @param [in] context     OpenGL context.
   1283  */
   1284 MapReadWriteTest::MapReadWriteTest(deqp::Context& context)
   1285 	: deqp::TestCase(context, "buffers_map_read_write", "Buffer Objects Map Read Write Test")
   1286 	, m_pNamedBufferData(DE_NULL)
   1287 	, m_pMapNamedBuffer(DE_NULL)
   1288 	, m_pUnmapNamedBuffer(DE_NULL)
   1289 {
   1290 	/* Intentionally left blank. */
   1291 }
   1292 
   1293 /** @brief Iterate Map Read Write Test cases.
   1294  *
   1295  *  @return Iteration result.
   1296  */
   1297 tcu::TestNode::IterateResult MapReadWriteTest::iterate()
   1298 {
   1299 	/* Shortcut for GL functionality. */
   1300 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
   1301 
   1302 	/* Get context setup. */
   1303 	bool is_at_least_gl_45 = (glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::core(4, 5)));
   1304 	bool is_arb_direct_state_access = m_context.getContextInfo().isExtensionSupported("GL_ARB_direct_state_access");
   1305 
   1306 	if ((!is_at_least_gl_45) && (!is_arb_direct_state_access))
   1307 	{
   1308 		m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "Not Supported");
   1309 
   1310 		return STOP;
   1311 	}
   1312 
   1313 	/* Running tests. */
   1314 	bool is_ok	= true;
   1315 	bool is_error = false;
   1316 
   1317 	glw::GLuint buffer = 0;
   1318 
   1319 	m_pNamedBufferData  = (PFNGLNAMEDBUFFERDATA)gl.namedBufferData;
   1320 	m_pMapNamedBuffer   = (PFNGLMAPNAMEDBUFFER)gl.mapNamedBuffer;
   1321 	m_pUnmapNamedBuffer = (PFNGLUNMAPNAMEDBUFFER)gl.unmapNamedBuffer;
   1322 
   1323 	try
   1324 	{
   1325 		if ((DE_NULL == m_pNamedBufferData) || (DE_NULL == m_pMapNamedBuffer) || (DE_NULL == m_pUnmapNamedBuffer))
   1326 		{
   1327 			throw 0;
   1328 		}
   1329 
   1330 		/* Buffer creation. */
   1331 		gl.createBuffers(1, &buffer);
   1332 		GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateBuffers failed.");
   1333 
   1334 		/* Buffer's storage allocation and reference data upload. */
   1335 		m_pNamedBufferData(buffer, s_reference_size, s_reference, GL_DYNAMIC_COPY);
   1336 		GLU_EXPECT_NO_ERROR(gl.getError(), "glNamedBufferData failed.");
   1337 
   1338 		/* Mapping with new named buffer map function. */
   1339 		glw::GLuint* data = (glw::GLuint*)m_pMapNamedBuffer(buffer, GL_READ_WRITE);
   1340 		GLU_EXPECT_NO_ERROR(gl.getError(), "glMapNamedBuffer failed.");
   1341 
   1342 		if (DE_NULL == data)
   1343 		{
   1344 			/* Log. */
   1345 			m_context.getTestContext().getLog()
   1346 				<< tcu::TestLog::Message << "glMapNamedBuffer returned NULL pointer, but buffer's data was expected."
   1347 				<< tcu::TestLog::EndMessage;
   1348 		}
   1349 		else
   1350 		{
   1351 			/* Comparison results with reference data. */
   1352 			for (glw::GLsizei i = 0; i < s_reference_count; ++i)
   1353 			{
   1354 				is_ok &= (data[i] == s_reference[i]);
   1355 			}
   1356 
   1357 			if (!is_ok)
   1358 			{
   1359 				/* Log. */
   1360 				m_context.getTestContext().getLog()
   1361 					<< tcu::TestLog::Message
   1362 					<< "glMapNamedBuffer returned pointer to data which is not identical to reference data."
   1363 					<< tcu::TestLog::EndMessage;
   1364 			}
   1365 
   1366 			/* Writting inverted reference data. */
   1367 			for (glw::GLsizei i = 0; i < s_reference_count; ++i)
   1368 			{
   1369 				data[i] = s_reference[s_reference_count - i - 1];
   1370 			}
   1371 
   1372 			/* Unmapping with new named buffer unmap function. */
   1373 			if (GL_TRUE != m_pUnmapNamedBuffer(buffer))
   1374 			{
   1375 				is_ok = false;
   1376 
   1377 				/* Log. */
   1378 				m_context.getTestContext().getLog()
   1379 					<< tcu::TestLog::Message
   1380 					<< "glUnmapNamedBuffer called on mapped buffer has returned GL_FALSE, but GL_TRUE was expected."
   1381 					<< tcu::TestLog::EndMessage;
   1382 			}
   1383 			GLU_EXPECT_NO_ERROR(gl.getError(), "glUnmapNamedBuffer failed.");
   1384 
   1385 			data = DE_NULL;
   1386 
   1387 			data = (glw::GLuint*)m_pMapNamedBuffer(buffer, GL_READ_WRITE);
   1388 			GLU_EXPECT_NO_ERROR(gl.getError(), "glMapNamedBuffer failed.");
   1389 
   1390 			if (DE_NULL == data)
   1391 			{
   1392 				/* Log. */
   1393 				m_context.getTestContext().getLog()
   1394 					<< tcu::TestLog::Message
   1395 					<< "glMapNamedBuffer returned NULL pointer, but buffer's data was expected."
   1396 					<< tcu::TestLog::EndMessage;
   1397 			}
   1398 			else
   1399 			{
   1400 				/* Comparison results with inverted reference data. */
   1401 				for (glw::GLsizei i = 0; i < s_reference_count; ++i)
   1402 				{
   1403 					is_ok &= (data[i] == s_reference[s_reference_count - i - 1]);
   1404 				}
   1405 
   1406 				/* Unmapping with new named buffer unmap function. */
   1407 				if (GL_TRUE != m_pUnmapNamedBuffer(buffer))
   1408 				{
   1409 					is_ok = false;
   1410 
   1411 					/* Log. */
   1412 					m_context.getTestContext().getLog()
   1413 						<< tcu::TestLog::Message
   1414 						<< "glUnmapNamedBuffer called on mapped buffer has returned GL_FALSE, but GL_TRUE was expected."
   1415 						<< tcu::TestLog::EndMessage;
   1416 				}
   1417 				GLU_EXPECT_NO_ERROR(gl.getError(), "glUnmapNamedBuffer failed.");
   1418 			}
   1419 		}
   1420 	}
   1421 	catch (...)
   1422 	{
   1423 		is_ok	= false;
   1424 		is_error = true;
   1425 	}
   1426 
   1427 	/* Clean up. */
   1428 	if (buffer)
   1429 	{
   1430 		gl.deleteBuffers(1, &buffer);
   1431 
   1432 		buffer = false;
   1433 	}
   1434 
   1435 	/* Errors clean up. */
   1436 	while (gl.getError())
   1437 		;
   1438 
   1439 	/* Result's setup. */
   1440 	if (is_ok)
   1441 	{
   1442 		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
   1443 	}
   1444 	else
   1445 	{
   1446 		if (is_error)
   1447 		{
   1448 			m_testCtx.setTestResult(QP_TEST_RESULT_INTERNAL_ERROR, "Error");
   1449 		}
   1450 		else
   1451 		{
   1452 			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
   1453 		}
   1454 	}
   1455 
   1456 	return STOP;
   1457 }
   1458 
   1459 const glw::GLuint MapReadWriteTest::s_reference[] = {
   1460 	0, 1, 2, 4, 8, 16, 64, 128, 256, 512, 1024, 2048, 4096
   1461 };																			 //!< Reference data.
   1462 const glw::GLsizei MapReadWriteTest::s_reference_size = sizeof(s_reference); //!< Reference data size.
   1463 const glw::GLsizei MapReadWriteTest::s_reference_count =
   1464 	s_reference_size / sizeof(s_reference[0]); //!< Reference data elements' count.
   1465 
   1466 /******************************** Map Write Only Test Implementation   ********************************/
   1467 
   1468 /** @brief Map Write Only Test constructor.
   1469  *
   1470  *  @param [in] context     OpenGL context.
   1471  */
   1472 MapWriteOnlyTest::MapWriteOnlyTest(deqp::Context& context)
   1473 	: deqp::TestCase(context, "buffers_map_write_only", "Buffer Objects Map Write Only Test")
   1474 	, m_pNamedBufferData(DE_NULL)
   1475 	, m_pMapNamedBuffer(DE_NULL)
   1476 	, m_pUnmapNamedBuffer(DE_NULL)
   1477 {
   1478 	/* Intentionally left blank. */
   1479 }
   1480 
   1481 /** @brief Iterate Map Write Only Test cases.
   1482  *
   1483  *  @return Iteration result.
   1484  */
   1485 tcu::TestNode::IterateResult MapWriteOnlyTest::iterate()
   1486 {
   1487 	/* Shortcut for GL functionality. */
   1488 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
   1489 
   1490 	/* Get context setup. */
   1491 	bool is_at_least_gl_45 = (glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::core(4, 5)));
   1492 	bool is_arb_direct_state_access = m_context.getContextInfo().isExtensionSupported("GL_ARB_direct_state_access");
   1493 
   1494 	if ((!is_at_least_gl_45) && (!is_arb_direct_state_access))
   1495 	{
   1496 		m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "Not Supported");
   1497 
   1498 		return STOP;
   1499 	}
   1500 
   1501 	/* Running tests. */
   1502 	bool is_ok	= true;
   1503 	bool is_error = false;
   1504 
   1505 	glw::GLuint buffer = 0;
   1506 
   1507 	m_pNamedBufferData  = (PFNGLNAMEDBUFFERDATA)gl.namedBufferData;
   1508 	m_pMapNamedBuffer   = (PFNGLMAPNAMEDBUFFER)gl.mapNamedBuffer;
   1509 	m_pUnmapNamedBuffer = (PFNGLUNMAPNAMEDBUFFER)gl.unmapNamedBuffer;
   1510 
   1511 	try
   1512 	{
   1513 		if ((DE_NULL == m_pNamedBufferData) || (DE_NULL == m_pMapNamedBuffer) || (DE_NULL == m_pUnmapNamedBuffer))
   1514 		{
   1515 			throw 0;
   1516 		}
   1517 
   1518 		/* Buffer creation. */
   1519 		gl.createBuffers(1, &buffer);
   1520 		GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateBuffers failed.");
   1521 
   1522 		/* Buffer's storage allocation. */
   1523 		m_pNamedBufferData(buffer, s_reference_size, NULL, GL_DYNAMIC_COPY);
   1524 		GLU_EXPECT_NO_ERROR(gl.getError(), "glNamedBufferData failed.");
   1525 
   1526 		/* Mapping with new named buffer map function. */
   1527 		glw::GLuint* data = (glw::GLuint*)m_pMapNamedBuffer(buffer, GL_WRITE_ONLY);
   1528 		GLU_EXPECT_NO_ERROR(gl.getError(), "glMapNamedBuffer failed.");
   1529 
   1530 		if (DE_NULL == data)
   1531 		{
   1532 			/* Log. */
   1533 			m_context.getTestContext().getLog()
   1534 				<< tcu::TestLog::Message << "glMapNamedBuffer returned NULL pointer, but buffer's data was expected."
   1535 				<< tcu::TestLog::EndMessage;
   1536 		}
   1537 		else
   1538 		{
   1539 			/* Reference data upload. */
   1540 			for (glw::GLsizei i = 0; i < s_reference_count; ++i)
   1541 			{
   1542 				data[i] = s_reference[i];
   1543 			}
   1544 
   1545 			/* Unmapping with new named buffer unmap function. */
   1546 			if (GL_TRUE != m_pUnmapNamedBuffer(buffer))
   1547 			{
   1548 				is_ok = false;
   1549 
   1550 				/* Log. */
   1551 				m_context.getTestContext().getLog()
   1552 					<< tcu::TestLog::Message
   1553 					<< "glUnmapNamedBuffer called on mapped buffer has returned GL_FALSE, but GL_TRUE was expected."
   1554 					<< tcu::TestLog::EndMessage;
   1555 			}
   1556 			GLU_EXPECT_NO_ERROR(gl.getError(), "glUnmapNamedBuffer failed.");
   1557 
   1558 			/* Mapping data, the old way. */
   1559 			gl.bindBuffer(GL_ARRAY_BUFFER, buffer);
   1560 			GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer failed.");
   1561 
   1562 			data = DE_NULL;
   1563 
   1564 			data = (glw::GLuint*)gl.mapBuffer(GL_ARRAY_BUFFER, GL_READ_ONLY);
   1565 			GLU_EXPECT_NO_ERROR(gl.getError(), "glMapBuffer failed.");
   1566 
   1567 			/* Comparison results with reference data. */
   1568 			for (glw::GLsizei i = 0; i < s_reference_count; ++i)
   1569 			{
   1570 				is_ok &= (data[i] == s_reference[i]);
   1571 			}
   1572 
   1573 			if (!is_ok)
   1574 			{
   1575 				/* Log. */
   1576 				m_context.getTestContext().getLog()
   1577 					<< tcu::TestLog::Message
   1578 					<< "glMapNamedBuffer, called with GL_WRITE_ONLY access flag, had not stored the reference data."
   1579 					<< tcu::TestLog::EndMessage;
   1580 			}
   1581 
   1582 			gl.unmapBuffer(GL_ARRAY_BUFFER);
   1583 			GLU_EXPECT_NO_ERROR(gl.getError(), "glUnmapBuffer failed.");
   1584 		}
   1585 	}
   1586 	catch (...)
   1587 	{
   1588 		is_ok	= false;
   1589 		is_error = true;
   1590 	}
   1591 
   1592 	/* Clean up. */
   1593 	if (buffer)
   1594 	{
   1595 		gl.deleteBuffers(1, &buffer);
   1596 
   1597 		buffer = false;
   1598 	}
   1599 
   1600 	/* Errors clean up. */
   1601 	while (gl.getError())
   1602 		;
   1603 
   1604 	/* Result's setup. */
   1605 	if (is_ok)
   1606 	{
   1607 		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
   1608 	}
   1609 	else
   1610 	{
   1611 		if (is_error)
   1612 		{
   1613 			m_testCtx.setTestResult(QP_TEST_RESULT_INTERNAL_ERROR, "Error");
   1614 		}
   1615 		else
   1616 		{
   1617 			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
   1618 		}
   1619 	}
   1620 
   1621 	return STOP;
   1622 }
   1623 
   1624 const glw::GLuint MapWriteOnlyTest::s_reference[] = {
   1625 	0, 1, 2, 4, 8, 16, 64, 128, 256, 512, 1024, 2048, 4096
   1626 };																			 //!< Reference data.
   1627 const glw::GLsizei MapWriteOnlyTest::s_reference_size = sizeof(s_reference); //!< Reference data size.
   1628 const glw::GLsizei MapWriteOnlyTest::s_reference_count =
   1629 	s_reference_size / sizeof(s_reference[0]); //!< Reference data elements' count.
   1630 
   1631 /******************************** Buffers Range Map Read Bit Test Implementation   ********************************/
   1632 
   1633 /** @brief Buffers Range Map Read Bit Test constructor.
   1634  *
   1635  *  @param [in] context     OpenGL context.
   1636  */
   1637 MapRangeReadBitTest::MapRangeReadBitTest(deqp::Context& context)
   1638 	: deqp::TestCase(context, "buffers_map_range_read_bit", "Buffer Objects Map Range Read Bit Test")
   1639 	, m_pNamedBufferStorage(DE_NULL)
   1640 	, m_pMapNamedBufferRange(DE_NULL)
   1641 	, m_pUnmapNamedBuffer(DE_NULL)
   1642 {
   1643 	/* Intentionally left blank. */
   1644 }
   1645 
   1646 /** @brief Iterate Buffers Range Map Read Bit Test cases.
   1647  *
   1648  *  @return Iteration result.
   1649  */
   1650 tcu::TestNode::IterateResult MapRangeReadBitTest::iterate()
   1651 {
   1652 	/* Shortcut for GL functionality. */
   1653 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
   1654 
   1655 	/* Get context setup. */
   1656 	bool is_at_least_gl_45 = (glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::core(4, 5)));
   1657 	bool is_arb_direct_state_access = m_context.getContextInfo().isExtensionSupported("GL_ARB_direct_state_access");
   1658 
   1659 	if ((!is_at_least_gl_45) && (!is_arb_direct_state_access))
   1660 	{
   1661 		m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "Not Supported");
   1662 
   1663 		return STOP;
   1664 	}
   1665 
   1666 	/* Running tests. */
   1667 	bool is_ok	= true;
   1668 	bool is_error = false;
   1669 
   1670 	glw::GLuint buffer = 0;
   1671 
   1672 	m_pNamedBufferStorage  = (PFNGLNAMEDBUFFERSTORAGE)gl.namedBufferStorage;
   1673 	m_pMapNamedBufferRange = (PFNGLMAPNAMEDBUFFERRANGE)gl.mapNamedBufferRange;
   1674 	m_pUnmapNamedBuffer	= (PFNGLUNMAPNAMEDBUFFER)gl.unmapNamedBuffer;
   1675 
   1676 	try
   1677 	{
   1678 		if ((DE_NULL == m_pNamedBufferStorage) || (DE_NULL == m_pMapNamedBufferRange) ||
   1679 			(DE_NULL == m_pUnmapNamedBuffer))
   1680 		{
   1681 			throw 0;
   1682 		}
   1683 
   1684 		glw::GLbitfield access_flags[] = { GL_MAP_READ_BIT, GL_MAP_READ_BIT | GL_MAP_PERSISTENT_BIT,
   1685 										   GL_MAP_READ_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT };
   1686 
   1687 		glw::GLuint access_flags_count = sizeof(access_flags) / sizeof(access_flags[0]);
   1688 
   1689 		for (glw::GLuint i = 0; i < access_flags_count; ++i)
   1690 		{
   1691 			/* Buffer creation. */
   1692 			gl.createBuffers(1, &buffer);
   1693 			GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateBuffers failed.");
   1694 
   1695 			/* Buffer's storage allocation and reference data upload. */
   1696 			m_pNamedBufferStorage(buffer, s_reference_size, s_reference, access_flags[i]);
   1697 			GLU_EXPECT_NO_ERROR(gl.getError(), "glNamedBufferData failed.");
   1698 
   1699 			/* Mapping with first half of named buffer. */
   1700 			glw::GLuint* data = (glw::GLuint*)m_pMapNamedBufferRange(buffer, 0, s_reference_size / 2, access_flags[i]);
   1701 			GLU_EXPECT_NO_ERROR(gl.getError(), "glMapNamedBufferRange failed.");
   1702 
   1703 			/* Check with reference. */
   1704 			is_ok &= CompareWithReference(data, 0, s_reference_size / 2);
   1705 
   1706 			/* Unmapping with new named buffer unmap function. */
   1707 			m_pUnmapNamedBuffer(buffer);
   1708 			GLU_EXPECT_NO_ERROR(gl.getError(), "glUnmapNamedBuffer failed.");
   1709 
   1710 			/* Mapping with second half of named buffer. */
   1711 			data = (glw::GLuint*)m_pMapNamedBufferRange(buffer, s_reference_size / 2, s_reference_size / 2,
   1712 														access_flags[i]);
   1713 			GLU_EXPECT_NO_ERROR(gl.getError(), "glMapNamedBufferRange failed.");
   1714 
   1715 			/* Check with reference. */
   1716 			is_ok &= CompareWithReference(data, s_reference_size / 2, s_reference_size / 2);
   1717 
   1718 			/* Unmapping with new named buffer unmap function. */
   1719 			m_pUnmapNamedBuffer(buffer);
   1720 			GLU_EXPECT_NO_ERROR(gl.getError(), "glUnmapNamedBuffer failed.");
   1721 
   1722 			/* Clean up. */
   1723 			if (buffer)
   1724 			{
   1725 				gl.deleteBuffers(1, &buffer);
   1726 
   1727 				buffer = 0;
   1728 			}
   1729 		}
   1730 	}
   1731 	catch (...)
   1732 	{
   1733 		is_ok	= false;
   1734 		is_error = true;
   1735 	}
   1736 
   1737 	/* Clean up. */
   1738 	if (buffer)
   1739 	{
   1740 		gl.deleteBuffers(1, &buffer);
   1741 
   1742 		buffer = 0;
   1743 	}
   1744 
   1745 	/* Errors clean up. */
   1746 	while (gl.getError())
   1747 		;
   1748 
   1749 	/* Result's setup. */
   1750 	if (is_ok)
   1751 	{
   1752 		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
   1753 	}
   1754 	else
   1755 	{
   1756 		if (is_error)
   1757 		{
   1758 			m_testCtx.setTestResult(QP_TEST_RESULT_INTERNAL_ERROR, "Error");
   1759 		}
   1760 		else
   1761 		{
   1762 			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
   1763 		}
   1764 	}
   1765 
   1766 	return STOP;
   1767 }
   1768 
   1769 /** @brief Compare array of unsigned integers with subrange of reference values (s_reference).
   1770  *
   1771  *  @param [in] data        Data to be compared.
   1772  *  @param [in] offset      Offset in the reference data.
   1773  *  @param [in] length      Length of the data to be compared.
   1774  *
   1775  *  @return True if comparison succeeded, false otherwise.
   1776  */
   1777 bool MapRangeReadBitTest::CompareWithReference(glw::GLuint* data, glw::GLintptr offset, glw::GLsizei length)
   1778 {
   1779 	if (DE_NULL == data)
   1780 	{
   1781 		/* Log. */
   1782 		m_context.getTestContext().getLog()
   1783 			<< tcu::TestLog::Message << "glMapNamedBufferRange called with offset " << offset << " and length "
   1784 			<< length << " returned NULL pointer, but buffer's data was expected." << tcu::TestLog::EndMessage;
   1785 	}
   1786 	else
   1787 	{
   1788 		glw::GLuint start = static_cast<glw::GLuint>((offset) / sizeof(s_reference[0]));
   1789 		glw::GLuint end   = static_cast<glw::GLuint>((offset + length) / sizeof(s_reference[0]));
   1790 
   1791 		/* Comparison results with reference data. */
   1792 		for (glw::GLuint i = start; i < end; ++i)
   1793 		{
   1794 #if (DE_COMPILER == DE_COMPILER_GCC)
   1795 #pragma GCC diagnostic push
   1796 #pragma GCC diagnostic ignored "-Warray-bounds"
   1797 #endif
   1798 			if (data[i - start] != s_reference[i])
   1799 			{
   1800 				/* Log. */
   1801 				m_context.getTestContext().getLog()
   1802 					<< tcu::TestLog::Message << "glMapNamedBufferRange called with offset " << offset << " and length "
   1803 					<< length << " returned pointer to data which is not identical to reference data."
   1804 					<< tcu::TestLog::EndMessage;
   1805 
   1806 				return false;
   1807 			}
   1808 #if (DE_COMPILER == DE_COMPILER_GCC)
   1809 #pragma GCC diagnostic pop
   1810 #endif
   1811 		}
   1812 	}
   1813 
   1814 	return true;
   1815 }
   1816 
   1817 const glw::GLuint MapRangeReadBitTest::s_reference[] = {
   1818 	1, 2, 4, 8, 16, 64, 128, 256, 512, 1024, 2048, 4096
   1819 };																				//!< Reference data.
   1820 const glw::GLsizei MapRangeReadBitTest::s_reference_size = sizeof(s_reference); //!< Reference data size.
   1821 const glw::GLsizei MapRangeReadBitTest::s_reference_count =
   1822 	s_reference_size / sizeof(s_reference[0]); //!< Reference data elements' count.
   1823 
   1824 /******************************** Buffers Range Map Write Bit Test Implementation   ********************************/
   1825 
   1826 /** @brief Buffers Range Map Write Bit Test constructor.
   1827  *
   1828  *  @param [in] context     OpenGL context.
   1829  */
   1830 MapRangeWriteBitTest::MapRangeWriteBitTest(deqp::Context& context)
   1831 	: deqp::TestCase(context, "buffers_map_range_write_bit", "Buffer Objects Map Range Write Bit Test")
   1832 	, m_pNamedBufferStorage(DE_NULL)
   1833 	, m_pMapNamedBufferRange(DE_NULL)
   1834 	, m_pUnmapNamedBuffer(DE_NULL)
   1835 	, m_pFlushMappedNamedBufferRange(DE_NULL)
   1836 {
   1837 	/* Intentionally left blank. */
   1838 }
   1839 
   1840 /** @brief Iterate Buffers Range Map Read Bit Test cases.
   1841  *
   1842  *  @return Iteration result.
   1843  */
   1844 tcu::TestNode::IterateResult MapRangeWriteBitTest::iterate()
   1845 {
   1846 	/* Shortcut for GL functionality. */
   1847 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
   1848 
   1849 	/* Get context setup. */
   1850 	bool is_at_least_gl_45 = (glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::core(4, 5)));
   1851 	bool is_arb_direct_state_access = m_context.getContextInfo().isExtensionSupported("GL_ARB_direct_state_access");
   1852 
   1853 	if ((!is_at_least_gl_45) && (!is_arb_direct_state_access))
   1854 	{
   1855 		m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "Not Supported");
   1856 
   1857 		return STOP;
   1858 	}
   1859 
   1860 	/* Running tests. */
   1861 	bool is_ok	= true;
   1862 	bool is_error = false;
   1863 
   1864 	glw::GLuint buffer = 0;
   1865 
   1866 	m_pNamedBufferStorage		   = (PFNGLNAMEDBUFFERSTORAGE)gl.namedBufferStorage;
   1867 	m_pMapNamedBufferRange		   = (PFNGLMAPNAMEDBUFFERRANGE)gl.mapNamedBufferRange;
   1868 	m_pUnmapNamedBuffer			   = (PFNGLUNMAPNAMEDBUFFER)gl.unmapNamedBuffer;
   1869 	m_pFlushMappedNamedBufferRange = (PFNGLFLUSHMAPPEDNAMEDBUFFERRANGE)gl.flushMappedNamedBufferRange;
   1870 
   1871 	try
   1872 	{
   1873 		if ((DE_NULL == m_pNamedBufferStorage) || (DE_NULL == m_pMapNamedBufferRange) ||
   1874 			(DE_NULL == m_pUnmapNamedBuffer) || (DE_NULL == m_pFlushMappedNamedBufferRange))
   1875 		{
   1876 			throw 0;
   1877 		}
   1878 
   1879 		struct
   1880 		{
   1881 			glw::GLbitfield creation;
   1882 			glw::GLbitfield first_mapping;
   1883 			glw::GLbitfield second_mapping;
   1884 		} access_flags[] = {
   1885 			{ GL_MAP_WRITE_BIT | GL_MAP_READ_BIT, GL_MAP_WRITE_BIT, GL_MAP_WRITE_BIT },
   1886 			{ GL_MAP_WRITE_BIT | GL_MAP_READ_BIT, GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT,
   1887 			  GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT },
   1888 			{ GL_MAP_WRITE_BIT | GL_MAP_READ_BIT, GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT, GL_MAP_WRITE_BIT },
   1889 			{ GL_MAP_WRITE_BIT | GL_MAP_READ_BIT, GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT,
   1890 			  GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT },
   1891 			{ GL_MAP_WRITE_BIT | GL_MAP_READ_BIT, GL_MAP_WRITE_BIT, GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT }
   1892 		};
   1893 
   1894 		glw::GLuint access_flags_count = sizeof(access_flags) / sizeof(access_flags[0]);
   1895 
   1896 		for (glw::GLuint i = 0; i < access_flags_count; ++i)
   1897 		{
   1898 			/* Buffer creation. */
   1899 			gl.createBuffers(1, &buffer);
   1900 			GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateBuffers failed.");
   1901 
   1902 			/* Buffer's storage allocation and reference data upload. */
   1903 			m_pNamedBufferStorage(buffer, s_reference_size, DE_NULL, access_flags[i].creation);
   1904 			GLU_EXPECT_NO_ERROR(gl.getError(), "glNamedBufferStorage failed.");
   1905 
   1906 			/* Mapping with first half of named buffer. */
   1907 			glw::GLuint* data =
   1908 				(glw::GLuint*)m_pMapNamedBufferRange(buffer, 0, s_reference_size / 2, access_flags[i].first_mapping);
   1909 			GLU_EXPECT_NO_ERROR(gl.getError(), "glMapNamedBufferRange failed.");
   1910 
   1911 			/* Write to mapped buffer. */
   1912 			for (glw::GLsizei j = 0; j < s_reference_count / 2; ++j)
   1913 			{
   1914 				data[j] = s_reference[j];
   1915 			}
   1916 
   1917 			/* Flush, if needed. */
   1918 			glw::GLenum flush_error = GL_NO_ERROR;
   1919 
   1920 			if (GL_MAP_FLUSH_EXPLICIT_BIT & access_flags[i].first_mapping)
   1921 			{
   1922 				m_pFlushMappedNamedBufferRange(buffer, 0, s_reference_size / 2);
   1923 
   1924 				flush_error = gl.getError();
   1925 			}
   1926 
   1927 			/* Unmapping with new named buffer unmap function. */
   1928 			m_pUnmapNamedBuffer(buffer);
   1929 			GLU_EXPECT_NO_ERROR(flush_error, "glFlushMappedNamedBufferRange failed.");
   1930 			GLU_EXPECT_NO_ERROR(gl.getError(), "glUnmapNamedBuffer failed.");
   1931 
   1932 			/* Mapping with second half of named buffer. */
   1933 			data = (glw::GLuint*)m_pMapNamedBufferRange(buffer, s_reference_size / 2, s_reference_size / 2,
   1934 														access_flags[i].second_mapping);
   1935 			GLU_EXPECT_NO_ERROR(gl.getError(), "glMapNamedBufferRange failed.");
   1936 
   1937 			/* Write to mapped buffer. */
   1938 			for (glw::GLsizei j = 0; j < s_reference_count / 2; ++j)
   1939 			{
   1940 				data[j] = s_reference[j + s_reference_count / 2];
   1941 			}
   1942 
   1943 			/* Flush, if needed. */
   1944 			flush_error = GL_NO_ERROR;
   1945 
   1946 			if (GL_MAP_FLUSH_EXPLICIT_BIT & access_flags[i].second_mapping)
   1947 			{
   1948 				m_pFlushMappedNamedBufferRange(buffer, 0, s_reference_size / 2);
   1949 
   1950 				flush_error = gl.getError();
   1951 			}
   1952 
   1953 			/* Unmapping with new named buffer unmap function. */
   1954 			m_pUnmapNamedBuffer(buffer);
   1955 			GLU_EXPECT_NO_ERROR(flush_error, "glFlushMappedNamedBufferRange failed.");
   1956 			GLU_EXPECT_NO_ERROR(gl.getError(), "glUnmapNamedBuffer failed.");
   1957 
   1958 			/* Check that previous mappings correctly filled buffer with reference data. */
   1959 			is_ok &= CompareWithReference(buffer, access_flags[i].first_mapping | access_flags[i].second_mapping);
   1960 
   1961 			/* Clean up. */
   1962 			if (buffer)
   1963 			{
   1964 				gl.deleteBuffers(1, &buffer);
   1965 
   1966 				buffer = 0;
   1967 			}
   1968 		}
   1969 	}
   1970 	catch (...)
   1971 	{
   1972 		is_ok	= false;
   1973 		is_error = true;
   1974 	}
   1975 
   1976 	/* Clean up. */
   1977 	if (buffer)
   1978 	{
   1979 		gl.deleteBuffers(1, &buffer);
   1980 
   1981 		buffer = 0;
   1982 	}
   1983 
   1984 	/* Errors clean up. */
   1985 	while (gl.getError())
   1986 		;
   1987 
   1988 	/* Result's setup. */
   1989 	if (is_ok)
   1990 	{
   1991 		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
   1992 	}
   1993 	else
   1994 	{
   1995 		if (is_error)
   1996 		{
   1997 			m_testCtx.setTestResult(QP_TEST_RESULT_INTERNAL_ERROR, "Error");
   1998 		}
   1999 		else
   2000 		{
   2001 			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
   2002 		}
   2003 	}
   2004 
   2005 	return STOP;
   2006 }
   2007 
   2008 /** @brief Compare buffer's content with the reference values (s_reference) and log possible failure.
   2009  *
   2010  *  @param [in] buffer          Buffer to be tested.
   2011  *  @param [in] access_flag     Access flag used during test's mapping (for failure logging purposes).
   2012  *
   2013  *  @return True if comparison succeeded, false otherwise.
   2014  */
   2015 bool MapRangeWriteBitTest::CompareWithReference(glw::GLuint buffer, glw::GLbitfield access_flag)
   2016 {
   2017 	/* Shortcut for GL functionality. */
   2018 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
   2019 
   2020 	/* Map buffer with legacy API. */
   2021 	gl.bindBuffer(GL_ARRAY_BUFFER, buffer);
   2022 	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer failed.");
   2023 
   2024 	glw::GLuint* data = (glw::GLuint*)gl.mapBuffer(GL_ARRAY_BUFFER, GL_READ_ONLY);
   2025 	GLU_EXPECT_NO_ERROR(gl.getError(), "glMapBuffer failed.");
   2026 
   2027 	/* Default return value. */
   2028 	bool is_ok = true;
   2029 
   2030 	if (DE_NULL != data)
   2031 	{
   2032 		/* Comparison results with reference data. */
   2033 		for (glw::GLsizei i = 0; i < s_reference_count; ++i)
   2034 		{
   2035 			if (data[i] != s_reference[i])
   2036 			{
   2037 				std::string access_string = "GL_MAP_WRITE_BIT";
   2038 
   2039 				if (GL_MAP_INVALIDATE_RANGE_BIT & access_flag)
   2040 				{
   2041 					access_string = "(GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT)";
   2042 				}
   2043 
   2044 				if (GL_MAP_INVALIDATE_BUFFER_BIT & access_flag)
   2045 				{
   2046 					access_string = "(GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT)";
   2047 				}
   2048 
   2049 				if (GL_MAP_FLUSH_EXPLICIT_BIT & access_flag)
   2050 				{
   2051 					access_string = "(GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT)";
   2052 				}
   2053 
   2054 				if (GL_MAP_UNSYNCHRONIZED_BIT & access_flag)
   2055 				{
   2056 					access_string = "(GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT)";
   2057 				}
   2058 
   2059 				/* Log. */
   2060 				m_context.getTestContext().getLog()
   2061 					<< tcu::TestLog::Message << "Test of glMapNamedBufferRange with access flag " << access_string
   2062 					<< " failed to fill the buffer with reference data." << tcu::TestLog::EndMessage;
   2063 
   2064 				is_ok = false;
   2065 
   2066 				break;
   2067 			}
   2068 		}
   2069 	}
   2070 
   2071 	/* Unmap buffer. */
   2072 	gl.unmapBuffer(GL_ARRAY_BUFFER);
   2073 	GLU_EXPECT_NO_ERROR(gl.getError(), "glUnmapBuffer failed.");
   2074 
   2075 	return is_ok;
   2076 }
   2077 
   2078 const glw::GLuint MapRangeWriteBitTest::s_reference[] = {
   2079 	1, 2, 4, 8, 16, 64, 128, 256, 512, 1024, 2048, 4096
   2080 };																				 //!< Reference data.
   2081 const glw::GLsizei MapRangeWriteBitTest::s_reference_size = sizeof(s_reference); //!< Reference data size.
   2082 const glw::GLsizei MapRangeWriteBitTest::s_reference_count =
   2083 	s_reference_size / sizeof(s_reference[0]); //!< Reference data elements' count.
   2084 
   2085 /******************************** Get Named Buffer SubData Query Test Implementation   ********************************/
   2086 
   2087 /** @brief Get Named Buffer SubData Query Test's static constants. */
   2088 const glw::GLuint SubDataQueryTest::s_reference[] = {
   2089 	1, 2, 4, 8, 16, 64, 128, 256, 512, 1024, 2048, 4096
   2090 };																			 //!< Reference data.
   2091 const glw::GLsizei SubDataQueryTest::s_reference_size = sizeof(s_reference); //!< Reference data size.
   2092 const glw::GLsizei SubDataQueryTest::s_reference_count =
   2093 	s_reference_size / sizeof(s_reference[0]); //!< Reference data elements' count.
   2094 
   2095 /** @brief Get Named Buffer SubData Query Test constructor.
   2096  *
   2097  *  @param [in] context     OpenGL context.
   2098  */
   2099 SubDataQueryTest::SubDataQueryTest(deqp::Context& context)
   2100 	: deqp::TestCase(context, "buffers_get_named_buffer_subdata", "Buffer Objects Get Named Buffer SubData Query Test")
   2101 	, m_pNamedBufferData(DE_NULL)
   2102 	, m_pGetNamedBufferSubData(DE_NULL)
   2103 {
   2104 	/* Intentionally left blank. */
   2105 }
   2106 
   2107 /** @brief Iterate Get Named Buffer SubData Query Test cases.
   2108  *
   2109  *  @return Iteration result.
   2110  */
   2111 tcu::TestNode::IterateResult SubDataQueryTest::iterate()
   2112 {
   2113 	/* Shortcut for GL functionality. */
   2114 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
   2115 
   2116 	/* Get context setup. */
   2117 	bool is_at_least_gl_45 = (glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::core(4, 5)));
   2118 	bool is_arb_direct_state_access = m_context.getContextInfo().isExtensionSupported("GL_ARB_direct_state_access");
   2119 
   2120 	if ((!is_at_least_gl_45) && (!is_arb_direct_state_access))
   2121 	{
   2122 		m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "Not Supported");
   2123 
   2124 		return STOP;
   2125 	}
   2126 
   2127 	/* Running tests. */
   2128 	bool is_ok	= true;
   2129 	bool is_error = false;
   2130 
   2131 	glw::GLuint buffer = 0;
   2132 
   2133 	m_pNamedBufferData		 = (PFNGLNAMEDBUFFERDATA)gl.namedBufferData;
   2134 	m_pGetNamedBufferSubData = (PFNGLGETNAMEDBUFFERSUBDATA)gl.getNamedBufferSubData;
   2135 
   2136 	try
   2137 	{
   2138 		if ((DE_NULL == m_pNamedBufferData) || (DE_NULL == m_pGetNamedBufferSubData))
   2139 		{
   2140 			throw 0;
   2141 		}
   2142 
   2143 		/* Buffer creation. */
   2144 		gl.createBuffers(1, &buffer);
   2145 		GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateBuffers failed.");
   2146 
   2147 		/* Buffer's storage allocation and reference data upload. */
   2148 		m_pNamedBufferData(buffer, s_reference_size, s_reference, GL_DYNAMIC_COPY);
   2149 		GLU_EXPECT_NO_ERROR(gl.getError(), "glNamedBufferData failed.");
   2150 
   2151 		/* Mapping with new named buffer map function. */
   2152 		glw::GLuint data[s_reference_count] = {};
   2153 		m_pGetNamedBufferSubData(buffer, 0, s_reference_size / 2, data);
   2154 		GLU_EXPECT_NO_ERROR(gl.getError(), "glGetNamedBufferSubData failed.");
   2155 
   2156 		m_pGetNamedBufferSubData(buffer, s_reference_size / 2, s_reference_size / 2, &data[s_reference_count / 2]);
   2157 		GLU_EXPECT_NO_ERROR(gl.getError(), "glGetNamedBufferSubData failed.");
   2158 
   2159 		/* Comparison results with reference data. */
   2160 		for (glw::GLsizei i = 0; i < s_reference_count; ++i)
   2161 		{
   2162 			is_ok &= (data[i] == s_reference[i]);
   2163 		}
   2164 
   2165 		if (!is_ok)
   2166 		{
   2167 			/* Log. */
   2168 			m_context.getTestContext().getLog()
   2169 				<< tcu::TestLog::Message
   2170 				<< "glGetNamedBufferSubData returned data which is not identical to reference data."
   2171 				<< tcu::TestLog::EndMessage;
   2172 		}
   2173 	}
   2174 	catch (...)
   2175 	{
   2176 		is_ok	= false;
   2177 		is_error = true;
   2178 	}
   2179 
   2180 	/* Clean up. */
   2181 	if (buffer)
   2182 	{
   2183 		gl.deleteBuffers(1, &buffer);
   2184 
   2185 		buffer = false;
   2186 	}
   2187 
   2188 	/* Errors clean up. */
   2189 	while (gl.getError())
   2190 		;
   2191 
   2192 	/* Result's setup. */
   2193 	if (is_ok)
   2194 	{
   2195 		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
   2196 	}
   2197 	else
   2198 	{
   2199 		if (is_error)
   2200 		{
   2201 			m_testCtx.setTestResult(QP_TEST_RESULT_INTERNAL_ERROR, "Error");
   2202 		}
   2203 		else
   2204 		{
   2205 			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
   2206 		}
   2207 	}
   2208 
   2209 	return STOP;
   2210 }
   2211 
   2212 /******************************** Defaults Test Implementation   ********************************/
   2213 
   2214 /** @brief Defaults Query Test constructor.
   2215  *
   2216  *  @param [in] context     OpenGL context.
   2217  */
   2218 DefaultsTest::DefaultsTest(deqp::Context& context)
   2219 	: deqp::TestCase(context, "buffers_defaults", "Buffer Objects Defaults Test")
   2220 	, m_pNamedBufferData(DE_NULL)
   2221 	, m_pGetNamedBufferParameteri64v(DE_NULL)
   2222 	, m_pGetNamedBufferParameteriv(DE_NULL)
   2223 	, m_pGetNamedBufferPointerv(DE_NULL)
   2224 {
   2225 	/* Intentionally left blank. */
   2226 }
   2227 
   2228 /** @brief Compare value with the reference.
   2229  *
   2230  *  @param [in] value               Value to be compared.
   2231  *  @param [in] reference_value     Reference value for comparison.
   2232  *  @param [in] pname_string        String of parameter name of the value (for logging).
   2233  *  @param [in] function_string     String of function which returned the value (for logging).
   2234  *
   2235  *  @return True if value is equal to reference value, false otherwise. False solution is logged.
   2236  */
   2237 template <typename T>
   2238 bool DefaultsTest::CheckValue(const T value, const T reference_value, const glw::GLchar* pname_string,
   2239 							  const glw::GLchar* function_string)
   2240 {
   2241 	if (reference_value != value)
   2242 	{
   2243 		/* Log. */
   2244 		m_context.getTestContext().getLog() << tcu::TestLog::Message << function_string << " called with "
   2245 											<< pname_string << " parameter name returned " << value << ", but "
   2246 											<< reference_value << " was expected." << tcu::TestLog::EndMessage;
   2247 
   2248 		return false;
   2249 	}
   2250 	return true;
   2251 }
   2252 
   2253 /** @brief Iterate Defaults Test cases.
   2254  *
   2255  *  @return Iteration result.
   2256  */
   2257 tcu::TestNode::IterateResult DefaultsTest::iterate()
   2258 {
   2259 	/* Shortcut for GL functionality. */
   2260 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
   2261 
   2262 	/* Get context setup. */
   2263 	bool is_at_least_gl_45 = (glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::core(4, 5)));
   2264 	bool is_arb_direct_state_access = m_context.getContextInfo().isExtensionSupported("GL_ARB_direct_state_access");
   2265 
   2266 	if ((!is_at_least_gl_45) && (!is_arb_direct_state_access))
   2267 	{
   2268 		m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "Not Supported");
   2269 
   2270 		return STOP;
   2271 	}
   2272 
   2273 	/* Running tests. */
   2274 	bool is_ok	= true;
   2275 	bool is_error = false;
   2276 
   2277 	glw::GLuint buffer = 0;
   2278 
   2279 	m_pNamedBufferData			   = (PFNGLNAMEDBUFFERDATA)gl.namedBufferData;
   2280 	m_pGetNamedBufferParameteri64v = (PFNGLGETNAMEDBUFFERPARAMETERI64V)gl.getNamedBufferParameteri64v;
   2281 	m_pGetNamedBufferParameteriv   = (PFNGLGETNAMEDBUFFERPARAMETERIV)gl.getNamedBufferParameteriv;
   2282 	m_pGetNamedBufferPointerv	  = (PFNGLGETNAMEDBUFFERPOINTERV)gl.getNamedBufferPointerv;
   2283 
   2284 	try
   2285 	{
   2286 		if ((DE_NULL == m_pNamedBufferData) || (DE_NULL == m_pGetNamedBufferParameteri64v) ||
   2287 			(DE_NULL == m_pGetNamedBufferParameteriv) || (DE_NULL == m_pGetNamedBufferPointerv))
   2288 		{
   2289 			throw 0;
   2290 		}
   2291 
   2292 		/* Buffer creation. */
   2293 		gl.createBuffers(1, &buffer);
   2294 		GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateBuffers failed.");
   2295 
   2296 		/* Test data for glGetNamedBufferParameteri*v. */
   2297 		static const struct
   2298 		{
   2299 			glw::GLenum		   pname;
   2300 			const glw::GLchar* pname_string;
   2301 			glw::GLint		   expected_data;
   2302 		} test_values[] = { { GL_BUFFER_SIZE, "GL_BUFFER_SIZE", 0 },
   2303 							{ GL_BUFFER_USAGE, "GL_BUFFER_USAGE", GL_STATIC_DRAW },
   2304 							{ GL_BUFFER_ACCESS, "GL_BUFFER_ACCESS", GL_READ_WRITE },
   2305 							{ GL_BUFFER_ACCESS_FLAGS, "GL_BUFFER_ACCESS_FLAGS", 0 },
   2306 							{ GL_BUFFER_IMMUTABLE_STORAGE, "GL_BUFFER_IMMUTABLE_STORAGE", GL_FALSE },
   2307 							{ GL_BUFFER_MAPPED, "GL_BUFFER_MAPPED", GL_FALSE },
   2308 							{ GL_BUFFER_MAP_OFFSET, "GL_BUFFER_MAP_OFFSET", 0 },
   2309 							{ GL_BUFFER_MAP_LENGTH, "GL_BUFFER_MAP_LENGTH", 0 },
   2310 							{ GL_BUFFER_STORAGE_FLAGS, "GL_BUFFER_STORAGE_FLAGS", 0 } };
   2311 
   2312 		static const glw::GLuint test_dictionary_count = sizeof(test_values) / sizeof(test_values[0]);
   2313 
   2314 		/* Test glGetNamedBufferParameteriv. */
   2315 		for (glw::GLuint i = 0; i < test_dictionary_count; ++i)
   2316 		{
   2317 			glw::GLint data = -1;
   2318 
   2319 			m_pGetNamedBufferParameteriv(buffer, test_values[i].pname, &data);
   2320 
   2321 			is_ok &= CheckParameterError(test_values[i].pname_string, "glGetNamedBufferParameteriv");
   2322 
   2323 			is_ok &= CheckValue<glw::GLint>(data, test_values[i].expected_data, test_values[i].pname_string,
   2324 											"glGetNamedBufferParameteriv");
   2325 		}
   2326 
   2327 		/* Test glGetNamedBufferParameteri64v. */
   2328 		for (glw::GLuint i = 0; i < test_dictionary_count; ++i)
   2329 		{
   2330 			glw::GLint64 data = -1;
   2331 
   2332 			m_pGetNamedBufferParameteri64v(buffer, test_values[i].pname, &data);
   2333 
   2334 			is_ok &= CheckParameterError(test_values[i].pname_string, "glGetNamedBufferParameteri64v");
   2335 
   2336 			is_ok &= CheckValue<glw::GLint64>(data, (glw::GLint64)test_values[i].expected_data,
   2337 											  test_values[i].pname_string, "glGetNamedBufferParameteri64v");
   2338 		}
   2339 
   2340 		/* Test glGetNamedBufferPointerv. */
   2341 		{
   2342 			glw::GLvoid* data = (glw::GLvoid*)1;
   2343 
   2344 			m_pGetNamedBufferPointerv(buffer, GL_BUFFER_MAP_POINTER, &data);
   2345 
   2346 			is_ok &= CheckParameterError("GL_BUFFER_MAP_POINTER", "glGetNamedBufferPointer");
   2347 
   2348 			is_ok &= CheckValue<glw::GLvoid*>(data, (glw::GLvoid*)DE_NULL, "GL_BUFFER_MAP_POINTER",
   2349 											  "glGetNamedBufferParameteriv");
   2350 		}
   2351 	}
   2352 	catch (...)
   2353 	{
   2354 		is_ok	= false;
   2355 		is_error = true;
   2356 	}
   2357 
   2358 	/* Clean up. */
   2359 	if (buffer)
   2360 	{
   2361 		gl.deleteBuffers(1, &buffer);
   2362 
   2363 		buffer = 0;
   2364 	}
   2365 
   2366 	/* Errors clean up. */
   2367 	while (gl.getError())
   2368 		;
   2369 
   2370 	/* Result's setup. */
   2371 	if (is_ok)
   2372 	{
   2373 		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
   2374 	}
   2375 	else
   2376 	{
   2377 		if (is_error)
   2378 		{
   2379 			m_testCtx.setTestResult(QP_TEST_RESULT_INTERNAL_ERROR, "Error");
   2380 		}
   2381 		else
   2382 		{
   2383 			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
   2384 		}
   2385 	}
   2386 
   2387 	return STOP;
   2388 }
   2389 
   2390 /** @brief Check for GL error and log.
   2391  *
   2392  *  @param [in] pname_string        String of parameter name of the value (for logging).
   2393  *  @param [in] function_string     String of function which returned the value (for logging).
   2394  *
   2395  *  @return True if error was generated, false otherwise. False solution is logged.
   2396  */
   2397 bool DefaultsTest::CheckParameterError(const glw::GLchar* pname_string, const glw::GLchar* function_string)
   2398 {
   2399 	/* Shortcut for GL functionality. */
   2400 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
   2401 
   2402 	/* Error check. */
   2403 	if (glw::GLenum error = gl.getError())
   2404 	{
   2405 		/* Log. */
   2406 		m_context.getTestContext().getLog() << tcu::TestLog::Message << function_string << " called with "
   2407 											<< pname_string << " parameter name unexpectedly returned "
   2408 											<< glu::getErrorStr(error) << "error." << tcu::TestLog::EndMessage;
   2409 
   2410 		return false;
   2411 	}
   2412 
   2413 	return true;
   2414 }
   2415 
   2416 /******************************** Errors Test Implementation   ********************************/
   2417 
   2418 /** @brief Errors Query Test constructor.
   2419  *
   2420  *  @param [in] context     OpenGL context.
   2421  */
   2422 ErrorsTest::ErrorsTest(deqp::Context& context)
   2423 	: deqp::TestCase(context, "buffers_errors", "Buffer Objects Errors Test")
   2424 	, m_pClearNamedBufferData(DE_NULL)
   2425 	, m_pClearNamedBufferSubData(DE_NULL)
   2426 	, m_pCopyNamedBufferSubData(DE_NULL)
   2427 	, m_pFlushMappedNamedBufferRange(DE_NULL)
   2428 	, m_pGetNamedBufferParameteri64v(DE_NULL)
   2429 	, m_pGetNamedBufferParameteriv(DE_NULL)
   2430 	, m_pGetNamedBufferPointerv(DE_NULL)
   2431 	, m_pGetNamedBufferSubData(DE_NULL)
   2432 	, m_pMapNamedBuffer(DE_NULL)
   2433 	, m_pMapNamedBufferRange(DE_NULL)
   2434 	, m_pNamedBufferData(DE_NULL)
   2435 	, m_pNamedBufferStorage(DE_NULL)
   2436 	, m_pNamedBufferSubData(DE_NULL)
   2437 	, m_pUnmapNamedBuffer(DE_NULL)
   2438 {
   2439 	/* Intentionally left blank. */
   2440 }
   2441 
   2442 /** @brief Iterate Errors Test cases.
   2443  *
   2444  *  @return Iteration result.
   2445  */
   2446 tcu::TestNode::IterateResult ErrorsTest::iterate()
   2447 {
   2448 	/* Shortcut for GL functionality. */
   2449 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
   2450 
   2451 	/* Get context setup. */
   2452 	bool is_at_least_gl_45 = (glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::core(4, 5)));
   2453 	bool is_arb_direct_state_access = m_context.getContextInfo().isExtensionSupported("GL_ARB_direct_state_access");
   2454 
   2455 	if ((!is_at_least_gl_45) && (!is_arb_direct_state_access))
   2456 	{
   2457 		m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "Not Supported");
   2458 
   2459 		return STOP;
   2460 	}
   2461 
   2462 	/* Running tests. */
   2463 	bool is_ok	= true;
   2464 	bool is_error = false;
   2465 
   2466 	/* API function pointers setup. */
   2467 	m_pClearNamedBufferData		   = (PFNGLCLEARNAMEDBUFFERDATA)gl.clearNamedBufferData;
   2468 	m_pClearNamedBufferSubData	 = (PFNGLCLEARNAMEDBUFFERSUBDATA)gl.clearNamedBufferSubData;
   2469 	m_pCopyNamedBufferSubData	  = (PFNGLCOPYNAMEDBUFFERSUBDATA)gl.copyNamedBufferSubData;
   2470 	m_pFlushMappedNamedBufferRange = (PFNGLFLUSHMAPPEDNAMEDBUFFERRANGE)gl.flushMappedNamedBufferRange;
   2471 	m_pGetNamedBufferParameteri64v = (PFNGLGETNAMEDBUFFERPARAMETERI64V)gl.getNamedBufferParameteri64v;
   2472 	m_pGetNamedBufferParameteriv   = (PFNGLGETNAMEDBUFFERPARAMETERIV)gl.getNamedBufferParameteriv;
   2473 	m_pGetNamedBufferPointerv	  = (PFNGLGETNAMEDBUFFERPOINTERV)gl.getNamedBufferPointerv;
   2474 	m_pGetNamedBufferSubData	   = (PFNGLGETNAMEDBUFFERSUBDATA)gl.getNamedBufferSubData;
   2475 	m_pMapNamedBuffer			   = (PFNGLMAPNAMEDBUFFER)gl.mapNamedBuffer;
   2476 	m_pMapNamedBufferRange		   = (PFNGLMAPNAMEDBUFFERRANGE)gl.mapNamedBufferRange;
   2477 	m_pNamedBufferData			   = (PFNGLNAMEDBUFFERDATA)gl.namedBufferData;
   2478 	m_pNamedBufferStorage		   = (PFNGLNAMEDBUFFERSTORAGE)gl.namedBufferStorage;
   2479 	m_pNamedBufferSubData		   = (PFNGLNAMEDBUFFERSUBDATA)gl.namedBufferSubData;
   2480 	m_pUnmapNamedBuffer			   = (PFNGLUNMAPNAMEDBUFFER)gl.unmapNamedBuffer;
   2481 
   2482 	try
   2483 	{
   2484 		/* API function pointers check. */
   2485 		if ((DE_NULL == m_pClearNamedBufferData) || (DE_NULL == m_pClearNamedBufferSubData) ||
   2486 			(DE_NULL == m_pCopyNamedBufferSubData) || (DE_NULL == m_pFlushMappedNamedBufferRange) ||
   2487 			(DE_NULL == m_pGetNamedBufferParameteri64v) || (DE_NULL == m_pGetNamedBufferParameteriv) ||
   2488 			(DE_NULL == m_pGetNamedBufferPointerv) || (DE_NULL == m_pGetNamedBufferSubData) ||
   2489 			(DE_NULL == m_pMapNamedBuffer) || (DE_NULL == m_pMapNamedBufferRange) || (DE_NULL == m_pNamedBufferData) ||
   2490 			(DE_NULL == m_pNamedBufferStorage) || (DE_NULL == m_pNamedBufferSubData) ||
   2491 			(DE_NULL == m_pUnmapNamedBuffer))
   2492 		{
   2493 			throw 0;
   2494 		}
   2495 
   2496 		/* Running test cases.                              Cleaning errors. */
   2497 		is_ok &= TestErrorsOfClearNamedBufferData();
   2498 		while (gl.getError())
   2499 			;
   2500 		is_ok &= TestErrorsOfClearNamedBufferSubData();
   2501 		while (gl.getError())
   2502 			;
   2503 		is_ok &= TestErrorsOfCopyNamedBufferSubData();
   2504 		while (gl.getError())
   2505 			;
   2506 		is_ok &= TestErrorsOfCreateBuffers();
   2507 		while (gl.getError())
   2508 			;
   2509 		is_ok &= TestErrorsOfFlushMappedNamedBufferRange();
   2510 		while (gl.getError())
   2511 			;
   2512 		is_ok &= TestErrorsOfGetNamedBufferParameter();
   2513 		while (gl.getError())
   2514 			;
   2515 		is_ok &= TestErrorsOfGetNamedBufferPointerv();
   2516 		while (gl.getError())
   2517 			;
   2518 		is_ok &= TestErrorsOfGetNamedBufferSubData();
   2519 		while (gl.getError())
   2520 			;
   2521 		is_ok &= TestErrorsOfMapNamedBuffer();
   2522 		while (gl.getError())
   2523 			;
   2524 		is_ok &= TestErrorsOfMapNamedBufferRange();
   2525 		while (gl.getError())
   2526 			;
   2527 		is_ok &= TestErrorsOfNamedBufferData();
   2528 		while (gl.getError())
   2529 			;
   2530 		is_ok &= TestErrorsOfNamedBufferStorage();
   2531 		while (gl.getError())
   2532 			;
   2533 		is_ok &= TestErrorsOfNamedBufferSubData();
   2534 		while (gl.getError())
   2535 			;
   2536 		is_ok &= TestErrorsOfUnmapNamedBuffer();
   2537 		while (gl.getError())
   2538 			;
   2539 	}
   2540 	catch (...)
   2541 	{
   2542 		is_ok	= false;
   2543 		is_error = true;
   2544 	}
   2545 
   2546 	/* Errors clean up. */
   2547 	while (gl.getError())
   2548 		;
   2549 
   2550 	/* Result's setup. */
   2551 	if (is_ok)
   2552 	{
   2553 		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
   2554 	}
   2555 	else
   2556 	{
   2557 		if (is_error)
   2558 		{
   2559 			m_testCtx.setTestResult(QP_TEST_RESULT_INTERNAL_ERROR, "Error");
   2560 		}
   2561 		else
   2562 		{
   2563 			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
   2564 		}
   2565 	}
   2566 
   2567 	return STOP;
   2568 }
   2569 
   2570 /** Check if error was generated and if it is equal to expected value. Log possible failure.
   2571  *
   2572  *  @param [in] function_name               Tested Function.
   2573  *  @param [in] expected_error              Expected error function.
   2574  *  @param [in] when_shall_be_generated     Description when shall the error occure.
   2575  *
   2576  *  @return True if GL error is equal to the expected value, false otherwise.
   2577  */
   2578 bool ErrorsTest::ErrorCheckAndLog(const glw::GLchar* function_name, const glw::GLenum expected_error,
   2579 								  const glw::GLchar* when_shall_be_generated)
   2580 {
   2581 	/* Shortcut for GL functionality. */
   2582 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
   2583 
   2584 	/* Error value storage. */
   2585 	glw::GLenum error = GL_NO_ERROR;
   2586 
   2587 	/* Error comparision. */
   2588 	if (expected_error != (error = gl.getError()))
   2589 	{
   2590 		/* Log. */
   2591 		m_context.getTestContext().getLog() << tcu::TestLog::Message << function_name << " does not generate "
   2592 											<< glu::getErrorStr(expected_error) << when_shall_be_generated
   2593 											<< "The error value of " << glu::getErrorStr(error) << " was observed."
   2594 											<< tcu::TestLog::EndMessage;
   2595 
   2596 		/* Error cleanup. */
   2597 		while (gl.getError())
   2598 			;
   2599 
   2600 		/* Check failed. */
   2601 		return false;
   2602 	}
   2603 
   2604 	/* Error was equal to expected. */
   2605 	return true;
   2606 }
   2607 
   2608 /** @brief Test Errors Of ClearNamedBufferData function.
   2609  *
   2610  *  Check that INVALID_OPERATION is generated by ClearNamedBufferData if
   2611  *  buffer is not the name of an existing buffer object.
   2612  *
   2613  *  Check that INVALID_ENUM is generated by ClearNamedBufferData if
   2614  *  internal format is not one of the valid sized internal formats listed in
   2615  *  the table above.
   2616  *
   2617  *  Check that INVALID_OPERATION is generated by ClearNamedBufferData if
   2618  *  any part of the specified range of the buffer object is mapped with
   2619  *  MapBufferRange or MapBuffer, unless it was mapped with the
   2620  *  MAP_PERSISTENT_BIT bit set in the MapBufferRange access flags.
   2621  *
   2622  *  Check that INVALID_VALUE is generated by ClearNamedBufferData if
   2623  *  format is not a valid format, or type is not a valid type.
   2624  *
   2625  *  True if test case succeeded, false otherwise.
   2626  */
   2627 bool ErrorsTest::TestErrorsOfClearNamedBufferData()
   2628 {
   2629 	/* Shortcut for GL functionality. */
   2630 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
   2631 
   2632 	/* Return value. */
   2633 	bool is_ok			= true;
   2634 	bool internal_error = false;
   2635 
   2636 	/* Common variables. */
   2637 	glw::GLuint buffer	 = 0;
   2638 	glw::GLbyte dummy_data = 0;
   2639 
   2640 	try
   2641 	{
   2642 		/* Common preparations. */
   2643 		gl.createBuffers(1, &buffer);
   2644 		GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateBuffers failed.");
   2645 
   2646 		m_pNamedBufferStorage(buffer, sizeof(dummy_data), &dummy_data,
   2647 							  GL_MAP_READ_BIT | GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT);
   2648 		GLU_EXPECT_NO_ERROR(gl.getError(), "glNamedBufferStorage failed.");
   2649 
   2650 		/* Test invalid buffer name error behavior. */
   2651 		{
   2652 			/* Prepare for invalid buffer name error behavior verification. */
   2653 			glw::GLuint not_a_buffer_name = 0;
   2654 
   2655 			while (gl.isBuffer(++not_a_buffer_name))
   2656 				;
   2657 
   2658 			/* Test. */
   2659 			m_pClearNamedBufferData(not_a_buffer_name, GL_R8, GL_RED, GL_UNSIGNED_BYTE, &dummy_data);
   2660 
   2661 			is_ok &= ErrorCheckAndLog("glClearNamedBufferData", GL_INVALID_OPERATION,
   2662 									  " if buffer is not the name of an existing buffer object.");
   2663 		}
   2664 
   2665 		/* Test invalid sized internal format error behavior. */
   2666 		{
   2667 			/* Prepare for invalid sized internal format error behavior verification. */
   2668 			static const glw::GLenum valid_internal_formats[] = {
   2669 				GL_R8,		GL_R16,		GL_R16F,	GL_R32F,	 GL_R8I,	  GL_R16I,	GL_R32I,
   2670 				GL_R8UI,	GL_R16UI,   GL_R32UI,   GL_RG8,		 GL_RG16,	 GL_RG16F,   GL_RG32F,
   2671 				GL_RG8I,	GL_RG16I,   GL_RG32I,   GL_RG8UI,	GL_RG16UI,   GL_RG32UI,  GL_RGB32F,
   2672 				GL_RGB32I,  GL_RGB32UI, GL_RGBA8,   GL_RGBA16,   GL_RGBA16F,  GL_RGBA32F, GL_RGBA8I,
   2673 				GL_RGBA16I, GL_RGBA32I, GL_RGBA8UI, GL_RGBA16UI, GL_RGBA32UI, GL_NONE
   2674 			};
   2675 			static const glw::GLenum valid_internal_formats_last =
   2676 				sizeof(valid_internal_formats) / sizeof(valid_internal_formats[0]) - 1;
   2677 
   2678 			glw::GLenum invalid_internal_format = 0;
   2679 
   2680 			while (&valid_internal_formats[valid_internal_formats_last] !=
   2681 				   std::find(&valid_internal_formats[0], &valid_internal_formats[valid_internal_formats_last],
   2682 							 (++invalid_internal_format)))
   2683 				;
   2684 
   2685 			/* Test. */
   2686 			m_pClearNamedBufferData(buffer, invalid_internal_format, GL_RED, GL_UNSIGNED_BYTE, &dummy_data);
   2687 
   2688 			is_ok &= ErrorCheckAndLog("glClearNamedBufferData", GL_INVALID_ENUM,
   2689 									  " if internal format is not one of the valid sized internal formats "
   2690 									  "(GL_R8, GL_R16, GL_R16F, GL_R32F, GL_R8I, GL_R16I, GL_R32I, GL_R8UI,"
   2691 									  " GL_R16UI, GL_R32UI, GL_RG8, GL_RG16, GL_RG16F, GL_RG32F, GL_RG8I, GL_RG16I,"
   2692 									  " GL_RG32I, GL_RG8UI, GL_RG16UI, GL_RG32UI, GL_RGB32F, GL_RGB32I, GL_RGB32UI,"
   2693 									  " GL_RGBA8, GL_RGBA16, GL_RGBA16F, GL_RGBA32F, GL_RGBA8I, GL_RGBA16I, GL_RGBA32I,"
   2694 									  " GL_RGBA8UI, GL_RGBA16UI, GL_RGBA32UI).");
   2695 		}
   2696 
   2697 		/* Test of mapped buffer clear error behavior verification (glMapNamedBuffer version). */
   2698 		{
   2699 			(void)(glw::GLbyte*) m_pMapNamedBuffer(buffer, GL_READ_ONLY);
   2700 			GLU_EXPECT_NO_ERROR(gl.getError(), "glMapNamedBuffer failed.");
   2701 
   2702 			m_pClearNamedBufferData(buffer, GL_R8, GL_RED, GL_UNSIGNED_BYTE, &dummy_data);
   2703 
   2704 			is_ok &= ErrorCheckAndLog("glClearNamedBufferData", GL_INVALID_OPERATION,
   2705 									  " if any part of the specified range of the buffer"
   2706 									  " object is mapped with MapBuffer, unless it was mapped with "
   2707 									  "the MAP_PERSISTENT_BIT bit set in the MapBufferRange access flags.");
   2708 
   2709 			m_pUnmapNamedBuffer(buffer);
   2710 			GLU_EXPECT_NO_ERROR(gl.getError(), "glUnmapNamedBuffer failed.");
   2711 		}
   2712 
   2713 		/* Test of mapped buffer clear error behavior verification (glMapNamedBufferRange version). */
   2714 		{
   2715 			(void)(glw::GLbyte*) m_pMapNamedBufferRange(buffer, 0, sizeof(dummy_data), GL_MAP_READ_BIT);
   2716 			GLU_EXPECT_NO_ERROR(gl.getError(), "glMapNamedBuffer failed.");
   2717 
   2718 			m_pClearNamedBufferData(buffer, GL_R8, GL_RED, GL_UNSIGNED_BYTE, &dummy_data);
   2719 
   2720 			is_ok &= ErrorCheckAndLog("glClearNamedBufferData", GL_INVALID_OPERATION,
   2721 									  " if any part of the specified range of the buffer"
   2722 									  " object is mapped with MapBufferRange, unless it was mapped with "
   2723 									  "the MAP_PERSISTENT_BIT bit set in the MapBufferRange access flags.");
   2724 
   2725 			m_pUnmapNamedBuffer(buffer);
   2726 			GLU_EXPECT_NO_ERROR(gl.getError(), "glUnmapNamedBuffer failed.");
   2727 		}
   2728 
   2729 		/* Test of persistently mapped buffer clear error with behavior verification (glMapNamedBufferRange version). */
   2730 		{
   2731 			(void)(glw::GLbyte*)
   2732 				m_pMapNamedBufferRange(buffer, 0, sizeof(dummy_data), GL_MAP_READ_BIT | GL_MAP_PERSISTENT_BIT);
   2733 			GLU_EXPECT_NO_ERROR(gl.getError(), "glMapNamedBuffer failed.");
   2734 
   2735 			m_pClearNamedBufferData(buffer, GL_R8, GL_RED, GL_UNSIGNED_BYTE, &dummy_data);
   2736 
   2737 			is_ok &= ErrorCheckAndLog("glClearNamedBufferData", GL_NO_ERROR,
   2738 									  " if any part of the specified range of the buffer"
   2739 									  " object is mapped with MapBuffer with the MAP_PERSISTENT_BIT"
   2740 									  " bit set in the MapBufferRange access flags.");
   2741 
   2742 			m_pUnmapNamedBuffer(buffer);
   2743 			GLU_EXPECT_NO_ERROR(gl.getError(), "glUnmapNamedBuffer failed.");
   2744 		}
   2745 
   2746 		/* Test invalid format error behavior. */
   2747 		{
   2748 			/* Prepare for invalid format error behavior verification. */
   2749 			static const glw::GLenum valid_formats[] = { GL_RED,		   GL_RG,
   2750 														 GL_RGB,		   GL_BGR,
   2751 														 GL_RGBA,		   GL_BGRA,
   2752 														 GL_RED_INTEGER,   GL_RG_INTEGER,
   2753 														 GL_RGB_INTEGER,   GL_BGR_INTEGER,
   2754 														 GL_RGBA_INTEGER,  GL_BGRA_INTEGER,
   2755 														 GL_STENCIL_INDEX, GL_DEPTH_COMPONENT,
   2756 														 GL_DEPTH_STENCIL };
   2757 			static const glw::GLenum valid_formats_last = sizeof(valid_formats) / sizeof(valid_formats[0]) - 1;
   2758 
   2759 			glw::GLenum invalid_format = 0;
   2760 
   2761 			while (&valid_formats[valid_formats_last] !=
   2762 				   std::find(&valid_formats[0], &valid_formats[valid_formats_last], (++invalid_format)))
   2763 				;
   2764 
   2765 			/* Test. */
   2766 			m_pClearNamedBufferData(buffer, GL_R8, invalid_format, GL_UNSIGNED_BYTE, &dummy_data);
   2767 
   2768 			is_ok &= ErrorCheckAndLog(
   2769 				"glClearNamedBufferData", GL_INVALID_ENUM,
   2770 				" if format is not a valid format "
   2771 				"(one of GL_RED, GL_RG, GL_RGB, GL_BGR, GL_RGBA, GL_BGRA, "
   2772 				"GL_RED_INTEGER, GL_RG_INTEGER, GL_RGB_INTEGER, GL_BGR_INTEGER, GL_RGBA_INTEGER, GL_BGRA_INTEGER, "
   2773 				"GL_STENCIL_INDEX, GL_DEPTH_COMPONENT, GL_DEPTH_STENCIL).");
   2774 		}
   2775 
   2776 		/* Test invalid type error behavior. */
   2777 		{
   2778 			/* Prepare for invalid type error behavior verification. */
   2779 			static const glw::GLenum valid_types[] = { GL_RED,			 GL_RG,
   2780 													   GL_RGB,			 GL_BGR,
   2781 													   GL_RGBA,			 GL_BGRA,
   2782 													   GL_RED_INTEGER,   GL_RG_INTEGER,
   2783 													   GL_RGB_INTEGER,   GL_BGR_INTEGER,
   2784 													   GL_RGBA_INTEGER,  GL_BGRA_INTEGER,
   2785 													   GL_STENCIL_INDEX, GL_DEPTH_COMPONENT,
   2786 													   GL_DEPTH_STENCIL };
   2787 			static const glw::GLenum valid_types_last = sizeof(valid_types) / sizeof(valid_types[0]) - 1;
   2788 
   2789 			glw::GLenum invalid_type = 0;
   2790 
   2791 			while (&valid_types[valid_types_last] !=
   2792 				   std::find(&valid_types[0], &valid_types[valid_types_last], (++invalid_type)))
   2793 				;
   2794 
   2795 			/* Test. */
   2796 			m_pClearNamedBufferData(buffer, GL_R8, GL_RED, invalid_type, &dummy_data);
   2797 
   2798 			is_ok &= ErrorCheckAndLog(
   2799 				"glClearNamedBufferData", GL_INVALID_ENUM,
   2800 				" if format is not a valid type "
   2801 				"(one of GL_UNSIGNED_BYTE, GL_BYTE, GL_UNSIGNED_SHORT, "
   2802 				"GL_SHORT, GL_UNSIGNED_INT, GL_INT, GL_FLOAT, GL_UNSIGNED_BYTE_3_3_2, "
   2803 				"GL_UNSIGNED_BYTE_2_3_3_REV, GL_UNSIGNED_SHORT_5_6_5, "
   2804 				"GL_UNSIGNED_SHORT_5_6_5_REV, GL_UNSIGNED_SHORT_4_4_4_4, GL_UNSIGNED_SHORT_4_4_4_4_REV, "
   2805 				"GL_UNSIGNED_SHORT_5_5_5_1, GL_UNSIGNED_SHORT_1_5_5_5_REV, GL_UNSIGNED_INT_8_8_8_8, "
   2806 				"GL_UNSIGNED_INT_8_8_8_8_REV, GL_UNSIGNED_INT_10_10_10_2, and GL_UNSIGNED_INT_2_10_10_10_REV).");
   2807 		}
   2808 	}
   2809 	catch (...)
   2810 	{
   2811 		is_ok		   = false;
   2812 		internal_error = true;
   2813 	}
   2814 
   2815 	if (buffer)
   2816 	{
   2817 		gl.deleteBuffers(1, &buffer);
   2818 
   2819 		buffer = 0;
   2820 	}
   2821 
   2822 	if (internal_error)
   2823 	{
   2824 		throw 0;
   2825 	}
   2826 
   2827 	return is_ok;
   2828 }
   2829 
   2830 /** @brief Test Errors Of ClearNamedBufferSubData function.
   2831  *
   2832  *  Check that INVALID_OPERATION is generated by ClearNamedBufferSubData
   2833  *  if buffer is not the name of an existing buffer object.
   2834  *
   2835  *  Check that INVALID_ENUM is generated by ClearNamedBufferSubData if
   2836  *  internal format is not one of the valid sized internal formats listed in
   2837  *  the table above.
   2838  *
   2839  *  Check that INVALID_VALUE is generated by ClearNamedBufferSubData if
   2840  *  offset or range are not multiples of the number of basic machine units
   2841  *  per-element for the internal format specified by internal format. This
   2842  *  value may be computed by multiplying the number of components for
   2843  *  internal format from the table by the size of the base type from the
   2844  *  specification table.
   2845  *
   2846  *  Check that INVALID_VALUE is generated by ClearNamedBufferSubData if
   2847  *  offset or size is negative, or if offset+size is greater than the value
   2848  *  of BUFFER_SIZE for the buffer object.
   2849  *
   2850  *  Check that INVALID_OPERATION is generated by ClearNamedBufferSubData
   2851  *  if any part of the specified range of the buffer object is mapped with
   2852  *  MapBufferRange or MapBuffer, unless it was mapped with the
   2853  *  MAP_PERSISTENT_BIT bit set in the MapBufferRange access flags.
   2854  *
   2855  *  Check that INVALID_VALUE is generated by ClearNamedBufferSubData if format is not
   2856  *  a valid format, or type is not a valid type.
   2857  *
   2858  *  True if test case succeeded, false otherwise.
   2859  */
   2860 bool ErrorsTest::TestErrorsOfClearNamedBufferSubData()
   2861 {
   2862 	/* Shortcut for GL functionality. */
   2863 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
   2864 
   2865 	/* Return value. */
   2866 	bool is_ok			= true;
   2867 	bool internal_error = false;
   2868 
   2869 	/* Common variables. */
   2870 	glw::GLuint  buffer		   = 0;
   2871 	glw::GLubyte dummy_data[4] = {};
   2872 
   2873 	try
   2874 	{
   2875 		/* Common preparations. */
   2876 		gl.createBuffers(1, &buffer);
   2877 		GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateBuffers failed.");
   2878 
   2879 		m_pNamedBufferStorage(buffer, sizeof(dummy_data), &dummy_data,
   2880 							  GL_MAP_READ_BIT | GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT);
   2881 		GLU_EXPECT_NO_ERROR(gl.getError(), "glNamedBuffeStorage failed.");
   2882 
   2883 		/* Test invalid buffer name error behavior. */
   2884 		{
   2885 			/* Prepare for invalid buffer name error behavior verification. */
   2886 			glw::GLuint not_a_buffer_name = 0;
   2887 
   2888 			while (gl.isBuffer(++not_a_buffer_name))
   2889 				;
   2890 
   2891 			/* Test. */
   2892 			m_pClearNamedBufferSubData(not_a_buffer_name, GL_R8, 0, sizeof(dummy_data), GL_RGBA, GL_UNSIGNED_BYTE,
   2893 									   &dummy_data);
   2894 
   2895 			is_ok &= ErrorCheckAndLog("glClearNamedBufferSubData", GL_INVALID_OPERATION,
   2896 									  " if buffer is not the name of an existing buffer object.");
   2897 		}
   2898 
   2899 		/* Test invalid sized internal format error behavior. */
   2900 		{
   2901 			/* Prepare for invalid sized internal format error behavior verification. */
   2902 			static const glw::GLenum valid_internal_formats[] = {
   2903 				GL_R8,		GL_R16,		GL_R16F,	GL_R32F,	 GL_R8I,	  GL_R16I,	GL_R32I,
   2904 				GL_R8UI,	GL_R16UI,   GL_R32UI,   GL_RG8,		 GL_RG16,	 GL_RG16F,   GL_RG32F,
   2905 				GL_RG8I,	GL_RG16I,   GL_RG32I,   GL_RG8UI,	GL_RG16UI,   GL_RG32UI,  GL_RGB32F,
   2906 				GL_RGB32I,  GL_RGB32UI, GL_RGBA8,   GL_RGBA16,   GL_RGBA16F,  GL_RGBA32F, GL_RGBA8I,
   2907 				GL_RGBA16I, GL_RGBA32I, GL_RGBA8UI, GL_RGBA16UI, GL_RGBA32UI, GL_NONE
   2908 			};
   2909 			static const glw::GLenum valid_internal_formats_last =
   2910 				sizeof(valid_internal_formats) / sizeof(valid_internal_formats[0]) - 1;
   2911 
   2912 			glw::GLenum invalid_internal_format = 0;
   2913 
   2914 			while (&valid_internal_formats[valid_internal_formats_last] !=
   2915 				   std::find(&valid_internal_formats[0], &valid_internal_formats[valid_internal_formats_last],
   2916 							 (++invalid_internal_format)))
   2917 				;
   2918 
   2919 			/* Test. */
   2920 			m_pClearNamedBufferData(buffer, invalid_internal_format, GL_RGBA, GL_UNSIGNED_BYTE, &dummy_data);
   2921 
   2922 			is_ok &= ErrorCheckAndLog("glClearNamedBufferSubData", GL_INVALID_ENUM,
   2923 									  " if internal format is not one of the valid sized internal formats "
   2924 									  "(GL_R8, GL_R16, GL_R16F, GL_R32F, GL_R8I, GL_R16I, GL_R32I, GL_R8UI,"
   2925 									  " GL_R16UI, GL_R32UI, GL_RG8, GL_RG16, GL_RG16F, GL_RG32F, GL_RG8I, GL_RG16I,"
   2926 									  " GL_RG32I, GL_RG8UI, GL_RG16UI, GL_RG32UI, GL_RGB32F, GL_RGB32I, GL_RGB32UI,"
   2927 									  " GL_RGBA8, GL_RGBA16, GL_RGBA16F, GL_RGBA32F, GL_RGBA8I, GL_RGBA16I, GL_RGBA32I,"
   2928 									  " GL_RGBA8UI, GL_RGBA16UI, GL_RGBA32UI).");
   2929 		}
   2930 
   2931 		/* Test incorrect offset alignment error behavior. */
   2932 		{
   2933 			/* Test. */
   2934 			m_pClearNamedBufferSubData(buffer, GL_RGBA8, sizeof(dummy_data[0]), sizeof(dummy_data), GL_RGBA,
   2935 									   GL_UNSIGNED_BYTE, &dummy_data);
   2936 
   2937 			is_ok &= ErrorCheckAndLog("glClearNamedBufferSubData", GL_INVALID_VALUE,
   2938 									  "if offset is not multiples of the number of basic machine units (GLubyte)"
   2939 									  "per-element for the internal format (GL_RGBA) specified by internal format.");
   2940 		}
   2941 
   2942 		/* Test incorrect range alignment error behavior. */
   2943 		{
   2944 			m_pClearNamedBufferSubData(buffer, GL_RGBA8, 0, sizeof(dummy_data) - sizeof(dummy_data[0]), GL_RGBA,
   2945 									   GL_UNSIGNED_BYTE, &dummy_data);
   2946 
   2947 			is_ok &= ErrorCheckAndLog("glClearNamedBufferSubData", GL_INVALID_VALUE,
   2948 									  "if range is not multiples of the number of basic machine units (GLubyte)"
   2949 									  "per-element for the internal format (GL_RGBA) specified by internal format.");
   2950 		}
   2951 
   2952 		/* Test negative offset error behavior. */
   2953 		{
   2954 			/* Test. */
   2955 			m_pClearNamedBufferSubData(buffer, GL_R8, -1, sizeof(dummy_data), GL_RGBA, GL_UNSIGNED_BYTE, &dummy_data);
   2956 
   2957 			is_ok &= ErrorCheckAndLog("glClearNamedBufferSubData", GL_INVALID_VALUE, " if offset or size is negative.");
   2958 		}
   2959 
   2960 		/* Test negative size error behavior. */
   2961 		{
   2962 			/* Test. */
   2963 			m_pClearNamedBufferSubData(buffer, GL_R8, 0, -((glw::GLsizei)sizeof(dummy_data)), GL_RGBA, GL_UNSIGNED_BYTE,
   2964 									   &dummy_data);
   2965 
   2966 			is_ok &= ErrorCheckAndLog("glClearNamedBufferSubData", GL_INVALID_VALUE, " if offset or size is negative.");
   2967 		}
   2968 
   2969 		/* Test size overflow error behavior. */
   2970 		{
   2971 			/* Test. */
   2972 			m_pClearNamedBufferSubData(buffer, GL_R8, 0, 2 * sizeof(dummy_data), GL_RGBA, GL_UNSIGNED_BYTE,
   2973 									   &dummy_data);
   2974 
   2975 			is_ok &= ErrorCheckAndLog(
   2976 				"glClearNamedBufferSubData", GL_INVALID_VALUE,
   2977 				" if offset+size is greater than the value of BUFFER_SIZE for the specified buffer object.");
   2978 		}
   2979 
   2980 		/* Test of mapped buffer clear error behavior verification (glMapNamedBuffer version). */
   2981 		{
   2982 			(void)(glw::GLbyte*) m_pMapNamedBuffer(buffer, GL_READ_ONLY);
   2983 			GLU_EXPECT_NO_ERROR(gl.getError(), "glMapNamedBuffer failed.");
   2984 
   2985 			m_pClearNamedBufferSubData(buffer, GL_R8, 0, sizeof(dummy_data), GL_RGBA, GL_UNSIGNED_BYTE, &dummy_data);
   2986 
   2987 			is_ok &= ErrorCheckAndLog("glClearNamedBufferSubData", GL_INVALID_OPERATION,
   2988 									  " if any part of the specified range of the buffer"
   2989 									  " object is mapped with MapBuffer, unless it was mapped with "
   2990 									  "the MAP_PERSISTENT_BIT bit set in the MapBufferRange access flags.");
   2991 
   2992 			m_pUnmapNamedBuffer(buffer);
   2993 			GLU_EXPECT_NO_ERROR(gl.getError(), "glUnmapNamedBuffer failed.");
   2994 		}
   2995 
   2996 		/* Test of mapped buffer clear error behavior verification (glMapNamedBufferRange version). */
   2997 		{
   2998 			(void)(glw::GLbyte*) m_pMapNamedBufferRange(buffer, 0, sizeof(dummy_data), GL_MAP_READ_BIT);
   2999 			GLU_EXPECT_NO_ERROR(gl.getError(), "glMapNamedBuffer failed.");
   3000 
   3001 			m_pClearNamedBufferSubData(buffer, GL_R8, 0, sizeof(dummy_data), GL_RGBA, GL_UNSIGNED_BYTE, &dummy_data);
   3002 
   3003 			is_ok &= ErrorCheckAndLog("glClearNamedBufferSubData", GL_INVALID_OPERATION,
   3004 									  " if any part of the specified range of the buffer"
   3005 									  " object is mapped with MapBufferRange, unless it was mapped with "
   3006 									  "the MAP_PERSISTENT_BIT bit set in the MapBufferRange access flags.");
   3007 
   3008 			m_pUnmapNamedBuffer(buffer);
   3009 			GLU_EXPECT_NO_ERROR(gl.getError(), "glUnmapNamedBuffer failed.");
   3010 		}
   3011 
   3012 		/* Test of persistently mapped buffer clear error with behavior verification (glMapNamedBufferRange version). */
   3013 		{
   3014 			(void)(glw::GLbyte*)
   3015 				m_pMapNamedBufferRange(buffer, 0, sizeof(dummy_data), GL_MAP_READ_BIT | GL_MAP_PERSISTENT_BIT);
   3016 			GLU_EXPECT_NO_ERROR(gl.getError(), "glMapNamedBuffer failed.");
   3017 
   3018 			m_pClearNamedBufferSubData(buffer, GL_R8, 0, sizeof(dummy_data), GL_RGBA, GL_UNSIGNED_BYTE, &dummy_data);
   3019 
   3020 			is_ok &= ErrorCheckAndLog("glClearNamedBufferSubData", GL_NO_ERROR,
   3021 									  " if any part of the specified range of the buffer"
   3022 									  " object is mapped with MapBuffer with the MAP_PERSISTENT_BIT"
   3023 									  " bit set in the MapBufferRange access flags.");
   3024 
   3025 			m_pUnmapNamedBuffer(buffer);
   3026 			GLU_EXPECT_NO_ERROR(gl.getError(), "glUnmapNamedBuffer failed.");
   3027 		}
   3028 
   3029 		/* Test invalid format error behavior. */
   3030 		{
   3031 			/* Prepare for invalid format error behavior verification. */
   3032 			static const glw::GLenum valid_formats[] = { GL_RED,		   GL_RG,
   3033 														 GL_RGB,		   GL_BGR,
   3034 														 GL_RGBA,		   GL_BGRA,
   3035 														 GL_RED_INTEGER,   GL_RG_INTEGER,
   3036 														 GL_RGB_INTEGER,   GL_BGR_INTEGER,
   3037 														 GL_RGBA_INTEGER,  GL_BGRA_INTEGER,
   3038 														 GL_STENCIL_INDEX, GL_DEPTH_COMPONENT,
   3039 														 GL_DEPTH_STENCIL };
   3040 			static const glw::GLenum valid_formats_last = sizeof(valid_formats) / sizeof(valid_formats[0]) - 1;
   3041 
   3042 			glw::GLenum invalid_format = 0;
   3043 
   3044 			while (&valid_formats[valid_formats_last] !=
   3045 				   std::find(&valid_formats[0], &valid_formats[valid_formats_last], (++invalid_format)))
   3046 				;
   3047 
   3048 			/* Test. */
   3049 			m_pClearNamedBufferSubData(buffer, GL_R8, 0, sizeof(dummy_data), invalid_format, GL_UNSIGNED_BYTE,
   3050 									   &dummy_data);
   3051 
   3052 			is_ok &= ErrorCheckAndLog(
   3053 				"glClearNamedBufferSubData", GL_INVALID_ENUM,
   3054 				" if format is not a valid format "
   3055 				"(one of GL_RED, GL_RG, GL_RGB, GL_BGR, GL_RGBA, GL_BGRA, "
   3056 				"GL_RED_INTEGER, GL_RG_INTEGER, GL_RGB_INTEGER, GL_BGR_INTEGER, GL_RGBA_INTEGER, GL_BGRA_INTEGER, "
   3057 				"GL_STENCIL_INDEX, GL_DEPTH_COMPONENT, GL_DEPTH_STENCIL).");
   3058 		}
   3059 
   3060 		/* Test invalid type error behavior. */
   3061 		{
   3062 			/* Prepare for invalid type error behavior verification. */
   3063 			static const glw::GLenum valid_types[] = { GL_RED,			 GL_RG,
   3064 													   GL_RGB,			 GL_BGR,
   3065 													   GL_RGBA,			 GL_BGRA,
   3066 													   GL_RED_INTEGER,   GL_RG_INTEGER,
   3067 													   GL_RGB_INTEGER,   GL_BGR_INTEGER,
   3068 													   GL_RGBA_INTEGER,  GL_BGRA_INTEGER,
   3069 													   GL_STENCIL_INDEX, GL_DEPTH_COMPONENT,
   3070 													   GL_DEPTH_STENCIL, GL_NONE };
   3071 			static const glw::GLenum valid_types_last = sizeof(valid_types) / sizeof(valid_types[0]) - 1;
   3072 
   3073 			glw::GLenum invalid_type = 0;
   3074 
   3075 			while (&valid_types[valid_types_last] !=
   3076 				   std::find(&valid_types[0], &valid_types[valid_types_last], (++invalid_type)))
   3077 				;
   3078 
   3079 			/* Test. */
   3080 			m_pClearNamedBufferSubData(buffer, GL_R8, 0, sizeof(dummy_data), GL_RGBA, invalid_type, &dummy_data);
   3081 
   3082 			is_ok &= ErrorCheckAndLog(
   3083 				"glClearNamedBufferSubData", GL_INVALID_ENUM,
   3084 				" if format is not a valid type "
   3085 				"(one of GL_UNSIGNED_BYTE, GL_BYTE, GL_UNSIGNED_SHORT, "
   3086 				"GL_SHORT, GL_UNSIGNED_INT, GL_INT, GL_FLOAT, GL_UNSIGNED_BYTE_3_3_2, "
   3087 				"GL_UNSIGNED_BYTE_2_3_3_REV, GL_UNSIGNED_SHORT_5_6_5, "
   3088 				"GL_UNSIGNED_SHORT_5_6_5_REV, GL_UNSIGNED_SHORT_4_4_4_4, GL_UNSIGNED_SHORT_4_4_4_4_REV, "
   3089 				"GL_UNSIGNED_SHORT_5_5_5_1, GL_UNSIGNED_SHORT_1_5_5_5_REV, GL_UNSIGNED_INT_8_8_8_8, "
   3090 				"GL_UNSIGNED_INT_8_8_8_8_REV, GL_UNSIGNED_INT_10_10_10_2, and GL_UNSIGNED_INT_2_10_10_10_REV).");
   3091 		}
   3092 	}
   3093 	catch (...)
   3094 	{
   3095 		is_ok		   = false;
   3096 		internal_error = true;
   3097 	}
   3098 
   3099 	if (buffer)
   3100 	{
   3101 		gl.deleteBuffers(1, &buffer);
   3102 
   3103 		buffer = 0;
   3104 	}
   3105 
   3106 	if (internal_error)
   3107 	{
   3108 		throw 0;
   3109 	}
   3110 
   3111 	return is_ok;
   3112 }
   3113 
   3114 /** @brief Test Errors Of CopyNamedBufferSubData function.
   3115  *
   3116  *  Check that INVALID_OPERATION is generated by CopyNamedBufferSubData if readBuffer
   3117  *  or writeBuffer is not the name of an existing buffer object.
   3118  *
   3119  *  Check that INVALID_VALUE is generated by CopyNamedBufferSubData if any of
   3120  *  readOffset, writeOffset or size is negative, if readOffset+size is
   3121  *  greater than the size of the source buffer object (its value of
   3122  *  BUFFER_SIZE), or if writeOffset+size is greater than the size of the
   3123  *  destination buffer object.
   3124  *
   3125  *  Check that INVALID_VALUE is generated by CopyNamedBufferSubData if the
   3126  *  source and destination are the same buffer object, and the ranges
   3127  *  [readOffset,readOffset+size) and [writeOffset,writeOffset+size) overlap.
   3128  *
   3129  *  Check that INVALID_OPERATION is generated by CopyNamedBufferSubData if
   3130  *  either the source or destination buffer object is mapped with
   3131  *  MapBufferRange or MapBuffer, unless they were mapped with the
   3132  *  MAP_PERSISTENT bit set in the MapBufferRange access flags.
   3133  *
   3134  *  True if test case succeeded, false otherwise.
   3135  */
   3136 bool ErrorsTest::TestErrorsOfCopyNamedBufferSubData()
   3137 {
   3138 	/* Shortcut for GL functionality. */
   3139 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
   3140 
   3141 	/* Return value. */
   3142 	bool is_ok			= true;
   3143 	bool internal_error = false;
   3144 
   3145 	/* Common variables. */
   3146 	glw::GLuint  buffer_r	  = 0;
   3147 	glw::GLuint  buffer_w	  = 0;
   3148 	glw::GLubyte dummy_data[4] = {};
   3149 
   3150 	try
   3151 	{
   3152 		/* Common preparations. */
   3153 		gl.createBuffers(1, &buffer_r);
   3154 		GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateBuffers failed.");
   3155 
   3156 		m_pNamedBufferStorage(buffer_r, sizeof(dummy_data), &dummy_data,
   3157 							  GL_MAP_READ_BIT | GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT);
   3158 		GLU_EXPECT_NO_ERROR(gl.getError(), "glNamedBuffeStorage failed.");
   3159 
   3160 		gl.createBuffers(1, &buffer_w);
   3161 		GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateBuffers failed.");
   3162 
   3163 		m_pNamedBufferStorage(buffer_w, sizeof(dummy_data), &dummy_data,
   3164 							  GL_MAP_READ_BIT | GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT);
   3165 		GLU_EXPECT_NO_ERROR(gl.getError(), "glNamedBuffeStorage failed.");
   3166 
   3167 		/* Test invalid buffer name error behavior. */
   3168 		{
   3169 			/* Prepare for invalid buffer name error behavior verification. */
   3170 			glw::GLuint not_a_buffer_name = 0;
   3171 
   3172 			while (gl.isBuffer(++not_a_buffer_name))
   3173 				;
   3174 
   3175 			/* Test. */
   3176 			m_pCopyNamedBufferSubData(not_a_buffer_name, buffer_w, 0, 0, sizeof(dummy_data));
   3177 
   3178 			is_ok &= ErrorCheckAndLog("glCopyNamedBufferSubData", GL_INVALID_OPERATION,
   3179 									  " if readBuffer is not the name of an existing buffer object.");
   3180 
   3181 			m_pCopyNamedBufferSubData(buffer_r, not_a_buffer_name, 0, 0, sizeof(dummy_data));
   3182 
   3183 			is_ok &= ErrorCheckAndLog("glCopyNamedBufferSubData", GL_INVALID_OPERATION,
   3184 									  " if writeBuffer is not the name of an existing buffer object.");
   3185 		}
   3186 
   3187 		/* Test negative read offset error behavior. */
   3188 		{
   3189 			/* Test. */
   3190 			m_pCopyNamedBufferSubData(buffer_r, buffer_w, -1, 0, sizeof(dummy_data));
   3191 
   3192 			is_ok &= ErrorCheckAndLog("glCopyNamedBufferSubData", GL_INVALID_VALUE, "if readOffset is negative.");
   3193 		}
   3194 
   3195 		/* Test negative write offset error behavior. */
   3196 		{
   3197 			/* Test. */
   3198 			m_pCopyNamedBufferSubData(buffer_r, buffer_w, 0, -1, sizeof(dummy_data));
   3199 
   3200 			is_ok &= ErrorCheckAndLog("glCopyNamedBufferSubData", GL_INVALID_VALUE, "if writeOffset is negative.");
   3201 		}
   3202 
   3203 		/* Test negative size error behavior. */
   3204 		{
   3205 			/* Test. */
   3206 			m_pCopyNamedBufferSubData(buffer_r, buffer_w, 0, 0, -1);
   3207 
   3208 			is_ok &= ErrorCheckAndLog("glCopyNamedBufferSubData", GL_INVALID_VALUE, "if size is negative.");
   3209 		}
   3210 
   3211 		/* Test overflow size error behavior. */
   3212 		{
   3213 			/* Test. */
   3214 			m_pCopyNamedBufferSubData(buffer_r, buffer_w, 0, 0, 2 * sizeof(dummy_data));
   3215 
   3216 			is_ok &= ErrorCheckAndLog("glCopyNamedBufferSubData", GL_INVALID_VALUE,
   3217 									  " if size is greater than the size of the source buffer object.");
   3218 		}
   3219 
   3220 		/* Test overflow read offset and size error behavior. */
   3221 		{
   3222 			/* Test. */
   3223 			m_pCopyNamedBufferSubData(buffer_r, buffer_w, sizeof(dummy_data) / 2, 0, sizeof(dummy_data));
   3224 
   3225 			is_ok &= ErrorCheckAndLog("glCopyNamedBufferSubData", GL_INVALID_VALUE,
   3226 									  " if readOffset+size is greater than the size of the source buffer object.");
   3227 		}
   3228 
   3229 		/* Test overflow write offset and size error behavior. */
   3230 		{
   3231 			/* Test. */
   3232 			m_pCopyNamedBufferSubData(buffer_r, buffer_w, 0, sizeof(dummy_data) / 2, sizeof(dummy_data));
   3233 
   3234 			is_ok &= ErrorCheckAndLog("glCopyNamedBufferSubData", GL_INVALID_VALUE,
   3235 									  " if writeOffset+size is greater than the size of the source buffer object.");
   3236 		}
   3237 
   3238 		/* Test same buffer overlapping error behavior. */
   3239 		{
   3240 			/* Test. */
   3241 			m_pCopyNamedBufferSubData(buffer_w, buffer_w, 0, 0, sizeof(dummy_data));
   3242 
   3243 			is_ok &= ErrorCheckAndLog("glCopyNamedBufferSubData", GL_INVALID_VALUE,
   3244 									  " if the source and destination are the same buffer object, and the ranges"
   3245 									  " [readOffset,readOffset+size) and [writeOffset,writeOffset+size) overlap.");
   3246 		}
   3247 
   3248 		/* Test of mapped read buffer copy error behavior verification (glMapNamedBuffer version). */
   3249 		{
   3250 			(void)(glw::GLbyte*) m_pMapNamedBuffer(buffer_r, GL_READ_ONLY);
   3251 			GLU_EXPECT_NO_ERROR(gl.getError(), "glMapNamedBuffer failed.");
   3252 
   3253 			m_pCopyNamedBufferSubData(buffer_r, buffer_w, 0, 0, sizeof(dummy_data));
   3254 
   3255 			is_ok &= ErrorCheckAndLog("glCopyNamedBufferSubData", GL_INVALID_OPERATION,
   3256 									  " if the source buffer object is mapped with MapBuffer.");
   3257 
   3258 			m_pUnmapNamedBuffer(buffer_r);
   3259 			GLU_EXPECT_NO_ERROR(gl.getError(), "glUnmapNamedBuffer failed.");
   3260 		}
   3261 
   3262 		/* Test of mapped write buffer copy error behavior verification (glMapNamedBuffer version). */
   3263 		{
   3264 			(void)(glw::GLbyte*) m_pMapNamedBuffer(buffer_w, GL_READ_ONLY);
   3265 			GLU_EXPECT_NO_ERROR(gl.getError(), "glMapNamedBuffer failed.");
   3266 
   3267 			m_pCopyNamedBufferSubData(buffer_r, buffer_w, 0, 0, sizeof(dummy_data));
   3268 
   3269 			is_ok &= ErrorCheckAndLog("glCopyNamedBufferSubData", GL_INVALID_OPERATION,
   3270 									  " if the destination buffer object is mapped with MapBuffer.");
   3271 
   3272 			m_pUnmapNamedBuffer(buffer_w);
   3273 			GLU_EXPECT_NO_ERROR(gl.getError(), "glUnmapNamedBuffer failed.");
   3274 		}
   3275 
   3276 		/* Test of mapped read buffer copy error behavior verification (glMapNamedBufferRange version). */
   3277 		{
   3278 			(void)(glw::GLbyte*) m_pMapNamedBufferRange(buffer_r, 0, sizeof(dummy_data), GL_MAP_READ_BIT);
   3279 			GLU_EXPECT_NO_ERROR(gl.getError(), "glMapNamedBuffer failed.");
   3280 
   3281 			m_pCopyNamedBufferSubData(buffer_r, buffer_w, 0, 0, sizeof(dummy_data));
   3282 
   3283 			is_ok &= ErrorCheckAndLog("glCopyNamedBufferSubData", GL_INVALID_OPERATION,
   3284 									  " if the source buffer object is mapped with MapBuffer.");
   3285 
   3286 			m_pUnmapNamedBuffer(buffer_r);
   3287 			GLU_EXPECT_NO_ERROR(gl.getError(), "glUnmapNamedBuffer failed.");
   3288 		}
   3289 
   3290 		/* Test of mapped write buffer copy error behavior verification (glMapNamedBufferRange version). */
   3291 		{
   3292 			(void)(glw::GLbyte*) m_pMapNamedBufferRange(buffer_w, 0, sizeof(dummy_data), GL_MAP_READ_BIT);
   3293 			GLU_EXPECT_NO_ERROR(gl.getError(), "glMapNamedBuffer failed.");
   3294 
   3295 			m_pCopyNamedBufferSubData(buffer_r, buffer_w, 0, 0, sizeof(dummy_data));
   3296 
   3297 			is_ok &= ErrorCheckAndLog("glCopyNamedBufferSubData", GL_INVALID_OPERATION,
   3298 									  " if the destination buffer object is mapped with MapBuffer.");
   3299 
   3300 			m_pUnmapNamedBuffer(buffer_w);
   3301 			GLU_EXPECT_NO_ERROR(gl.getError(), "glUnmapNamedBuffer failed.");
   3302 		}
   3303 
   3304 		/* Test of persistently mapped read buffer copy error with behavior verification. */
   3305 		{
   3306 			(void)(glw::GLbyte*)
   3307 				m_pMapNamedBufferRange(buffer_r, 0, sizeof(dummy_data), GL_MAP_READ_BIT | GL_MAP_PERSISTENT_BIT);
   3308 			GLU_EXPECT_NO_ERROR(gl.getError(), "glMapNamedBuffer failed.");
   3309 
   3310 			m_pCopyNamedBufferSubData(buffer_r, buffer_w, 0, 0, sizeof(dummy_data));
   3311 
   3312 			is_ok &= ErrorCheckAndLog("glCopyNamedBufferSubData", GL_NO_ERROR,
   3313 									  " if the source buffer object is mapped using "
   3314 									  "MapBufferRange with the MAP_PERSISTENT bit "
   3315 									  "set in the access flags.");
   3316 
   3317 			m_pUnmapNamedBuffer(buffer_r);
   3318 			GLU_EXPECT_NO_ERROR(gl.getError(), "glUnmapNamedBuffer failed.");
   3319 		}
   3320 
   3321 		/* Test of persistently mapped write buffer copy error with behavior verification. */
   3322 		{
   3323 			(void)(glw::GLbyte*)
   3324 				m_pMapNamedBufferRange(buffer_w, 0, sizeof(dummy_data), GL_MAP_READ_BIT | GL_MAP_PERSISTENT_BIT);
   3325 			GLU_EXPECT_NO_ERROR(gl.getError(), "glMapNamedBuffer failed.");
   3326 
   3327 			m_pCopyNamedBufferSubData(buffer_r, buffer_w, 0, 0, sizeof(dummy_data));
   3328 
   3329 			GLU_EXPECT_NO_ERROR(gl.getError(), "glMapNamedBuffer failed.");
   3330 			is_ok &= ErrorCheckAndLog("glCopyNamedBufferSubData", GL_NO_ERROR,
   3331 									  " if the destination buffer object is mapped using "
   3332 									  "MapBufferRange with the MAP_PERSISTENT bit "
   3333 									  "set in the access flags.");
   3334 
   3335 			m_pUnmapNamedBuffer(buffer_w);
   3336 			GLU_EXPECT_NO_ERROR(gl.getError(), "glUnmapNamedBuffer failed.");
   3337 		}
   3338 	}
   3339 	catch (...)
   3340 	{
   3341 		is_ok		   = false;
   3342 		internal_error = true;
   3343 	}
   3344 
   3345 	if (buffer_r)
   3346 	{
   3347 		gl.deleteBuffers(1, &buffer_r);
   3348 
   3349 		buffer_r = 0;
   3350 	}
   3351 
   3352 	if (buffer_r)
   3353 	{
   3354 		gl.deleteBuffers(1, &buffer_r);
   3355 
   3356 		buffer_r = 0;
   3357 	}
   3358 
   3359 	if (internal_error)
   3360 	{
   3361 		throw 0;
   3362 	}
   3363 
   3364 	return is_ok;
   3365 }
   3366 
   3367 /** @brief Test Errors Of CreateBuffers function.
   3368  *
   3369  *  Check that INVALID_VALUE is generated by CreateBuffers if n is negative.
   3370  *
   3371  *  True if test case succeeded, false otherwise.
   3372  */
   3373 bool ErrorsTest::TestErrorsOfCreateBuffers()
   3374 {
   3375 	/* Shortcut for GL functionality. */
   3376 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
   3377 
   3378 	/* Return value. */
   3379 	bool is_ok = true;
   3380 
   3381 	/* Test. */
   3382 	glw::GLuint buffer = 0;
   3383 
   3384 	gl.createBuffers(-1, &buffer);
   3385 
   3386 	is_ok &= ErrorCheckAndLog("glCreateBuffers", GL_INVALID_VALUE, " if n is negative.");
   3387 
   3388 	/* Sanity check. */
   3389 	if (buffer)
   3390 	{
   3391 		gl.deleteBuffers(1, &buffer);
   3392 
   3393 		/* Possible error cleanup. */
   3394 		while (gl.getError())
   3395 			;
   3396 	}
   3397 
   3398 	return is_ok;
   3399 }
   3400 
   3401 /** @brief Test Errors Of FlushMappedNamedBufferRange function.
   3402  *
   3403  *  Check that INVALID_OPERATION is generated by FlushMappedNamedBufferRange
   3404  *  if buffer is not the name of an existing buffer object.
   3405  *
   3406  *  Check that INVALID_VALUE is generated by FlushMappedNamedBufferRange if
   3407  *  offset or length is negative, or if offset + length exceeds the size of
   3408  *  the mapping.
   3409  *
   3410  *  Check that INVALID_OPERATION is generated by FlushMappedNamedBufferRange
   3411  *  if the buffer object is not mapped, or is mapped without the
   3412  *  MAP_FLUSH_EXPLICIT_BIT flag.
   3413  *
   3414  *  True if test case succeeded, false otherwise.
   3415  */
   3416 bool ErrorsTest::TestErrorsOfFlushMappedNamedBufferRange()
   3417 {
   3418 	/* Shortcut for GL functionality. */
   3419 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
   3420 
   3421 	/* Return value. */
   3422 	bool is_ok			= true;
   3423 	bool internal_error = false;
   3424 
   3425 	/* Common variables. */
   3426 	glw::GLuint  buffer		   = 0;
   3427 	glw::GLubyte dummy_data[4] = {};
   3428 
   3429 	try
   3430 	{
   3431 		/* Common preparations. */
   3432 		gl.createBuffers(1, &buffer);
   3433 		GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateBuffers failed.");
   3434 
   3435 		m_pNamedBufferStorage(buffer, sizeof(dummy_data), &dummy_data, GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT);
   3436 		GLU_EXPECT_NO_ERROR(gl.getError(), "glNamedBuffeStorage failed.");
   3437 
   3438 		/* Test invalid buffer name flush error behavior. */
   3439 		{
   3440 			/* Prepare for invalid buffer name error behavior verification. */
   3441 			glw::GLuint not_a_buffer_name = 0;
   3442 
   3443 			while (gl.isBuffer(++not_a_buffer_name))
   3444 				;
   3445 
   3446 			/* Test. */
   3447 			m_pFlushMappedNamedBufferRange(not_a_buffer_name, 0, 1);
   3448 
   3449 			is_ok &= ErrorCheckAndLog("glFlushMappedNamedBufferRange", GL_INVALID_OPERATION,
   3450 									  " if buffer is not the name of an existing buffer object.");
   3451 		}
   3452 
   3453 		/* Test negative offset flush error behavior. */
   3454 		{
   3455 			(void)(glw::GLbyte*)
   3456 				m_pMapNamedBufferRange(buffer, 0, sizeof(dummy_data), GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT);
   3457 			GLU_EXPECT_NO_ERROR(gl.getError(), "glMapNamedBuffer failed.");
   3458 
   3459 			m_pFlushMappedNamedBufferRange(buffer, -1, 1);
   3460 
   3461 			is_ok &= ErrorCheckAndLog("glFlushMappedNamedBufferRange", GL_INVALID_VALUE, " if offset is negative.");
   3462 
   3463 			m_pUnmapNamedBuffer(buffer);
   3464 			GLU_EXPECT_NO_ERROR(gl.getError(), "glUnmapNamedBuffer failed.");
   3465 		}
   3466 
   3467 		/* Test negative length flush error behavior. */
   3468 		{
   3469 			(void)(glw::GLbyte*)
   3470 				m_pMapNamedBufferRange(buffer, 0, sizeof(dummy_data), GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT);
   3471 			GLU_EXPECT_NO_ERROR(gl.getError(), "glMapNamedBuffer failed.");
   3472 
   3473 			m_pFlushMappedNamedBufferRange(buffer, 0, -1);
   3474 
   3475 			is_ok &= ErrorCheckAndLog("glFlushMappedNamedBufferRange", GL_INVALID_VALUE, " if length is negative.");
   3476 
   3477 			m_pUnmapNamedBuffer(buffer);
   3478 			GLU_EXPECT_NO_ERROR(gl.getError(), "glUnmapNamedBuffer failed.");
   3479 		}
   3480 
   3481 		/* Test length exceeds the mapping size flush error behavior. */
   3482 		{
   3483 			(void)(glw::GLbyte*)
   3484 				m_pMapNamedBufferRange(buffer, 0, sizeof(dummy_data) / 2, GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT);
   3485 			GLU_EXPECT_NO_ERROR(gl.getError(), "glMapNamedBuffer failed.");
   3486 
   3487 			m_pFlushMappedNamedBufferRange(buffer, 0, sizeof(dummy_data));
   3488 
   3489 			is_ok &= ErrorCheckAndLog("glFlushMappedNamedBufferRange", GL_INVALID_VALUE,
   3490 									  " if length exceeds the size of the mapping.");
   3491 
   3492 			m_pUnmapNamedBuffer(buffer);
   3493 			GLU_EXPECT_NO_ERROR(gl.getError(), "glUnmapNamedBuffer failed.");
   3494 		}
   3495 
   3496 		/* Test offset + length exceeds the mapping size flush error behavior. */
   3497 		{
   3498 			(void)(glw::GLbyte*)
   3499 				m_pMapNamedBufferRange(buffer, 0, sizeof(dummy_data), GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT);
   3500 			GLU_EXPECT_NO_ERROR(gl.getError(), "glMapNamedBuffer failed.");
   3501 
   3502 			m_pFlushMappedNamedBufferRange(buffer, 1, sizeof(dummy_data));
   3503 
   3504 			is_ok &= ErrorCheckAndLog("glFlushMappedNamedBufferRange", GL_INVALID_VALUE,
   3505 									  " if offset + length exceeds the size of the mapping.");
   3506 
   3507 			m_pUnmapNamedBuffer(buffer);
   3508 			GLU_EXPECT_NO_ERROR(gl.getError(), "glUnmapNamedBuffer failed.");
   3509 		}
   3510 
   3511 		/* Test not mapped buffer flush error behavior. */
   3512 		{
   3513 			m_pFlushMappedNamedBufferRange(buffer, 0, sizeof(dummy_data));
   3514 
   3515 			is_ok &= ErrorCheckAndLog("glFlushMappedNamedBufferRange", GL_INVALID_OPERATION,
   3516 									  " if the buffer object is not mapped.");
   3517 		}
   3518 
   3519 		/* Test buffer flush without the MAP_FLUSH_EXPLICIT_BIT error behavior. */
   3520 		{
   3521 			(void)(glw::GLbyte*) m_pMapNamedBufferRange(buffer, 0, sizeof(dummy_data), GL_MAP_WRITE_BIT);
   3522 			GLU_EXPECT_NO_ERROR(gl.getError(), "glMapNamedBuffer failed.");
   3523 
   3524 			m_pFlushMappedNamedBufferRange(buffer, 0, sizeof(dummy_data));
   3525 
   3526 			is_ok &= ErrorCheckAndLog("glFlushMappedNamedBufferRange", GL_INVALID_OPERATION,
   3527 									  " if the buffer is mapped without the MAP_FLUSH_EXPLICIT_BIT flag.");
   3528 
   3529 			m_pUnmapNamedBuffer(buffer);
   3530 			GLU_EXPECT_NO_ERROR(gl.getError(), "glUnmapNamedBuffer failed.");
   3531 		}
   3532 	}
   3533 	catch (...)
   3534 	{
   3535 		is_ok		   = false;
   3536 		internal_error = true;
   3537 	}
   3538 
   3539 	if (buffer)
   3540 	{
   3541 		gl.deleteBuffers(1, &buffer);
   3542 
   3543 		buffer = 0;
   3544 	}
   3545 
   3546 	if (internal_error)
   3547 	{
   3548 		throw 0;
   3549 	}
   3550 
   3551 	return is_ok;
   3552 }
   3553 
   3554 /** @brief Test Errors Of GetNamedBufferParameteriv
   3555  *         and GetNamedBufferParameteri64v functions.
   3556  *
   3557  *  Check that INVALID_OPERATION is generated by GetNamedBufferParameter* if
   3558  *  buffer is not the name of an existing buffer object.
   3559  *
   3560  *  Check that INVALID_ENUM is generated by GetNamedBufferParameter* if
   3561  *  pname is not one of the buffer object parameter names: BUFFER_ACCESS,
   3562  *  BUFFER_ACCESS_FLAGS, BUFFER_IMMUTABLE_STORAGE, BUFFER_MAPPED,
   3563  *  BUFFER_MAP_LENGTH, BUFFER_MAP_OFFSET, BUFFER_SIZE, BUFFER_STORAGE_FLAGS,
   3564  *  BUFFER_USAGE.
   3565  *
   3566  *  True if test case succeeded, false otherwise.
   3567  */
   3568 bool ErrorsTest::TestErrorsOfGetNamedBufferParameter()
   3569 {
   3570 	/* Shortcut for GL functionality. */
   3571 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
   3572 
   3573 	/* Return value. */
   3574 	bool is_ok			= true;
   3575 	bool internal_error = false;
   3576 
   3577 	/* Common variables. */
   3578 	glw::GLuint  buffer		   = 0;
   3579 	glw::GLubyte dummy_data[4] = {};
   3580 
   3581 	try
   3582 	{
   3583 		/* Common preparations. */
   3584 		gl.createBuffers(1, &buffer);
   3585 		GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateBuffers failed.");
   3586 
   3587 		m_pNamedBufferStorage(buffer, sizeof(dummy_data), &dummy_data, GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT);
   3588 		GLU_EXPECT_NO_ERROR(gl.getError(), "glNamedBuffeStorage failed.");
   3589 
   3590 		/* Test invalid buffer name in GetNamedBufferParameteriv function error behavior. */
   3591 		{
   3592 			/* Prepare for invalid buffer name error behavior verification. */
   3593 			glw::GLuint not_a_buffer_name = 0;
   3594 
   3595 			while (gl.isBuffer(++not_a_buffer_name))
   3596 				;
   3597 
   3598 			glw::GLint value = 0;
   3599 
   3600 			/* Test. */
   3601 			m_pGetNamedBufferParameteriv(not_a_buffer_name, GL_BUFFER_MAPPED, &value);
   3602 
   3603 			is_ok &= ErrorCheckAndLog("glGetNamedBufferParameteriv", GL_INVALID_OPERATION,
   3604 									  " if buffer is not the name of an existing buffer object.");
   3605 		}
   3606 
   3607 		/* Test invalid buffer name in GetNamedBufferParameteri64v function error behavior. */
   3608 		{
   3609 			/* Prepare for invalid buffer name error behavior verification. */
   3610 			glw::GLuint not_a_buffer_name = 0;
   3611 
   3612 			while (gl.isBuffer(++not_a_buffer_name))
   3613 				;
   3614 
   3615 			glw::GLint64 value = 0;
   3616 
   3617 			/* Test. */
   3618 			m_pGetNamedBufferParameteri64v(not_a_buffer_name, GL_BUFFER_MAPPED, &value);
   3619 
   3620 			is_ok &= ErrorCheckAndLog("glGetNamedBufferParameteri64v", GL_INVALID_OPERATION,
   3621 									  " if buffer is not the name of an existing buffer object.");
   3622 		}
   3623 
   3624 		/* Test invalid parameter name in GetNamedBufferParameteriv function error behavior. */
   3625 		{
   3626 			/* Prepare for invalid parameter name error behavior verification. */
   3627 			static const glw::GLenum valid_parameters[] = {
   3628 				GL_BUFFER_ACCESS, GL_BUFFER_ACCESS_FLAGS,  GL_BUFFER_IMMUTABLE_STORAGE,
   3629 				GL_BUFFER_MAPPED, GL_BUFFER_MAP_LENGTH,	GL_BUFFER_MAP_OFFSET,
   3630 				GL_BUFFER_SIZE,   GL_BUFFER_STORAGE_FLAGS, GL_BUFFER_USAGE,
   3631 				GL_NONE
   3632 			};
   3633 			static const glw::GLenum valid_parameters_last = sizeof(valid_parameters) / sizeof(valid_parameters[0]) - 1;
   3634 
   3635 			glw::GLint value = 0;
   3636 
   3637 			glw::GLenum invalid_parameter = 0;
   3638 
   3639 			while (&valid_parameters[valid_parameters_last] !=
   3640 				   std::find(&valid_parameters[0], &valid_parameters[valid_parameters_last], (++invalid_parameter)))
   3641 				;
   3642 
   3643 			/* Test. */
   3644 			m_pGetNamedBufferParameteriv(buffer, invalid_parameter, &value);
   3645 
   3646 			is_ok &= ErrorCheckAndLog("glGetNamedBufferParameteriv", GL_INVALID_ENUM,
   3647 									  " if pname is not one of the buffer object parameter names: BUFFER_ACCESS,"
   3648 									  " BUFFER_ACCESS_FLAGS, BUFFER_IMMUTABLE_STORAGE, BUFFER_MAPPED,"
   3649 									  " BUFFER_MAP_LENGTH, BUFFER_MAP_OFFSET, BUFFER_SIZE, BUFFER_STORAGE_FLAGS,"
   3650 									  " BUFFER_USAGE.");
   3651 		}
   3652 
   3653 		/* Test invalid parameter name in GetNamedBufferParameteri64v function error behavior. */
   3654 		{
   3655 			/* Prepare for invalid parameter name error behavior verification. */
   3656 			static const glw::GLenum valid_parameters[] = {
   3657 				GL_BUFFER_ACCESS, GL_BUFFER_ACCESS_FLAGS,  GL_BUFFER_IMMUTABLE_STORAGE,
   3658 				GL_BUFFER_MAPPED, GL_BUFFER_MAP_LENGTH,	GL_BUFFER_MAP_OFFSET,
   3659 				GL_BUFFER_SIZE,   GL_BUFFER_STORAGE_FLAGS, GL_BUFFER_USAGE,
   3660 				GL_NONE
   3661 			};
   3662 			static const glw::GLenum valid_parameters_last = sizeof(valid_parameters) / sizeof(valid_parameters[0]) - 1;
   3663 
   3664 			glw::GLint64 value = 0;
   3665 
   3666 			glw::GLenum invalid_parameter = 0;
   3667 
   3668 			while (&valid_parameters[valid_parameters_last] !=
   3669 				   std::find(&valid_parameters[0], &valid_parameters[valid_parameters_last], (++invalid_parameter)))
   3670 				;
   3671 
   3672 			/* Test. */
   3673 			m_pGetNamedBufferParameteri64v(buffer, invalid_parameter, &value);
   3674 
   3675 			is_ok &= ErrorCheckAndLog("glGetNamedBufferParameteri64v", GL_INVALID_ENUM,
   3676 									  " if pname is not one of the buffer object parameter names: BUFFER_ACCESS,"
   3677 									  " BUFFER_ACCESS_FLAGS, BUFFER_IMMUTABLE_STORAGE, BUFFER_MAPPED,"
   3678 									  " BUFFER_MAP_LENGTH, BUFFER_MAP_OFFSET, BUFFER_SIZE, BUFFER_STORAGE_FLAGS,"
   3679 									  " BUFFER_USAGE.");
   3680 		}
   3681 	}
   3682 	catch (...)
   3683 	{
   3684 		is_ok		   = false;
   3685 		internal_error = true;
   3686 	}
   3687 
   3688 	if (buffer)
   3689 	{
   3690 		gl.deleteBuffers(1, &buffer);
   3691 
   3692 		buffer = 0;
   3693 	}
   3694 
   3695 	if (internal_error)
   3696 	{
   3697 		throw 0;
   3698 	}
   3699 
   3700 	return is_ok;
   3701 }
   3702 
   3703 /** @brief Test Errors Of GetNamedBufferPointerv function.
   3704  *
   3705  *  Check that INVALID_OPERATION is generated by GetNamedBufferPointerv
   3706  *  if buffer is not the name of an existing buffer object.
   3707  *
   3708  *  True if test case succeeded, false otherwise.
   3709  */
   3710 bool ErrorsTest::TestErrorsOfGetNamedBufferPointerv()
   3711 {
   3712 	/* Shortcut for GL functionality. */
   3713 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
   3714 
   3715 	/* Return value. */
   3716 	bool is_ok			= true;
   3717 	bool internal_error = false;
   3718 
   3719 	/* Common variables. */
   3720 	glw::GLuint  buffer		   = 0;
   3721 	glw::GLubyte dummy_data[4] = {};
   3722 
   3723 	try
   3724 	{
   3725 		/* Common preparations. */
   3726 		gl.createBuffers(1, &buffer);
   3727 		GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateBuffers failed.");
   3728 
   3729 		m_pNamedBufferStorage(buffer, sizeof(dummy_data), &dummy_data, GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT);
   3730 		GLU_EXPECT_NO_ERROR(gl.getError(), "glNamedBuffeStorage failed.");
   3731 
   3732 		/* Test invalid buffer name in GetNamedBufferPointerv function error behavior. */
   3733 		{
   3734 			/* Prepare for invalid buffer name error behavior verification. */
   3735 			glw::GLuint not_a_buffer_name = 0;
   3736 
   3737 			while (gl.isBuffer(++not_a_buffer_name))
   3738 				;
   3739 
   3740 			glw::GLvoid* pointer = DE_NULL;
   3741 
   3742 			/* Test. */
   3743 			m_pGetNamedBufferPointerv(not_a_buffer_name, GL_BUFFER_MAP_POINTER, &pointer);
   3744 
   3745 			is_ok &= ErrorCheckAndLog("glGetNamedBufferPointerv", GL_INVALID_OPERATION,
   3746 									  " if buffer is not the name of an existing buffer object.");
   3747 		}
   3748 	}
   3749 	catch (...)
   3750 	{
   3751 		is_ok		   = false;
   3752 		internal_error = true;
   3753 	}
   3754 
   3755 	if (buffer)
   3756 	{
   3757 		gl.deleteBuffers(1, &buffer);
   3758 
   3759 		buffer = 0;
   3760 	}
   3761 
   3762 	if (internal_error)
   3763 	{
   3764 		throw 0;
   3765 	}
   3766 
   3767 	return is_ok;
   3768 }
   3769 
   3770 /** @brief Test Errors Of GetNamedBufferSubData function.
   3771  *
   3772  *  Check that INVALID_OPERATION is generated by GetNamedBufferSubData if
   3773  *  buffer is not the name of an existing buffer object.
   3774  *
   3775  *  Check that INVALID_VALUE is generated by GetNamedBufferSubData if offset
   3776  *  or size is negative, or if offset+size is greater than the value of
   3777  *  BUFFER_SIZE for the buffer object.
   3778  *
   3779  *  Check that INVALID_OPERATION is generated by GetNamedBufferSubData if
   3780  *  the buffer object is mapped with MapBufferRange or MapBuffer, unless it
   3781  *  was mapped with the MAP_PERSISTENT_BIT bit set in the MapBufferRange
   3782  *  access flags.
   3783  *
   3784  *  True if test case succeeded, false otherwise.
   3785  */
   3786 bool ErrorsTest::TestErrorsOfGetNamedBufferSubData()
   3787 {
   3788 	/* Shortcut for GL functionality. */
   3789 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
   3790 
   3791 	/* Return value. */
   3792 	bool is_ok			= true;
   3793 	bool internal_error = false;
   3794 
   3795 	/* Common variables. */
   3796 	glw::GLuint  buffer		   = 0;
   3797 	glw::GLubyte dummy_data[4] = {};
   3798 
   3799 	try
   3800 	{
   3801 		/* Common preparations. */
   3802 		gl.createBuffers(1, &buffer);
   3803 		GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateBuffers failed.");
   3804 
   3805 		m_pNamedBufferStorage(buffer, sizeof(dummy_data), &dummy_data, GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT);
   3806 		GLU_EXPECT_NO_ERROR(gl.getError(), "glNamedBuffeStorage failed.");
   3807 
   3808 		/* Test invalid buffer name in pGetNamedBufferSubData function error behavior. */
   3809 		{
   3810 			/* Prepare for invalid buffer name error behavior verification. */
   3811 			glw::GLuint not_a_buffer_name = 0;
   3812 
   3813 			while (gl.isBuffer(++not_a_buffer_name))
   3814 				;
   3815 
   3816 			/* Query storage. */
   3817 			glw::GLubyte dummy_data_query[sizeof(dummy_data) / sizeof(dummy_data[0])] = {};
   3818 
   3819 			/* Test. */
   3820 			m_pGetNamedBufferSubData(not_a_buffer_name, 0, sizeof(dummy_data_query), dummy_data_query);
   3821 
   3822 			is_ok &= ErrorCheckAndLog("glGetNamedBufferSubData", GL_INVALID_OPERATION,
   3823 									  " if buffer is not the name of an existing buffer object.");
   3824 		}
   3825 
   3826 		/* Test negative offset error behavior. */
   3827 		{
   3828 			/* Query storage. */
   3829 			glw::GLubyte dummy_data_query[sizeof(dummy_data) / sizeof(dummy_data[0])] = {};
   3830 
   3831 			/* Test. */
   3832 			m_pGetNamedBufferSubData(buffer, -1, sizeof(dummy_data_query), dummy_data_query);
   3833 
   3834 			is_ok &= ErrorCheckAndLog("glGetNamedBufferSubData", GL_INVALID_VALUE, " if offset is negative.");
   3835 		}
   3836 
   3837 		/* Test negative size error behavior. */
   3838 		{
   3839 			/* Query storage. */
   3840 			glw::GLubyte dummy_data_query[sizeof(dummy_data) / sizeof(dummy_data[0])] = {};
   3841 
   3842 			/* Test. */
   3843 			m_pGetNamedBufferSubData(buffer, 0, -1, dummy_data_query);
   3844 
   3845 			is_ok &= ErrorCheckAndLog("glGetNamedBufferSubData", GL_INVALID_VALUE, " if size is negative.");
   3846 		}
   3847 
   3848 		/* Test size overflow error behavior. */
   3849 		{
   3850 			/* Query storage. */
   3851 			glw::GLubyte dummy_data_query[sizeof(dummy_data) / sizeof(dummy_data[0])] = {};
   3852 
   3853 			/* Test. */
   3854 			m_pGetNamedBufferSubData(buffer, 0, 2 * sizeof(dummy_data_query), dummy_data_query);
   3855 
   3856 			is_ok &= ErrorCheckAndLog("glGetNamedBufferSubData", GL_INVALID_VALUE,
   3857 									  " if size is greater than the value of BUFFER_SIZE for the buffer object.");
   3858 		}
   3859 
   3860 		/* Test offset+size overflow error behavior. */
   3861 		{
   3862 			/* Query storage. */
   3863 			glw::GLubyte dummy_data_query[sizeof(dummy_data) / sizeof(dummy_data[0])] = {};
   3864 
   3865 			/* Test. */
   3866 			m_pGetNamedBufferSubData(buffer, sizeof(dummy_data_query) / 2, sizeof(dummy_data_query), dummy_data_query);
   3867 
   3868 			is_ok &=
   3869 				ErrorCheckAndLog("glGetNamedBufferSubData", GL_INVALID_VALUE,
   3870 								 " if offset+size is greater than the value of BUFFER_SIZE for the buffer object.");
   3871 		}
   3872 
   3873 		/* Test offset overflow error behavior. */
   3874 		{
   3875 			/* Query storage. */
   3876 			glw::GLubyte dummy_data_query[sizeof(dummy_data) / sizeof(dummy_data[0])] = {};
   3877 
   3878 			/* Test. */
   3879 			m_pGetNamedBufferSubData(buffer, sizeof(dummy_data_query) + 1, 0, dummy_data_query);
   3880 
   3881 			is_ok &= ErrorCheckAndLog("glGetNamedBufferSubData", GL_INVALID_VALUE,
   3882 									  " if offset is greater than the value of BUFFER_SIZE for the buffer object.");
   3883 		}
   3884 
   3885 		/* Test mapped buffer query error behavior. */
   3886 		{
   3887 			/* Query storage. */
   3888 			glw::GLubyte dummy_data_query[sizeof(dummy_data) / sizeof(dummy_data[0])] = {};
   3889 
   3890 			/* Test. */
   3891 			(void)(glw::GLbyte*) m_pMapNamedBuffer(buffer, GL_WRITE_ONLY);
   3892 			GLU_EXPECT_NO_ERROR(gl.getError(), "glMapNamedBuffer failed.");
   3893 
   3894 			m_pGetNamedBufferSubData(buffer, 0, sizeof(dummy_data_query), dummy_data_query);
   3895 
   3896 			is_ok &= ErrorCheckAndLog("glGetNamedBufferSubData", GL_INVALID_OPERATION,
   3897 									  " if the buffer object is mapped with MapBufferRange.");
   3898 
   3899 			m_pUnmapNamedBuffer(buffer);
   3900 			GLU_EXPECT_NO_ERROR(gl.getError(), "glUnmapNamedBuffer failed.");
   3901 		}
   3902 
   3903 		/* Test mapped buffer query error behavior. */
   3904 		{
   3905 			/* Query storage. */
   3906 			glw::GLubyte dummy_data_query[sizeof(dummy_data) / sizeof(dummy_data[0])] = {};
   3907 
   3908 			/* Test. */
   3909 			(void)(glw::GLbyte*) m_pMapNamedBufferRange(buffer, 0, sizeof(dummy_data), GL_MAP_WRITE_BIT);
   3910 			GLU_EXPECT_NO_ERROR(gl.getError(), "glMapNamedBuffer failed.");
   3911 
   3912 			m_pGetNamedBufferSubData(buffer, 0, sizeof(dummy_data_query), dummy_data_query);
   3913 
   3914 			is_ok &= ErrorCheckAndLog("glGetNamedBufferSubData", GL_INVALID_OPERATION,
   3915 									  " if the buffer object is mapped with MapBufferRange.");
   3916 
   3917 			m_pUnmapNamedBuffer(buffer);
   3918 			GLU_EXPECT_NO_ERROR(gl.getError(), "glUnmapNamedBuffer failed.");
   3919 		}
   3920 
   3921 		/* Test persistently mapped buffer query behavior. */
   3922 		{
   3923 			/* Query storage. */
   3924 			glw::GLubyte dummy_data_query[sizeof(dummy_data) / sizeof(dummy_data[0])] = {};
   3925 
   3926 			/* Test. */
   3927 			(void)(glw::GLbyte*)
   3928 				m_pMapNamedBufferRange(buffer, 0, sizeof(dummy_data), GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT);
   3929 			GLU_EXPECT_NO_ERROR(gl.getError(), "glMapNamedBuffer failed.");
   3930 
   3931 			m_pGetNamedBufferSubData(buffer, 0, sizeof(dummy_data_query), dummy_data_query);
   3932 
   3933 			is_ok &= ErrorCheckAndLog(
   3934 				"glGetNamedBufferSubData", GL_NO_ERROR,
   3935 				" if the buffer object is mapped with MapBufferRange with GL_MAP_PERSISTENT_BIT flag.");
   3936 
   3937 			m_pUnmapNamedBuffer(buffer);
   3938 			GLU_EXPECT_NO_ERROR(gl.getError(), "glUnmapNamedBuffer failed.");
   3939 		}
   3940 	}
   3941 	catch (...)
   3942 	{
   3943 		is_ok		   = false;
   3944 		internal_error = true;
   3945 	}
   3946 
   3947 	if (buffer)
   3948 	{
   3949 		gl.deleteBuffers(1, &buffer);
   3950 
   3951 		buffer = 0;
   3952 	}
   3953 
   3954 	if (internal_error)
   3955 	{
   3956 		throw 0;
   3957 	}
   3958 
   3959 	return is_ok;
   3960 }
   3961 
   3962 /** @brief Test Errors Of MapNamedBuffer function.
   3963  *
   3964  *  Check that INVALID_OPERATION is generated by MapNamedBuffer if buffer is
   3965  *  not the name of an existing buffer object.
   3966  *
   3967  *  Check that INVALID_ENUM is generated by MapNamedBuffer if access is not
   3968  *  READ_ONLY, WRITE_ONLY, or READ_WRITE.
   3969  *
   3970  *  Check that INVALID_OPERATION is generated by MapNamedBuffer if the
   3971  *  buffer object is in a mapped state.
   3972  *
   3973  *  True if test case succeeded, false otherwise.
   3974  */
   3975 bool ErrorsTest::TestErrorsOfMapNamedBuffer()
   3976 {
   3977 	/* Shortcut for GL functionality. */
   3978 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
   3979 
   3980 	/* Return value. */
   3981 	bool is_ok			= true;
   3982 	bool internal_error = false;
   3983 
   3984 	/* Common variables. */
   3985 	glw::GLuint  buffer		   = 0;
   3986 	glw::GLubyte dummy_data[4] = {};
   3987 
   3988 	try
   3989 	{
   3990 		/* Common preparations. */
   3991 		gl.createBuffers(1, &buffer);
   3992 		GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateBuffers failed.");
   3993 
   3994 		m_pNamedBufferStorage(buffer, sizeof(dummy_data), &dummy_data, GL_MAP_READ_BIT | GL_MAP_PERSISTENT_BIT);
   3995 		GLU_EXPECT_NO_ERROR(gl.getError(), "glNamedBuffeStorage failed.");
   3996 
   3997 		/* Test invalid buffer name error behavior. */
   3998 		{
   3999 			/* Prepare for invalid buffer name error behavior verification. */
   4000 			glw::GLuint not_a_buffer_name = 0;
   4001 
   4002 			while (gl.isBuffer(++not_a_buffer_name))
   4003 				;
   4004 
   4005 			/* Test. */
   4006 			m_pMapNamedBuffer(not_a_buffer_name, GL_READ_ONLY);
   4007 
   4008 			is_ok &= ErrorCheckAndLog("glMapNamedBuffer", GL_INVALID_OPERATION,
   4009 									  " if buffer is not the name of an existing buffer object.");
   4010 		}
   4011 
   4012 		/* Test access flag error behavior. */
   4013 		{
   4014 			/* Prepare for invalid type error behavior verification. */
   4015 			static const glw::GLenum valid_access_flags[] = { GL_READ_ONLY, GL_WRITE_ONLY, GL_READ_WRITE, GL_NONE };
   4016 			static const glw::GLenum valid_access_flags_last =
   4017 				sizeof(valid_access_flags) / sizeof(valid_access_flags[0]) - 1;
   4018 
   4019 			glw::GLenum invalid_access_flags = 0;
   4020 
   4021 			while (&valid_access_flags[valid_access_flags_last] !=
   4022 				   std::find(&valid_access_flags[0], &valid_access_flags[valid_access_flags_last],
   4023 							 (++invalid_access_flags)))
   4024 				;
   4025 
   4026 			/* Test. */
   4027 			glw::GLbyte* mapped_data = (glw::GLbyte*)m_pMapNamedBuffer(buffer, invalid_access_flags);
   4028 
   4029 			is_ok &= ErrorCheckAndLog("glMapNamedBuffer", GL_INVALID_ENUM,
   4030 									  " if access is not READ_ONLY, WRITE_ONLY, or READ_WRITE.");
   4031 
   4032 			/* Sanity unmapping. */
   4033 			if (DE_NULL != mapped_data)
   4034 			{
   4035 				m_pUnmapNamedBuffer(buffer);
   4036 				while (gl.getError())
   4037 					;
   4038 			}
   4039 		}
   4040 
   4041 		/* Test mapping of mapped buffer error behavior. */
   4042 		{
   4043 			(void)(glw::GLbyte*) m_pMapNamedBuffer(buffer, GL_READ_ONLY);
   4044 			GLU_EXPECT_NO_ERROR(gl.getError(), "glMapNamedBuffer.");
   4045 
   4046 			glw::GLbyte* subsequent_mapped_data = (glw::GLbyte*)m_pMapNamedBuffer(buffer, GL_READ_ONLY);
   4047 
   4048 			is_ok &= ErrorCheckAndLog("glMapNamedBuffer", GL_INVALID_OPERATION,
   4049 									  " if the buffer object is in a mapped state.");
   4050 
   4051 			m_pUnmapNamedBuffer(buffer);
   4052 			GLU_EXPECT_NO_ERROR(gl.getError(), "glUnmapNamedBuffer failed.");
   4053 
   4054 			if (subsequent_mapped_data)
   4055 			{
   4056 				m_context.getTestContext().getLog()
   4057 					<< tcu::TestLog::Message
   4058 					<< "glMapNamedBuffer called on mapped buffer returned non-NULL pointer when error shall occure."
   4059 					   "This may lead to undefined behavior during next tests (object still may be mapped). "
   4060 					   "Test was terminated prematurely."
   4061 					<< tcu::TestLog::EndMessage;
   4062 				throw 0;
   4063 			}
   4064 		}
   4065 	}
   4066 	catch (...)
   4067 	{
   4068 		is_ok		   = false;
   4069 		internal_error = true;
   4070 	}
   4071 
   4072 	if (buffer)
   4073 	{
   4074 		gl.deleteBuffers(1, &buffer);
   4075 
   4076 		buffer = 0;
   4077 	}
   4078 
   4079 	if (internal_error)
   4080 	{
   4081 		throw 0;
   4082 	}
   4083 
   4084 	return is_ok;
   4085 }
   4086 
   4087 /** @brief Test Errors Of MapNamedBufferRange function.
   4088  *
   4089  *  Check that INVALID_OPERATION is generated by MapNamedBufferRange if
   4090  *  buffer is not the name of an existing buffer object.
   4091  *
   4092  *  Check that INVALID_VALUE is generated by MapNamedBufferRange if offset
   4093  *  or length is negative, if offset+length is greater than the value of
   4094  *  BUFFER_SIZE for the buffer object, or if access has any bits set other
   4095  *  than those defined above.
   4096  *
   4097  *  Check that INVALID_OPERATION is generated by MapNamedBufferRange for any
   4098  *  of the following conditions:
   4099  *   -  length is zero.
   4100  *   -  The buffer object is already in a mapped state.
   4101  *   -  Neither MAP_READ_BIT nor MAP_WRITE_BIT is set.
   4102  *   -  MAP_READ_BIT is set and any of MAP_INVALIDATE_RANGE_BIT,
   4103  *      MAP_INVALIDATE_BUFFER_BIT or MAP_UNSYNCHRONIZED_BIT is set.
   4104  *   -  MAP_FLUSH_EXPLICIT_BIT is set and MAP_WRITE_BIT is not set.
   4105  *   -  Any of MAP_READ_BIT, MAP_WRITE_BIT, MAP_PERSISTENT_BIT, or
   4106  *      MAP_COHERENT_BIT are set, but the same bit is not included in the
   4107  *      buffer's storage flags.
   4108  *
   4109  *  True if test case succeeded, false otherwise.
   4110  */
   4111 bool ErrorsTest::TestErrorsOfMapNamedBufferRange()
   4112 {
   4113 	/* Shortcut for GL functionality. */
   4114 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
   4115 
   4116 	/* Return value. */
   4117 	bool is_ok			= true;
   4118 	bool internal_error = false;
   4119 
   4120 	/* Common variables. */
   4121 	glw::GLuint  buffer				  = 0;
   4122 	glw::GLuint  buffer_special_flags = 0;
   4123 	glw::GLubyte dummy_data[4]		  = {};
   4124 
   4125 	try
   4126 	{
   4127 		/* Common preparations. */
   4128 		gl.createBuffers(1, &buffer);
   4129 		GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateBuffers failed.");
   4130 
   4131 		m_pNamedBufferStorage(buffer, sizeof(dummy_data), &dummy_data,
   4132 							  GL_MAP_READ_BIT | GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT);
   4133 		GLU_EXPECT_NO_ERROR(gl.getError(), "glNamedBuffeStorage failed.");
   4134 
   4135 		/* Test invalid buffer name error behavior. */
   4136 		{
   4137 			/* Prepare for invalid buffer name error behavior verification. */
   4138 			glw::GLuint not_a_buffer_name = 0;
   4139 
   4140 			while (gl.isBuffer(++not_a_buffer_name))
   4141 				;
   4142 
   4143 			/* Test. */
   4144 			m_pMapNamedBufferRange(not_a_buffer_name, 0, sizeof(dummy_data), GL_MAP_READ_BIT);
   4145 
   4146 			is_ok &= ErrorCheckAndLog("glMapNamedBufferRange", GL_INVALID_OPERATION,
   4147 									  " if buffer is not the name of an existing buffer object.");
   4148 		}
   4149 
   4150 		/* Test negative offset error behavior. */
   4151 		{
   4152 			glw::GLvoid* mapped_data = m_pMapNamedBufferRange(buffer, -1, sizeof(dummy_data), GL_MAP_READ_BIT);
   4153 
   4154 			is_ok &= ErrorCheckAndLog("glMapNamedBufferRange", GL_INVALID_VALUE, " if offset is negative.");
   4155 
   4156 			/* Sanity unmapping. */
   4157 			if (DE_NULL != mapped_data)
   4158 			{
   4159 				m_pUnmapNamedBuffer(buffer);
   4160 				while (gl.getError())
   4161 					;
   4162 			}
   4163 		}
   4164 
   4165 		/* Test negative length error behavior. */
   4166 		{
   4167 			glw::GLvoid* mapped_data = m_pMapNamedBufferRange(buffer, 0, -1, GL_MAP_READ_BIT);
   4168 
   4169 			is_ok &= ErrorCheckAndLog("glMapNamedBufferRange", GL_INVALID_VALUE, " if length is negative.");
   4170 
   4171 			/* Sanity unmapping. */
   4172 			if (DE_NULL != mapped_data)
   4173 			{
   4174 				m_pUnmapNamedBuffer(buffer);
   4175 				while (gl.getError())
   4176 					;
   4177 			}
   4178 		}
   4179 
   4180 		/* Test length overflow error behavior. */
   4181 		{
   4182 			glw::GLvoid* mapped_data = m_pMapNamedBufferRange(buffer, 0, sizeof(dummy_data) * 2, GL_MAP_READ_BIT);
   4183 
   4184 			is_ok &= ErrorCheckAndLog("glMapNamedBufferRange", GL_INVALID_VALUE,
   4185 									  " if length is greater than the value of BUFFER_SIZE"
   4186 									  " for the buffer object, or if access has any bits set other"
   4187 									  " than those defined above.");
   4188 
   4189 			/* Sanity unmapping. */
   4190 			if (DE_NULL != mapped_data)
   4191 			{
   4192 				m_pUnmapNamedBuffer(buffer);
   4193 				while (gl.getError())
   4194 					;
   4195 			}
   4196 		}
   4197 
   4198 		/* Test (offset+length) overflow error behavior. */
   4199 		{
   4200 			glw::GLvoid* mapped_data =
   4201 				m_pMapNamedBufferRange(buffer, sizeof(dummy_data) / 2, sizeof(dummy_data), GL_MAP_READ_BIT);
   4202 
   4203 			is_ok &= ErrorCheckAndLog("glMapNamedBufferRange", GL_INVALID_VALUE,
   4204 									  " if offset+length is greater than the value of BUFFER_SIZE"
   4205 									  " for the buffer object, or if access has any bits set other"
   4206 									  " than those defined above.");
   4207 
   4208 			/* Sanity unmapping. */
   4209 			if (DE_NULL != mapped_data)
   4210 			{
   4211 				m_pUnmapNamedBuffer(buffer);
   4212 				while (gl.getError())
   4213 					;
   4214 			}
   4215 		}
   4216 
   4217 		/* Test zero length error behavior. */
   4218 		{
   4219 			glw::GLvoid* mapped_data = m_pMapNamedBufferRange(buffer, 0, 0, GL_MAP_READ_BIT);
   4220 
   4221 			is_ok &= ErrorCheckAndLog("glMapNamedBufferRange", GL_INVALID_OPERATION, " if length is zero.");
   4222 
   4223 			/* Sanity unmapping. */
   4224 			if (DE_NULL != mapped_data)
   4225 			{
   4226 				m_pUnmapNamedBuffer(buffer);
   4227 				while (gl.getError())
   4228 					;
   4229 			}
   4230 		}
   4231 
   4232 		/* Test mapping of mapped buffer error behavior. */
   4233 		{
   4234 			m_pMapNamedBufferRange(buffer, 0, sizeof(dummy_data), GL_MAP_READ_BIT);
   4235 			GLU_EXPECT_NO_ERROR(gl.getError(), "glMapNamedBuffer.");
   4236 
   4237 			glw::GLvoid* subsequent_mapped_data =
   4238 				m_pMapNamedBufferRange(buffer, 0, sizeof(dummy_data), GL_MAP_READ_BIT);
   4239 
   4240 			is_ok &= ErrorCheckAndLog("glMapNamedBufferRange", GL_INVALID_OPERATION,
   4241 									  " if the buffer object is in a mapped state.");
   4242 
   4243 			m_pUnmapNamedBuffer(buffer);
   4244 			GLU_EXPECT_NO_ERROR(gl.getError(), "glUnmapNamedBuffer failed.");
   4245 
   4246 			if (subsequent_mapped_data)
   4247 			{
   4248 				m_context.getTestContext().getLog()
   4249 					<< tcu::TestLog::Message
   4250 					<< "glMapNamedBufferRange called on mapped buffer returned non-NULL pointer when error shall "
   4251 					   "occure."
   4252 					   "This may lead to undefined behavior during next tests (object still may be mapped). "
   4253 					   "Test was terminated prematurely."
   4254 					<< tcu::TestLog::EndMessage;
   4255 				throw 0;
   4256 			}
   4257 		}
   4258 
   4259 		/* Test access flag read and write bits are not set error behavior. */
   4260 		{
   4261 			glw::GLvoid* mapped_data = m_pMapNamedBufferRange(buffer, 0, sizeof(dummy_data), 0);
   4262 
   4263 			is_ok &= ErrorCheckAndLog("glMapNamedBufferRange", GL_INVALID_OPERATION,
   4264 									  " if neither MAP_READ_BIT nor MAP_WRITE_BIT is set.");
   4265 
   4266 			/* Sanity unmapping. */
   4267 			if (DE_NULL != mapped_data)
   4268 			{
   4269 				m_pUnmapNamedBuffer(buffer);
   4270 				while (gl.getError())
   4271 					;
   4272 			}
   4273 		}
   4274 
   4275 		/* Test read access invalid flags error behavior. */
   4276 		{
   4277 			glw::GLenum read_access_invalid_flags[] = { GL_MAP_INVALIDATE_RANGE_BIT, GL_MAP_INVALIDATE_BUFFER_BIT,
   4278 														GL_MAP_UNSYNCHRONIZED_BIT };
   4279 			const glw::GLchar* read_access_invalid_flags_log[] = {
   4280 				" if MAP_READ_BIT is set with MAP_INVALIDATE_RANGE_BIT.",
   4281 				" if MAP_READ_BIT is set with MAP_INVALIDATE_BUFFER_BIT.",
   4282 				" if MAP_READ_BIT is set with MAP_UNSYNCHRONIZED_BIT."
   4283 			};
   4284 			glw::GLuint read_access_invalid_flags_count =
   4285 				sizeof(read_access_invalid_flags) / sizeof(read_access_invalid_flags[0]);
   4286 
   4287 			for (glw::GLuint i = 0; i < read_access_invalid_flags_count; ++i)
   4288 			{
   4289 				glw::GLvoid* mapped_data = m_pMapNamedBufferRange(buffer, 0, sizeof(dummy_data),
   4290 																  GL_MAP_READ_BIT | read_access_invalid_flags[i]);
   4291 
   4292 				is_ok &=
   4293 					ErrorCheckAndLog("glMapNamedBufferRange", GL_INVALID_OPERATION, read_access_invalid_flags_log[i]);
   4294 
   4295 				/* Sanity unmapping. */
   4296 				if (DE_NULL != mapped_data)
   4297 				{
   4298 					m_pUnmapNamedBuffer(buffer);
   4299 					while (gl.getError())
   4300 						;
   4301 				}
   4302 			}
   4303 		}
   4304 
   4305 		/* Test access flush bit without write bit error behavior. */
   4306 		{
   4307 			glw::GLvoid* mapped_data =
   4308 				m_pMapNamedBufferRange(buffer, 0, sizeof(dummy_data), GL_MAP_READ_BIT | GL_MAP_FLUSH_EXPLICIT_BIT);
   4309 
   4310 			is_ok &= ErrorCheckAndLog("glMapNamedBufferRange", GL_INVALID_OPERATION,
   4311 									  " if MAP_FLUSH_EXPLICIT_BIT is set and MAP_WRITE_BIT is not set.");
   4312 
   4313 			/* Sanity unmapping. */
   4314 			if (DE_NULL != mapped_data)
   4315 			{
   4316 				m_pUnmapNamedBuffer(buffer);
   4317 				while (gl.getError())
   4318 					;
   4319 			}
   4320 		}
   4321 
   4322 		/* Test incompatible buffer flag error behavior. */
   4323 		{
   4324 			glw::GLenum buffer_flags[] = { GL_MAP_WRITE_BIT, GL_MAP_READ_BIT, GL_MAP_WRITE_BIT,
   4325 										   GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT };
   4326 			glw::GLenum mapping_flags[] = { GL_MAP_READ_BIT, GL_MAP_WRITE_BIT, GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT,
   4327 											GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT };
   4328 			const glw::GLchar* mapping_flags_log[] = {
   4329 				" if MAP_READ_BIT is set, but the same bit is not included in the buffer's storage flags.",
   4330 				" if MAP_WRITE_BIT is set, but the same bit is not included in the buffer's storage flags.",
   4331 				" if MAP_PERSISTENT_BIT is set, but the same bit is not included in the buffer's storage flags.",
   4332 				" if MAP_COHERENT_BIT is set, but the same bit is not included in the buffer's storage flags."
   4333 			};
   4334 			glw::GLuint flags_count = sizeof(mapping_flags) / sizeof(mapping_flags[0]);
   4335 
   4336 			for (glw::GLuint i = 0; i < flags_count; ++i)
   4337 			{
   4338 				/* Create buffer. */
   4339 				gl.createBuffers(1, &buffer_special_flags);
   4340 				GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateBuffers failed.");
   4341 
   4342 				m_pNamedBufferStorage(buffer_special_flags, sizeof(dummy_data), &dummy_data, buffer_flags[i]);
   4343 				GLU_EXPECT_NO_ERROR(gl.getError(), "glNamedBuffeStorage failed.");
   4344 
   4345 				/* Test mapping. */
   4346 				glw::GLvoid* mapped_data =
   4347 					m_pMapNamedBufferRange(buffer_special_flags, 0, sizeof(dummy_data), mapping_flags[i]);
   4348 
   4349 				is_ok &= ErrorCheckAndLog("glMapNamedBufferRange", GL_INVALID_OPERATION, mapping_flags_log[i]);
   4350 
   4351 				/* Sanity unmapping. */
   4352 				if (DE_NULL != mapped_data)
   4353 				{
   4354 					m_pUnmapNamedBuffer(buffer);
   4355 					while (gl.getError())
   4356 						;
   4357 				}
   4358 
   4359 				/* Releasing buffer. */
   4360 				if (buffer_special_flags)
   4361 				{
   4362 					gl.deleteBuffers(1, &buffer_special_flags);
   4363 
   4364 					buffer_special_flags = 0;
   4365 				}
   4366 			}
   4367 		}
   4368 	}
   4369 	catch (...)
   4370 	{
   4371 		is_ok		   = false;
   4372 		internal_error = true;
   4373 	}
   4374 
   4375 	if (buffer)
   4376 	{
   4377 		gl.deleteBuffers(1, &buffer);
   4378 
   4379 		buffer = 0;
   4380 	}
   4381 
   4382 	if (buffer_special_flags)
   4383 	{
   4384 		gl.deleteBuffers(1, &buffer_special_flags);
   4385 
   4386 		buffer_special_flags = 0;
   4387 	}
   4388 
   4389 	if (internal_error)
   4390 	{
   4391 		throw 0;
   4392 	}
   4393 
   4394 	return is_ok;
   4395 }
   4396 
   4397 /** @brief Test Errors Of NamedBufferData function.
   4398  *
   4399  *          Check that INVALID_OPERATION is generated by NamedBufferData if buffer
   4400  *          is not the name of an existing buffer object.
   4401  *
   4402  *          Check that INVALID_ENUM is generated by NamedBufferData if usage is not
   4403  *          STREAM_DRAW, STREAM_READ, STREAM_COPY, STATIC_DRAW, STATIC_READ,
   4404  *          STATIC_COPY, DYNAMIC_DRAW, DYNAMIC_READ or DYNAMIC_COPY.
   4405  *
   4406  *          Check that INVALID_VALUE is generated by NamedBufferData if size is
   4407  *          negative.
   4408  *
   4409  *          Check that INVALID_OPERATION is generated by NamedBufferData if the
   4410  *          BUFFER_IMMUTABLE_STORAGE flag of the buffer object is TRUE.
   4411  *
   4412  *  True if test case succeeded, false otherwise.
   4413  */
   4414 bool ErrorsTest::TestErrorsOfNamedBufferData()
   4415 {
   4416 	/* Shortcut for GL functionality. */
   4417 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
   4418 
   4419 	/* Return value. */
   4420 	bool is_ok			= true;
   4421 	bool internal_error = false;
   4422 
   4423 	/* Common variables. */
   4424 	glw::GLuint				buffer			 = 0;
   4425 	glw::GLuint				immutable_buffer = 0;
   4426 	glw::GLubyte			dummy_data[4]	= {};
   4427 	std::stack<glw::GLuint> too_much_buffers;
   4428 
   4429 	try
   4430 	{
   4431 		/* Common preparations. */
   4432 		gl.createBuffers(1, &buffer);
   4433 		GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateBuffers failed.");
   4434 
   4435 		gl.createBuffers(1, &immutable_buffer);
   4436 		GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateBuffers failed.");
   4437 
   4438 		m_pNamedBufferStorage(immutable_buffer, sizeof(dummy_data), &dummy_data, GL_MAP_READ_BIT);
   4439 		GLU_EXPECT_NO_ERROR(gl.getError(), "glNamedBuffeStorage failed.");
   4440 
   4441 		/* Test invalid buffer name error behavior. */
   4442 		{
   4443 			/* Prepare for invalid buffer name error behavior verification. */
   4444 			glw::GLuint not_a_buffer_name = 0;
   4445 
   4446 			while (gl.isBuffer(++not_a_buffer_name))
   4447 				;
   4448 
   4449 			/* Test. */
   4450 			m_pNamedBufferData(not_a_buffer_name, sizeof(dummy_data), dummy_data, GL_DYNAMIC_COPY);
   4451 
   4452 			is_ok &= ErrorCheckAndLog("glNamedBufferData", GL_INVALID_OPERATION,
   4453 									  " if buffer is not the name of an existing buffer object.");
   4454 		}
   4455 
   4456 		/* Test invalid usage error behavior. */
   4457 		{
   4458 			/* Prepare for invalid type error behavior verification. */
   4459 			static const glw::GLenum valid_usages[] = { GL_STREAM_DRAW,  GL_STREAM_READ,  GL_STREAM_COPY,
   4460 														GL_STATIC_DRAW,  GL_STATIC_READ,  GL_STATIC_COPY,
   4461 														GL_DYNAMIC_DRAW, GL_DYNAMIC_READ, GL_DYNAMIC_COPY,
   4462 														GL_NONE };
   4463 			static const glw::GLenum valid_usages_last = sizeof(valid_usages) / sizeof(valid_usages[0]) - 1;
   4464 
   4465 			glw::GLenum invalid_usage = 0;
   4466 
   4467 			while (&valid_usages[valid_usages_last] !=
   4468 				   std::find(&valid_usages[0], &valid_usages[valid_usages_last], (++invalid_usage)))
   4469 				;
   4470 
   4471 			/* Test. */
   4472 			m_pNamedBufferData(buffer, sizeof(dummy_data), dummy_data, invalid_usage);
   4473 
   4474 			is_ok &=
   4475 				ErrorCheckAndLog("glNamedBufferData", GL_INVALID_ENUM,
   4476 								 " if usage is not STREAM_DRAW, STREAM_READ, STREAM_COPY, STATIC_DRAW, STATIC_READ,"
   4477 								 " STATIC_COPY, DYNAMIC_DRAW, DYNAMIC_READ or DYNAMIC_COPY.");
   4478 		}
   4479 
   4480 		/* Test negative size error behavior. */
   4481 		{
   4482 			m_pNamedBufferData(buffer, -1, dummy_data, GL_DYNAMIC_COPY);
   4483 
   4484 			is_ok &= ErrorCheckAndLog("glNamedBufferData", GL_INVALID_VALUE, " if size is negative.");
   4485 		}
   4486 
   4487 		/* Test immutable buffer error behavior. */
   4488 		{
   4489 			m_pNamedBufferData(immutable_buffer, sizeof(dummy_data) / 2, dummy_data, GL_DYNAMIC_COPY);
   4490 
   4491 			is_ok &= ErrorCheckAndLog("glNamedBufferData", GL_INVALID_OPERATION,
   4492 									  " if the BUFFER_IMMUTABLE_STORAGE flag of the buffer object is TRUE.");
   4493 		}
   4494 	}
   4495 	catch (...)
   4496 	{
   4497 		is_ok		   = false;
   4498 		internal_error = true;
   4499 	}
   4500 
   4501 	if (buffer)
   4502 	{
   4503 		gl.deleteBuffers(1, &buffer);
   4504 
   4505 		buffer = 0;
   4506 	}
   4507 
   4508 	while (!too_much_buffers.empty())
   4509 	{
   4510 		glw::GLuint tmp_buffer = too_much_buffers.top();
   4511 
   4512 		if (tmp_buffer)
   4513 		{
   4514 			gl.deleteBuffers(1, &tmp_buffer);
   4515 		}
   4516 
   4517 		too_much_buffers.pop();
   4518 	}
   4519 
   4520 	if (immutable_buffer)
   4521 	{
   4522 		gl.deleteBuffers(1, &immutable_buffer);
   4523 
   4524 		immutable_buffer = 0;
   4525 	}
   4526 
   4527 	if (internal_error)
   4528 	{
   4529 		throw 0;
   4530 	}
   4531 
   4532 	return is_ok;
   4533 }
   4534 
   4535 /** @brief Test Errors Of NamedBufferStorage function.
   4536  *
   4537  *  Check that INVALID_OPERATION is generated by NamedBufferStorage if
   4538  *  buffer is not the name of an existing buffer object.
   4539  *
   4540  *  Check that INVALID_VALUE is generated by NamedBufferStorage if size is
   4541  *  less than or equal to zero.
   4542  *
   4543  *  Check that INVALID_VALUE is generated by NamedBufferStorage if flags has
   4544  *  any bits set other than DYNAMIC_STORAGE_BIT, MAP_READ_BIT,
   4545  *  MAP_WRITE_BIT, MAP_PERSISTENT_BIT, MAP_COHERENT_BIT or
   4546  *  CLIENT_STORAGE_BIT.
   4547  *
   4548  *  Check that INVALID_VALUE error is generated by NamedBufferStorage if
   4549  *  flags contains MAP_PERSISTENT_BIT but does not contain at least one of
   4550  *  MAP_READ_BIT or MAP_WRITE_BIT.
   4551  *
   4552  *  Check that INVALID_VALUE is generated by NamedBufferStorage if flags
   4553  *  contains MAP_COHERENT_BIT, but does not also contain MAP_PERSISTENT_BIT.
   4554  *
   4555  *  True if test case succeeded, false otherwise.
   4556  */
   4557 bool ErrorsTest::TestErrorsOfNamedBufferStorage()
   4558 {
   4559 	/* Shortcut for GL functionality. */
   4560 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
   4561 
   4562 	/* Return value. */
   4563 	bool is_ok			= true;
   4564 	bool internal_error = false;
   4565 
   4566 	/* Common variables. */
   4567 	glw::GLuint				buffer		  = 0;
   4568 	glw::GLubyte			dummy_data[4] = {};
   4569 	std::stack<glw::GLuint> too_much_buffers;
   4570 
   4571 	try
   4572 	{
   4573 		/* Test invalid buffer name error behavior. */
   4574 		{
   4575 			/* Prepare for invalid buffer name error behavior verification. */
   4576 			glw::GLuint not_a_buffer_name = 0;
   4577 
   4578 			while (gl.isBuffer(++not_a_buffer_name))
   4579 				;
   4580 
   4581 			/* Test. */
   4582 			m_pNamedBufferStorage(not_a_buffer_name, sizeof(dummy_data), dummy_data, GL_MAP_WRITE_BIT);
   4583 
   4584 			is_ok &= ErrorCheckAndLog("glNamedBufferStorage", GL_INVALID_OPERATION,
   4585 									  " if buffer is not the name of an existing buffer object.");
   4586 		}
   4587 
   4588 		/* Test negative or zero size error behavior. */
   4589 		{
   4590 			/* Object creation. */
   4591 			gl.createBuffers(1, &buffer);
   4592 			GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateBuffers failed.");
   4593 
   4594 			/* Test negative size. */
   4595 			m_pNamedBufferStorage(buffer, -1, dummy_data, GL_DYNAMIC_COPY);
   4596 
   4597 			is_ok &= ErrorCheckAndLog("glNamedBufferStorage", GL_INVALID_VALUE, " if size is negative.");
   4598 
   4599 			/* Test zero size. */
   4600 			m_pNamedBufferStorage(buffer, 0, dummy_data, GL_DYNAMIC_COPY);
   4601 
   4602 			is_ok &= ErrorCheckAndLog("glNamedBufferStorage", GL_INVALID_VALUE, " if size zero.");
   4603 
   4604 			/* Clean-up. */
   4605 			gl.deleteBuffers(1, &buffer);
   4606 
   4607 			buffer = 0;
   4608 
   4609 			GLU_EXPECT_NO_ERROR(gl.getError(), "glDeleteBuffers failed.");
   4610 		}
   4611 
   4612 		/* Test invalid usage bit error behavior. */
   4613 		{
   4614 			/* Prepare for invalid type error behavior verification. */
   4615 			glw::GLuint valid_bits = GL_DYNAMIC_STORAGE_BIT | GL_MAP_READ_BIT | GL_MAP_WRITE_BIT |
   4616 									 GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT | GL_CLIENT_STORAGE_BIT;
   4617 
   4618 			if (m_context.getContextInfo().isExtensionSupported("GL_ARB_sparse_buffer"))
   4619 			{
   4620 				valid_bits |= GL_SPARSE_STORAGE_BIT_ARB;
   4621 			}
   4622 
   4623 			if (m_context.getContextInfo().isExtensionSupported("GL_NV_gpu_multicast") ||
   4624 				m_context.getContextInfo().isExtensionSupported("GL_NVX_linked_gpu_multicast"))
   4625 			{
   4626 				valid_bits |= GL_PER_GPU_STORAGE_BIT_NV;
   4627 			}
   4628 
   4629 			glw::GLuint invalid_bits = ~valid_bits;
   4630 
   4631 			glw::GLuint bits_count = CHAR_BIT * sizeof(invalid_bits);
   4632 
   4633 			/* Test. */
   4634 			for (glw::GLuint i = 0; i < bits_count; ++i)
   4635 			{
   4636 				glw::GLuint possibly_invalid_bit = (1 << i);
   4637 
   4638 				if (invalid_bits & possibly_invalid_bit)
   4639 				{
   4640 					/* Object creation. */
   4641 					gl.createBuffers(1, &buffer);
   4642 					GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateBuffers failed.");
   4643 
   4644 					/* Test invalid bit. */
   4645 					m_pNamedBufferStorage(buffer, sizeof(dummy_data), dummy_data, possibly_invalid_bit);
   4646 
   4647 					is_ok &=
   4648 						ErrorCheckAndLog("glNamedBufferStorage", GL_INVALID_VALUE,
   4649 										 " if flags has any bits set other than DYNAMIC_STORAGE_BIT, MAP_READ_BIT,"
   4650 										 " MAP_WRITE_BIT, MAP_PERSISTENT_BIT, MAP_COHERENT_BIT or CLIENT_STORAGE_BIT.");
   4651 
   4652 					/* Release object. */
   4653 					gl.deleteBuffers(1, &buffer);
   4654 
   4655 					buffer = 0;
   4656 
   4657 					GLU_EXPECT_NO_ERROR(gl.getError(), "glDeleteBuffers failed.");
   4658 				}
   4659 			}
   4660 		}
   4661 
   4662 		/* Test improper persistent bit behavior error behavior. */
   4663 		{
   4664 			/* Object creation. */
   4665 			gl.createBuffers(1, &buffer);
   4666 			GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateBuffers failed.");
   4667 
   4668 			/* Test. */
   4669 			m_pNamedBufferStorage(buffer, sizeof(dummy_data), dummy_data, GL_MAP_PERSISTENT_BIT);
   4670 
   4671 			is_ok &= ErrorCheckAndLog("glNamedBufferStorage", GL_INVALID_VALUE, " if flags contains MAP_PERSISTENT_BIT "
   4672 																				"but does not contain at least one of "
   4673 																				"MAP_READ_BIT or MAP_WRITE_BIT.");
   4674 
   4675 			/* Clean-up. */
   4676 			gl.deleteBuffers(1, &buffer);
   4677 
   4678 			buffer = 0;
   4679 
   4680 			GLU_EXPECT_NO_ERROR(gl.getError(), "glDeleteBuffers failed.");
   4681 		}
   4682 
   4683 		/* Test improper persistent bit behavior error behavior. */
   4684 		{
   4685 			/* Object creation. */
   4686 			gl.createBuffers(1, &buffer);
   4687 			GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateBuffers failed.");
   4688 
   4689 			/* Test. */
   4690 			m_pNamedBufferStorage(buffer, sizeof(dummy_data), dummy_data,
   4691 								  GL_MAP_READ_BIT | GL_MAP_WRITE_BIT | GL_MAP_COHERENT_BIT);
   4692 
   4693 			is_ok &=
   4694 				ErrorCheckAndLog("glNamedBufferStorage", GL_INVALID_VALUE,
   4695 								 " if flags contains MAP_COHERENT_BIT, but does not also contain MAP_PERSISTENT_BIT.");
   4696 
   4697 			/* Clean-up. */
   4698 			gl.deleteBuffers(1, &buffer);
   4699 
   4700 			buffer = 0;
   4701 
   4702 			GLU_EXPECT_NO_ERROR(gl.getError(), "glDeleteBuffers failed.");
   4703 		}
   4704 	}
   4705 	catch (...)
   4706 	{
   4707 		is_ok		   = false;
   4708 		internal_error = true;
   4709 	}
   4710 
   4711 	if (buffer)
   4712 	{
   4713 		gl.deleteBuffers(1, &buffer);
   4714 
   4715 		buffer = 0;
   4716 	}
   4717 
   4718 	while (!too_much_buffers.empty())
   4719 	{
   4720 		glw::GLuint tmp_buffer = too_much_buffers.top();
   4721 
   4722 		if (tmp_buffer)
   4723 		{
   4724 			gl.deleteBuffers(1, &tmp_buffer);
   4725 		}
   4726 
   4727 		too_much_buffers.pop();
   4728 	}
   4729 
   4730 	if (internal_error)
   4731 	{
   4732 		throw 0;
   4733 	}
   4734 
   4735 	return is_ok;
   4736 }
   4737 
   4738 /** @brief Test Errors Of NamedBufferSubData function.
   4739  *
   4740  *  Check that INVALID_OPERATION is generated by NamedBufferSubData if
   4741  *  buffer is not the name of an existing buffer object.
   4742  *
   4743  *  Check that INVALID_VALUE is generated by NamedBufferSubData if offset or
   4744  *  size is negative, or if offset+size is greater than the value of
   4745  *  BUFFER_SIZE for the specified buffer object.
   4746  *
   4747  *  Check that INVALID_OPERATION is generated by NamedBufferSubData if any
   4748  *  part of the specified range of the buffer object is mapped with
   4749  *  MapBufferRange or MapBuffer, unless it was mapped with the
   4750  *  MAP_PERSISTENT_BIT bit set in the MapBufferRange access flags.
   4751  *
   4752  *  Check that INVALID_OPERATION is generated by NamedBufferSubData if the
   4753  *  value of the BUFFER_IMMUTABLE_STORAGE flag of the buffer object is TRUE
   4754  *  and the value of BUFFER_STORAGE_FLAGS for the buffer object does not
   4755  *  have the DYNAMIC_STORAGE_BIT bit set.
   4756  *
   4757  *  True if test case succeeded, false otherwise.
   4758  */
   4759 bool ErrorsTest::TestErrorsOfNamedBufferSubData()
   4760 {
   4761 	/* Shortcut for GL functionality. */
   4762 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
   4763 
   4764 	/* Return value. */
   4765 	bool is_ok			= true;
   4766 	bool internal_error = false;
   4767 
   4768 	/* Common variables. */
   4769 	glw::GLuint  buffer					  = 0;
   4770 	glw::GLuint  immutable_storage_buffer = 0;
   4771 	glw::GLubyte dummy_data[4]			  = {};
   4772 
   4773 	try
   4774 	{
   4775 		/* Common preparations. */
   4776 		gl.createBuffers(1, &buffer);
   4777 		GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateBuffers failed.");
   4778 
   4779 		m_pNamedBufferStorage(buffer, sizeof(dummy_data), &dummy_data,
   4780 							  GL_MAP_READ_BIT | GL_MAP_WRITE_BIT | GL_DYNAMIC_STORAGE_BIT | GL_MAP_PERSISTENT_BIT);
   4781 		GLU_EXPECT_NO_ERROR(gl.getError(), "glNamedBuffeStorage failed.");
   4782 
   4783 		gl.createBuffers(1, &immutable_storage_buffer);
   4784 		GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateBuffers failed.");
   4785 
   4786 		m_pNamedBufferStorage(immutable_storage_buffer, sizeof(dummy_data), &dummy_data, GL_MAP_READ_BIT);
   4787 		GLU_EXPECT_NO_ERROR(gl.getError(), "glNamedBuffeStorage failed.");
   4788 
   4789 		/* Test invalid buffer name error behavior. */
   4790 		{
   4791 			/* Prepare for invalid buffer name error behavior verification. */
   4792 			glw::GLuint not_a_buffer_name = 0;
   4793 
   4794 			while (gl.isBuffer(++not_a_buffer_name))
   4795 				;
   4796 
   4797 			/* Test. */
   4798 			m_pNamedBufferSubData(not_a_buffer_name, 0, sizeof(dummy_data), &dummy_data);
   4799 
   4800 			is_ok &= ErrorCheckAndLog("glNamedBufferSubData", GL_INVALID_OPERATION,
   4801 									  " if buffer is not the name of an existing buffer object.");
   4802 		}
   4803 
   4804 		/* Test negative offset error behavior. */
   4805 		{
   4806 			/* Test. */
   4807 			m_pNamedBufferSubData(buffer, -1, sizeof(dummy_data), &dummy_data);
   4808 
   4809 			is_ok &= ErrorCheckAndLog("glNamedBufferSubData", GL_INVALID_VALUE, " if offset or size is negative.");
   4810 		}
   4811 
   4812 		/* Test negative size error behavior. */
   4813 		{
   4814 			/* Test. */
   4815 			m_pNamedBufferSubData(buffer, 0, -1, &dummy_data);
   4816 
   4817 			is_ok &= ErrorCheckAndLog("glNamedBufferSubData", GL_INVALID_VALUE, " if offset or size is negative.");
   4818 		}
   4819 
   4820 		/* Test size overflow error behavior. */
   4821 		{
   4822 			/* Test. */
   4823 			m_pNamedBufferSubData(buffer, 0, sizeof(dummy_data) * 2, &dummy_data);
   4824 
   4825 			is_ok &= ErrorCheckAndLog(
   4826 				"glNamedBufferSubData", GL_INVALID_VALUE,
   4827 				" if offset+size is greater than the value of BUFFER_SIZE for the specified buffer object.");
   4828 		}
   4829 
   4830 		/* Test offset+size overflow error behavior. */
   4831 		{
   4832 			/* Test. */
   4833 			m_pNamedBufferSubData(buffer, sizeof(dummy_data) / 2, sizeof(dummy_data), &dummy_data);
   4834 
   4835 			is_ok &= ErrorCheckAndLog(
   4836 				"glNamedBufferSubData", GL_INVALID_VALUE,
   4837 				" if offset+size is greater than the value of BUFFER_SIZE for the specified buffer object.");
   4838 		}
   4839 
   4840 		/* Test of mapped buffer subdata error behavior verification (with glMapBuffer). */
   4841 		{
   4842 			(void)(glw::GLbyte*) m_pMapNamedBuffer(buffer, GL_READ_ONLY);
   4843 			GLU_EXPECT_NO_ERROR(gl.getError(), "glMapNamedBuffer failed.");
   4844 
   4845 			m_pNamedBufferSubData(buffer, 0, sizeof(dummy_data), &dummy_data);
   4846 
   4847 			is_ok &= ErrorCheckAndLog("glNamedBufferSubData", GL_INVALID_OPERATION,
   4848 									  " if any part of the specified range of the buffer"
   4849 									  " object is mapped with MapBuffer, unless it was mapped with "
   4850 									  "the MAP_PERSISTENT_BIT bit set in the MapBufferRange access flags.");
   4851 
   4852 			m_pUnmapNamedBuffer(buffer);
   4853 			GLU_EXPECT_NO_ERROR(gl.getError(), "glUnmapNamedBuffer failed.");
   4854 		}
   4855 
   4856 		/* Test of mapped buffer subdata error behavior verification (with glMapBufferRange). */
   4857 		{
   4858 			(void)(glw::GLbyte*) m_pMapNamedBufferRange(buffer, 0, sizeof(dummy_data), GL_MAP_READ_BIT);
   4859 			GLU_EXPECT_NO_ERROR(gl.getError(), "glMapNamedBuffer failed.");
   4860 
   4861 			m_pNamedBufferSubData(buffer, 0, sizeof(dummy_data), &dummy_data);
   4862 
   4863 			is_ok &= ErrorCheckAndLog("glNamedBufferSubData", GL_INVALID_OPERATION,
   4864 									  " if any part of the specified range of the buffer"
   4865 									  " object is mapped with MapBufferRange, unless it was mapped with "
   4866 									  "the MAP_PERSISTENT_BIT bit set in the MapBufferRange access flags.");
   4867 
   4868 			m_pUnmapNamedBuffer(buffer);
   4869 			GLU_EXPECT_NO_ERROR(gl.getError(), "glUnmapNamedBuffer failed.");
   4870 		}
   4871 
   4872 		/* Test of persistently mapped buffer clear error with behavior verification. */
   4873 		{
   4874 			(void)(glw::GLbyte*)
   4875 				m_pMapNamedBufferRange(buffer, 0, sizeof(dummy_data), GL_MAP_READ_BIT | GL_MAP_PERSISTENT_BIT);
   4876 			GLU_EXPECT_NO_ERROR(gl.getError(), "glMapNamedBuffer failed.");
   4877 
   4878 			m_pNamedBufferSubData(buffer, 0, sizeof(dummy_data), &dummy_data);
   4879 
   4880 			is_ok &= ErrorCheckAndLog("glNamedBufferSubData", GL_NO_ERROR,
   4881 									  " if any part of the specified range of the buffer"
   4882 									  " object is mapped with MapBuffer with the MAP_PERSISTENT_BIT"
   4883 									  " bit set in the MapBufferRange access flags.");
   4884 
   4885 			m_pUnmapNamedBuffer(buffer);
   4886 			GLU_EXPECT_NO_ERROR(gl.getError(), "glUnmapNamedBuffer failed.");
   4887 		}
   4888 
   4889 		/* Test DYNAMIC_STORAGE_BIT bit off immutable buffer not set error behavior. */
   4890 		{
   4891 			/* Test. */
   4892 			m_pNamedBufferSubData(immutable_storage_buffer, 0, sizeof(dummy_data), &dummy_data);
   4893 
   4894 			is_ok &= ErrorCheckAndLog("glNamedBufferSubData", GL_INVALID_OPERATION,
   4895 									  " if the value of the BUFFER_IMMUTABLE_STORAGE flag of the buffer object is TRUE"
   4896 									  " and the value of BUFFER_STORAGE_FLAGS for the buffer object does not"
   4897 									  " have the DYNAMIC_STORAGE_BIT bit set.");
   4898 		}
   4899 
   4900 		/* Test DYNAMIC_STORAGE_BIT bit off immutable buffer set no error behavior. */
   4901 		{
   4902 			/* Test. */
   4903 			m_pNamedBufferSubData(buffer, 0, sizeof(dummy_data), &dummy_data);
   4904 
   4905 			is_ok &= ErrorCheckAndLog("glNamedBufferSubData", GL_NO_ERROR,
   4906 									  " if the value of the BUFFER_IMMUTABLE_STORAGE flag of the buffer object is TRUE"
   4907 									  " and the value of BUFFER_STORAGE_FLAGS for the buffer object"
   4908 									  " have the DYNAMIC_STORAGE_BIT bit set.");
   4909 		}
   4910 	}
   4911 	catch (...)
   4912 	{
   4913 		is_ok		   = false;
   4914 		internal_error = true;
   4915 	}
   4916 
   4917 	if (buffer)
   4918 	{
   4919 		gl.deleteBuffers(1, &buffer);
   4920 
   4921 		buffer = 0;
   4922 	}
   4923 
   4924 	if (immutable_storage_buffer)
   4925 	{
   4926 		gl.deleteBuffers(1, &immutable_storage_buffer);
   4927 
   4928 		buffer = 0;
   4929 	}
   4930 
   4931 	if (internal_error)
   4932 	{
   4933 		throw 0;
   4934 	}
   4935 
   4936 	return is_ok;
   4937 }
   4938 
   4939 /** @brief Test Errors Of UnmapNamedBuffer function.
   4940  *
   4941  *  Check that INVALID_OPERATION is generated by UnmapNamedBuffer if buffer
   4942  *  is not the name of an existing buffer object.
   4943  *
   4944  *  Check that INVALID_OPERATION is generated by UnmapNamedBuffer if the
   4945  *  buffer object is not in a mapped state.
   4946  *
   4947  *  True if test case succeeded, false otherwise.
   4948  */
   4949 bool ErrorsTest::TestErrorsOfUnmapNamedBuffer()
   4950 {
   4951 	/* Shortcut for GL functionality. */
   4952 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
   4953 
   4954 	/* Return value. */
   4955 	bool is_ok			= true;
   4956 	bool internal_error = false;
   4957 
   4958 	/* Common variables. */
   4959 	glw::GLuint  buffer		   = 0;
   4960 	glw::GLubyte dummy_data[4] = {};
   4961 
   4962 	try
   4963 	{
   4964 		/* Common preparations. */
   4965 		gl.createBuffers(1, &buffer);
   4966 		GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateBuffers failed.");
   4967 
   4968 		m_pNamedBufferStorage(buffer, sizeof(dummy_data), &dummy_data,
   4969 							  GL_MAP_READ_BIT | GL_MAP_WRITE_BIT | GL_DYNAMIC_STORAGE_BIT | GL_MAP_PERSISTENT_BIT);
   4970 		GLU_EXPECT_NO_ERROR(gl.getError(), "glNamedBuffeStorage failed.");
   4971 
   4972 		/* Test invalid buffer name error behavior. */
   4973 		{
   4974 			/* Prepare for invalid buffer name error behavior verification. */
   4975 			glw::GLuint not_a_buffer_name = 0;
   4976 
   4977 			while (gl.isBuffer(++not_a_buffer_name))
   4978 				;
   4979 
   4980 			/* Test. */
   4981 			m_pUnmapNamedBuffer(not_a_buffer_name);
   4982 
   4983 			is_ok &= ErrorCheckAndLog("glUnmapNamedBuffer", GL_INVALID_OPERATION,
   4984 									  " if buffer is not the name of an existing buffer object.");
   4985 		}
   4986 
   4987 		/* Test not mapped buffer error behavior verification. */
   4988 		{
   4989 			m_pUnmapNamedBuffer(buffer);
   4990 
   4991 			is_ok &= ErrorCheckAndLog("glUnmapNamedBuffer", GL_INVALID_OPERATION,
   4992 									  " if the buffer object is not in a mapped state.");
   4993 		}
   4994 	}
   4995 	catch (...)
   4996 	{
   4997 		is_ok		   = false;
   4998 		internal_error = true;
   4999 	}
   5000 
   5001 	if (buffer)
   5002 	{
   5003 		gl.deleteBuffers(1, &buffer);
   5004 
   5005 		buffer = 0;
   5006 	}
   5007 
   5008 	if (internal_error)
   5009 	{
   5010 		throw 0;
   5011 	}
   5012 
   5013 	return is_ok;
   5014 }
   5015 
   5016 /******************************** Functional Test Implementation   ********************************/
   5017 
   5018 /** @brief Vertex shader source code */
   5019 const glw::GLchar FunctionalTest::s_vertex_shader[] = "#version 450\n"
   5020 													  "\n"
   5021 													  "in  int data_in;\n"
   5022 													  "out int data_out;\n"
   5023 													  "\n"
   5024 													  "void main()\n"
   5025 													  "{\n"
   5026 													  "    gl_Position = vec4(0.0, 0.0, 0.0, 1.0);\n"
   5027 													  "\n"
   5028 													  "    data_out = data_in * data_in;\n"
   5029 													  "}\n";
   5030 
   5031 /** @brief Fragment shader source code */
   5032 const glw::GLchar FunctionalTest::s_fragment_shader[] = "#version 450\n"
   5033 														"\n"
   5034 														"out vec4 color;\n"
   5035 														"\n"
   5036 														"void main()\n"
   5037 														"{\n"
   5038 														"    color = vec4(0.0);\n"
   5039 														"}\n";
   5040 
   5041 const glw::GLchar FunctionalTest::s_vertex_shader_input_name[] =
   5042 	"data_in"; //!< Vertex shader's name of the input attribute.
   5043 
   5044 const glw::GLchar* FunctionalTest::s_vertex_shader_output_name =
   5045 	"data_out"; //!< Vertex shader's name of the transform feedback varying.
   5046 
   5047 const glw::GLint FunctionalTest::s_initial_data_a[] = {
   5048 	1, 2, 3, 4, 5, 5
   5049 }; //!< Initial data to be uploaded for the input buffer.
   5050 
   5051 const glw::GLint FunctionalTest::s_initial_data_b[] = {
   5052 	0, 0, 0, 0, 0, 0, 36
   5053 }; //!< Initial data to be uploaded for the output buffer.
   5054 
   5055 const glw::GLint FunctionalTest::s_expected_data[] = {
   5056 	0, 1, 4, 9, 16, 25, 36
   5057 }; //!< Expected result which shall be read from output buffer.
   5058 
   5059 /** @brief Functional Test constructor.
   5060  *
   5061  *  @param [in] context     OpenGL context.
   5062  */
   5063 FunctionalTest::FunctionalTest(deqp::Context& context)
   5064 	: deqp::TestCase(context, "buffers_functional", "Buffer Objects Functional Test")
   5065 	, m_pClearNamedBufferData(DE_NULL)
   5066 	, m_pClearNamedBufferSubData(DE_NULL)
   5067 	, m_pCopyNamedBufferSubData(DE_NULL)
   5068 	, m_pFlushMappedNamedBufferRange(DE_NULL)
   5069 	, m_pGetNamedBufferParameteri64v(DE_NULL)
   5070 	, m_pGetNamedBufferParameteriv(DE_NULL)
   5071 	, m_pGetNamedBufferPointerv(DE_NULL)
   5072 	, m_pGetNamedBufferSubData(DE_NULL)
   5073 	, m_pMapNamedBuffer(DE_NULL)
   5074 	, m_pMapNamedBufferRange(DE_NULL)
   5075 	, m_pNamedBufferData(DE_NULL)
   5076 	, m_pNamedBufferStorage(DE_NULL)
   5077 	, m_pNamedBufferSubData(DE_NULL)
   5078 	, m_pUnmapNamedBuffer(DE_NULL)
   5079 	, m_po(0)
   5080 	, m_vao(0)
   5081 	, m_bo_in(0)
   5082 	, m_bo_out(0)
   5083 	, m_attrib_location(-1)
   5084 {
   5085 	/* Intentionally left blank. */
   5086 }
   5087 
   5088 /** @brief Run Functional Test.
   5089  *
   5090  *  @return Iteration result.
   5091  */
   5092 tcu::TestNode::IterateResult FunctionalTest::iterate()
   5093 {
   5094 	/* Shortcut for GL functionality. */
   5095 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
   5096 
   5097 	/* Get context setup. */
   5098 	bool is_at_least_gl_45 = (glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::core(4, 5)));
   5099 	bool is_arb_direct_state_access = m_context.getContextInfo().isExtensionSupported("GL_ARB_direct_state_access");
   5100 
   5101 	if ((!is_at_least_gl_45) && (!is_arb_direct_state_access))
   5102 	{
   5103 		m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "Not Supported");
   5104 
   5105 		return STOP;
   5106 	}
   5107 
   5108 	/* Running tests. */
   5109 	bool is_ok	= true;
   5110 	bool is_error = false;
   5111 
   5112 	/* API function pointers setup. */
   5113 	m_pClearNamedBufferData		   = (PFNGLCLEARNAMEDBUFFERDATA)gl.clearNamedBufferData;
   5114 	m_pClearNamedBufferSubData	 = (PFNGLCLEARNAMEDBUFFERSUBDATA)gl.clearNamedBufferSubData;
   5115 	m_pCopyNamedBufferSubData	  = (PFNGLCOPYNAMEDBUFFERSUBDATA)gl.copyNamedBufferSubData;
   5116 	m_pFlushMappedNamedBufferRange = (PFNGLFLUSHMAPPEDNAMEDBUFFERRANGE)gl.flushMappedNamedBufferRange;
   5117 	m_pGetNamedBufferParameteri64v = (PFNGLGETNAMEDBUFFERPARAMETERI64V)gl.getNamedBufferParameteri64v;
   5118 	m_pGetNamedBufferParameteriv   = (PFNGLGETNAMEDBUFFERPARAMETERIV)gl.getNamedBufferParameteriv;
   5119 	m_pGetNamedBufferPointerv	  = (PFNGLGETNAMEDBUFFERPOINTERV)gl.getNamedBufferPointerv;
   5120 	m_pGetNamedBufferSubData	   = (PFNGLGETNAMEDBUFFERSUBDATA)gl.getNamedBufferSubData;
   5121 	m_pMapNamedBuffer			   = (PFNGLMAPNAMEDBUFFER)gl.mapNamedBuffer;
   5122 	m_pMapNamedBufferRange		   = (PFNGLMAPNAMEDBUFFERRANGE)gl.mapNamedBufferRange;
   5123 	m_pNamedBufferData			   = (PFNGLNAMEDBUFFERDATA)gl.namedBufferData;
   5124 	m_pNamedBufferStorage		   = (PFNGLNAMEDBUFFERSTORAGE)gl.namedBufferStorage;
   5125 	m_pNamedBufferSubData		   = (PFNGLNAMEDBUFFERSUBDATA)gl.namedBufferSubData;
   5126 	m_pUnmapNamedBuffer			   = (PFNGLUNMAPNAMEDBUFFER)gl.unmapNamedBuffer;
   5127 
   5128 	try
   5129 	{
   5130 		/* API function pointers check. */
   5131 		if ((DE_NULL == m_pClearNamedBufferData) || (DE_NULL == m_pClearNamedBufferSubData) ||
   5132 			(DE_NULL == m_pCopyNamedBufferSubData) || (DE_NULL == m_pFlushMappedNamedBufferRange) ||
   5133 			(DE_NULL == m_pGetNamedBufferParameteri64v) || (DE_NULL == m_pGetNamedBufferParameteriv) ||
   5134 			(DE_NULL == m_pGetNamedBufferPointerv) || (DE_NULL == m_pGetNamedBufferSubData) ||
   5135 			(DE_NULL == m_pMapNamedBuffer) || (DE_NULL == m_pMapNamedBufferRange) || (DE_NULL == m_pNamedBufferData) ||
   5136 			(DE_NULL == m_pNamedBufferStorage) || (DE_NULL == m_pNamedBufferSubData) ||
   5137 			(DE_NULL == m_pUnmapNamedBuffer))
   5138 		{
   5139 			throw 0;
   5140 		}
   5141 
   5142 		/* Running test. */
   5143 		BuildProgram();
   5144 		PrepareVertexArrayObject();
   5145 
   5146 		is_ok = is_ok && PrepareInputBuffer();
   5147 		is_ok = is_ok && PrepareOutputBuffer();
   5148 
   5149 		if (is_ok)
   5150 		{
   5151 			Draw();
   5152 		}
   5153 
   5154 		is_ok = is_ok && CheckArrayBufferImmutableFlag();
   5155 		is_ok = is_ok && CheckTransformFeedbackBufferSize();
   5156 		is_ok = is_ok && CheckTransformFeedbackResult();
   5157 	}
   5158 	catch (...)
   5159 	{
   5160 		is_ok	= false;
   5161 		is_error = true;
   5162 	}
   5163 
   5164 	/* Clean Up. */
   5165 	Cleanup();
   5166 
   5167 	/* Errors clean up. */
   5168 	while (gl.getError())
   5169 		;
   5170 
   5171 	/* Result's setup. */
   5172 	if (is_ok)
   5173 	{
   5174 		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
   5175 	}
   5176 	else
   5177 	{
   5178 		if (is_error)
   5179 		{
   5180 			m_testCtx.setTestResult(QP_TEST_RESULT_INTERNAL_ERROR, "Error");
   5181 		}
   5182 		else
   5183 		{
   5184 			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
   5185 		}
   5186 	}
   5187 
   5188 	return STOP;
   5189 }
   5190 
   5191 /** @brief Build test's GL program */
   5192 void FunctionalTest::BuildProgram()
   5193 {
   5194 	/* Shortcut for GL functionality */
   5195 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
   5196 
   5197 	struct Shader
   5198 	{
   5199 		glw::GLchar const* const source;
   5200 		glw::GLenum const		 type;
   5201 		glw::GLuint				 id;
   5202 	} shader[] = { { s_vertex_shader, GL_VERTEX_SHADER, 0 }, { s_fragment_shader, GL_FRAGMENT_SHADER, 0 } };
   5203 
   5204 	glw::GLuint const shader_count = sizeof(shader) / sizeof(shader[0]);
   5205 
   5206 	try
   5207 	{
   5208 		/* Create program. */
   5209 		m_po = gl.createProgram();
   5210 		GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateProgram call failed.");
   5211 
   5212 		/* Shader compilation. */
   5213 
   5214 		for (glw::GLuint i = 0; i < shader_count; ++i)
   5215 		{
   5216 			if (DE_NULL != shader[i].source)
   5217 			{
   5218 				shader[i].id = gl.createShader(shader[i].type);
   5219 
   5220 				GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateShader call failed.");
   5221 
   5222 				gl.attachShader(m_po, shader[i].id);
   5223 
   5224 				GLU_EXPECT_NO_ERROR(gl.getError(), "glAttachShader call failed.");
   5225 
   5226 				gl.shaderSource(shader[i].id, 1, &(shader[i].source), NULL);
   5227 
   5228 				GLU_EXPECT_NO_ERROR(gl.getError(), "glShaderSource call failed.");
   5229 
   5230 				gl.compileShader(shader[i].id);
   5231 
   5232 				GLU_EXPECT_NO_ERROR(gl.getError(), "glCompileShader call failed.");
   5233 
   5234 				glw::GLint status = GL_FALSE;
   5235 
   5236 				gl.getShaderiv(shader[i].id, GL_COMPILE_STATUS, &status);
   5237 				GLU_EXPECT_NO_ERROR(gl.getError(), "glGetShaderiv call failed.");
   5238 
   5239 				if (GL_FALSE == status)
   5240 				{
   5241 					glw::GLint log_size = 0;
   5242 					gl.getShaderiv(shader[i].id, GL_INFO_LOG_LENGTH, &log_size);
   5243 					GLU_EXPECT_NO_ERROR(gl.getError(), "glGetShaderiv call failed.");
   5244 
   5245 					glw::GLchar* log_text = new glw::GLchar[log_size];
   5246 
   5247 					gl.getShaderInfoLog(shader[i].id, log_size, NULL, &log_text[0]);
   5248 
   5249 					m_context.getTestContext().getLog() << tcu::TestLog::Message << "Shader compilation has failed.\n"
   5250 														<< "Shader type: " << glu::getShaderTypeStr(shader[i].type)
   5251 														<< "\n"
   5252 														<< "Shader compilation error log:\n"
   5253 														<< log_text << "\n"
   5254 														<< "Shader source code:\n"
   5255 														<< shader[i].source << "\n"
   5256 														<< tcu::TestLog::EndMessage;
   5257 
   5258 					delete[] log_text;
   5259 
   5260 					GLU_EXPECT_NO_ERROR(gl.getError(), "glGetShaderInfoLog call failed.");
   5261 
   5262 					throw 0;
   5263 				}
   5264 			}
   5265 		}
   5266 
   5267 		/* Tranform feedback varying */
   5268 		gl.transformFeedbackVaryings(m_po, 1, &s_vertex_shader_output_name, GL_INTERLEAVED_ATTRIBS);
   5269 		GLU_EXPECT_NO_ERROR(gl.getError(), "glTransformFeedbackVaryings call failed.");
   5270 
   5271 		/* Link. */
   5272 		gl.linkProgram(m_po);
   5273 
   5274 		GLU_EXPECT_NO_ERROR(gl.getError(), "glLinkProgram call failed.");
   5275 
   5276 		glw::GLint status = GL_FALSE;
   5277 
   5278 		gl.getProgramiv(m_po, GL_LINK_STATUS, &status);
   5279 
   5280 		if (GL_TRUE == status)
   5281 		{
   5282 			for (glw::GLuint i = 0; i < shader_count; ++i)
   5283 			{
   5284 				if (shader[i].id)
   5285 				{
   5286 					gl.detachShader(m_po, shader[i].id);
   5287 
   5288 					GLU_EXPECT_NO_ERROR(gl.getError(), "glDetachShader call failed.");
   5289 				}
   5290 			}
   5291 		}
   5292 		else
   5293 		{
   5294 			glw::GLint log_size = 0;
   5295 
   5296 			gl.getProgramiv(m_po, GL_INFO_LOG_LENGTH, &log_size);
   5297 
   5298 			GLU_EXPECT_NO_ERROR(gl.getError(), "glGetProgramiv call failed.");
   5299 
   5300 			glw::GLchar* log_text = new glw::GLchar[log_size];
   5301 
   5302 			gl.getProgramInfoLog(m_po, log_size, NULL, &log_text[0]);
   5303 
   5304 			m_context.getTestContext().getLog() << tcu::TestLog::Message << "Program linkage has failed due to:\n"
   5305 												<< log_text << "\n"
   5306 												<< tcu::TestLog::EndMessage;
   5307 
   5308 			delete[] log_text;
   5309 
   5310 			GLU_EXPECT_NO_ERROR(gl.getError(), "glGetProgramInfoLog call failed.");
   5311 
   5312 			throw 0;
   5313 		}
   5314 	}
   5315 	catch (...)
   5316 	{
   5317 		if (m_po)
   5318 		{
   5319 			gl.deleteProgram(m_po);
   5320 
   5321 			m_po = 0;
   5322 		}
   5323 	}
   5324 
   5325 	for (glw::GLuint i = 0; i < shader_count; ++i)
   5326 	{
   5327 		if (0 != shader[i].id)
   5328 		{
   5329 			gl.deleteShader(shader[i].id);
   5330 
   5331 			shader[i].id = 0;
   5332 		}
   5333 	}
   5334 
   5335 	if (m_po)
   5336 	{
   5337 		gl.useProgram(m_po);
   5338 		GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram call failed.");
   5339 	}
   5340 
   5341 	if (0 == m_po)
   5342 	{
   5343 		throw 0;
   5344 	}
   5345 }
   5346 
   5347 /** @brief Prepare empty vertex array object and bind it. */
   5348 void FunctionalTest::PrepareVertexArrayObject()
   5349 {
   5350 	/* Shortcut for GL functionality */
   5351 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
   5352 
   5353 	gl.genVertexArrays(1, &m_vao);
   5354 	GLU_EXPECT_NO_ERROR(gl.getError(), "glGenVertexArrays call failed.");
   5355 
   5356 	gl.bindVertexArray(m_vao);
   5357 	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindVertexArray call failed.");
   5358 }
   5359 
   5360 /** Prepare input buffer in the way described in test specification (see class comment). */
   5361 bool FunctionalTest::PrepareInputBuffer()
   5362 {
   5363 	/* Shortcut for GL functionality */
   5364 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
   5365 
   5366 	/* Constants. */
   5367 	static const glw::GLint zero = 0;
   5368 	static const glw::GLint one  = 1;
   5369 
   5370 	/* Buffer preparation */
   5371 	gl.createBuffers(1, &m_bo_in);
   5372 
   5373 	if (GL_NO_ERROR == gl.getError())
   5374 	{
   5375 		/* Storage and last (6th) element preparation. */
   5376 		m_pNamedBufferStorage(m_bo_in, sizeof(s_initial_data_a), s_initial_data_a,
   5377 							  GL_MAP_WRITE_BIT | GL_DYNAMIC_STORAGE_BIT | GL_MAP_PERSISTENT_BIT);
   5378 
   5379 		if (GL_NO_ERROR == gl.getError())
   5380 		{
   5381 			/* First element preparation. */
   5382 			m_pClearNamedBufferSubData(m_bo_in, GL_R8, 0, sizeof(glw::GLint), GL_RED, GL_INT, &zero);
   5383 
   5384 			if (GL_NO_ERROR == gl.getError())
   5385 			{
   5386 				/* Second element preparation. */
   5387 				m_pNamedBufferSubData(m_bo_in, 1 /* 2nd element */ * sizeof(glw::GLint), sizeof(glw::GLint), &one);
   5388 
   5389 				if (GL_NO_ERROR == gl.getError())
   5390 				{
   5391 					/* Third element preparation. */
   5392 					glw::GLint* p = (glw::GLint*)m_pMapNamedBuffer(m_bo_in, GL_WRITE_ONLY);
   5393 
   5394 					if ((GL_NO_ERROR == gl.getError()) || (DE_NULL == p))
   5395 					{
   5396 						p[2] = 2;
   5397 
   5398 						m_pUnmapNamedBuffer(m_bo_in);
   5399 
   5400 						if (GL_NO_ERROR == gl.getError())
   5401 						{
   5402 							/* Fifth element preparation. */
   5403 							m_pCopyNamedBufferSubData(m_bo_in, m_bo_in, sizeof(glw::GLint) * 3, sizeof(glw::GLint) * 4,
   5404 													  sizeof(glw::GLint));
   5405 
   5406 							if (GL_NO_ERROR == gl.getError())
   5407 							{
   5408 								/* Fourth element preparation. */
   5409 								p = (glw::GLint*)m_pMapNamedBufferRange(
   5410 									m_bo_in, sizeof(glw::GLint) * 3, sizeof(glw::GLint),
   5411 									GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_FLUSH_EXPLICIT_BIT);
   5412 
   5413 								if (GL_NO_ERROR == gl.getError())
   5414 								{
   5415 									/* Write to mapped buffer. */
   5416 									*p = 3;
   5417 
   5418 									/* Flush test. */
   5419 									m_pFlushMappedNamedBufferRange(m_bo_in, 0, sizeof(glw::GLint));
   5420 
   5421 									if (GL_NO_ERROR == gl.getError())
   5422 									{
   5423 										/* Mapped Buffer Pointer query. */
   5424 										glw::GLvoid* is_p = DE_NULL;
   5425 										m_pGetNamedBufferPointerv(m_bo_in, GL_BUFFER_MAP_POINTER, &is_p);
   5426 
   5427 										if (GL_NO_ERROR == gl.getError())
   5428 										{
   5429 											/* Mapped Buffer pointer query check. */
   5430 											if (p == is_p)
   5431 											{
   5432 												/* Unmapping. */
   5433 												m_pUnmapNamedBuffer(m_bo_in);
   5434 
   5435 												if (GL_NO_ERROR == gl.getError())
   5436 												{
   5437 													/* Setup buffer as input for vertex shader. */
   5438 													m_attrib_location =
   5439 														gl.getAttribLocation(m_po, s_vertex_shader_input_name);
   5440 													GLU_EXPECT_NO_ERROR(gl.getError(),
   5441 																		"glGetAttribLocation call failed.");
   5442 
   5443 													gl.bindBuffer(GL_ARRAY_BUFFER, m_bo_in);
   5444 													GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer call failed.");
   5445 
   5446 													gl.vertexAttribIPointer(m_attrib_location, 1, GL_INT, 0, NULL);
   5447 													GLU_EXPECT_NO_ERROR(gl.getError(),
   5448 																		"glVertexAttribIPointer call failed.");
   5449 
   5450 													gl.enableVertexAttribArray(m_attrib_location);
   5451 													GLU_EXPECT_NO_ERROR(gl.getError(),
   5452 																		"glEnableVertexAttribArray call failed.");
   5453 
   5454 													return true;
   5455 												}
   5456 												else
   5457 												{
   5458 													m_context.getTestContext().getLog()
   5459 														<< tcu::TestLog::Message << "UnmapNamedBuffer has failed."
   5460 														<< tcu::TestLog::EndMessage;
   5461 												}
   5462 											}
   5463 											else
   5464 											{
   5465 												m_pUnmapNamedBuffer(m_bo_in);
   5466 												m_context.getTestContext().getLog()
   5467 													<< tcu::TestLog::Message
   5468 													<< "Pointer returned by GetNamedBufferPointerv is not proper."
   5469 													<< tcu::TestLog::EndMessage;
   5470 											}
   5471 										}
   5472 										else
   5473 										{
   5474 											m_pUnmapNamedBuffer(m_bo_in);
   5475 											m_context.getTestContext().getLog() << tcu::TestLog::Message
   5476 																				<< "GetNamedBufferPointerv has failed."
   5477 																				<< tcu::TestLog::EndMessage;
   5478 										}
   5479 									}
   5480 									else
   5481 									{
   5482 										m_pUnmapNamedBuffer(m_bo_in);
   5483 										m_context.getTestContext().getLog() << tcu::TestLog::Message
   5484 																			<< "FlushMappedNamedBufferRange has failed."
   5485 																			<< tcu::TestLog::EndMessage;
   5486 									}
   5487 								}
   5488 								else
   5489 								{
   5490 									m_context.getTestContext().getLog() << tcu::TestLog::Message
   5491 																		<< "MapNamedBufferRange has failed."
   5492 																		<< tcu::TestLog::EndMessage;
   5493 								}
   5494 							}
   5495 							else
   5496 							{
   5497 								m_context.getTestContext().getLog() << tcu::TestLog::Message
   5498 																	<< "CopyNamedBufferSubData has failed."
   5499 																	<< tcu::TestLog::EndMessage;
   5500 							}
   5501 						}
   5502 						else
   5503 						{
   5504 							m_context.getTestContext().getLog()
   5505 								<< tcu::TestLog::Message << "UnmapNamedBuffer has failed." << tcu::TestLog::EndMessage;
   5506 						}
   5507 					}
   5508 					else
   5509 					{
   5510 						m_context.getTestContext().getLog() << tcu::TestLog::Message << "MapNamedBuffer has failed."
   5511 															<< tcu::TestLog::EndMessage;
   5512 					}
   5513 				}
   5514 				else
   5515 				{
   5516 					m_context.getTestContext().getLog() << tcu::TestLog::Message << "NamedBufferSubData has failed."
   5517 														<< tcu::TestLog::EndMessage;
   5518 				}
   5519 			}
   5520 			else
   5521 			{
   5522 				m_context.getTestContext().getLog() << tcu::TestLog::Message << "ClearNamedBufferSubData has failed."
   5523 													<< tcu::TestLog::EndMessage;
   5524 			}
   5525 		}
   5526 		else
   5527 		{
   5528 			m_context.getTestContext().getLog() << tcu::TestLog::Message << "NamedBufferStorage has failed."
   5529 												<< tcu::TestLog::EndMessage;
   5530 		}
   5531 	}
   5532 	else
   5533 	{
   5534 		m_context.getTestContext().getLog() << tcu::TestLog::Message << "CreateBuffers has failed."
   5535 											<< tcu::TestLog::EndMessage;
   5536 	}
   5537 
   5538 	return false;
   5539 }
   5540 
   5541 /** Prepare output buffer in the way described in test specification (see class comment). */
   5542 bool FunctionalTest::PrepareOutputBuffer()
   5543 {
   5544 	/* Shortcut for GL functionality */
   5545 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
   5546 
   5547 	/* Buffer preparation */
   5548 	gl.genBuffers(1, &m_bo_out);
   5549 
   5550 	if (GL_NO_ERROR == gl.getError())
   5551 	{
   5552 		gl.bindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, m_bo_out);
   5553 
   5554 		if (GL_NO_ERROR == gl.getError())
   5555 		{
   5556 			m_pNamedBufferData(m_bo_out, sizeof(s_initial_data_b), s_initial_data_b, GL_DYNAMIC_COPY);
   5557 
   5558 			if (GL_NO_ERROR == gl.getError())
   5559 			{
   5560 				gl.bindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, 0, m_bo_out, 0,
   5561 								   sizeof(s_initial_data_a) /* intentionally sizeof(a) < sizeof(b) */);
   5562 
   5563 				if (GL_NO_ERROR == gl.getError())
   5564 				{
   5565 					return true;
   5566 				}
   5567 				else
   5568 				{
   5569 					m_context.getTestContext().getLog() << tcu::TestLog::Message << "BindBufferRange has failed."
   5570 														<< tcu::TestLog::EndMessage;
   5571 					throw 0; /* This function is not being tested, throw test internal error */
   5572 				}
   5573 			}
   5574 			else
   5575 			{
   5576 				m_context.getTestContext().getLog() << tcu::TestLog::Message << "NamedBufferData has failed."
   5577 													<< tcu::TestLog::EndMessage;
   5578 			}
   5579 		}
   5580 		else
   5581 		{
   5582 			m_context.getTestContext().getLog() << tcu::TestLog::Message << "BindBuffer has failed."
   5583 												<< tcu::TestLog::EndMessage;
   5584 			throw 0; /* This function is not being tested, throw test internal error */
   5585 		}
   5586 	}
   5587 	else
   5588 	{
   5589 		m_context.getTestContext().getLog() << tcu::TestLog::Message << "GenBuffers has failed."
   5590 											<< tcu::TestLog::EndMessage;
   5591 		throw 0; /* This function is not being tested, throw test internal error */
   5592 	}
   5593 
   5594 	return false;
   5595 }
   5596 
   5597 /** Draw with the test program and transform feedback. */
   5598 void FunctionalTest::Draw()
   5599 {
   5600 	/* Shortcut for GL functionality */
   5601 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
   5602 
   5603 	/* Draw using transform feedback. */
   5604 	gl.disable(GL_RASTERIZER_DISCARD);
   5605 	GLU_EXPECT_NO_ERROR(gl.getError(), "glDisable call failed.");
   5606 
   5607 	gl.beginTransformFeedback(GL_POINTS);
   5608 	GLU_EXPECT_NO_ERROR(gl.getError(), "glBeginTransformFeedback call failed.");
   5609 
   5610 	gl.drawArrays(GL_POINTS, 0, sizeof(s_initial_data_a) / sizeof(s_initial_data_a[0]));
   5611 	GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawArrays call failed.");
   5612 
   5613 	gl.endTransformFeedback();
   5614 	GLU_EXPECT_NO_ERROR(gl.getError(), "glEndTransformFeedback call failed.");
   5615 
   5616 	gl.enable(GL_RASTERIZER_DISCARD);
   5617 	GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable call failed.");
   5618 }
   5619 
   5620 /** @brief Check that input buffer is immutable using GetNamedBufferParameteriv function. */
   5621 bool FunctionalTest::CheckArrayBufferImmutableFlag()
   5622 {
   5623 	/* Shortcut for GL functionality. */
   5624 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
   5625 
   5626 	/* Local query storage. */
   5627 	glw::GLint is_storage_immutable = -1;
   5628 
   5629 	/* Querry. */
   5630 	m_pGetNamedBufferParameteriv(m_bo_in, GL_BUFFER_IMMUTABLE_STORAGE, &is_storage_immutable);
   5631 
   5632 	/* Error checking. */
   5633 	if (GL_NO_ERROR == gl.getError())
   5634 	{
   5635 		/* Return value checking. */
   5636 		if (-1 != is_storage_immutable)
   5637 		{
   5638 			/* Test. */
   5639 			if (GL_TRUE == is_storage_immutable)
   5640 			{
   5641 				return true;
   5642 			}
   5643 			else
   5644 			{
   5645 				m_context.getTestContext().getLog() << tcu::TestLog::Message
   5646 													<< "Input buffer storage is unexpectedly mutable."
   5647 													<< tcu::TestLog::EndMessage;
   5648 			}
   5649 		}
   5650 		else
   5651 		{
   5652 			m_context.getTestContext().getLog() << tcu::TestLog::Message
   5653 												<< "GetNamedBufferParameteriv has not returned a data."
   5654 												<< tcu::TestLog::EndMessage;
   5655 		}
   5656 	}
   5657 	else
   5658 	{
   5659 		m_context.getTestContext().getLog() << tcu::TestLog::Message << "GetNamedBufferParameteriv has failed."
   5660 											<< tcu::TestLog::EndMessage;
   5661 	}
   5662 
   5663 	return false;
   5664 }
   5665 
   5666 /** @brief Check that output buffer size using GetNamedBufferParameteri64v function. */
   5667 bool FunctionalTest::CheckTransformFeedbackBufferSize()
   5668 {
   5669 	/* Shortcut for GL functionality. */
   5670 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
   5671 
   5672 	/* Local query storage. */
   5673 	glw::GLint64 size = -1;
   5674 
   5675 	/* Querry. */
   5676 	m_pGetNamedBufferParameteri64v(m_bo_out, GL_BUFFER_SIZE, &size);
   5677 
   5678 	/* Error checking. */
   5679 	if (GL_NO_ERROR == gl.getError())
   5680 	{
   5681 		/* Return value checking. */
   5682 		if (-1 != size)
   5683 		{
   5684 			/* Test. */
   5685 			if (sizeof(s_initial_data_b) == size)
   5686 			{
   5687 				return true;
   5688 			}
   5689 			else
   5690 			{
   5691 				m_context.getTestContext().getLog() << tcu::TestLog::Message << "Output buffer size is " << size
   5692 													<< ", but " << sizeof(s_initial_data_b) << " was expected."
   5693 													<< tcu::TestLog::EndMessage;
   5694 			}
   5695 		}
   5696 		else
   5697 		{
   5698 			m_context.getTestContext().getLog() << tcu::TestLog::Message
   5699 												<< "GetNamedBufferParameteri64v has not returned a data."
   5700 												<< tcu::TestLog::EndMessage;
   5701 		}
   5702 	}
   5703 	else
   5704 	{
   5705 		m_context.getTestContext().getLog() << tcu::TestLog::Message << "GetNamedBufferParameteri64v has failed."
   5706 											<< tcu::TestLog::EndMessage;
   5707 	}
   5708 
   5709 	return false;
   5710 }
   5711 
   5712 /** @brief Check that results of the test are equal to the expected reference values. */
   5713 bool FunctionalTest::CheckTransformFeedbackResult()
   5714 {
   5715 	/* Shortcut for GL functionality. */
   5716 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
   5717 
   5718 	/* Local data storage. */
   5719 	glw::GLint output_data[sizeof(s_initial_data_b) / sizeof(s_initial_data_b[0])] = {};
   5720 
   5721 	/* Fetch data. */
   5722 	m_pGetNamedBufferSubData(m_bo_out, 0, sizeof(output_data), output_data);
   5723 
   5724 	/* Error checking. */
   5725 	if (GL_NO_ERROR == gl.getError())
   5726 	{
   5727 		for (glw::GLuint i = 0; i < sizeof(s_initial_data_b) / sizeof(s_initial_data_b[0]); ++i)
   5728 		{
   5729 			if (s_expected_data[i] != output_data[i])
   5730 			{
   5731 				m_context.getTestContext().getLog() << tcu::TestLog::Message << "Expected data is not equal to results."
   5732 													<< tcu::TestLog::EndMessage;
   5733 				return false;
   5734 			}
   5735 		}
   5736 
   5737 		return true;
   5738 	}
   5739 	else
   5740 	{
   5741 		m_context.getTestContext().getLog() << tcu::TestLog::Message << "GetNamedBufferSubData has failed."
   5742 											<< tcu::TestLog::EndMessage;
   5743 	}
   5744 	return false;
   5745 }
   5746 
   5747 /** Clean all test's GL objects and state. */
   5748 void FunctionalTest::Cleanup()
   5749 {
   5750 	/* Shortcut for GL functionality. */
   5751 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
   5752 
   5753 	/* Cleanup objects. */
   5754 	if (m_po)
   5755 	{
   5756 		gl.useProgram(0);
   5757 
   5758 		gl.deleteProgram(m_po);
   5759 
   5760 		m_po = 0;
   5761 	}
   5762 
   5763 	if (m_vao)
   5764 	{
   5765 		gl.deleteVertexArrays(1, &m_vao);
   5766 
   5767 		m_vao = 0;
   5768 	}
   5769 
   5770 	if (0 <= m_attrib_location)
   5771 	{
   5772 		gl.disableVertexAttribArray(m_attrib_location);
   5773 
   5774 		m_attrib_location = -1;
   5775 	}
   5776 
   5777 	if (m_bo_in)
   5778 	{
   5779 		gl.deleteBuffers(1, &m_bo_in);
   5780 
   5781 		m_bo_in = 0;
   5782 	}
   5783 
   5784 	if (m_bo_out)
   5785 	{
   5786 		gl.deleteBuffers(1, &m_bo_out);
   5787 
   5788 		m_bo_out = 0;
   5789 	}
   5790 
   5791 	/* Make sure that rasterizer is turned on (default). */
   5792 	gl.enable(GL_RASTERIZER_DISCARD);
   5793 
   5794 	/* Clean all errors. */
   5795 	while (gl.getError())
   5796 		;
   5797 }
   5798 
   5799 } /* Buffers namespace. */
   5800 } /* DirectStateAccess namespace. */
   5801 } /* gl4cts namespace. */
   5802