13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*-------------------------------------------------------------------------
23c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * drawElements Quality Program OpenGL ES 3.1 Module
33c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * -------------------------------------------------
43c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
53c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Copyright 2014 The Android Open Source Project
63c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
73c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Licensed under the Apache License, Version 2.0 (the "License");
83c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * you may not use this file except in compliance with the License.
93c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * You may obtain a copy of the License at
103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *      http://www.apache.org/licenses/LICENSE-2.0
123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Unless required by applicable law or agreed to in writing, software
143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * distributed under the License is distributed on an "AS IS" BASIS,
153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * See the License for the specific language governing permissions and
173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * limitations under the License.
183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*!
203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \file
213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Negative Buffer API tests.
223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "es31fNegativeBufferApiTests.hpp"
253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluCallLogWrapper.hpp"
273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glwDefs.hpp"
293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glwEnums.hpp"
303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
313c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace deqp
323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
333c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace gles31
343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
353c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace Functional
363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
373c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace NegativeTestShared
383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
403c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing tcu::TestLog;
413c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing glu::CallLogWrapper;
423c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing namespace glw;
433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// Buffers
453c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid bind_buffer (NegativeTestContext& ctx)
463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_ENUM is generated if target is not one of the allowable values.");
483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindBuffer(-1, 0);
493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_ENUM);
503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
533c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid delete_buffers (NegativeTestContext& ctx)
543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_VALUE is generated if n is negative.");
563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glDeleteBuffers(-1, 0);
573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_VALUE);
583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
613c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid gen_buffers (NegativeTestContext& ctx)
623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_VALUE is generated if n is negative.");
643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGenBuffers(-1, 0);
653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_VALUE);
663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
693c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid buffer_data (NegativeTestContext& ctx)
703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLuint buffer = 0x1234;
723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGenBuffers(1, &buffer);
733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindBuffer(GL_ARRAY_BUFFER, buffer);
743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_ENUM is generated if target is not GL_ARRAY_BUFFER or GL_ELEMENT_ARRAY_BUFFER.");
763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBufferData(-1, 0, NULL, GL_STREAM_DRAW);
773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_ENUM);
783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_ENUM is generated if usage is not GL_STREAM_DRAW, GL_STATIC_DRAW, or GL_DYNAMIC_DRAW.");
813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBufferData(GL_ARRAY_BUFFER, 0, NULL, -1);
823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_ENUM);
833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_VALUE is generated if size is negative.");
863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBufferData(GL_ARRAY_BUFFER, -1, NULL, GL_STREAM_DRAW);
873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_VALUE);
883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_OPERATION is generated if the reserved buffer object name 0 is bound to target.");
913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindBuffer(GL_ARRAY_BUFFER, 0);
923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBufferData(GL_ARRAY_BUFFER, 0, NULL, GL_STREAM_DRAW);
933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_OPERATION);
943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glDeleteBuffers(1, &buffer);
973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
993c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid buffer_sub_data (NegativeTestContext& ctx)
1003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLuint buffer = 0x1234;
1023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGenBuffers(1, &buffer);
1033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindBuffer(GL_ARRAY_BUFFER, buffer);
1043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBufferData(GL_ARRAY_BUFFER, 10, 0, GL_STREAM_DRAW);
1053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_ENUM is generated if target is not GL_ARRAY_BUFFER or GL_ELEMENT_ARRAY_BUFFER.");
1073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBufferSubData(-1, 1, 1, 0);
1083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_ENUM);
1093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
1103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_OPERATION is generated if the reserved buffer object name 0 is bound to target.");
1123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindBuffer(GL_ARRAY_BUFFER, 0);
1133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBufferSubData(GL_ARRAY_BUFFER, 1, 1, 0);
1143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_OPERATION);
1153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
1163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_OPERATION is generated if the buffer object being updated is mapped.");
1183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindBuffer(GL_ARRAY_BUFFER, buffer);
1193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glMapBufferRange(GL_ARRAY_BUFFER, 0, 5, GL_MAP_READ_BIT);
1203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_NO_ERROR);
1213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBufferSubData(GL_ARRAY_BUFFER, 1, 1, 0);
1223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_OPERATION);
1233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
1243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glDeleteBuffers(1, &buffer);
1263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1283c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid buffer_sub_data_size_offset (NegativeTestContext& ctx)
1293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLuint buffer = 0x1234;
1313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGenBuffers(1, &buffer);
1323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindBuffer(GL_ARRAY_BUFFER, buffer);
1333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBufferData(GL_ARRAY_BUFFER, 10, 0, GL_STREAM_DRAW);
1343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_VALUE is generated if offset or size is negative, or if together they define a region of memory that extends beyond the buffer object's allocated data store.");
1363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBufferSubData(GL_ARRAY_BUFFER, -1, 1, 0);
1373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_VALUE);
1383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBufferSubData(GL_ARRAY_BUFFER, -1, -1, 0);
1393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_VALUE);
1403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBufferSubData(GL_ARRAY_BUFFER, 1, -1, 0);
1413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_VALUE);
1423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBufferSubData(GL_ARRAY_BUFFER, 15, 1, 0);
1433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_VALUE);
1443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBufferSubData(GL_ARRAY_BUFFER, 1, 15, 0);
1453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_VALUE);
1463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBufferSubData(GL_ARRAY_BUFFER, 8, 8, 0);
1473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_VALUE);
1483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
1493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glDeleteBuffers(1, &buffer);
1513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1533c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid clear (NegativeTestContext& ctx)
1543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_VALUE is generated if any bit other than the three defined bits is set in mask.");
1563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
1573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_NO_ERROR);
1583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glClear(0x00000200);
1593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_VALUE);
1603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glClear(0x00001000);
1613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_VALUE);
1623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glClear(0x00000010);
1633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_VALUE);
1643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
1653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1673c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid read_pixels (NegativeTestContext& ctx)
1683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
169fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	std::vector<GLubyte>	ubyteData	(4);
170fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	GLuint					fbo			= 0x1234;
1713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_OPERATION is generated if the combination of format and type is unsupported.");
1733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glReadPixels(0, 0, 1, 1, GL_LUMINANCE_ALPHA, GL_UNSIGNED_SHORT_4_4_4_4, &ubyteData[0]);
1743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_OPERATION);
1753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
1763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_VALUE is generated if either width or height is negative.");
1783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glReadPixels(0, 0, -1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &ubyteData[0]);
1793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_VALUE);
1803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glReadPixels(0, 0, 1, -1, GL_RGBA, GL_UNSIGNED_BYTE, &ubyteData[0]);
1813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_VALUE);
1823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glReadPixels(0, 0, -1, -1, GL_RGBA, GL_UNSIGNED_BYTE, &ubyteData[0]);
1833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_VALUE);
1843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
1853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
1873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGenFramebuffers(1, &fbo);
1883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
1893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
1903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &ubyteData[0]);
1913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
1923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
1933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glDeleteFramebuffers(1, &fbo);
1953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
197fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulosvoid readn_pixels (NegativeTestContext& ctx)
198fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos{
199d99ba132d92fb015a4008910a98a257fad1199a6Alexander Galazin	std::vector<GLfloat>	floatData	(4);
200fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	std::vector<GLubyte>	ubyteData	(4);
201fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	GLuint					fbo			= 0x1234;
202fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
20333b9b63106a43ad6bba497c8f31fc35b0051da78Mika Isojärvi	if (!contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2))
20433b9b63106a43ad6bba497c8f31fc35b0051da78Mika Isojärvi		&& !ctx.isExtensionSupported("GL_KHR_robustness")
20533b9b63106a43ad6bba497c8f31fc35b0051da78Mika Isojärvi		&& !ctx.isExtensionSupported("GL_EXT_robustness"))
20633b9b63106a43ad6bba497c8f31fc35b0051da78Mika Isojärvi	{
20733b9b63106a43ad6bba497c8f31fc35b0051da78Mika Isojärvi		TCU_THROW(NotSupportedError, "GLES 3.2 or robustness extension not supported");
20833b9b63106a43ad6bba497c8f31fc35b0051da78Mika Isojärvi	}
20933b9b63106a43ad6bba497c8f31fc35b0051da78Mika Isojärvi
210fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.beginSection("GL_INVALID_OPERATION is generated if the combination of format and type is unsupported.");
211fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glReadnPixels(0, 0, 1, 1, GL_LUMINANCE_ALPHA, GL_UNSIGNED_SHORT_4_4_4_4, (int) ubyteData.size(), &ubyteData[0]);
212fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError(GL_INVALID_OPERATION);
213fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.endSection();
214fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
215fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.beginSection("GL_INVALID_VALUE is generated if either width or height is negative.");
216fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glReadnPixels(0, 0, -1, 1, GL_RGBA, GL_UNSIGNED_BYTE, (int) ubyteData.size(), &ubyteData[0]);
217fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError(GL_INVALID_VALUE);
218fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glReadnPixels(0, 0, 1, -1, GL_RGBA, GL_UNSIGNED_BYTE, (int) ubyteData.size(), &ubyteData[0]);
219fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError(GL_INVALID_VALUE);
220fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glReadnPixels(0, 0, -1, -1, GL_RGBA, GL_UNSIGNED_BYTE, (int) ubyteData.size(), &ubyteData[0]);
221fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError(GL_INVALID_VALUE);
222fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.endSection();
223fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
224fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.beginSection("GL_INVALID_OPERATION is generated by ReadnPixels if the buffer size required to store the requested data is larger than bufSize.");
225fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glReadnPixels(0, 0, 0x1234, 0x1234, GL_RGBA, GL_UNSIGNED_BYTE, (int) ubyteData.size(), &ubyteData[0]);
226fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError(GL_INVALID_OPERATION);
227d99ba132d92fb015a4008910a98a257fad1199a6Alexander Galazin	ctx.glReadnPixels(0, 0, 1, 1, GL_RGBA, GL_FLOAT, (int) floatData.size(), &floatData[0]);
228d99ba132d92fb015a4008910a98a257fad1199a6Alexander Galazin	ctx.expectError(GL_INVALID_OPERATION);
229fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.endSection();
230fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
231fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.");
232fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glGenFramebuffers(1, &fbo);
233fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
234fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
235fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glReadnPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, (int) ubyteData.size(), &ubyteData[0]);
236fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError(GL_INVALID_FRAMEBUFFER_OPERATION);
237fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.endSection();
238fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
239fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glDeleteFramebuffers(1, &fbo);
240fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos}
241fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
2423c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid read_pixels_format_mismatch (NegativeTestContext& ctx)
2433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
244fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	std::vector<GLubyte>	ubyteData	(4);
245fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	std::vector<GLushort>	ushortData	(4);
246fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	GLint					readFormat	= 0x1234;
247fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	GLint					readType	= 0x1234;
2483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
249fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.beginSection("Unsupported combinations of format and type will generate an GL_INVALID_OPERATION error.");
2503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_SHORT_5_6_5, &ushortData[0]);
2513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_OPERATION);
2523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glReadPixels(0, 0, 1, 1, GL_ALPHA, GL_UNSIGNED_SHORT_5_6_5, &ushortData[0]);
2533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_OPERATION);
2543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glReadPixels(0, 0, 1, 1, GL_RGB, GL_UNSIGNED_SHORT_4_4_4_4, &ushortData[0]);
2553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_OPERATION);
2563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glReadPixels(0, 0, 1, 1, GL_ALPHA, GL_UNSIGNED_SHORT_4_4_4_4, &ushortData[0]);
2573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_OPERATION);
2583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glReadPixels(0, 0, 1, 1, GL_RGB, GL_UNSIGNED_SHORT_5_5_5_1, &ushortData[0]);
2593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_OPERATION);
2603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glReadPixels(0, 0, 1, 1, GL_ALPHA, GL_UNSIGNED_SHORT_5_5_5_1, &ushortData[0]);
2613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_OPERATION);
2623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
2633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_RGBA/GL_UNSIGNED_BYTE is always accepted and the other acceptable pair can be discovered by querying GL_IMPLEMENTATION_COLOR_READ_FORMAT and GL_IMPLEMENTATION_COLOR_READ_TYPE.");
2653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &ubyteData[0]);
2663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_NO_ERROR);
2673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_FORMAT, &readFormat);
2683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_TYPE, &readType);
2693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glReadPixels(0, 0, 1, 1, readFormat, readType, &ubyteData[0]);
2703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_NO_ERROR);
2713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
2723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2743c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid read_pixels_fbo_format_mismatch (NegativeTestContext& ctx)
2753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	std::vector<GLubyte>	ubyteData(4);
2773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	std::vector<float>		floatData(4);
2783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32				fbo = 0x1234;
2793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32				texture = 0x1234;
2803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGenTextures			(1, &texture);
2823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindTexture			(GL_TEXTURE_2D, texture);
2833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glTexImage2D			(GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
2843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGenFramebuffers		(1, &fbo);
2853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindFramebuffer		(GL_FRAMEBUFFER, fbo);
2863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glFramebufferTexture2D	(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
2873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_NO_ERROR);
2883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_OPERATION is generated if currently bound framebuffer format is incompatible with format and type.");
2903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glTexImage2D			(GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
2923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glFramebufferTexture2D	(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
2933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
2943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_NO_ERROR);
2953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glReadPixels			(0, 0, 1, 1, GL_RGBA, GL_FLOAT, &floatData[0]);
2963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_OPERATION);
2973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glTexImage2D			(GL_TEXTURE_2D, 0, GL_RGBA32I, 32, 32, 0, GL_RGBA_INTEGER, GL_INT, NULL);
2993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glFramebufferTexture2D	(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
3003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
3013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_NO_ERROR);
3023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glReadPixels			(0, 0, 1, 1, GL_RGBA, GL_FLOAT, &floatData[0]);
3033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_OPERATION);
3043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glTexImage2D			(GL_TEXTURE_2D, 0, GL_RGBA32UI, 32, 32, 0, GL_RGBA_INTEGER, GL_UNSIGNED_INT, NULL);
3063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glFramebufferTexture2D	(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
3073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
3083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_NO_ERROR);
3093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glReadPixels			(0, 0, 1, 1, GL_RGBA, GL_FLOAT, &floatData[0]);
3103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_OPERATION);
3113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
31237e360591e357a7c087b817735860a9f0e922a88Pyry Haulos	if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)) ||
31337e360591e357a7c087b817735860a9f0e922a88Pyry Haulos		ctx.isExtensionSupported("GL_EXT_color_buffer_float"))
31437e360591e357a7c087b817735860a9f0e922a88Pyry Haulos	{
31537e360591e357a7c087b817735860a9f0e922a88Pyry Haulos		ctx.glTexImage2D			(GL_TEXTURE_2D, 0, GL_RGBA32F, 32, 32, 0, GL_RGBA, GL_FLOAT, NULL);
31637e360591e357a7c087b817735860a9f0e922a88Pyry Haulos		ctx.expectError				(GL_NO_ERROR);
31737e360591e357a7c087b817735860a9f0e922a88Pyry Haulos		ctx.glFramebufferTexture2D	(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
31837e360591e357a7c087b817735860a9f0e922a88Pyry Haulos		ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
31937e360591e357a7c087b817735860a9f0e922a88Pyry Haulos		ctx.expectError				(GL_NO_ERROR);
32037e360591e357a7c087b817735860a9f0e922a88Pyry Haulos		ctx.glReadPixels			(0, 0, 1, 1, GL_RGBA, GL_INT, &floatData[0]);
32137e360591e357a7c087b817735860a9f0e922a88Pyry Haulos		ctx.expectError				(GL_INVALID_OPERATION);
32237e360591e357a7c087b817735860a9f0e922a88Pyry Haulos	}
323fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
3243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
3253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_OPERATION is generated if GL_READ_FRAMEBUFFER_BINDING is non-zero, the read framebuffer is complete, and the value of GL_SAMPLE_BUFFERS for the read framebuffer is greater than zero.");
3273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int			binding			= -1;
3293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int			sampleBuffers = 0x1234;
3303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32	rbo = 0x1234;
3313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGenRenderbuffers(1, &rbo);
3333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindRenderbuffer(GL_RENDERBUFFER, rbo);
3343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_RGBA8, 32, 32);
3353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
3363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGetIntegerv			(GL_READ_FRAMEBUFFER_BINDING, &binding);
3383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.getLog() << TestLog::Message << "// GL_READ_FRAMEBUFFER_BINDING: " << binding << TestLog::EndMessage;
3393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
3403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGetIntegerv			(GL_SAMPLE_BUFFERS, &sampleBuffers);
3413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.getLog() << TestLog::Message << "// GL_SAMPLE_BUFFERS: " << sampleBuffers << TestLog::EndMessage;
3423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_NO_ERROR);
3433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (binding == 0 || sampleBuffers <= 0)
3453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
3463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		ctx.getLog() << TestLog::Message << "// ERROR: expected GL_READ_FRAMEBUFFER_BINDING to be non-zero and GL_SAMPLE_BUFFERS to be greater than zero" << TestLog::EndMessage;
3473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		ctx.fail("Got invalid value");
3483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
3493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
3503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
3513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		ctx.glReadPixels	(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &ubyteData[0]);
3523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		ctx.expectError		(GL_INVALID_OPERATION);
3533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
3543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
3563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindRenderbuffer		(GL_RENDERBUFFER, 0);
3583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindTexture			(GL_TEXTURE_2D, 0);
3593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindFramebuffer		(GL_FRAMEBUFFER, 0);
3603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glDeleteFramebuffers	(1, &fbo);
3613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glDeleteTextures		(1, &texture);
3623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glDeleteRenderbuffers	(1, &rbo);
3633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3653c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid bind_buffer_range (NegativeTestContext& ctx)
3663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
367fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	deUint32	bufAC		= 0x1234;
368fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	deUint32	bufU		= 0x1234;
369fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	deUint32	bufTF		= 0x1234;
370fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	int			maxTFSize	= 0x1234;
371fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	int			maxUSize	= 0x1234;
372fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	int			uAlignment	= 0x1234;
373fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
3743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGenBuffers(1, &bufU);
3753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindBuffer(GL_UNIFORM_BUFFER, bufU);
3763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBufferData(GL_UNIFORM_BUFFER, 16, NULL, GL_STREAM_DRAW);
3773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGenBuffers(1, &bufTF);
3793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, bufTF);
3803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 16, NULL, GL_STREAM_DRAW);
3813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
382fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glGenBuffers(1, &bufAC);
383fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glBindBuffer(GL_ATOMIC_COUNTER_BUFFER, bufAC);
384fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glBufferData(GL_ATOMIC_COUNTER_BUFFER, 16, NULL, GL_STREAM_DRAW);
385fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
386fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.beginSection("GL_INVALID_ENUM is generated if target is not GL_ATOMIC_COUNTER_BUFFER, GL_SHADER_STORAGE_BUFFER, GL_TRANSFORM_FEEDBACK_BUFFER or GL_UNIFORM_BUFFER.");
3873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindBufferRange(GL_ARRAY_BUFFER, 0, bufU, 0, 4);
3883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_ENUM);
3893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
3903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_VALUE is generated if target is GL_TRANSFORM_FEEDBACK_BUFFER and index is greater than or equal to GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS.");
3923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGetIntegerv(GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS, &maxTFSize);
3933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, maxTFSize, bufTF, 0, 4);
3943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_VALUE);
3953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
3963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_VALUE is generated if target is GL_UNIFORM_BUFFER and index is greater than or equal to GL_MAX_UNIFORM_BUFFER_BINDINGS.");
3983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGetIntegerv(GL_MAX_UNIFORM_BUFFER_BINDINGS, &maxUSize);
3993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindBufferRange(GL_UNIFORM_BUFFER, maxUSize, bufU, 0, 4);
4003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_VALUE);
4013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
4023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_VALUE is generated if size is less than or equal to zero.");
4043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindBufferRange(GL_UNIFORM_BUFFER, 0, bufU, 0, -1);
4053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_VALUE);
4063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindBufferRange(GL_UNIFORM_BUFFER, 0, bufU, 0, 0);
4073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_VALUE);
4083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
4093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
410fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.beginSection("GL_INVALID_VALUE is generated if offset is less than zero.");
411fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glBindBufferRange(GL_UNIFORM_BUFFER, 0, bufU, -1, 0);
412fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError(GL_INVALID_VALUE);
413fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.endSection();
414fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
4153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_VALUE is generated if target is GL_TRANSFORM_FEEDBACK_BUFFER and size or offset are not multiples of 4.");
4163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, 0, bufTF, 4, 5);
4173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_VALUE);
4183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, 0, bufTF, 5, 4);
4193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_VALUE);
4203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, 0, bufTF, 5, 7);
4213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_VALUE);
4223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
4233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_VALUE is generated if target is GL_UNIFORM_BUFFER and offset is not a multiple of GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT.");
425fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glGetIntegerv(GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT, &uAlignment);
426fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glBindBufferRange(GL_UNIFORM_BUFFER, 0, bufU, uAlignment+1, 4);
4273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_VALUE);
4283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
4293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
430fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)))
431fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	{
432fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		int maxACize	= 0x1234;
433fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		int maxSSize	= 0x1234;
434fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		int ssAlignment	= 0x1234;
435fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
436fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.beginSection("GL_INVALID_VALUE is generated if target is GL_ATOMIC_COUNTER_BUFFER and index is greater than or equal to GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS.");
437fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glGetIntegerv(GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS, &maxACize);
438fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glBindBufferRange(GL_ATOMIC_COUNTER_BUFFER, maxACize, bufU, 0, 4);
439fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.expectError(GL_INVALID_VALUE);
440fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.endSection();
441fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
442fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.beginSection("GL_INVALID_VALUE is generated if target is GL_SHADER_STORAGE_BUFFER and index is greater than or equal to GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS.");
443fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glGetIntegerv(GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS, &maxSSize);
444fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glBindBufferRange(GL_SHADER_STORAGE_BUFFER, maxSSize, bufU, 0, 4);
445fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.expectError(GL_INVALID_VALUE);
446fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.endSection();
447fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
448fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.beginSection("GL_INVALID_VALUE is generated if target is GL_ATOMIC_COUNTER_BUFFER and offset is not multiples of 4.");
44951e20f1e2525f27b6e0ab81ffe7469fd4b33e5e7John Richardson		ctx.glBindBufferRange(GL_ATOMIC_COUNTER_BUFFER, 0, bufTF, 5, 4);
450fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.expectError(GL_INVALID_VALUE);
451fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.endSection();
452fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
453fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glGetIntegerv(GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT, &ssAlignment);
45451e20f1e2525f27b6e0ab81ffe7469fd4b33e5e7John Richardson
45551e20f1e2525f27b6e0ab81ffe7469fd4b33e5e7John Richardson		if (ssAlignment != 1)
45651e20f1e2525f27b6e0ab81ffe7469fd4b33e5e7John Richardson		{
45751e20f1e2525f27b6e0ab81ffe7469fd4b33e5e7John Richardson			ctx.beginSection("GL_INVALID_VALUE is generated if target is GL_SHADER_STORAGE_BUFFER and offset is not a multiple of the value of GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT.");
45851e20f1e2525f27b6e0ab81ffe7469fd4b33e5e7John Richardson			ctx.glBindBufferRange(GL_SHADER_STORAGE_BUFFER, 0, bufTF, ssAlignment+1, 4);
45951e20f1e2525f27b6e0ab81ffe7469fd4b33e5e7John Richardson			ctx.expectError(GL_INVALID_VALUE);
46051e20f1e2525f27b6e0ab81ffe7469fd4b33e5e7John Richardson			ctx.endSection();
46151e20f1e2525f27b6e0ab81ffe7469fd4b33e5e7John Richardson		}
462fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	}
463fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
4643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glDeleteBuffers(1, &bufU);
4653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glDeleteBuffers(1, &bufTF);
466fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glDeleteBuffers(1, &bufAC);
4673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
4683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4693c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid bind_buffer_base (NegativeTestContext& ctx)
4703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
471fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	deUint32	bufU		= 0x1234;
472fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	deUint32	bufTF		= 0x1234;
473fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	int			maxUSize	= 0x1234;
474fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	int			maxTFSize	= 0x1234;
475fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
4763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGenBuffers(1, &bufU);
4773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindBuffer(GL_UNIFORM_BUFFER, bufU);
4783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBufferData(GL_UNIFORM_BUFFER, 16, NULL, GL_STREAM_DRAW);
4793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGenBuffers(1, &bufTF);
4813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, bufTF);
4823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 16, NULL, GL_STREAM_DRAW);
4833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_NO_ERROR);
4843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
485fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.beginSection("GL_INVALID_ENUM is generated if target is not GL_ATOMIC_COUNTER_BUFFER, GL_SHADER_STORAGE_BUFFER, GL_TRANSFORM_FEEDBACK_BUFFER or GL_UNIFORM_BUFFER.");
4863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindBufferBase(-1, 0, bufU);
4873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_ENUM);
4883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindBufferBase(GL_ARRAY_BUFFER, 0, bufU);
4893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_ENUM);
4903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
4913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_VALUE is generated if target is GL_UNIFORM_BUFFER and index is greater than or equal to GL_MAX_UNIFORM_BUFFER_BINDINGS.");
4933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGetIntegerv(GL_MAX_UNIFORM_BUFFER_BINDINGS, &maxUSize);
4943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindBufferBase(GL_UNIFORM_BUFFER, maxUSize, bufU);
4953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_VALUE);
4963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
4973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_VALUE is generated if target is GL_TRANSFORM_FEEDBACK_BUFFER andindex is greater than or equal to GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS.");
4993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGetIntegerv(GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS, &maxTFSize);
5003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, maxTFSize, bufTF);
5013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_VALUE);
5023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
5033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glDeleteBuffers(1, &bufU);
5053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glDeleteBuffers(1, &bufTF);
5063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
5073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5083c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid clear_bufferiv (NegativeTestContext& ctx)
5093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
510fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	std::vector<int>	data			(32*32);
511fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	deUint32			fbo				= 0x1234;
512fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	deUint32			texture			= 0x1234;
513fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	int					maxDrawBuffers	= 0x1234;
5143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGenTextures			(1, &texture);
5163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindTexture			(GL_TEXTURE_2D, texture);
5173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glTexImage2D			(GL_TEXTURE_2D, 0, GL_RGBA32I, 32, 32, 0, GL_RGBA_INTEGER, GL_INT, NULL);
5183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGenFramebuffers		(1, &fbo);
5193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindFramebuffer		(GL_FRAMEBUFFER, fbo);
5203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glFramebufferTexture2D	(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
5213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
5223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_NO_ERROR);
5233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_ENUM is generated if buffer is not an accepted value.");
525fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glClearBufferiv			(-1, 0, &data[0]);
526fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError				(GL_INVALID_ENUM);
527fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glClearBufferiv			(GL_FRAMEBUFFER, 0, &data[0]);
528fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError				(GL_INVALID_ENUM);
5293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
5303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
531fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.beginSection("GL_INVALID_ENUM is generated if buffer is GL_DEPTH or GL_DEPTH_STENCIL.");
532fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glClearBufferiv			(GL_DEPTH, 1, &data[0]);
533fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError				(GL_INVALID_ENUM);
534fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glClearBufferiv			(GL_DEPTH_STENCIL, 1, &data[0]);
535fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError				(GL_INVALID_ENUM);
5363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
5373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
538fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.beginSection("GL_INVALID_VALUE is generated if buffer is GL_COLOR or GL_STENCIL and drawBuffer is greater than or equal to GL_MAX_DRAW_BUFFERS.");
539fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glGetIntegerv			(GL_MAX_DRAW_BUFFERS, &maxDrawBuffers);
540fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glClearBufferiv			(GL_COLOR, maxDrawBuffers, &data[0]);
541fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError				(GL_INVALID_VALUE);
542fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.endSection();
543fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
544fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.beginSection("GL_INVALID_VALUE is generated if buffer is GL_COLOR or GL_STENCIL and drawBuffer is negative.");
545fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glClearBufferiv			(GL_COLOR, -1, &data[0]);
546fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError				(GL_INVALID_VALUE);
5473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
5483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_VALUE is generated if buffer is GL_STENCIL and drawBuffer is not zero.");
550fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glClearBufferiv			(GL_STENCIL, 1, &data[0]);
551fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError				(GL_INVALID_VALUE);
5523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
5533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
554fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glDeleteFramebuffers	(1, &fbo);
555fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glDeleteTextures		(1, &texture);
5563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
5573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5583c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid clear_bufferuiv (NegativeTestContext& ctx)
5593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
560fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	std::vector<deUint32>	data			(32*32);
561fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	deUint32				fbo				= 0x1234;
562fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	deUint32				texture			= 0x1234;
563fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	int						maxDrawBuffers	= 0x1234;
5643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGenTextures			(1, &texture);
5663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindTexture			(GL_TEXTURE_2D, texture);
5673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glTexImage2D			(GL_TEXTURE_2D, 0, GL_RGBA32UI, 32, 32, 0, GL_RGBA_INTEGER, GL_UNSIGNED_INT, NULL);
5683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGenFramebuffers		(1, &fbo);
5693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindFramebuffer		(GL_FRAMEBUFFER, fbo);
5703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glFramebufferTexture2D	(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
5713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
5723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_NO_ERROR);
5733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
574fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.beginSection("GL_INVALID_ENUM is generated if buffer is not GL_COLOR.");
575fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glClearBufferuiv		(-1, 0, &data[0]);
576fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError				(GL_INVALID_ENUM);
577fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glClearBufferuiv		(GL_FRAMEBUFFER, 0, &data[0]);
578fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError				(GL_INVALID_ENUM);
5793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
5803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
581fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.beginSection("GL_INVALID_ENUM is generated if buffer is GL_DEPTH, GL_STENCIL, or GL_DEPTH_STENCIL.");
582fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glClearBufferuiv		(GL_DEPTH, 0, &data[0]);
583fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError				(GL_INVALID_ENUM);
584fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glClearBufferuiv		(GL_STENCIL, 0, &data[0]);
585fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError				(GL_INVALID_ENUM);
586fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glClearBufferuiv		(GL_DEPTH_STENCIL, 0, &data[0]);
587fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError				(GL_INVALID_ENUM);
5883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
5893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
590fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.beginSection("GL_INVALID_VALUE is generated if buffer is GL_COLOR and drawBuffer is greater than or equal to GL_MAX_DRAW_BUFFERS.");
591fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glGetIntegerv			(GL_MAX_DRAW_BUFFERS, &maxDrawBuffers);
592fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glClearBufferuiv		(GL_COLOR, maxDrawBuffers, &data[0]);
593fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError				(GL_INVALID_VALUE);
5943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
5953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
596fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.beginSection("GL_INVALID_VALUE is generated if buffer is GL_COLOR and drawBuffer is negative.");
597fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glClearBufferuiv		(GL_COLOR, -1, &data[0]);
598fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError				(GL_INVALID_VALUE);
599fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.endSection();
600fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
601fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glDeleteFramebuffers	(1, &fbo);
602fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glDeleteTextures		(1, &texture);
6033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
6043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6053c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid clear_bufferfv (NegativeTestContext& ctx)
6063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
607fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	std::vector<float>	data			(32*32);
608fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	deUint32			fbo				= 0x1234;
609fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	deUint32			texture			= 0x1234;
610653ad0e8a4209754304cbd5b5ceb4fdc7b29c01aPyry Haulos	int					maxDrawBuffers	= 0x1234;
6113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGenTextures			(1, &texture);
6133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindTexture			(GL_TEXTURE_2D, texture);
6143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glTexImage2D			(GL_TEXTURE_2D, 0, GL_RGBA32F, 32, 32, 0, GL_RGBA, GL_FLOAT, NULL);
6153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGenFramebuffers		(1, &fbo);
6163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindFramebuffer		(GL_FRAMEBUFFER, fbo);
6173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glFramebufferTexture2D	(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
6183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
6193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_NO_ERROR);
6203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
621fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.beginSection("GL_INVALID_ENUM is generated if buffer is not GL_COLOR or GL_DEPTH.");
622fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glClearBufferfv			(-1, 0, &data[0]);
623fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError				(GL_INVALID_ENUM);
624fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glClearBufferfv			(GL_FRAMEBUFFER, 0, &data[0]);
625fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError				(GL_INVALID_ENUM);
6263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
6273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
628fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.beginSection("GL_INVALID_ENUM is generated if buffer is GL_STENCIL or GL_DEPTH_STENCIL.");
629fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glClearBufferfv			(GL_STENCIL, 1, &data[0]);
630fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError				(GL_INVALID_ENUM);
631fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glClearBufferfv			(GL_DEPTH_STENCIL, 1, &data[0]);
632fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError				(GL_INVALID_ENUM);
6333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
6343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
635fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.beginSection("GL_INVALID_VALUE is generated if buffer is GL_COLOR and drawBuffer is greater than or equal to GL_MAX_DRAW_BUFFERS.");
636fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glGetIntegerv			(GL_MAX_DRAW_BUFFERS, &maxDrawBuffers);
637fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glClearBufferfv			(GL_COLOR, maxDrawBuffers, &data[0]);
638fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError				(GL_INVALID_VALUE);
639fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.endSection();
640fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
641fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.beginSection("GL_INVALID_VALUE is generated if buffer is GL_COLOR and drawBuffer is negative.");
642fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glClearBufferfv			(GL_COLOR, -1, &data[0]);
643fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError				(GL_INVALID_VALUE);
6443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
6453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_VALUE is generated if buffer is GL_DEPTH and drawBuffer is not zero.");
647fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glClearBufferfv			(GL_DEPTH, 1, &data[0]);
648fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError				(GL_INVALID_VALUE);
6493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
6503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
651fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glDeleteFramebuffers	(1, &fbo);
652fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glDeleteTextures		(1, &texture);
6533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
6543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6553c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid clear_bufferfi (NegativeTestContext& ctx)
6563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
6573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_ENUM is generated if buffer is not GL_DEPTH_STENCIL.");
658fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glClearBufferfi		(-1, 0, 1.0f, 1);
659fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError			(GL_INVALID_ENUM);
660fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glClearBufferfi		(GL_FRAMEBUFFER, 0, 1.0f, 1);
661fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError			(GL_INVALID_ENUM);
662fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glClearBufferfi		(GL_DEPTH, 0, 1.0f, 1);
663fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError			(GL_INVALID_ENUM);
664fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glClearBufferfi		(GL_STENCIL, 0, 1.0f, 1);
665fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError			(GL_INVALID_ENUM);
666fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glClearBufferfi		(GL_COLOR, 0, 1.0f, 1);
667fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError			(GL_INVALID_ENUM);
6683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
6693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_VALUE is generated if buffer is GL_DEPTH_STENCIL and drawBuffer is not zero.");
671fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glClearBufferfi		(GL_DEPTH_STENCIL, 1, 1.0f, 1);
672fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError			(GL_INVALID_VALUE);
6733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
6743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
6753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6763c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid copy_buffer_sub_data (NegativeTestContext& ctx)
6773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
6783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32				buf[2];
679fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	std::vector<float>		data	(32*32);
6803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGenBuffers			(2, buf);
6823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindBuffer			(GL_COPY_READ_BUFFER, buf[0]);
6833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBufferData			(GL_COPY_READ_BUFFER, 32, &data[0], GL_DYNAMIC_COPY);
6843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindBuffer			(GL_COPY_WRITE_BUFFER, buf[1]);
6853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBufferData			(GL_COPY_WRITE_BUFFER, 32, &data[0], GL_DYNAMIC_COPY);
6863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_NO_ERROR);
6873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_VALUE is generated if any of readoffset, writeoffset or size is negative.");
6893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glCopyBufferSubData		(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, -4);
6903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_VALUE);
6913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glCopyBufferSubData		(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, -1, 0, 4);
6923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_VALUE);
6933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glCopyBufferSubData		(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, -1, 4);
6943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_VALUE);
6953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
6963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_VALUE is generated if readoffset + size exceeds the size of the buffer object bound to readtarget.");
6983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glCopyBufferSubData		(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, 36);
6993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_VALUE);
7003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glCopyBufferSubData		(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 24, 0, 16);
7013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_VALUE);
7023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glCopyBufferSubData		(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 36, 0, 4);
7033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_VALUE);
7043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
7053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_VALUE is generated if writeoffset + size exceeds the size of the buffer object bound to writetarget.");
7073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glCopyBufferSubData		(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, 36);
7083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_VALUE);
7093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glCopyBufferSubData		(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 24, 16);
7103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_VALUE);
7113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glCopyBufferSubData		(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 36, 4);
7123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_VALUE);
7133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
7143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_VALUE is generated if the same buffer object is bound to both readtarget and writetarget and the ranges [readoffset, readoffset + size) and [writeoffset, writeoffset + size) overlap.");
7163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindBuffer			(GL_COPY_WRITE_BUFFER, buf[0]);
7173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glCopyBufferSubData		(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 16, 4);
7183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_NO_ERROR);
7193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glCopyBufferSubData		(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, 4);
7203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_VALUE);
7213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glCopyBufferSubData		(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 16, 18);
7223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_VALUE);
7233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindBuffer			(GL_COPY_WRITE_BUFFER, buf[1]);
7243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
7253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_OPERATION is generated if zero is bound to readtarget or writetarget.");
7273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindBuffer			(GL_COPY_READ_BUFFER, 0);
7283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glCopyBufferSubData		(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, 16);
7293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_OPERATION);
7303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindBuffer			(GL_COPY_READ_BUFFER, buf[0]);
7323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindBuffer			(GL_COPY_WRITE_BUFFER, 0);
7333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glCopyBufferSubData		(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, 16);
7343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_OPERATION);
7353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindBuffer			(GL_COPY_WRITE_BUFFER, buf[1]);
7373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
7383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_OPERATION is generated if the buffer object bound to either readtarget or writetarget is mapped.");
7403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glMapBufferRange		(GL_COPY_READ_BUFFER, 0, 4, GL_MAP_READ_BIT);
7413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glCopyBufferSubData		(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, 16);
7423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_OPERATION);
7433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glUnmapBuffer			(GL_COPY_READ_BUFFER);
7443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glMapBufferRange		(GL_COPY_WRITE_BUFFER, 0, 4, GL_MAP_READ_BIT);
7463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glCopyBufferSubData		(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, 16);
7473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_OPERATION);
7483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glUnmapBuffer			(GL_COPY_WRITE_BUFFER);
7493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
7503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glDeleteBuffers(2, buf);
7523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
7533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7543c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid draw_buffers (NegativeTestContext& ctx)
7553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
756653ad0e8a4209754304cbd5b5ceb4fdc7b29c01aPyry Haulos	deUint32				fbo						= 0x1234;
757653ad0e8a4209754304cbd5b5ceb4fdc7b29c01aPyry Haulos	deUint32				texture					= 0x1234;
758653ad0e8a4209754304cbd5b5ceb4fdc7b29c01aPyry Haulos	int						maxDrawBuffers			= 0x1234;
759fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	int						maxColorAttachments		= -1;
760fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glGetIntegerv		(GL_MAX_COLOR_ATTACHMENTS, &maxColorAttachments);
7613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGetIntegerv		(GL_MAX_DRAW_BUFFERS, &maxDrawBuffers);
762fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	std::vector<deUint32>	values					(maxDrawBuffers+1);
763fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	std::vector<deUint32>	attachments				(4);
764fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	std::vector<GLfloat>	data					(32*32);
7653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	values[0]				= GL_NONE;
7663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	values[1]				= GL_BACK;
7673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	values[2]				= GL_COLOR_ATTACHMENT0;
7683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	values[3]				= GL_DEPTH_ATTACHMENT;
769fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	attachments[0]			= (glw::GLenum) (GL_COLOR_ATTACHMENT0 + maxColorAttachments);
770fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	attachments[1]			= GL_COLOR_ATTACHMENT0;
771fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	attachments[2]			= GL_COLOR_ATTACHMENT1;
772fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	attachments[3]			= GL_NONE;
7733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGenTextures			(1, &texture);
7753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindTexture			(GL_TEXTURE_2D, texture);
7763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glTexImage2D			(GL_TEXTURE_2D, 0, GL_RGBA8, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
7773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGenFramebuffers		(1, &fbo);
7783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindFramebuffer		(GL_FRAMEBUFFER, fbo);
7793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glFramebufferTexture2D	(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
7803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
7813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_NO_ERROR);
7823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_ENUM is generated if one of the values in bufs is not an accepted value.");
7843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glDrawBuffers			(2, &values[2]);
7853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_ENUM);
7863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
7873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
788fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.beginSection("GL_INVALID_OPERATION is generated if the GL is bound to a draw framebuffer and DrawBuffers is supplied with BACK or COLOR_ATTACHMENTm where m is greater than or equal to the value of MAX_COLOR_ATTACHMENTS.");
789fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glBindFramebuffer		(GL_FRAMEBUFFER, fbo);
790fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glDrawBuffers			(1, &values[1]);
791fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError				(GL_INVALID_OPERATION);
792fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glDrawBuffers			(4, &attachments[0]);
793fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError				(GL_INVALID_OPERATION);
794fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.endSection();
795fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
7963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_OPERATION is generated if the GL is bound to the default framebuffer and n is not 1.");
7973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindFramebuffer		(GL_FRAMEBUFFER, 0);
7983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glDrawBuffers			(2, &values[0]);
7993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_OPERATION);
8003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
8013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_OPERATION is generated if the GL is bound to the default framebuffer and the value in bufs is one of the GL_COLOR_ATTACHMENTn tokens.");
8033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindFramebuffer		(GL_FRAMEBUFFER, 0);
8043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glDrawBuffers			(1, &values[2]);
8053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_OPERATION);
8063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
8073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_OPERATION is generated if the GL is bound to a framebuffer object and the ith buffer listed in bufs is anything other than GL_NONE or GL_COLOR_ATTACHMENTSi.");
8093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindFramebuffer		(GL_FRAMEBUFFER, fbo);
8103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glDrawBuffers			(1, &values[1]);
8113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_OPERATION);
812fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glDrawBuffers			(4, &attachments[0]);
813fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError				(GL_INVALID_OPERATION);
814fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
8153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
8163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_VALUE is generated if n is less than 0 or greater than GL_MAX_DRAW_BUFFERS.");
8183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glDrawBuffers			(-1, &values[1]);
8193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_VALUE);
8203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glDrawBuffers			(maxDrawBuffers+1, &values[0]);
8213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_VALUE);
8223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
8233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glDeleteTextures(1, &texture);
8253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glDeleteFramebuffers(1, &fbo);
8263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
8273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8283c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid flush_mapped_buffer_range (NegativeTestContext& ctx)
8293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
830fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	deUint32				buf		= 0x1234;
831fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	std::vector<GLfloat>	data	(32);
8323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGenBuffers			(1, &buf);
8343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindBuffer			(GL_ARRAY_BUFFER, buf);
8353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBufferData			(GL_ARRAY_BUFFER, 32, &data[0], GL_STATIC_READ);
8363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glMapBufferRange		(GL_ARRAY_BUFFER, 0, 16, GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT);
8373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_NO_ERROR);
8383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
839fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.beginSection("GL_INVALID_ENUM is generated if target is not one of the accepted values.");
840fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glFlushMappedBufferRange(-1, 0, 16);
841fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError				(GL_INVALID_ENUM);
842fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.endSection();
843fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
8443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_VALUE is generated if offset or length is negative, or if offset + length exceeds the size of the mapping.");
8453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glFlushMappedBufferRange(GL_ARRAY_BUFFER, -1, 1);
8463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_VALUE);
8473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glFlushMappedBufferRange(GL_ARRAY_BUFFER, 0, -1);
8483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_VALUE);
8493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glFlushMappedBufferRange(GL_ARRAY_BUFFER, 12, 8);
8503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_VALUE);
8513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glFlushMappedBufferRange(GL_ARRAY_BUFFER, 24, 4);
8523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_VALUE);
8533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glFlushMappedBufferRange(GL_ARRAY_BUFFER, 0, 24);
8543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_VALUE);
8553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
8563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_OPERATION is generated if zero is bound to target.");
8583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindBuffer			(GL_ARRAY_BUFFER, 0);
8593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glFlushMappedBufferRange(GL_ARRAY_BUFFER, 0, 8);
8603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_OPERATION);
8613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
8623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_OPERATION is generated if the buffer bound to target is not mapped, or is mapped without the GL_MAP_FLUSH_EXPLICIT flag.");
8643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindBuffer			(GL_ARRAY_BUFFER, buf);
8653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glUnmapBuffer			(GL_ARRAY_BUFFER);
8663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glFlushMappedBufferRange(GL_ARRAY_BUFFER, 0, 8);
8673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_OPERATION);
8683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glMapBufferRange		(GL_ARRAY_BUFFER, 0, 16, GL_MAP_WRITE_BIT);
8693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glFlushMappedBufferRange(GL_ARRAY_BUFFER, 0, 8);
8703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_OPERATION);
8713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
8723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glUnmapBuffer			(GL_ARRAY_BUFFER);
8743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glDeleteBuffers			(1, &buf);
8753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
8763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8773c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid map_buffer_range (NegativeTestContext& ctx)
8783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
879fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	deUint32				buf		= 0x1234;
880fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	std::vector<GLfloat>	data	(32);
8813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGenBuffers			(1, &buf);
8833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindBuffer			(GL_ARRAY_BUFFER, buf);
8843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBufferData			(GL_ARRAY_BUFFER, 32, &data[0], GL_DYNAMIC_COPY);
8853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_NO_ERROR);
8863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_VALUE is generated if either of offset or length is negative.");
8883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glMapBufferRange		(GL_ARRAY_BUFFER, -1, 1, GL_MAP_READ_BIT);
8893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_VALUE);
8903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glMapBufferRange		(GL_ARRAY_BUFFER, 1, -1, GL_MAP_READ_BIT);
8923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_VALUE);
8933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
8943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_VALUE is generated if offset + length is greater than the value of GL_BUFFER_SIZE.");
8963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glMapBufferRange		(GL_ARRAY_BUFFER, 0, 33, GL_MAP_READ_BIT);
8973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_VALUE);
8983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glMapBufferRange		(GL_ARRAY_BUFFER, 32, 1, GL_MAP_READ_BIT);
9003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_VALUE);
9013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glMapBufferRange		(GL_ARRAY_BUFFER, 16, 17, GL_MAP_READ_BIT);
9033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_VALUE);
9043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
9053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_VALUE is generated if access has any bits set other than those accepted.");
9073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glMapBufferRange		(GL_ARRAY_BUFFER, 0, 16, GL_MAP_READ_BIT | 0x1000);
9083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_VALUE);
9093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glMapBufferRange		(GL_ARRAY_BUFFER, 0, 16, GL_MAP_WRITE_BIT | 0x1000);
9113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_VALUE);
9123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
9133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_OPERATION is generated if the buffer is already in a mapped state.");
9153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glMapBufferRange		(GL_ARRAY_BUFFER, 0, 16, GL_MAP_WRITE_BIT);
9163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_NO_ERROR);
9173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glMapBufferRange		(GL_ARRAY_BUFFER, 16, 8, GL_MAP_READ_BIT);
9183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_OPERATION);
9193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glUnmapBuffer			(GL_ARRAY_BUFFER);
9203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
9213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_OPERATION is generated if neither GL_MAP_READ_BIT or GL_MAP_WRITE_BIT is set.");
9233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glMapBufferRange		(GL_ARRAY_BUFFER, 0, 16, GL_MAP_INVALIDATE_RANGE_BIT);
9243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_OPERATION);
9253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
9263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
927fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.beginSection("GL_INVALID_OPERATION is generated if length is 0");
928fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glMapBufferRange		(GL_ARRAY_BUFFER, 0, 0, GL_MAP_READ_BIT);
9293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_OPERATION);
9303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
9313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_OPERATION is generated if GL_MAP_READ_BIT is set and any of GL_MAP_INVALIDATE_RANGE_BIT, GL_MAP_INVALIDATE_BUFFER_BIT, or GL_MAP_UNSYNCHRONIZED_BIT is set.");
9333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glMapBufferRange		(GL_ARRAY_BUFFER, 0, 16, GL_MAP_READ_BIT | GL_MAP_INVALIDATE_RANGE_BIT);
9343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_OPERATION);
9353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glMapBufferRange		(GL_ARRAY_BUFFER, 0, 16, GL_MAP_READ_BIT | GL_MAP_INVALIDATE_BUFFER_BIT);
9373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_OPERATION);
9383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glMapBufferRange		(GL_ARRAY_BUFFER, 0, 16, GL_MAP_READ_BIT | GL_MAP_UNSYNCHRONIZED_BIT);
9403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_OPERATION);
9413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
9423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_OPERATION is generated if GL_MAP_FLUSH_EXPLICIT_BIT is set and GL_MAP_WRITE_BIT is not set.");
9443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glMapBufferRange		(GL_ARRAY_BUFFER, 0, 16, GL_MAP_READ_BIT | GL_MAP_FLUSH_EXPLICIT_BIT);
9453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_OPERATION);
9463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
9473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glDeleteBuffers			(1, &buf);
9493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
9503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9513c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid read_buffer (NegativeTestContext& ctx)
9523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
953f9825aec0f63f29d4029b71206b9cdd66d1dd737Pyry Haulos	deUint32	fbo					= 0x1234;
954f9825aec0f63f29d4029b71206b9cdd66d1dd737Pyry Haulos	deUint32	texture				= 0x1234;
955f9825aec0f63f29d4029b71206b9cdd66d1dd737Pyry Haulos	int			maxColorAttachments	= 0x1234;
9563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGetIntegerv			(GL_MAX_COLOR_ATTACHMENTS, &maxColorAttachments);
9583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGenTextures			(1, &texture);
9593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindTexture			(GL_TEXTURE_2D, texture);
9603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glTexImage2D			(GL_TEXTURE_2D, 0, GL_RGBA8, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
9613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGenFramebuffers		(1, &fbo);
9623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindFramebuffer		(GL_FRAMEBUFFER, fbo);
9633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glFramebufferTexture2D	(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
9643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glCheckFramebufferStatus(GL_FRAMEBUFFER);
9653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_NO_ERROR);
9663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
967f9825aec0f63f29d4029b71206b9cdd66d1dd737Pyry Haulos	ctx.beginSection("GL_INVALID_ENUM is generated if mode is not GL_BACK, GL_NONE, or GL_COLOR_ATTACHMENTi.");
968f9825aec0f63f29d4029b71206b9cdd66d1dd737Pyry Haulos	ctx.glReadBuffer			(GL_NONE);
969f9825aec0f63f29d4029b71206b9cdd66d1dd737Pyry Haulos	ctx.expectError				(GL_NO_ERROR);
970f9825aec0f63f29d4029b71206b9cdd66d1dd737Pyry Haulos	ctx.glReadBuffer			(1);
9713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_ENUM);
9723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glReadBuffer			(GL_FRAMEBUFFER);
9733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_ENUM);
974f9825aec0f63f29d4029b71206b9cdd66d1dd737Pyry Haulos	ctx.glReadBuffer			(GL_COLOR_ATTACHMENT0 - 1);
975f9825aec0f63f29d4029b71206b9cdd66d1dd737Pyry Haulos	ctx.expectError				(GL_INVALID_ENUM);
976f9825aec0f63f29d4029b71206b9cdd66d1dd737Pyry Haulos	ctx.glReadBuffer			(GL_FRONT);
977f9825aec0f63f29d4029b71206b9cdd66d1dd737Pyry Haulos	ctx.expectError				(GL_INVALID_ENUM);
978f9825aec0f63f29d4029b71206b9cdd66d1dd737Pyry Haulos
979f9825aec0f63f29d4029b71206b9cdd66d1dd737Pyry Haulos	// \ note Spec isn't actually clear here, but it is safe to assume that
980f9825aec0f63f29d4029b71206b9cdd66d1dd737Pyry Haulos	//		  GL_DEPTH_ATTACHMENT can't be interpreted as GL_COLOR_ATTACHMENTm
981f9825aec0f63f29d4029b71206b9cdd66d1dd737Pyry Haulos	//		  where m = (GL_DEPTH_ATTACHMENT - GL_COLOR_ATTACHMENT0).
982f9825aec0f63f29d4029b71206b9cdd66d1dd737Pyry Haulos	ctx.glReadBuffer			(GL_DEPTH_ATTACHMENT);
983f9825aec0f63f29d4029b71206b9cdd66d1dd737Pyry Haulos	ctx.expectError				(GL_INVALID_ENUM);
984f9825aec0f63f29d4029b71206b9cdd66d1dd737Pyry Haulos	ctx.glReadBuffer			(GL_STENCIL_ATTACHMENT);
985f9825aec0f63f29d4029b71206b9cdd66d1dd737Pyry Haulos	ctx.expectError				(GL_INVALID_ENUM);
986f9825aec0f63f29d4029b71206b9cdd66d1dd737Pyry Haulos	ctx.glReadBuffer			(GL_STENCIL_ATTACHMENT+1);
987f9825aec0f63f29d4029b71206b9cdd66d1dd737Pyry Haulos	ctx.expectError				(GL_INVALID_ENUM);
988f9825aec0f63f29d4029b71206b9cdd66d1dd737Pyry Haulos	ctx.glReadBuffer			(0xffffffffu);
9893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_ENUM);
9903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
991f9825aec0f63f29d4029b71206b9cdd66d1dd737Pyry Haulos
992f9825aec0f63f29d4029b71206b9cdd66d1dd737Pyry Haulos	ctx.beginSection("GL_INVALID_OPERATION error is generated if src is GL_BACK or if src is GL_COLOR_ATTACHMENTm where m is greater than or equal to the value of GL_MAX_COLOR_ATTACHMENTS.");
993f9825aec0f63f29d4029b71206b9cdd66d1dd737Pyry Haulos	ctx.glReadBuffer			(GL_BACK);
994f9825aec0f63f29d4029b71206b9cdd66d1dd737Pyry Haulos	ctx.expectError				(GL_INVALID_OPERATION);
995f9825aec0f63f29d4029b71206b9cdd66d1dd737Pyry Haulos	ctx.glReadBuffer			(GL_COLOR_ATTACHMENT0 + maxColorAttachments);
996f9825aec0f63f29d4029b71206b9cdd66d1dd737Pyry Haulos	ctx.expectError				(GL_INVALID_OPERATION);
997f9825aec0f63f29d4029b71206b9cdd66d1dd737Pyry Haulos
998f9825aec0f63f29d4029b71206b9cdd66d1dd737Pyry Haulos	if (GL_COLOR_ATTACHMENT0+maxColorAttachments < GL_DEPTH_ATTACHMENT-1)
999f9825aec0f63f29d4029b71206b9cdd66d1dd737Pyry Haulos	{
1000f9825aec0f63f29d4029b71206b9cdd66d1dd737Pyry Haulos		ctx.glReadBuffer			(GL_DEPTH_ATTACHMENT - 1);
1001f9825aec0f63f29d4029b71206b9cdd66d1dd737Pyry Haulos		ctx.expectError				(GL_INVALID_OPERATION);
1002f9825aec0f63f29d4029b71206b9cdd66d1dd737Pyry Haulos	}
1003f9825aec0f63f29d4029b71206b9cdd66d1dd737Pyry Haulos
1004f9825aec0f63f29d4029b71206b9cdd66d1dd737Pyry Haulos	ctx.endSection();
10053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_OPERATION is generated if the current framebuffer is the default framebuffer and mode is not GL_NONE or GL_BACK.");
10073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindFramebuffer		(GL_FRAMEBUFFER, 0);
10083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glReadBuffer			(GL_COLOR_ATTACHMENT0);
10093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_OPERATION);
10103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
10113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_OPERATION is generated if the current framebuffer is a named framebuffer and mode is not GL_NONE or GL_COLOR_ATTACHMENTi.");
10133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindFramebuffer		(GL_FRAMEBUFFER, fbo);
10143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glReadBuffer			(GL_BACK);
10153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_OPERATION);
10163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
10173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glDeleteTextures(1, &texture);
10193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glDeleteFramebuffers(1, &fbo);
10203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
10213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10223c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid unmap_buffer (NegativeTestContext& ctx)
10233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1024fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	deUint32				buf		= 0x1234;
1025fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	std::vector<GLfloat>	data	(32);
10263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGenBuffers			(1, &buf);
10283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindBuffer			(GL_ARRAY_BUFFER, buf);
10293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBufferData			(GL_ARRAY_BUFFER, 32, &data[0], GL_DYNAMIC_COPY);
10303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_NO_ERROR);
10313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_OPERATION is generated if the buffer data store is already in an unmapped state.");
10333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glUnmapBuffer			(GL_ARRAY_BUFFER);
10343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_OPERATION);
10353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
10363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glDeleteBuffers			(1, &buf);
10383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
10393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// Framebuffer Objects
10403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10413c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid bind_framebuffer (NegativeTestContext& ctx)
10423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1043fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.beginSection("GL_INVALID_ENUM is generated if target is not GL_DRAW_FRAMEBUFFER, GL_READ_FRAMEBUFFER, or GL_FRAMEBUFFER.");
10443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindFramebuffer(-1, 0);
10453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_ENUM);
10463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindFramebuffer(GL_RENDERBUFFER, 0);
10473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_ENUM);
10483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
10493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
10503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10513c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid bind_renderbuffer (NegativeTestContext& ctx)
10523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
10533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_ENUM is generated if target is not GL_RENDERBUFFER.");
10543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindRenderbuffer(-1, 0);
10553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_ENUM);
10563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindRenderbuffer(GL_FRAMEBUFFER, 0);
10573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_ENUM);
10583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
10593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
10603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10613c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid check_framebuffer_status (NegativeTestContext& ctx)
10623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1063fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.beginSection("GL_INVALID_ENUM is generated if target is not GL_DRAW_FRAMEBUFFER, GL_READ_FRAMEBUFFER, or GL_FRAMEBUFFER..");
10643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glCheckFramebufferStatus(-1);
10653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_ENUM);
10663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glCheckFramebufferStatus(GL_RENDERBUFFER);
10673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_ENUM);
10683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
10693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
10703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10713c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid gen_framebuffers (NegativeTestContext& ctx)
10723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
10733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_VALUE is generated if n is negative.");
10743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGenFramebuffers(-1, 0);
10753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_VALUE);
10763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
10773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
10783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10793c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid gen_renderbuffers (NegativeTestContext& ctx)
10803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
10813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_VALUE is generated if n is negative.");
10823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGenRenderbuffers(-1, 0);
10833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_VALUE);
10843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
10853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
10863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10873c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid delete_framebuffers (NegativeTestContext& ctx)
10883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
10893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_VALUE is generated if n is negative.");
10903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glDeleteFramebuffers(-1, 0);
10913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_VALUE);
10923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
10933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
10943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10953c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid delete_renderbuffers (NegativeTestContext& ctx)
10963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{;
10973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_VALUE is generated if n is negative.");
10983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glDeleteRenderbuffers(-1, 0);
10993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_VALUE);
11003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
11013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
11023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11033c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid framebuffer_renderbuffer (NegativeTestContext& ctx)
11043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
11053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLuint fbo = 0x1234;
11063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLuint rbo = 0x1234;
11073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGenFramebuffers(1, &fbo);
11083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
11093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGenRenderbuffers(1, &rbo);
11103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_ENUM is generated if target is not one of the accepted tokens.");
11123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glFramebufferRenderbuffer(-1, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, 0);
11133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_ENUM);
11143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
11153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1116fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.beginSection("GL_INVALID_ENUM is generated if attachment is not one of the accepted tokens.");
1117fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glFramebufferRenderbuffer(GL_FRAMEBUFFER, -1, GL_RENDERBUFFER, 0);
1118fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError(GL_INVALID_ENUM);
1119fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.endSection();
1120fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
11213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_ENUM is generated if renderbuffertarget is not GL_RENDERBUFFER.");
11223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindRenderbuffer(GL_RENDERBUFFER, rbo);
11233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, -1, rbo);
11243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_ENUM);
11253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindRenderbuffer(GL_RENDERBUFFER, 0);
11263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
11273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_OPERATION is generated if renderbuffer is neither 0 nor the name of an existing renderbuffer object.");
11293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, -1);
11303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_OPERATION);
11313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
11323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_OPERATION is generated if zero is bound to target.");
11343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
11353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, 0);
11363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_OPERATION);
11373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
11383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glDeleteRenderbuffers(1, &rbo);
11403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glDeleteFramebuffers(1, &fbo);
11413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
11423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1143fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulosvoid framebuffer_texture (NegativeTestContext& ctx)
1144fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos{
1145fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)))
1146fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	{
1147fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		GLuint fbo = 0x1234;
1148fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		GLuint texture[] = {0x1234, 0x1234};
1149fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
1150fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glGenFramebuffers(1, &fbo);
1151fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
1152fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glGenTextures(2, texture);
1153fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glBindTexture(GL_TEXTURE_2D, texture[0]);
1154fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glBindTexture(GL_TEXTURE_BUFFER, texture[1]);
1155fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.expectError(GL_NO_ERROR);
1156fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
1157fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.beginSection("GL_INVALID_ENUM is generated if target is not one of the accepted tokens.");
1158fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glFramebufferTexture(-1, GL_COLOR_ATTACHMENT0, texture[0], 0);
1159fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.expectError(GL_INVALID_ENUM);
1160fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.endSection();
1161fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
1162fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.beginSection("GL_INVALID_ENUM is generated if attachment is not one of the accepted tokens.");
1163fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glFramebufferTexture(GL_FRAMEBUFFER, -1, texture[0], 0);
1164fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.expectError(GL_INVALID_ENUM);
1165fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.endSection();
1166fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
1167fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.beginSection("GL_INVALID_OPERATION is generated if texture is neither 0 nor the name of an existing texture object.");
1168fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, -1, 0);
1169fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.expectError(GL_INVALID_VALUE);
1170fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.endSection();
1171fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
1172fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.beginSection("GL_INVALID_OPERATION is generated if zero is bound to target.");
1173fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
1174fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, 0, 0);
1175fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.expectError(GL_INVALID_OPERATION);
1176fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
1177fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.endSection();
1178fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
1179fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.beginSection("GL_INVALID_OPERATION is generated by if texture is a buffer texture.");
1180fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texture[1], 0);
1181fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.expectError(GL_INVALID_OPERATION);
1182fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.endSection();
1183fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
1184fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glDeleteFramebuffers(1, &fbo);
1185fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glDeleteBuffers(2, texture);
1186fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	}
1187fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos}
1188fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
11893c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid framebuffer_texture2d (NegativeTestContext& ctx)
11903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1191fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	GLuint	fbo				= 0x1234;
1192fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	GLuint	tex2D			= 0x1234;
1193fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	GLuint	texCube			= 0x1234;
1194fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	GLuint	tex2DMS			= 0x1234;
1195fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	GLint	maxTexSize		= 0x1234;
1196fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	GLint	maxTexCubeSize	= 0x1234;
1197fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	int		maxSize			= 0x1234;
11983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGenFramebuffers(1, &fbo);
12003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
12013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGenTextures(1, &tex2D);
12023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindTexture(GL_TEXTURE_2D, tex2D);
12033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGenTextures(1, &texCube);
12043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindTexture(GL_TEXTURE_CUBE_MAP, texCube);
1205fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glGenTextures(1, &tex2DMS);
1206fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, tex2DMS);
12073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTexSize);
12083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGetIntegerv(GL_MAX_CUBE_MAP_TEXTURE_SIZE, &maxTexCubeSize);
12093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_NO_ERROR);
12103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_ENUM is generated if target is not one of the accepted tokens.");
12123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glFramebufferTexture2D(-1, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0);
12133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_ENUM);
12143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
12153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_ENUM is generated if textarget is not an accepted texture target.");
12173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, -1, tex2D, 0);
12183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_ENUM);
12193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
12203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1221fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.beginSection("GL_INVALID_ENUM is generated if attachment is not an accepted token.");
1222fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glFramebufferTexture2D(GL_FRAMEBUFFER, -1, GL_TEXTURE_2D, tex2D, 0);
1223fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError(GL_INVALID_ENUM);
1224fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.endSection();
1225fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
12263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_VALUE is generated if level is less than 0 or larger than log_2 of maximum texture size.");
12273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex2D, -1);
12283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_VALUE);
12293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	maxSize = deLog2Floor32(maxTexSize) + 1;
12303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex2D, maxSize);
12313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_VALUE);
12323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	maxSize = deLog2Floor32(maxTexSize) + 1;
12333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X, texCube, maxSize);
12343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_VALUE);
12353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
12363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1237fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.beginSection("GL_INVALID_VALUE is generated if level is larger than maximum texture size.");
1238fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex2D, maxTexSize + 1);
1239fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError(GL_INVALID_VALUE);
1240fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex2D, -1);
1241fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError(GL_INVALID_VALUE);
1242fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_Z, texCube, maxTexCubeSize + 1);
1243fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError(GL_INVALID_VALUE);
1244fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_Z, texCube, -1);
1245fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError(GL_INVALID_VALUE);
1246b15ba11e484691c847c7de59af5b86a57b7e4e5dMika Isojärvi	ctx.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, tex2DMS, 1);
1247fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError(GL_INVALID_VALUE);
1248fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.endSection();
1249fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
12503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_OPERATION is generated if texture is neither 0 nor the name of an existing texture object.");
12513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, -1, 0);
12523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_OPERATION);
12533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
12543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_OPERATION is generated if textarget and texture are not compatible.");
12563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X, tex2D, 0);
12573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_OPERATION);
1258fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, tex2D, 0);
1259fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError(GL_INVALID_OPERATION);
12603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texCube, 0);
12613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_OPERATION);
1262fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex2DMS, 0);
1263fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError(GL_INVALID_OPERATION);
1264fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glDeleteTextures(1, &tex2D);
12653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glDeleteTextures(1, &texCube);
1266fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glDeleteTextures(1, &tex2DMS);
12673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
12683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_OPERATION is generated if zero is bound to target.");
12703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindFramebuffer(GL_FRAMEBUFFER, 0);
12713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0);
12723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError(GL_INVALID_OPERATION);
12733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
12743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1275fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)))
1276fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	{
1277fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		GLuint texBuf = 0x1234;
1278fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.beginSection("GL_INVALID_OPERATION error is generated if texture is the name of a buffer texture.");
1279fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glGenTextures(1, &texBuf);
1280fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glBindTexture(GL_TEXTURE_BUFFER, texBuf);
1281fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
1282fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.expectError(GL_NO_ERROR);
1283fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texBuf, 0);
1284fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.expectError(GL_INVALID_OPERATION);
1285fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.endSection();
1286fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	}
1287fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
12883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glDeleteFramebuffers(1, &fbo);
12893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
12903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12913c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid renderbuffer_storage (NegativeTestContext& ctx)
12923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1293fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	deUint32	rbo		= 0x1234;
1294fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	GLint		maxSize	= 0x1234;
1295fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
12963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGenRenderbuffers		(1, &rbo);
12973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindRenderbuffer		(GL_RENDERBUFFER, rbo);
12983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_ENUM is generated if target is not GL_RENDERBUFFER.");
13003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glRenderbufferStorage	(-1, GL_RGBA4, 1, 1);
13013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_ENUM);
13023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glRenderbufferStorage	(GL_FRAMEBUFFER, GL_RGBA4, 1, 1);
13033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_ENUM);
13043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
13053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_ENUM is generated if internalformat is not a color-renderable, depth-renderable, or stencil-renderable format.");
13073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glRenderbufferStorage	(GL_RENDERBUFFER, -1, 1, 1);
13083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_ENUM);
1309271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry
1310fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	if (!ctx.isExtensionSupported("GL_EXT_color_buffer_half_float")) // GL_EXT_color_buffer_half_float disables error
1311271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry	{
1312271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry		ctx.glRenderbufferStorage	(GL_RENDERBUFFER, GL_RGB16F, 1, 1);
1313271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry		ctx.expectError				(GL_INVALID_ENUM);
1314271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry	}
1315271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry
1316fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	if (!ctx.isExtensionSupported("GL_EXT_render_snorm")) // GL_EXT_render_snorm disables error
1317531a9f5311e314348ebc7678984c852be8dd2a2bMika Isojärvi	{
1318531a9f5311e314348ebc7678984c852be8dd2a2bMika Isojärvi		ctx.glRenderbufferStorage	(GL_RENDERBUFFER, GL_RGBA8_SNORM, 1, 1);
1319531a9f5311e314348ebc7678984c852be8dd2a2bMika Isojärvi		ctx.expectError				(GL_INVALID_ENUM);
1320531a9f5311e314348ebc7678984c852be8dd2a2bMika Isojärvi	}
1321531a9f5311e314348ebc7678984c852be8dd2a2bMika Isojärvi
13223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
13233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_VALUE is generated if width or height is less than zero.");
13253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glRenderbufferStorage	(GL_RENDERBUFFER, GL_RGBA4, -1, 1);
13263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_VALUE);
13273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glRenderbufferStorage	(GL_RENDERBUFFER, GL_RGBA4, 1, -1);
13283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_VALUE);
13293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glRenderbufferStorage	(GL_RENDERBUFFER, GL_RGBA4, -1, -1);
13303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_VALUE);
13313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
13323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_VALUE is generated if width or height is greater than GL_MAX_RENDERBUFFER_SIZE.");
13343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGetIntegerv			(GL_MAX_RENDERBUFFER_SIZE, &maxSize);
13353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glRenderbufferStorage	(GL_RENDERBUFFER, GL_RGBA4, 1, maxSize+1);
13363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_VALUE);
13373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glRenderbufferStorage	(GL_RENDERBUFFER, GL_RGBA4, maxSize+1, 1);
13383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_VALUE);
13393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glRenderbufferStorage	(GL_RENDERBUFFER, GL_RGBA4, maxSize+1, maxSize+1);
13403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_VALUE);
13413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
13423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glDeleteRenderbuffers(1, &rbo);
13443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
13453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13463c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid blit_framebuffer (NegativeTestContext& ctx)
13473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
13483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32					fbo[2];
13493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32					rbo[2];
13503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32					texture[2];
1351653ad0e8a4209754304cbd5b5ceb4fdc7b29c01aPyry Haulos	deUint32					blankFrameBuffer;
13523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1353fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glGenFramebuffers		(1, &blankFrameBuffer);
13543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGenFramebuffers		(2, fbo);
13553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGenTextures			(2, texture);
13563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGenRenderbuffers		(2, rbo);
13573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindTexture			(GL_TEXTURE_2D, texture[0]);
13593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindRenderbuffer		(GL_RENDERBUFFER, rbo[0]);
13603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindFramebuffer		(GL_READ_FRAMEBUFFER, fbo[0]);
13613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glTexImage2D			(GL_TEXTURE_2D, 0, GL_RGBA8, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
13633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glRenderbufferStorage	(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 32, 32);
13643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glFramebufferTexture2D	(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture[0], 0);
13653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glFramebufferRenderbuffer(GL_READ_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo[0]);
13663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glCheckFramebufferStatus(GL_READ_FRAMEBUFFER);
13673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindTexture			(GL_TEXTURE_2D, texture[1]);
13693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindRenderbuffer		(GL_RENDERBUFFER, rbo[1]);
13703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindFramebuffer		(GL_DRAW_FRAMEBUFFER, fbo[1]);
13713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glTexImage2D			(GL_TEXTURE_2D, 0, GL_RGBA8, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
13733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glRenderbufferStorage	(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 32, 32);
13743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glFramebufferTexture2D	(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture[1], 0);
13753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo[1]);
13763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER);
13773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_NO_ERROR);
13783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1379fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.beginSection("GL_INVALID_VALUE is generated if mask contains any bits other than GL_COLOR_BUFFER_BIT, GL_DEPTH_BUFFER_BIT, or GL_STENCIL_BUFFER_BIT.");
1380fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glBlitFramebuffer		(0, 0, 16, 16, 0, 0, 16, 16, 1, GL_NEAREST);
1381fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError				(GL_INVALID_VALUE);
1382fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.endSection();
1383fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
1384fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.beginSection("GL_INVALID_ENUM is generated if filter is not GL_LINEAR or GL_NEAREST.");
1385fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glBlitFramebuffer		(0, 0, 16, 16, 0, 0, 16, 16, GL_COLOR_BUFFER_BIT, 0);
1386fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError				(GL_INVALID_ENUM);
1387fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.endSection();
1388fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
13893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_OPERATION is generated if mask contains any of the GL_DEPTH_BUFFER_BIT or GL_STENCIL_BUFFER_BIT and filter is not GL_NEAREST.");
13903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBlitFramebuffer		(0, 0, 16, 16, 0, 0, 16, 16, GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_LINEAR);
13913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_OPERATION);
13923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBlitFramebuffer		(0, 0, 16, 16, 0, 0, 16, 16, GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT, GL_LINEAR);
13933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_OPERATION);
13943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBlitFramebuffer		(0, 0, 16, 16, 0, 0, 16, 16, GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_LINEAR);
13953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_OPERATION);
13963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
13973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_OPERATION is generated if mask contains GL_COLOR_BUFFER_BIT and read buffer format is incompatible with draw buffer format.");
13993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindTexture			(GL_TEXTURE_2D, texture[0]);
14003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glTexImage2D			(GL_TEXTURE_2D, 0, GL_RGBA32UI, 32, 32, 0, GL_RGBA_INTEGER, GL_UNSIGNED_INT, NULL);
14023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glFramebufferTexture2D	(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture[0], 0);
14033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.getLog() << TestLog::Message << "// Read buffer: GL_RGBA32UI, draw buffer: GL_RGBA" << TestLog::EndMessage;
14043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBlitFramebuffer		(0, 0, 16, 16, 0, 0, 16, 16, GL_COLOR_BUFFER_BIT, GL_NEAREST);
14053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_OPERATION);
14063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glTexImage2D			(GL_TEXTURE_2D, 0, GL_RGBA32I, 32, 32, 0, GL_RGBA_INTEGER, GL_INT, NULL);
14083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glFramebufferTexture2D	(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture[0], 0);
14093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.getLog() << TestLog::Message << "// Read buffer: GL_RGBA32I, draw buffer: GL_RGBA" << TestLog::EndMessage;
14103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBlitFramebuffer		(0, 0, 16, 16, 0, 0, 16, 16, GL_COLOR_BUFFER_BIT, GL_NEAREST);
14113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_OPERATION);
14123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glTexImage2D			(GL_TEXTURE_2D, 0, GL_RGBA8, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
14143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glFramebufferTexture2D	(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture[0], 0);
14153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindTexture			(GL_TEXTURE_2D, texture[1]);
14163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glTexImage2D			(GL_TEXTURE_2D, 0, GL_RGBA32I, 32, 32, 0, GL_RGBA_INTEGER, GL_INT, NULL);
14173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glFramebufferTexture2D	(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture[1], 0);
14183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.getLog() << TestLog::Message << "// Read buffer: GL_RGBA8, draw buffer: GL_RGBA32I" << TestLog::EndMessage;
14193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBlitFramebuffer		(0, 0, 16, 16, 0, 0, 16, 16, GL_COLOR_BUFFER_BIT, GL_NEAREST);
14203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_OPERATION);
14213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
14223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_OPERATION is generated if filter is GL_LINEAR and the read buffer contains integer data.");
14243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindTexture			(GL_TEXTURE_2D, texture[0]);
14253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glTexImage2D			(GL_TEXTURE_2D, 0, GL_RGBA32UI, 32, 32, 0, GL_RGBA_INTEGER, GL_UNSIGNED_INT, NULL);
14263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glFramebufferTexture2D	(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture[0], 0);
14273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glTexImage2D			(GL_TEXTURE_2D, 0, GL_RGBA8, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
14283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glFramebufferTexture2D	(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture[1], 0);
14293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.getLog() << TestLog::Message << "// Read buffer: GL_RGBA32I, draw buffer: GL_RGBA8" << TestLog::EndMessage;
14303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBlitFramebuffer		(0, 0, 16, 16, 0, 0, 16, 16, GL_COLOR_BUFFER_BIT, GL_LINEAR);
14313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_OPERATION);
14323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
14333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_OPERATION is generated if mask contains GL_DEPTH_BUFFER_BIT or GL_STENCIL_BUFFER_BIT and the source and destination depth and stencil formats do not match.");
14353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindRenderbuffer		(GL_RENDERBUFFER, rbo[0]);
14363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glRenderbufferStorage	(GL_RENDERBUFFER, GL_DEPTH32F_STENCIL8, 32, 32);
14373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glFramebufferRenderbuffer(GL_READ_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo[0]);
14383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBlitFramebuffer		(0, 0, 16, 16, 0, 0, 16, 16, GL_DEPTH_BUFFER_BIT, GL_NEAREST);
14393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_OPERATION);
14403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBlitFramebuffer		(0, 0, 16, 16, 0, 0, 16, 16, GL_STENCIL_BUFFER_BIT, GL_NEAREST);
14413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError				(GL_INVALID_OPERATION);
14423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
14433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1444fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.beginSection("GL_INVALID_FRAMEBUFFER_OPERATION is generated if the read or draw framebuffer is not framebuffer complete.");
1445fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glCheckFramebufferStatus(GL_READ_FRAMEBUFFER);
1446fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER);
1447fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glBlitFramebuffer		(0, 0, 16, 16, 0, 0, 16, 16, 0, GL_NEAREST);
1448fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError				(GL_NO_ERROR);
1449fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.getLog() << TestLog::Message << "// incomplete read framebuffer" << TestLog::EndMessage;
1450fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glBindFramebuffer		(GL_READ_FRAMEBUFFER, blankFrameBuffer);
1451fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glBindFramebuffer		(GL_DRAW_FRAMEBUFFER, fbo[1]);
1452fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	TCU_CHECK(ctx.glCheckFramebufferStatus(GL_READ_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE);
1453fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	TCU_CHECK(ctx.glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE);
1454fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glBlitFramebuffer		(0, 0, 16, 16, 0, 0, 16, 16, 0, GL_NEAREST);
1455fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError				(GL_INVALID_FRAMEBUFFER_OPERATION);
1456fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.getLog() << TestLog::Message << "// incomplete draw framebuffer" << TestLog::EndMessage;
1457fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glBindFramebuffer		(GL_READ_FRAMEBUFFER, fbo[1]);
1458fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glBindFramebuffer		(GL_DRAW_FRAMEBUFFER, blankFrameBuffer);
1459fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	TCU_CHECK(ctx.glCheckFramebufferStatus(GL_READ_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE);
1460fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	TCU_CHECK(ctx.glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE);
1461fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glBlitFramebuffer		(0, 0, 16, 16, 0, 0, 16, 16, 0, GL_NEAREST);
1462fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError				(GL_INVALID_FRAMEBUFFER_OPERATION);
1463fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.getLog() << TestLog::Message << "// incomplete read and draw framebuffer" << TestLog::EndMessage;
1464fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glBindFramebuffer		(GL_READ_FRAMEBUFFER, blankFrameBuffer);
1465fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glBindFramebuffer		(GL_DRAW_FRAMEBUFFER, blankFrameBuffer);
1466fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	TCU_CHECK(ctx.glCheckFramebufferStatus(GL_READ_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE);
1467fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	TCU_CHECK(ctx.glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE);
1468fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glBlitFramebuffer		(0, 0, 16, 16, 0, 0, 16, 16, 0, GL_NEAREST);
1469fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError				(GL_INVALID_FRAMEBUFFER_OPERATION);
1470fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	// restore
1471fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glBindFramebuffer		(GL_READ_FRAMEBUFFER, fbo[0]);
1472fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glCheckFramebufferStatus(GL_READ_FRAMEBUFFER);
1473fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glBindFramebuffer		(GL_DRAW_FRAMEBUFFER, fbo[1]);
1474fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER);
1475fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.endSection();
1476fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
1477fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.beginSection("GL_INVALID_OPERATION is generated if the source and destination buffers are identical.");
1478fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glBindFramebuffer		(GL_DRAW_FRAMEBUFFER, fbo[0]);
1479fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError				(GL_NO_ERROR);
1480378f80d61a8ead4044df1f5f13d20ef326c3bc3bMika Isojärvi	ctx.glBlitFramebuffer		(0, 0, 16, 16, 0, 0, 16, 16, GL_DEPTH_BUFFER_BIT, GL_NEAREST);
1481fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError				(GL_INVALID_OPERATION);
1482fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	// restore
1483fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glBindFramebuffer		(GL_DRAW_FRAMEBUFFER, fbo[1]);
1484fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.endSection();
1485fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
14863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindFramebuffer		(GL_FRAMEBUFFER, 0);
1487fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glBindRenderbuffer		(GL_RENDERBUFFER, 0);
14883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glDeleteFramebuffers	(2, fbo);
1489fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glDeleteFramebuffers	(1, &blankFrameBuffer);
14903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glDeleteTextures		(2, texture);
14913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glDeleteRenderbuffers	(2, rbo);
14923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
14933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14943c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid blit_framebuffer_multisample (NegativeTestContext& ctx)
14953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
14963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32							fbo[2];
14973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32							rbo[2];
14983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGenFramebuffers				(2, fbo);
15003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGenRenderbuffers				(2, rbo);
15013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindRenderbuffer				(GL_RENDERBUFFER, rbo[0]);
15033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindFramebuffer				(GL_READ_FRAMEBUFFER, fbo[0]);
15043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_RGBA8, 32, 32);
15053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glFramebufferRenderbuffer		(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo[0]);
15063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glCheckFramebufferStatus		(GL_READ_FRAMEBUFFER);
15073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindRenderbuffer				(GL_RENDERBUFFER, rbo[1]);
15093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindFramebuffer				(GL_DRAW_FRAMEBUFFER, fbo[1]);
15103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError						(GL_NO_ERROR);
15123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1513fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	if (!ctx.isExtensionSupported("GL_NV_framebuffer_multisample"))
1514c16dedced05e6299ad5fc0d2f3ac42e23952465cMika Isojärvi	{
1515c16dedced05e6299ad5fc0d2f3ac42e23952465cMika Isojärvi		ctx.beginSection("GL_INVALID_OPERATION is generated if the value of GL_SAMPLE_BUFFERS for the draw buffer is greater than zero.");
1516c16dedced05e6299ad5fc0d2f3ac42e23952465cMika Isojärvi		ctx.glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_RGBA8, 32, 32);
1517c16dedced05e6299ad5fc0d2f3ac42e23952465cMika Isojärvi		ctx.glFramebufferRenderbuffer		(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo[1]);
1518c16dedced05e6299ad5fc0d2f3ac42e23952465cMika Isojärvi		ctx.glBlitFramebuffer				(0, 0, 16, 16, 0, 0, 16, 16, GL_COLOR_BUFFER_BIT, GL_NEAREST);
1519c16dedced05e6299ad5fc0d2f3ac42e23952465cMika Isojärvi		ctx.expectError						(GL_INVALID_OPERATION);
1520c16dedced05e6299ad5fc0d2f3ac42e23952465cMika Isojärvi		ctx.endSection();
1521c16dedced05e6299ad5fc0d2f3ac42e23952465cMika Isojärvi
1522c16dedced05e6299ad5fc0d2f3ac42e23952465cMika Isojärvi		ctx.beginSection("GL_INVALID_OPERATION is generated if GL_SAMPLE_BUFFERS for the read buffer is greater than zero and the formats of draw and read buffers are not identical.");
1523c16dedced05e6299ad5fc0d2f3ac42e23952465cMika Isojärvi		ctx.glRenderbufferStorage			(GL_RENDERBUFFER, GL_RGBA4, 32, 32);
1524c16dedced05e6299ad5fc0d2f3ac42e23952465cMika Isojärvi		ctx.glFramebufferRenderbuffer		(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo[1]);
1525c16dedced05e6299ad5fc0d2f3ac42e23952465cMika Isojärvi		ctx.glBlitFramebuffer				(0, 0, 16, 16, 0, 0, 16, 16, GL_COLOR_BUFFER_BIT, GL_NEAREST);
1526c16dedced05e6299ad5fc0d2f3ac42e23952465cMika Isojärvi		ctx.expectError						(GL_INVALID_OPERATION);
1527c16dedced05e6299ad5fc0d2f3ac42e23952465cMika Isojärvi		ctx.endSection();
1528c16dedced05e6299ad5fc0d2f3ac42e23952465cMika Isojärvi
1529c16dedced05e6299ad5fc0d2f3ac42e23952465cMika Isojärvi		ctx.beginSection("GL_INVALID_OPERATION is generated if GL_SAMPLE_BUFFERS for the read buffer is greater than zero and the source and destination rectangles are not defined with the same (X0, Y0) and (X1, Y1) bounds.");
1530c16dedced05e6299ad5fc0d2f3ac42e23952465cMika Isojärvi		ctx.glRenderbufferStorage			(GL_RENDERBUFFER, GL_RGBA8, 32, 32);
1531c16dedced05e6299ad5fc0d2f3ac42e23952465cMika Isojärvi		ctx.glFramebufferRenderbuffer		(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo[1]);
1532c16dedced05e6299ad5fc0d2f3ac42e23952465cMika Isojärvi		ctx.glBlitFramebuffer				(0, 0, 16, 16, 2, 2, 18, 18, GL_COLOR_BUFFER_BIT, GL_NEAREST);
1533c16dedced05e6299ad5fc0d2f3ac42e23952465cMika Isojärvi		ctx.expectError						(GL_INVALID_OPERATION);
1534c16dedced05e6299ad5fc0d2f3ac42e23952465cMika Isojärvi		ctx.endSection();
1535c16dedced05e6299ad5fc0d2f3ac42e23952465cMika Isojärvi	}
15363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindFramebuffer				(GL_FRAMEBUFFER, 0);
15383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glDeleteRenderbuffers			(2, rbo);
15393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glDeleteFramebuffers			(2, fbo);
15403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
15413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15423c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid framebuffer_texture_layer (NegativeTestContext& ctx)
15433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1544fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	deUint32						fbo					= 0x1234;
1545fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	deUint32						tex3D				= 0x1234;
1546fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	deUint32						tex2DArray			= 0x1234;
1547fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	deUint32						tex2D				= 0x1234;
1548fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	deUint32						tex2DMSArray		= 0x1234;
1549fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	deUint32						texBuffer			= 0x1234;
1550fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	int								max3DTexSize		= 0x1234;
1551fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	int								maxTexSize			= 0x1234;
1552fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	int								maxArrayTexLayers	= 0x1234;
155301af60e03f051fb44046f80fdf45f1ebe1ffd5a4Pyry Haulos	int								log2Max3DTexSize	= 0x1234;
155401af60e03f051fb44046f80fdf45f1ebe1ffd5a4Pyry Haulos	int								log2MaxTexSize		= 0x1234;
1555fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
1556fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glGetIntegerv				(GL_MAX_3D_TEXTURE_SIZE, &max3DTexSize);
1557fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glGetIntegerv				(GL_MAX_TEXTURE_SIZE, &maxTexSize);
1558f28187809176f5eeb1ee25ccfa70d3702d74156aKalle Raita	ctx.glGetIntegerv				(GL_MAX_ARRAY_TEXTURE_LAYERS, &maxArrayTexLayers);
15593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGenFramebuffers			(1, &fbo);
15613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGenTextures				(1, &tex3D);
15623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGenTextures				(1, &tex2DArray);
15633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGenTextures				(1, &tex2D);
15643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindFramebuffer			(GL_FRAMEBUFFER, fbo);
15653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindTexture				(GL_TEXTURE_3D, tex3D);
15673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glTexImage3D				(GL_TEXTURE_3D, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
15683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindTexture				(GL_TEXTURE_2D_ARRAY, tex2DArray);
15693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glTexImage3D				(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
15703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindTexture				(GL_TEXTURE_2D, tex2D);
15713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glTexImage2D				(GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
15723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError					(GL_NO_ERROR);
15743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_ENUM is generated if target is not one of the accepted tokens.");
15763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glFramebufferTextureLayer	(-1, GL_COLOR_ATTACHMENT0, tex3D, 0, 1);
15773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError					(GL_INVALID_ENUM);
15783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glFramebufferTextureLayer	(GL_RENDERBUFFER, GL_COLOR_ATTACHMENT0, tex3D, 0, 1);
15793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError					(GL_INVALID_ENUM);
15803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
15813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_ENUM is generated if attachment is not one of the accepted tokens.");
15833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glFramebufferTextureLayer	(GL_FRAMEBUFFER, -1, tex3D, 0, 1);
15843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError					(GL_INVALID_ENUM);
15853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glFramebufferTextureLayer	(GL_FRAMEBUFFER, GL_BACK, tex3D, 0, 1);
15863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError					(GL_INVALID_ENUM);
15873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
15883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1589fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.beginSection("GL_INVALID_OPERATION is generated if texture is non-zero and not the name of a 3D texture or 2D array texture, 2D multisample array texture or cube map array texture.");
15903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glFramebufferTextureLayer	(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, -1, 0, 0);
15913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError					(GL_INVALID_OPERATION);
15923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glFramebufferTextureLayer	(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex2D, 0, 0);
15933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError					(GL_INVALID_OPERATION);
15943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
15953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_VALUE is generated if texture is not zero and layer is negative.");
15973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glFramebufferTextureLayer	(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex3D, 0, -1);
15983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError					(GL_INVALID_VALUE);
15993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
16003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_VALUE is generated if texture is not zero and layer is greater than GL_MAX_3D_TEXTURE_SIZE-1 for a 3D texture.");
16023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glFramebufferTextureLayer	(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex3D, 0, max3DTexSize);
16033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError					(GL_INVALID_VALUE);
16043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
16053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_VALUE is generated if texture is not zero and layer is greater than GL_MAX_ARRAY_TEXTURE_LAYERS-1 for a 2D array texture.");
16073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glFramebufferTextureLayer	(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex2DArray, 0, maxArrayTexLayers);
16083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError					(GL_INVALID_VALUE);
16093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
16103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_OPERATION is generated if zero is bound to target.");
16123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindFramebuffer			(GL_FRAMEBUFFER, 0);
16133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glFramebufferTextureLayer	(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex3D, 0, 1);
16143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError					(GL_INVALID_OPERATION);
1615fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glBindFramebuffer			(GL_FRAMEBUFFER, fbo);
1616fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.endSection();
1617fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
1618fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.beginSection("GL_INVALID_VALUE is generated if texture is a 3D texture and level is less than 0 or greater than log2 of the value of GL_MAX_3D_TEXTURE_SIZE.");
1619fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	log2Max3DTexSize	= deLog2Floor32(max3DTexSize);
1620fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glFramebufferTextureLayer	(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex3D, -1, max3DTexSize - 1);
1621fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError					(GL_INVALID_VALUE);
1622fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glFramebufferTextureLayer	(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex3D, log2Max3DTexSize + 1, max3DTexSize - 1);
1623fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError					(GL_INVALID_VALUE);
16243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
16253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1626f28187809176f5eeb1ee25ccfa70d3702d74156aKalle Raita	ctx.beginSection("GL_INVALID_VALUE is generated if texture is a 2D array texture and level is less than 0 or greater than log2 of the value of GL_MAX_TEXTURE_SIZE.");
1627fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	log2MaxTexSize		= deLog2Floor32(maxTexSize);
1628fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glFramebufferTextureLayer	(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex2DArray, -1, maxArrayTexLayers - 1);
1629fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError					(GL_INVALID_VALUE);
1630fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glFramebufferTextureLayer	(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex2DArray, log2MaxTexSize + 1, maxArrayTexLayers - 1);
1631fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError					(GL_INVALID_VALUE);
1632fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.endSection();
1633fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
1634fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)))
1635fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	{
1636f28187809176f5eeb1ee25ccfa70d3702d74156aKalle Raita		deUint32						texCubeArray		= 0x1234;
1637f28187809176f5eeb1ee25ccfa70d3702d74156aKalle Raita		int								maxCubeTexSize		= 0x1234;
1638fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glGetIntegerv				(GL_MAX_CUBE_MAP_TEXTURE_SIZE, &maxCubeTexSize);
1639fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glGenTextures				(1, &tex2DMSArray);
1640f28187809176f5eeb1ee25ccfa70d3702d74156aKalle Raita		ctx.glGenTextures				(1, &texCubeArray);
1641fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glGenTextures				(1, &texBuffer);
1642fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glBindTexture				(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, tex2DMSArray);
1643f28187809176f5eeb1ee25ccfa70d3702d74156aKalle Raita		ctx.glBindTexture				(GL_TEXTURE_CUBE_MAP_ARRAY, texCubeArray);
1644fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glBindTexture				(GL_TEXTURE_BUFFER, texBuffer);
1645fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.expectError					(GL_NO_ERROR);
1646fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
1647f28187809176f5eeb1ee25ccfa70d3702d74156aKalle Raita		ctx.beginSection("GL_INVALID_VALUE is generated if texture is a 2D multisample array texture and level is not 0.");
1648f28187809176f5eeb1ee25ccfa70d3702d74156aKalle Raita		ctx.glFramebufferTextureLayer	(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex2DMSArray, -1, 0);
1649fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.expectError					(GL_INVALID_VALUE);
1650f28187809176f5eeb1ee25ccfa70d3702d74156aKalle Raita		ctx.glFramebufferTextureLayer	(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex2DMSArray, 1, 0);
1651fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.expectError					(GL_INVALID_VALUE);
1652fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.endSection();
1653fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
1654f28187809176f5eeb1ee25ccfa70d3702d74156aKalle Raita		ctx.beginSection("GL_INVALID_VALUE is generated if texture is a cube map array texture and layer is larger than MAX_ARRAY_TEXTURE_LAYERS-1. (See Khronos bug 15968)");
1655f28187809176f5eeb1ee25ccfa70d3702d74156aKalle Raita		ctx.glFramebufferTextureLayer	(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texCubeArray, 0, maxArrayTexLayers);
1656fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.expectError					(GL_INVALID_VALUE);
1657fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.endSection();
1658fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
1659fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.beginSection("GL_INVALID_OPERATION is generated if texture is the name of a buffer texture.");
1660fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glFramebufferTextureLayer	(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texBuffer, 0, 0);
1661fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.expectError					(GL_INVALID_OPERATION);
1662fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.endSection();
1663fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
1664fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glDeleteTextures			(1, &tex2DMSArray);
1665f28187809176f5eeb1ee25ccfa70d3702d74156aKalle Raita		ctx.glDeleteTextures			(1, &texCubeArray);
1666fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glDeleteTextures			(1, &texBuffer);
1667fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	}
1668fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
16693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glDeleteTextures		(1, &tex3D);
16703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glDeleteTextures		(1, &tex2DArray);
16713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glDeleteTextures		(1, &tex2D);
16723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glDeleteFramebuffers	(1, &fbo);
16733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
16743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16753c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid invalidate_framebuffer (NegativeTestContext& ctx)
16763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1677fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	deUint32	attachments[3];
1678653ad0e8a4209754304cbd5b5ceb4fdc7b29c01aPyry Haulos	deUint32	fbo					= 0x1234;
1679653ad0e8a4209754304cbd5b5ceb4fdc7b29c01aPyry Haulos	deUint32	texture				= 0x1234;
1680fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	int			maxColorAttachments = 0x1234;
1681fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
16823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGetIntegerv				(GL_MAX_COLOR_ATTACHMENTS, &maxColorAttachments);
1683fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	attachments[0]					= GL_COLOR_ATTACHMENT0;
1684fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	attachments[1]					= GL_COLOR_ATTACHMENT0 + maxColorAttachments;
1685fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	attachments[2]					= GL_DEPTH_STENCIL_ATTACHMENT;
16863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGenFramebuffers			(1, &fbo);
16883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGenTextures				(1, &texture);
16893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindFramebuffer			(GL_FRAMEBUFFER, fbo);
16903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindTexture				(GL_TEXTURE_2D, texture);
16913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glTexImage2D				(GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
16923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glFramebufferTexture2D		(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
16933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glCheckFramebufferStatus	(GL_FRAMEBUFFER);
16943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError					(GL_NO_ERROR);
16953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_ENUM is generated if target is not GL_FRAMEBUFFER, GL_READ_FRAMEBUFFER or GL_DRAW_FRAMEBUFFER.");
16973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glInvalidateFramebuffer		(-1, 1, &attachments[0]);
16983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError					(GL_INVALID_ENUM);
16993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glInvalidateFramebuffer		(GL_BACK, 1, &attachments[0]);
17003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError					(GL_INVALID_ENUM);
17013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
17023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_OPERATION is generated if attachments contains GL_COLOR_ATTACHMENTm and m is greater than or equal to the value of GL_MAX_COLOR_ATTACHMENTS.");
17043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glInvalidateFramebuffer		(GL_FRAMEBUFFER, 1, &attachments[1]);
17053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError					(GL_INVALID_OPERATION);
17063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
17073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1708fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.beginSection("GL_INVALID_VALUE is generated if numAttachments is negative.");
1709fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glInvalidateFramebuffer		(GL_FRAMEBUFFER, -1, &attachments[0]);
1710fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError					(GL_INVALID_VALUE);
1711fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.endSection();
1712fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
1713fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.beginSection("GL_INVALID_ENUM is generated if the default framebuffer is bound to target and any elements of attachments are not one of the accepted attachments.");
1714fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glBindFramebuffer			(GL_FRAMEBUFFER, 0);
1715fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glInvalidateFramebuffer		(GL_FRAMEBUFFER, 1, &attachments[2]);
1716fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError					(GL_INVALID_ENUM);
1717fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.endSection();
1718fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
1719fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
17203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glDeleteTextures		(1, &texture);
17213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glDeleteFramebuffers	(1, &fbo);
17223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
17233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17243c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid invalidate_sub_framebuffer (NegativeTestContext& ctx)
17253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1726fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	deUint32	attachments[3];
1727fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	deUint32	fbo					= 0x1234;
1728fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	deUint32	texture				= 0x1234;
1729fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	int			maxColorAttachments	= 0x1234;
1730fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
17313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGetIntegerv				(GL_MAX_COLOR_ATTACHMENTS, &maxColorAttachments);
1732fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	attachments[0]					= GL_COLOR_ATTACHMENT0;
1733fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	attachments[1]					= GL_COLOR_ATTACHMENT0 + maxColorAttachments;
1734fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	attachments[2]					= GL_DEPTH_STENCIL_ATTACHMENT;
17353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGenFramebuffers			(1, &fbo);
17373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGenTextures				(1, &texture);
17383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindFramebuffer			(GL_FRAMEBUFFER, fbo);
17393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindTexture				(GL_TEXTURE_2D, texture);
17403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glTexImage2D				(GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
17413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glFramebufferTexture2D		(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
17423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glCheckFramebufferStatus	(GL_FRAMEBUFFER);
17433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError					(GL_NO_ERROR);
17443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_ENUM is generated if target is not GL_FRAMEBUFFER, GL_READ_FRAMEBUFFER or GL_DRAW_FRAMEBUFFER.");
17463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glInvalidateSubFramebuffer	(-1, 1, &attachments[0], 0, 0, 16, 16);
17473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError					(GL_INVALID_ENUM);
17483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glInvalidateSubFramebuffer	(GL_BACK, 1, &attachments[0], 0, 0, 16, 16);
17493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError					(GL_INVALID_ENUM);
17503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
17513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_OPERATION is generated if attachments contains GL_COLOR_ATTACHMENTm and m is greater than or equal to the value of GL_MAX_COLOR_ATTACHMENTS.");
17533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glInvalidateSubFramebuffer	(GL_FRAMEBUFFER, 1, &attachments[1], 0, 0, 16, 16);
17543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError					(GL_INVALID_OPERATION);
17553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
17563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1757fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.beginSection("GL_INVALID_VALUE is generated if numAttachments, width, or heigh is negative.");
1758fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glInvalidateSubFramebuffer	(GL_FRAMEBUFFER, -1, &attachments[0], 0, 0, 16, 16);
1759fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError					(GL_INVALID_VALUE);
1760fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glInvalidateSubFramebuffer	(GL_FRAMEBUFFER, -1, &attachments[0], 0, 0, -1, 16);
1761fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError					(GL_INVALID_VALUE);
1762fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glInvalidateSubFramebuffer	(GL_FRAMEBUFFER, -1, &attachments[0], 0, 0, 16, -1);
1763fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError					(GL_INVALID_VALUE);
1764fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glInvalidateSubFramebuffer	(GL_FRAMEBUFFER, -1, &attachments[0], 0, 0, -1, -1);
1765fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError					(GL_INVALID_VALUE);
1766fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glInvalidateSubFramebuffer	(GL_FRAMEBUFFER, 1, &attachments[0], 0, 0, -1, 16);
1767fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError					(GL_INVALID_VALUE);
1768fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glInvalidateSubFramebuffer	(GL_FRAMEBUFFER, 1, &attachments[0], 0, 0, 16, -1);
1769fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError					(GL_INVALID_VALUE);
1770fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glInvalidateSubFramebuffer	(GL_FRAMEBUFFER, 1, &attachments[0], 0, 0, -1, -1);
1771fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError					(GL_INVALID_VALUE);
1772fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.endSection();
1773fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
1774fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.beginSection("GL_INVALID_ENUM is generated if the default framebuffer is bound to target and any elements of attachments are not one of the accepted attachments.");
1775fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glBindFramebuffer			(GL_FRAMEBUFFER, 0);
1776fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glInvalidateSubFramebuffer	(GL_FRAMEBUFFER, 1, &attachments[2], 0, 0, 16, 16);
1777fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError					(GL_INVALID_ENUM);
1778fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.endSection();
1779fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
17803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glDeleteTextures		(1, &texture);
17813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glDeleteFramebuffers	(1, &fbo);
17823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
17833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17843c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid renderbuffer_storage_multisample (NegativeTestContext& ctx)
17853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1786fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	deUint32	rbo							= 0x1234;
1787fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	int			maxSamplesSupportedRGBA4	= -1;
1788fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	int			maxSamplesSupportedRGBA8UI	= -1;
1789fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	GLint		maxSize						= 0x1234;
17903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGetInternalformativ				(GL_RENDERBUFFER, GL_RGBA4, GL_SAMPLES, 1, &maxSamplesSupportedRGBA4);
179236ebe43247b45ca9933ccc511c73c373a4fafe59Jarkko Pöyry	ctx.glGetInternalformativ				(GL_RENDERBUFFER, GL_RGBA8UI, GL_SAMPLES, 1, &maxSamplesSupportedRGBA8UI);
179336ebe43247b45ca9933ccc511c73c373a4fafe59Jarkko Pöyry
17943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGenRenderbuffers					(1, &rbo);
17953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glBindRenderbuffer					(GL_RENDERBUFFER, rbo);
17963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_ENUM is generated if target is not GL_RENDERBUFFER.");
17983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glRenderbufferStorageMultisample	(-1, 2, GL_RGBA4, 1, 1);
17993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError							(GL_INVALID_ENUM);
18003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glRenderbufferStorageMultisample	(GL_FRAMEBUFFER, 2, GL_RGBA4, 1, 1);
18013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError							(GL_INVALID_ENUM);
18023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
18033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
18043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_OPERATION is generated if samples is greater than the maximum number of samples supported for internalformat.");
18053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glRenderbufferStorageMultisample	(GL_RENDERBUFFER, maxSamplesSupportedRGBA4+1, GL_RGBA4, 1, 1);
18063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError							(GL_INVALID_OPERATION);
18073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
18083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
18093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_ENUM is generated if internalformat is not a color-renderable, depth-renderable, or stencil-renderable format.");
18103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glRenderbufferStorageMultisample	(GL_RENDERBUFFER, 2, -1, 1, 1);
18113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError							(GL_INVALID_ENUM);
1812271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry
1813fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	if (!ctx.isExtensionSupported("GL_EXT_color_buffer_half_float")) // GL_EXT_color_buffer_half_float disables error
1814271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry	{
1815271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry		ctx.glRenderbufferStorageMultisample	(GL_RENDERBUFFER, 2, GL_RGB16F, 1, 1);
1816271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry		ctx.expectError							(GL_INVALID_ENUM);
1817271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry	}
1818271c2654cc44f23492888c7ef40c36c2fd810c77Jarkko Pöyry
1819fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	if (!ctx.isExtensionSupported("GL_EXT_render_snorm")) // GL_EXT_render_snorm disables error
1820531a9f5311e314348ebc7678984c852be8dd2a2bMika Isojärvi	{
1821531a9f5311e314348ebc7678984c852be8dd2a2bMika Isojärvi		ctx.glRenderbufferStorageMultisample	(GL_RENDERBUFFER, 2, GL_RGBA8_SNORM, 1, 1);
1822531a9f5311e314348ebc7678984c852be8dd2a2bMika Isojärvi		ctx.expectError							(GL_INVALID_ENUM);
1823531a9f5311e314348ebc7678984c852be8dd2a2bMika Isojärvi	}
1824531a9f5311e314348ebc7678984c852be8dd2a2bMika Isojärvi
18253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
18263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
182736ebe43247b45ca9933ccc511c73c373a4fafe59Jarkko Pöyry	ctx.beginSection("GL_INVALID_OPERATION is generated if samples is greater than the maximum number of samples supported for internalformat. (Unsigned integer format)");
182836ebe43247b45ca9933ccc511c73c373a4fafe59Jarkko Pöyry	ctx.glRenderbufferStorageMultisample	(GL_RENDERBUFFER, maxSamplesSupportedRGBA8UI+1, GL_RGBA8UI, 1, 1);
18293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError							(GL_INVALID_OPERATION);
18303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
18313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
18323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_VALUE is generated if width or height is less than zero.");
18333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glRenderbufferStorageMultisample	(GL_RENDERBUFFER, 2, GL_RGBA4, -1, 1);
18343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError							(GL_INVALID_VALUE);
18353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glRenderbufferStorageMultisample	(GL_RENDERBUFFER, 2, GL_RGBA4, 1, -1);
18363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError							(GL_INVALID_VALUE);
18373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glRenderbufferStorageMultisample	(GL_RENDERBUFFER, 2, GL_RGBA4, -1, -1);
18383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError							(GL_INVALID_VALUE);
1839fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glRenderbufferStorageMultisample	(GL_RENDERBUFFER, -1, GL_RGBA4, 1, 1);
1840fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError							(GL_INVALID_VALUE);
1841fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glRenderbufferStorageMultisample	(GL_RENDERBUFFER, -1, GL_RGBA4, -1, 1);
1842fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError							(GL_INVALID_VALUE);
1843fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glRenderbufferStorageMultisample	(GL_RENDERBUFFER, -1, GL_RGBA4, 1, -1);
1844fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError							(GL_INVALID_VALUE);
1845fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.glRenderbufferStorageMultisample	(GL_RENDERBUFFER, -1, GL_RGBA4, -1, -1);
1846fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	ctx.expectError							(GL_INVALID_VALUE);
18473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
18483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
18493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.beginSection("GL_INVALID_VALUE is generated if width or height is greater than GL_MAX_RENDERBUFFER_SIZE.");
18503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glGetIntegerv						(GL_MAX_RENDERBUFFER_SIZE, &maxSize);
18513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glRenderbufferStorageMultisample	(GL_RENDERBUFFER, 4, GL_RGBA4, 1, maxSize+1);
18523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError							(GL_INVALID_VALUE);
18533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glRenderbufferStorageMultisample	(GL_RENDERBUFFER, 4, GL_RGBA4, maxSize+1, 1);
18543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError							(GL_INVALID_VALUE);
18553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glRenderbufferStorageMultisample	(GL_RENDERBUFFER, 4, GL_RGBA4, maxSize+1, maxSize+1);
18563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.expectError							(GL_INVALID_VALUE);
18573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.endSection();
18583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
18593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.glDeleteRenderbuffers(1, &rbo);
18603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
18613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1862fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulosvoid copy_image_sub_data (NegativeTestContext& ctx)
1863fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos{
1864fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	if (contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)))
1865fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	{
1866fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		deUint32					texture[5];
1867fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		deUint32					rbo = 0x1234;
1868fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
1869fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glGenTextures			(5, texture);
1870fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glGenRenderbuffers		(1, &rbo);
1871fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glBindRenderbuffer		(GL_RENDERBUFFER, rbo);
1872fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
1873fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glBindTexture			(GL_TEXTURE_2D, texture[0]);
1874fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glTexParameteri			(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1875fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glTexParameteri			(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1876fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glTexImage2D			(GL_TEXTURE_2D, 0, GL_RGBA8, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
1877fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glRenderbufferStorage	(GL_RENDERBUFFER, GL_RGBA8, 32, 32);
1878fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glBindTexture			(GL_TEXTURE_2D, texture[1]);
1879fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glTexParameteri			(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1880fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glTexParameteri			(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1881fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glTexImage2D			(GL_TEXTURE_2D, 0, GL_RGBA8, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
1882fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.expectError				(GL_NO_ERROR);
1883fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
1884fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glBindTexture			(GL_TEXTURE_3D, texture[2]);
1885fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glTexParameteri			(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1886fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glTexParameteri			(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1887fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glTexImage3D			(GL_TEXTURE_3D, 0, GL_RGBA8, 32, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
1888fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.expectError				(GL_NO_ERROR);
1889fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
1890fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glBindTexture			(GL_TEXTURE_3D, texture[3]);
1891fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glTexImage3D			(GL_TEXTURE_3D, 0, GL_RGBA8, 32, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
1892fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.expectError				(GL_NO_ERROR);
1893fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
1894fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glBindTexture			(GL_TEXTURE_2D, texture[4]);
1895fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glTexParameteri			(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1896fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glTexParameteri			(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1897fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glTexImage2D			(GL_TEXTURE_2D, 0, GL_RGBA32F, 32, 32, 0, GL_RGBA, GL_FLOAT, NULL);
1898fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.expectError				(GL_NO_ERROR);
1899fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
1900fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.beginSection("GL_INVALID_VALUE is generated if srcWidth, srcHeight, or srcDepth is negative.");
1901fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glCopyImageSubData		(texture[0], GL_TEXTURE_2D, 0, 0, 0, 0, texture[1], GL_TEXTURE_2D, 0, 0, 0, 0, -1, 1, 1);
1902fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.expectError				(GL_INVALID_VALUE);
1903fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glCopyImageSubData		(texture[0], GL_TEXTURE_2D, 0, 0, 0, 0, texture[1], GL_TEXTURE_2D, 0, 0, 0, 0, 1, -1, 1);
1904fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.expectError				(GL_INVALID_VALUE);
1905fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glCopyImageSubData		(texture[0], GL_TEXTURE_2D, 0, 0, 0, 0, texture[1], GL_TEXTURE_2D, 0, 0, 0, 0, 1, 1, -1);
1906fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.expectError				(GL_INVALID_VALUE);
1907fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glCopyImageSubData		(texture[0], GL_TEXTURE_2D, 0, 0, 0, 0, texture[1], GL_TEXTURE_2D, 0, 0, 0, 0, -1, -1, 1);
1908fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.expectError				(GL_INVALID_VALUE);
1909fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glCopyImageSubData		(texture[0], GL_TEXTURE_2D, 0, 0, 0, 0, texture[1], GL_TEXTURE_2D, 0, 0, 0, 0, -1, 1, -1);
1910fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.expectError				(GL_INVALID_VALUE);
1911fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glCopyImageSubData		(texture[0], GL_TEXTURE_2D, 0, 0, 0, 0, texture[1], GL_TEXTURE_2D, 0, 0, 0, 0, 1, -1, -1);
1912fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.expectError				(GL_INVALID_VALUE);
1913fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glCopyImageSubData		(texture[0], GL_TEXTURE_2D, 0, 0, 0, 0, texture[1], GL_TEXTURE_2D, 0, 0, 0, 0, -1, -1, -1);
1914fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.expectError				(GL_INVALID_VALUE);
1915fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.endSection();
1916fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
1917fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.beginSection("GL_INVALID_VALUE is generated if srcLevel and dstLevel are not valid levels for the corresponding images.");
1918fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glCopyImageSubData		(texture[0], GL_TEXTURE_2D, 1, 0, 0, 0, texture[1], GL_TEXTURE_2D, 0, 0, 0, 0, 0, 0, 1);
1919fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.expectError				(GL_INVALID_VALUE);
1920fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glCopyImageSubData		(texture[0], GL_TEXTURE_2D, 0, 0, 0, 0, texture[1], GL_TEXTURE_2D, 1, 0, 0, 0, 0, 0, 1);
1921fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.expectError				(GL_INVALID_VALUE);
1922fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glCopyImageSubData		(texture[0], GL_TEXTURE_2D, 1, 0, 0, 0, texture[1], GL_TEXTURE_2D, 1, 0, 0, 0, 0, 0, 1);
1923fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.expectError				(GL_INVALID_VALUE);
1924fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glCopyImageSubData		(texture[0], GL_TEXTURE_2D, -1, 0, 0, 0, texture[1], GL_TEXTURE_2D, 0, 0, 0, 0, 0, 0, 1);
1925fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.expectError				(GL_INVALID_VALUE);
1926fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glCopyImageSubData		(texture[0], GL_TEXTURE_2D, 0, 0, 0, 0, texture[1], GL_TEXTURE_2D, -1, 0, 0, 0, 0, 0, 1);
1927fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.expectError				(GL_INVALID_VALUE);
1928fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glCopyImageSubData		(texture[0], GL_TEXTURE_2D, -1, 0, 0, 0, texture[1], GL_TEXTURE_2D, -1, 0, 0, 0, 0, 0, 1);
1929fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.expectError				(GL_INVALID_VALUE);
1930fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glCopyImageSubData		(rbo, GL_RENDERBUFFER, -1, 0, 0, 0, texture[1], GL_TEXTURE_2D, 0, 0, 0, 0, 0, 0, 1);
1931fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.expectError				(GL_INVALID_VALUE);
1932fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glCopyImageSubData		(rbo, GL_RENDERBUFFER, 1, 0, 0, 0, texture[1], GL_TEXTURE_2D, 0, 0, 0, 0, 0, 0, 1);
1933fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.expectError				(GL_INVALID_VALUE);
1934fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glCopyImageSubData		(texture[1], GL_TEXTURE_2D, 0, 0, 0, 0, rbo, GL_RENDERBUFFER, -1, 0, 0, 0, 0, 0, 1);
1935fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.expectError				(GL_INVALID_VALUE);
1936fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glCopyImageSubData		(texture[1], GL_TEXTURE_2D, 0, 0, 0, 0, rbo, GL_RENDERBUFFER, 1, 0, 0, 0, 0, 0, 1);
1937fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.expectError				(GL_INVALID_VALUE);
1938fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.endSection();
1939fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
1940fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.beginSection("GL_INVALID_ENUM is generated if either target does not match the type of the object.");
1941fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		// \note: This could be either:
1942fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		//		1. GL_INVALID_ENUM is generated if either target does not match the type of the object.
1943fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		//		2. GL_INVALID_VALUE is generated if either name does not correspond to a valid renderbuffer or texture object according to the corresponding target parameter.
1944fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glCopyImageSubData		(texture[0], GL_TEXTURE_2D, 0, 0, 0, 0, texture[1], GL_TEXTURE_3D, 0, 0, 0, 0, 0, 0, 1);
1945fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.expectError				(GL_INVALID_ENUM);
1946fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glCopyImageSubData		(texture[0], GL_TEXTURE_2D, 0, 0, 0, 0, texture[2], GL_TEXTURE_2D, 0, 0, 0, 0, 0, 0, 1);
1947fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.expectError				(GL_INVALID_ENUM);
1948fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glCopyImageSubData		(texture[0], GL_TEXTURE_3D, 0, 0, 0, 0, texture[1], GL_TEXTURE_2D, 0, 0, 0, 0, 0, 0, 1);
1949fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.expectError				(GL_INVALID_ENUM);
1950fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glCopyImageSubData		(texture[2], GL_TEXTURE_2D, 0, 0, 0, 0, texture[1], GL_TEXTURE_2D, 0, 0, 0, 0, 0, 0, 1);
1951fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.expectError				(GL_INVALID_ENUM);
1952fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.endSection();
1953fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
1954fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.beginSection("GL_INVALID_OPERATION is generated if either object is a texture and the texture is not complete.");
1955fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glCopyImageSubData		(texture[0], GL_TEXTURE_2D, 0, 0, 0, 0, texture[3], GL_TEXTURE_3D, 0, 0, 0, 0, 0, 0, 1);
1956fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.expectError				(GL_INVALID_OPERATION);
1957fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glCopyImageSubData		(texture[3], GL_TEXTURE_3D, 0, 0, 0, 0, texture[0], GL_TEXTURE_2D, 0, 0, 0, 0, 0, 0, 1);
1958fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.expectError				(GL_INVALID_OPERATION);
1959fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glCopyImageSubData		(texture[3], GL_TEXTURE_3D, 0, 0, 0, 0, texture[3], GL_TEXTURE_3D, 0, 0, 0, 0, 0, 0, 1);
1960fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.expectError				(GL_INVALID_OPERATION);
1961fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.endSection();
1962fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
1963fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.beginSection("GL_INVALID_VALUE is generated if the dimensions of either subregion exceeds the boundaries of the corresponding image object.");
1964fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glCopyImageSubData		(texture[0], GL_TEXTURE_2D, 0, 0, 0, 0, texture[1], GL_TEXTURE_2D, 0, 0, 0, 0, 33, 0, 1);
1965fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.expectError				(GL_INVALID_VALUE);
1966fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glCopyImageSubData		(texture[0], GL_TEXTURE_2D, 0, 0, 0, 0, texture[1], GL_TEXTURE_2D, 0, 0, 0, 0, 0, 33, 1);
1967fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.expectError				(GL_INVALID_VALUE);
1968fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.endSection();
1969fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
1970fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.beginSection("GL_INVALID_OPERATION error is generated if the source and destination internal formats are not compatible.");
1971fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glCopyImageSubData		(texture[0], GL_TEXTURE_2D, 0, 0, 0, 0, texture[4], GL_TEXTURE_2D, 0, 0, 0, 0, 0, 0, 1);
1972fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.expectError				(GL_INVALID_OPERATION);
1973fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glCopyImageSubData		(texture[4], GL_TEXTURE_2D, 0, 0, 0, 0, texture[0], GL_TEXTURE_2D, 0, 0, 0, 0, 0, 0, 1);
1974fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.expectError				(GL_INVALID_OPERATION);
1975fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.endSection();
1976fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
1977fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glDeleteTextures		(5, texture);
1978fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		ctx.glDeleteRenderbuffers	(1, &rbo);
1979fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	}
1980fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos}
1981fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos
19823c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystd::vector<FunctionContainer> getNegativeBufferApiTestFunctions ()
19833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1984fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos	const FunctionContainer funcs[] =
19853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1986fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		{bind_buffer,						"bind_buffer",						"Invalid glBindBuffer() usage"						},
1987fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		{delete_buffers,					"delete_buffers",					"Invalid glDeleteBuffers() usage"					},
1988fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		{gen_buffers,						"gen_buffers",						"Invalid glGenBuffers() usage"						},
1989fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		{buffer_data,						"buffer_data",						"Invalid glBufferData() usage"						},
1990fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		{buffer_sub_data,					"buffer_sub_data",					"Invalid glBufferSubData() usage"					},
1991fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		{buffer_sub_data_size_offset,		"buffer_sub_data_size_offset",		"Invalid glBufferSubData() usage"					},
1992fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		{clear,								"clear",							"Invalid glClear() usage"							},
1993fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		{read_pixels,						"read_pixels",						"Invalid glReadPixels() usage"						},
1994fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		{readn_pixels,						"readn_pixels",						"Invalid glReadPixels() usage"						},
1995fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		{read_pixels_format_mismatch,		"read_pixels_format_mismatch",		"Invalid glReadPixels() usage"						},
1996fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		{read_pixels_fbo_format_mismatch,	"read_pixels_fbo_format_mismatch",	"Invalid glReadPixels() usage"						},
1997fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		{bind_buffer_range,					"bind_buffer_range",				"Invalid glBindBufferRange() usage"					},
1998fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		{bind_buffer_base,					"bind_buffer_base",					"Invalid glBindBufferBase() usage"					},
1999fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		{clear_bufferiv,					"clear_bufferiv",					"Invalid glClearBufferiv() usage"					},
2000fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		{clear_bufferuiv,					"clear_bufferuiv",					"Invalid glClearBufferuiv() usage"					},
2001fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		{clear_bufferfv,					"clear_bufferfv",					"Invalid glClearBufferfv() usage"					},
2002fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		{clear_bufferfi,					"clear_bufferfi",					"Invalid glClearBufferfi() usage"					},
2003fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		{copy_buffer_sub_data,				"copy_buffer_sub_data",				"Invalid glCopyBufferSubData() usage"				},
2004fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		{draw_buffers,						"draw_buffers",						"Invalid glDrawBuffers() usage"						},
2005fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		{flush_mapped_buffer_range,			"flush_mapped_buffer_range",		"Invalid glFlushMappedBufferRange() usage"			},
2006fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		{map_buffer_range,					"map_buffer_range",					"Invalid glMapBufferRange() usage"					},
2007fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		{read_buffer,						"read_buffer",						"Invalid glReadBuffer() usage"						},
2008fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		{unmap_buffer,						"unmap_buffer",						"Invalid glUnmapBuffer() usage"						},
2009fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		{bind_framebuffer,					"bind_framebuffer",					"Invalid glBindFramebuffer() usage"					},
2010fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		{bind_renderbuffer,					"bind_renderbuffer",				"Invalid glBindRenderbuffer() usage"				},
2011fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		{check_framebuffer_status,			"check_framebuffer_status",			"Invalid glCheckFramebufferStatus() usage"			},
2012fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		{gen_framebuffers,					"gen_framebuffers",					"Invalid glGenFramebuffers() usage"					},
2013fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		{gen_renderbuffers,					"gen_renderbuffers",				"Invalid glGenRenderbuffers() usage"				},
2014fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		{delete_framebuffers,				"delete_framebuffers",				"Invalid glDeleteFramebuffers() usage"				},
2015fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		{delete_renderbuffers,				"delete_renderbuffers",				"Invalid glDeleteRenderbuffers() usage"				},
2016fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		{framebuffer_renderbuffer,			"framebuffer_renderbuffer",			"Invalid glFramebufferRenderbuffer() usage"			},
2017fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		{framebuffer_texture,				"framebuffer_texture",				"Invalid glFramebufferTexture() usage"				},
2018fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		{framebuffer_texture2d,				"framebuffer_texture2d",			"Invalid glFramebufferTexture2D() usage"			},
2019fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		{renderbuffer_storage,				"renderbuffer_storage",				"Invalid glRenderbufferStorage() usage"				},
2020fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		{blit_framebuffer,					"blit_framebuffer",					"Invalid glBlitFramebuffer() usage"					},
2021fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		{blit_framebuffer_multisample,		"blit_framebuffer_multisample",		"Invalid glBlitFramebuffer() usage"					},
2022fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		{framebuffer_texture_layer,			"framebuffer_texture_layer",		"Invalid glFramebufferTextureLayer() usage"			},
2023fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		{invalidate_framebuffer,			"invalidate_framebuffer",			"Invalid glInvalidateFramebuffer() usage"			},
2024fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		{invalidate_sub_framebuffer,		"invalidate_sub_framebuffer",		"Invalid glInvalidateSubFramebuffer() usage"		},
2025fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		{renderbuffer_storage_multisample,	"renderbuffer_storage_multisample",	"Invalid glRenderbufferStorageMultisample() usage"	},
2026fb059fdb43c8b6073ada028a68124263c59a000aPyry Haulos		{copy_image_sub_data,				"copy_image_sub_data",				"Invalid glCopyImageSubData() usage"				},
20273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
20283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return std::vector<FunctionContainer>(DE_ARRAY_BEGIN(funcs), DE_ARRAY_END(funcs));
20303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
20313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
20323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // NegativeTestShared
20333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // Functional
20343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // gles31
20353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // deqp
2036