13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*-------------------------------------------------------------------------
23c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * drawElements Quality Program OpenGL ES 2.0 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 Framebuffer Object API Tests.
223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Notes:
243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *   All gl calls are passed thru sgl2::Context class. Reasons:
253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *    + Name, object allocation is tracked and live resources are freed
263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *      when Context is destroyed.
273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *    + Makes it possible to easily log all relevant calls into test log.
283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *      \todo [pyry] This is not implemented yet
293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "es2fFboApiTest.hpp"
323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "sglrGLContext.hpp"
333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluDefs.hpp"
343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluContextInfo.hpp"
353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluStrUtil.hpp"
363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuRenderTarget.hpp"
373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deString.h"
383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glwFunctions.hpp"
393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glwEnums.hpp"
403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <iterator>
423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <algorithm>
433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
443c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace deqp
453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
463c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace gles2
473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
483c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace Functional
493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
513c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing std::string;
523c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing std::vector;
533c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing tcu::TestLog;
543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
553c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing glw::GLenum;
563c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing glw::GLint;
573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
583c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void logComment (tcu::TestContext& testCtx, const char* comment)
593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	testCtx.getLog() << TestLog::Message << "// " << comment << TestLog::EndMessage;
613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
633c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void checkError (tcu::TestContext& testCtx, sglr::Context& ctx, GLenum expect)
643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLenum result = ctx.getError();
663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	testCtx.getLog() << TestLog::Message << "// " << (result == expect ? "Pass" : "Fail") << ", expected " << glu::getErrorStr(expect) << TestLog::EndMessage;
673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (result != expect)
693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Error code mismatch");
703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
72cf7b2b5f1cb3c8b66e27db37f92d42b686251d39Mika Isojärvistatic void checkEitherError (tcu::TestContext& testCtx, sglr::Context& ctx, GLenum expectA, GLenum expectB)
73cf7b2b5f1cb3c8b66e27db37f92d42b686251d39Mika Isojärvi{
74cf7b2b5f1cb3c8b66e27db37f92d42b686251d39Mika Isojärvi	GLenum	result	= ctx.getError();
75cf7b2b5f1cb3c8b66e27db37f92d42b686251d39Mika Isojärvi	bool	isOk	= (result == expectA || result == expectB);
76cf7b2b5f1cb3c8b66e27db37f92d42b686251d39Mika Isojärvi
77cf7b2b5f1cb3c8b66e27db37f92d42b686251d39Mika Isojärvi	testCtx.getLog() << TestLog::Message << "// " << (isOk ? "Pass" : "Fail") << ", expected " << glu::getErrorStr(expectA) << " or " << glu::getErrorStr(expectB) << TestLog::EndMessage;
78cf7b2b5f1cb3c8b66e27db37f92d42b686251d39Mika Isojärvi
79cf7b2b5f1cb3c8b66e27db37f92d42b686251d39Mika Isojärvi	if (!isOk)
80cf7b2b5f1cb3c8b66e27db37f92d42b686251d39Mika Isojärvi		testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Error code mismatch");
81cf7b2b5f1cb3c8b66e27db37f92d42b686251d39Mika Isojärvi}
82cf7b2b5f1cb3c8b66e27db37f92d42b686251d39Mika Isojärvi
833c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic const char* getAttachmentName (GLenum attachment)
843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	switch (attachment)
863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_COLOR_ATTACHMENT0:	return "GL_COLOR_ATTACHMENT0";
883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_DEPTH_ATTACHMENT:	return "GL_DEPTH_ATTACHMENT";
893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_STENCIL_ATTACHMENT:	return "GL_STENCIL_ATTACHMENT";
903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		default: throw tcu::InternalError("Unknown attachment", "", __FILE__, __LINE__);
913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
943c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic const char* getAttachmentParameterName (GLenum pname)
953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	switch (pname)
973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:				return "GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE";
993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:				return "GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME";
1003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:			return "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL";
1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:	return "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE";
1023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		default: throw tcu::InternalError("Unknown parameter", "", __FILE__, __LINE__);
1033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
1043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1063c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic string getAttachmentParameterValueName (GLint value)
1073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	switch (value)
1093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case 0:									return "GL_NONE(0)";
1113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_TEXTURE:						return "GL_TEXTURE";
1123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_RENDERBUFFER:					return "GL_RENDERBUFFER";
1133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_TEXTURE_CUBE_MAP_POSITIVE_X:	return "GL_TEXTURE_CUBE_MAP_POSITIVE_X";
1143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:	return "GL_TEXTURE_CUBE_MAP_NEGATIVE_X";
1153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:	return "GL_TEXTURE_CUBE_MAP_POSITIVE_Y";
1163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:	return "GL_TEXTURE_CUBE_MAP_NEGATIVE_Y";
1173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:	return "GL_TEXTURE_CUBE_MAP_POSITIVE_Z";
1183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:	return "GL_TEXTURE_CUBE_MAP_NEGATIVE_Z";
1193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		default:
1203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
1213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			char tmp[64];
1223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			deSprintf(tmp, sizeof(tmp), "0x%x", value);
1233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return string(tmp);
1243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
1253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
1263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1283c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void checkFboAttachmentParam (tcu::TestContext& testCtx, sglr::Context& ctx, GLenum attachment, GLenum pname, GLint expectedValue)
1293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TestLog& log = testCtx.getLog();
1313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	log << TestLog::Message << "// Querying " << getAttachmentName(attachment) << " " << getAttachmentParameterName(pname) << TestLog::EndMessage;
1323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLint value = 0xcdcdcdcd;
1343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.getFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, attachment, pname, &value);
1353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLenum err = ctx.getError();
1373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (value == expectedValue && err == GL_NO_ERROR)
1393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		log << TestLog::Message << "// Pass" << TestLog::EndMessage;
1403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
1413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		log << TestLog::Message << "// Fail, expected " << getAttachmentParameterValueName(expectedValue) << " without error" << TestLog::EndMessage;
1433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid result for attachment param query");
1443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
1453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1473c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void notSupportedTest (tcu::TestContext& testCtx, sglr::Context& context)
1483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_UNREF(testCtx);
1503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_UNREF(context);
1513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	throw tcu::NotSupportedError("Not supported", "", __FILE__, __LINE__);
1523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1543c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void textureLevelsTest (tcu::TestContext& testCtx, sglr::Context& context)
1553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32	tex		= 1;
1573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32	fbo		= 1;
1583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	context.bindTexture(GL_TEXTURE_2D, tex);
1603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	context.texImage2D(GL_TEXTURE_2D, 0, GL_RGB, 256, 256);
1613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	context.texImage2D(GL_TEXTURE_2D, 1, GL_RGB, 128, 128);
1623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	context.bindFramebuffer(GL_FRAMEBUFFER, fbo);
1643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static int levels[] = { 2, 1, 0, -1, 0x7fffffff, 0, 1 };
1663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(levels); ndx++)
1683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		context.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, levels[ndx]);
1703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		checkError(testCtx, context, levels[ndx] == 0 ? GL_NO_ERROR : GL_INVALID_VALUE);
1713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
1723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1743c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void textureLevelsWithRenderToMipmapTest (tcu::TestContext& testCtx, sglr::Context& context)
1753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32	tex		= 1;
1773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32	fbo		= 1;
1783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	context.bindTexture(GL_TEXTURE_2D, tex);
1803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	context.texImage2D(GL_TEXTURE_2D, 0, GL_RGB, 256, 256);
1813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	context.texImage2D(GL_TEXTURE_2D, 1, GL_RGB, 128, 128);
1823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	context.bindFramebuffer(GL_FRAMEBUFFER, fbo);
1843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static int levels[] = { 2, 1, 0, -1, 0x7fffffff, 0, 1 };
1863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(levels); ndx++)
1883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		context.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, levels[ndx]);
1903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		checkError(testCtx, context, de::inBounds(levels[ndx], 0, 16) ? GL_NO_ERROR : GL_INVALID_VALUE);
1913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
1923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1943c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void validTex2DAttachmentsTest (tcu::TestContext& testCtx, sglr::Context& context)
1953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	context.bindFramebuffer(GL_FRAMEBUFFER, 1);
1973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static const GLenum attachmentPoints[] =
1983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GL_COLOR_ATTACHMENT0,
2003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GL_DEPTH_ATTACHMENT,
2013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GL_STENCIL_ATTACHMENT
2023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
2033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Texture2D
2053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32 tex2D = 1;
2063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	context.bindTexture(GL_TEXTURE_2D, tex2D);
2073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int pointNdx = 0; pointNdx < DE_LENGTH_OF_ARRAY(attachmentPoints); pointNdx++)
2083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		context.framebufferTexture2D(GL_FRAMEBUFFER, attachmentPoints[pointNdx], GL_TEXTURE_2D, tex2D, 0);
2103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		checkError(testCtx, context, GL_NO_ERROR);
2113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
2123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2143c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void validTexCubeAttachmentsTest (tcu::TestContext& testCtx, sglr::Context& context)
2153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static const GLenum attachmentPoints[] =
2173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GL_COLOR_ATTACHMENT0,
2193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GL_DEPTH_ATTACHMENT,
2203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GL_STENCIL_ATTACHMENT
2213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
2223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static const GLenum cubeTargets[] =
2233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GL_TEXTURE_CUBE_MAP_POSITIVE_X,
2253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
2263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
2273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
2283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
2293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
2303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
2313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	context.bindFramebuffer(GL_FRAMEBUFFER, 1);
2333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// TextureCube
2353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32 texCube = 2;
2363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	context.bindTexture(GL_TEXTURE_CUBE_MAP, texCube);
2373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int pointNdx = 0; pointNdx < DE_LENGTH_OF_ARRAY(attachmentPoints); pointNdx++)
2383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int targetNdx = 0; targetNdx < DE_LENGTH_OF_ARRAY(cubeTargets); targetNdx++)
2403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
2413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			context.framebufferTexture2D(GL_FRAMEBUFFER, attachmentPoints[pointNdx], cubeTargets[targetNdx], texCube, 0);
2423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			checkError(testCtx, context, GL_NO_ERROR);
2433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
2443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
2453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2473c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void validRboAttachmentsTest (tcu::TestContext& testCtx, sglr::Context& context)
2483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static const GLenum attachmentPoints[] =
2503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GL_COLOR_ATTACHMENT0,
2523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GL_DEPTH_ATTACHMENT,
2533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GL_STENCIL_ATTACHMENT
2543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
2553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	context.bindFramebuffer(GL_FRAMEBUFFER, 1);
2573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Renderbuffer
2593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32 rbo = 3;
2603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	context.bindRenderbuffer(GL_RENDERBUFFER, rbo);
2613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int pointNdx = 0; pointNdx < DE_LENGTH_OF_ARRAY(attachmentPoints); pointNdx++)
2623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		context.framebufferRenderbuffer(GL_FRAMEBUFFER, attachmentPoints[pointNdx], GL_RENDERBUFFER, rbo);
2643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		checkError(testCtx, context, GL_NO_ERROR);
2653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
2663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2683c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void attachToDefaultFramebufferTest (tcu::TestContext& testCtx, sglr::Context& context)
2693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	logComment(testCtx, "Attaching 2D texture to default framebuffer");
2713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32 tex2D = 1;
2733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	context.bindTexture(GL_TEXTURE_2D, tex2D);
2743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	context.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex2D, 0);
2753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	checkError(testCtx, context, GL_INVALID_OPERATION);
2763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	logComment(testCtx, "Attaching renderbuffer to default framebuffer");
2783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32 rbo = 1;
2803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	context.bindRenderbuffer(GL_RENDERBUFFER, rbo);
2813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	context.framebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rbo);
2823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	checkError(testCtx, context, GL_INVALID_OPERATION);
2833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2853c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void invalidTex2DAttachmentTest (tcu::TestContext& testCtx, sglr::Context& context)
2863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	context.bindFramebuffer(GL_FRAMEBUFFER, 1);
2883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	logComment(testCtx, "Attaching 2D texture using GL_TEXTURE_CUBE_MAP_NEGATIVE_X texture target");
2903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32 tex2D = 1;
2923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	context.bindTexture(GL_TEXTURE_2D, tex2D);
2933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	context.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_NEGATIVE_X, tex2D, 0);
2943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	checkError(testCtx, context, GL_INVALID_OPERATION);
2953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	logComment(testCtx, "Attaching deleted 2D texture object");
2973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	context.deleteTextures(1, &tex2D);
2983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	context.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex2D, 0);
2993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	checkError(testCtx, context, GL_INVALID_OPERATION);
3003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3023c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void invalidTexCubeAttachmentTest (tcu::TestContext& testCtx, sglr::Context& context)
3033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	context.bindFramebuffer(GL_FRAMEBUFFER, 1);
3053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	logComment(testCtx, "Attaching cube texture using GL_TEXTURE_2D texture target");
3073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32 texCube = 2;
3083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	context.bindTexture(GL_TEXTURE_CUBE_MAP, texCube);
3093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	context.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texCube, 0);
3103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	checkError(testCtx, context, GL_INVALID_OPERATION);
3113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	logComment(testCtx, "Attaching deleted cube texture object");
3133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	context.deleteTextures(1, &texCube);
3143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	context.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X, texCube, 0);
3153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	checkError(testCtx, context, GL_INVALID_OPERATION);
3163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3183c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void invalidRboAttachmentTest (tcu::TestContext& testCtx, sglr::Context& context)
3193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	context.bindFramebuffer(GL_FRAMEBUFFER, 1);
3213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	logComment(testCtx, "Attaching renderbuffer using GL_FRAMEBUFFER renderbuffer target");
3233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32 rbo = 3;
3243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	context.bindRenderbuffer(GL_RENDERBUFFER, rbo);
3253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	context.framebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_FRAMEBUFFER, rbo);
3263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	checkError(testCtx, context, GL_INVALID_ENUM);
3273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	logComment(testCtx, "Attaching deleted renderbuffer object");
3293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	context.deleteRenderbuffers(1, &rbo);
3303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	context.framebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo);
3313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	checkError(testCtx, context, GL_INVALID_OPERATION);
3323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3343c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void attachNamesTest (tcu::TestContext& testCtx, sglr::Context& context)
3353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	context.bindFramebuffer(GL_FRAMEBUFFER, 1);
3373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Just allocate some names, don't bind for storage
3393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32 reservedTexName;
3403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	context.genTextures(1, &reservedTexName);
3413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	logComment(testCtx, "Attaching allocated texture name to 2D target");
3433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	context.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, reservedTexName, 0);
3443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	checkError(testCtx, context, GL_INVALID_OPERATION);
3453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	logComment(testCtx, "Attaching allocated texture name to cube target");
3473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	context.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_NEGATIVE_X, reservedTexName, 0);
3483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	checkError(testCtx, context, GL_INVALID_OPERATION);
3493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32 reservedRboName;
3513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	context.genRenderbuffers(1, &reservedRboName);
3523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	logComment(testCtx, "Attaching allocated renderbuffer name");
3543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	context.framebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, reservedRboName);
3553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	checkError(testCtx, context, GL_INVALID_OPERATION);
3563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3583c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void attachmentQueryDefaultFboTest (tcu::TestContext& testCtx, sglr::Context& ctx)
3593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Check that proper error codes are returned
3613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLint unused = 1;
3623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.getFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &unused);
363cf7b2b5f1cb3c8b66e27db37f92d42b686251d39Mika Isojärvi	checkEitherError(testCtx, ctx, GL_INVALID_ENUM, GL_INVALID_OPERATION);
3643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.getFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, &unused);
365cf7b2b5f1cb3c8b66e27db37f92d42b686251d39Mika Isojärvi	checkEitherError(testCtx, ctx, GL_INVALID_ENUM, GL_INVALID_OPERATION);
3663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.getFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL, &unused);
367cf7b2b5f1cb3c8b66e27db37f92d42b686251d39Mika Isojärvi	checkEitherError(testCtx, ctx, GL_INVALID_ENUM, GL_INVALID_OPERATION);
3683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.getFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE, &unused);
369cf7b2b5f1cb3c8b66e27db37f92d42b686251d39Mika Isojärvi	checkEitherError(testCtx, ctx, GL_INVALID_ENUM, GL_INVALID_OPERATION);
3703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3723c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void attachmentQueryEmptyFboTest (tcu::TestContext& testCtx, sglr::Context& ctx)
3733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static const GLenum attachmentPoints[] =
3753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
3763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GL_COLOR_ATTACHMENT0,
3773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GL_DEPTH_ATTACHMENT,
3783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GL_STENCIL_ATTACHMENT
3793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
3803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.bindFramebuffer(GL_FRAMEBUFFER, 1);
3823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(attachmentPoints); ndx++)
3843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		checkFboAttachmentParam(testCtx, ctx, attachmentPoints[ndx], GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, GL_NONE);
3853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Check that proper error codes are returned
3873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLint unused = -1;
3883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.getFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, &unused);
3893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	checkError(testCtx, ctx, GL_INVALID_ENUM);
3903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.getFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL, &unused);
3913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	checkError(testCtx, ctx, GL_INVALID_ENUM);
3923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.getFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE, &unused);
3933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	checkError(testCtx, ctx, GL_INVALID_ENUM);
3943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3963c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void attachmentQueryTex2DTest (tcu::TestContext& testCtx, sglr::Context& ctx)
3973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.bindFramebuffer(GL_FRAMEBUFFER, 1);
3993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.bindTexture(GL_TEXTURE_2D, 1);
4013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 1, 0);
4023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	checkFboAttachmentParam(testCtx, ctx, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, GL_TEXTURE);
4043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	checkFboAttachmentParam(testCtx, ctx, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, 1);
4053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	checkFboAttachmentParam(testCtx, ctx, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL, 0);
4063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	checkFboAttachmentParam(testCtx, ctx, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE, 0);
4073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
4083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4093c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void attachmentQueryTexCubeTest (tcu::TestContext& testCtx, sglr::Context& ctx)
4103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.bindFramebuffer(GL_FRAMEBUFFER, 1);
4123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.bindTexture(GL_TEXTURE_CUBE_MAP, 2);
4143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.framebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 2, 0);
4153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	checkFboAttachmentParam(testCtx, ctx, GL_DEPTH_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, GL_TEXTURE);
4173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	checkFboAttachmentParam(testCtx, ctx, GL_DEPTH_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, 2);
4183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	checkFboAttachmentParam(testCtx, ctx, GL_DEPTH_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL, 0);
4193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	checkFboAttachmentParam(testCtx, ctx, GL_DEPTH_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y);
4203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
4213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4223c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void attachmentQueryRboTest (tcu::TestContext& testCtx, sglr::Context& ctx)
4233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.bindFramebuffer(GL_FRAMEBUFFER, 1);
4253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.bindRenderbuffer(GL_RENDERBUFFER, 3);
4273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.framebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, 3);
4283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	checkFboAttachmentParam(testCtx, ctx, GL_STENCIL_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, GL_RENDERBUFFER);
4303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	checkFboAttachmentParam(testCtx, ctx, GL_STENCIL_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, 3);
4313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLint unused = 0;
4333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.getFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL, &unused);
4343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	checkError(testCtx, ctx, GL_INVALID_ENUM);
4353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.getFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE, &unused);
4363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	checkError(testCtx, ctx, GL_INVALID_ENUM);
4373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
4383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4393c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void deleteTex2DAttachedToBoundFboTest (tcu::TestContext& testCtx, sglr::Context& ctx)
4403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.bindFramebuffer(GL_FRAMEBUFFER, 1);
4423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32 tex2D = 1;
4443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.bindTexture(GL_TEXTURE_2D, tex2D);
4453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex2D, 0);
4463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	checkFboAttachmentParam(testCtx, ctx, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, GL_TEXTURE);
4483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	checkFboAttachmentParam(testCtx, ctx, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, tex2D);
4493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.deleteTextures(1, &tex2D);
4513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	checkFboAttachmentParam(testCtx, ctx, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, GL_NONE);
4533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
4543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4553c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void deleteTexCubeAttachedToBoundFboTest (tcu::TestContext& testCtx, sglr::Context& ctx)
4563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.bindFramebuffer(GL_FRAMEBUFFER, 1);
4583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32 texCube = 1;
4603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.bindTexture(GL_TEXTURE_CUBE_MAP, texCube);
4613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.framebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_CUBE_MAP_POSITIVE_X, texCube, 0);
4623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	checkFboAttachmentParam(testCtx, ctx, GL_DEPTH_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, GL_TEXTURE);
4643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	checkFboAttachmentParam(testCtx, ctx, GL_DEPTH_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, texCube);
4653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.deleteTextures(1, &texCube);
4673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	checkFboAttachmentParam(testCtx, ctx, GL_DEPTH_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, GL_NONE);
4693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
4703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4713c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void deleteRboAttachedToBoundFboTest (tcu::TestContext& testCtx, sglr::Context& ctx)
4723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.bindFramebuffer(GL_FRAMEBUFFER, 1);
4743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32 rbo = 1;
4763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.bindRenderbuffer(GL_RENDERBUFFER, rbo);
4773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.framebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo);
4783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	checkFboAttachmentParam(testCtx, ctx, GL_STENCIL_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, GL_RENDERBUFFER);
4803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	checkFboAttachmentParam(testCtx, ctx, GL_STENCIL_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, rbo);
4813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.deleteRenderbuffers(1, &rbo);
4833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	checkFboAttachmentParam(testCtx, ctx, GL_STENCIL_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, GL_NONE);
4853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
4863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4873c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void deleteTex2DAttachedToNotBoundFboTest (tcu::TestContext& testCtx, sglr::Context& ctx)
4883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.bindFramebuffer(GL_FRAMEBUFFER, 1);
4903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32 tex2D = 1;
4923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.bindTexture(GL_TEXTURE_2D, tex2D);
4933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex2D, 0);
4943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	checkFboAttachmentParam(testCtx, ctx, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, GL_TEXTURE);
4963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	checkFboAttachmentParam(testCtx, ctx, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, tex2D);
4973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.bindFramebuffer(GL_FRAMEBUFFER, 0);
4993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.deleteTextures(1, &tex2D);
5013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.bindFramebuffer(GL_FRAMEBUFFER, 1);
5033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	checkFboAttachmentParam(testCtx, ctx, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, GL_TEXTURE);
5053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	checkFboAttachmentParam(testCtx, ctx, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, tex2D);
5063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
5073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5083c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void deleteTexCubeAttachedToNotBoundFboTest (tcu::TestContext& testCtx, sglr::Context& ctx)
5093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.bindFramebuffer(GL_FRAMEBUFFER, 1);
5113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32 texCube = 1;
5133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.bindTexture(GL_TEXTURE_CUBE_MAP, texCube);
5143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.framebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_CUBE_MAP_POSITIVE_X, texCube, 0);
5153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	checkFboAttachmentParam(testCtx, ctx, GL_DEPTH_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, GL_TEXTURE);
5173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	checkFboAttachmentParam(testCtx, ctx, GL_DEPTH_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, texCube);
5183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.bindFramebuffer(GL_FRAMEBUFFER, 0);
5203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.deleteTextures(1, &texCube);
5223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.bindFramebuffer(GL_FRAMEBUFFER, 1);
5243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	checkFboAttachmentParam(testCtx, ctx, GL_DEPTH_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, GL_TEXTURE);
5263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	checkFboAttachmentParam(testCtx, ctx, GL_DEPTH_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, texCube);
5273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
5283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5293c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic void deleteRboAttachedToNotBoundFboTest (tcu::TestContext& testCtx, sglr::Context& ctx)
5303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.bindFramebuffer(GL_FRAMEBUFFER, 1);
5323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32 rbo = 1;
5343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.bindRenderbuffer(GL_RENDERBUFFER, rbo);
5353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.framebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo);
5363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	checkFboAttachmentParam(testCtx, ctx, GL_STENCIL_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, GL_RENDERBUFFER);
5383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	checkFboAttachmentParam(testCtx, ctx, GL_STENCIL_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, rbo);
5393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.bindFramebuffer(GL_FRAMEBUFFER, 0);
5413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.deleteRenderbuffers(1, &rbo);
5433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ctx.bindFramebuffer(GL_FRAMEBUFFER, 1);
5453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	checkFboAttachmentParam(testCtx, ctx, GL_STENCIL_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, GL_RENDERBUFFER);
5473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	checkFboAttachmentParam(testCtx, ctx, GL_STENCIL_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, rbo);
5483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
5493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5503c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass FboApiCase : public TestCase
5513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5523c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
5533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	typedef void (*TestFunc) (tcu::TestContext& testCtx, sglr::Context& context);
5543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								FboApiCase				(Context& context, const char* name, const char* description, TestFunc test);
5563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual						~FboApiCase				(void);
5573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual IterateResult		iterate					(void);
5593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5603c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
5613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								FboApiCase				(const FboApiCase& other);
5623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FboApiCase&					operator=				(const FboApiCase& other);
5633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TestFunc					m_testFunc;
5653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
5663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5673c827367444ee418f129b2c238299f49d3264554Jarkko PoyryFboApiCase::FboApiCase (Context& context, const char* name, const char* description, TestFunc test)
5683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: TestCase		(context, name, description)
5693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_testFunc	(test)
5703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
5723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5733c827367444ee418f129b2c238299f49d3264554Jarkko PoyryFboApiCase::~FboApiCase (void)
5743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
5763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5773c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTestCase::IterateResult FboApiCase::iterate (void)
5783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
5803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_EXPECT_NO_ERROR(gl.getError(), "Before test case");
5823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Initialize result to PASS
5843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
5853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Execute test case
5873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
5883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		sglr::GLContext context(m_context.getRenderContext(), m_testCtx.getLog(), sglr::GLCONTEXT_LOG_CALLS, tcu::IVec4(0, 0, m_context.getRenderTarget().getWidth(), m_context.getRenderTarget().getHeight()));
5893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_testFunc(m_testCtx, context);
5903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
5913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_EXPECT_NO_ERROR(gl.getError(), "After test case");
5933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return STOP;
5953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
5963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5973c827367444ee418f129b2c238299f49d3264554Jarkko PoyryFboApiTestGroup::FboApiTestGroup (Context& context)
5983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: TestCaseGroup(context, "api", "API Tests")
5993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
6003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
6013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6023c827367444ee418f129b2c238299f49d3264554Jarkko PoyryFboApiTestGroup::~FboApiTestGroup (void)
6033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
6043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
6053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6063c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid FboApiTestGroup::init (void)
6073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
6083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	std::set<std::string> extensions;
6093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	std::copy(m_context.getContextInfo().getExtensions().begin(), m_context.getContextInfo().getExtensions().end(), std::inserter(extensions, extensions.begin()));
6103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool	defaultFboIsZero	= m_context.getRenderContext().getDefaultFramebuffer() == 0;
6123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool	hasRenderToMipmap	= extensions.find("GL_OES_fbo_render_mipmap") != extensions.end();
6133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Valid attachments
6153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(new FboApiCase(m_context, "valid_tex2d_attachments",					"Valid 2D texture attachments",							validTex2DAttachmentsTest));
6163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(new FboApiCase(m_context, "valid_texcube_attachments",					"Valid cubemap attachments",							validTexCubeAttachmentsTest));
6173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(new FboApiCase(m_context, "valid_rbo_attachments",						"Valid renderbuffer attachments",						validRboAttachmentsTest));
6183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Invalid attachments
6203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(new FboApiCase(m_context, "attach_to_default_fbo",						"Invalid usage: attaching to default FBO",				defaultFboIsZero ? attachToDefaultFramebufferTest : notSupportedTest));
6213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(new FboApiCase(m_context, "invalid_tex2d_attachments",					"Invalid 2D texture attachments",						invalidTex2DAttachmentTest));
6223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(new FboApiCase(m_context, "invalid_texcube_attachments",				"Invalid cubemap attachments",							invalidTexCubeAttachmentTest));
6233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(new FboApiCase(m_context, "invalid_rbo_attachments",					"Invalid renderbuffer attachments",						invalidRboAttachmentTest));
6243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(new FboApiCase(m_context, "attach_names",								"Attach allocated names without objects",				attachNamesTest));
6253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(new FboApiCase(m_context, "texture_levels",							"Valid and invalid texturel levels",					hasRenderToMipmap ? textureLevelsWithRenderToMipmapTest : textureLevelsTest));
6273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Attachment queries
6293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(new FboApiCase(m_context, "attachment_query_default_fbo",				"Query attachments from default FBO",					defaultFboIsZero ? attachmentQueryDefaultFboTest : notSupportedTest));
6303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(new FboApiCase(m_context, "attachment_query_empty_fbo",				"Query attachments from empty FBO",						attachmentQueryEmptyFboTest));
6313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(new FboApiCase(m_context, "attachment_query_tex2d",					"Query 2d texture attachment properties",				attachmentQueryTex2DTest));
6323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(new FboApiCase(m_context, "attachment_query_texcube",					"Query cubemap attachment properties",					attachmentQueryTexCubeTest));
6333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(new FboApiCase(m_context, "attachment_query_rbo",						"Query renderbuffer attachment properties",				attachmentQueryRboTest));
6343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Delete attachments
6363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(new FboApiCase(m_context, "delete_tex_2d_attached_to_bound_fbo",		"Delete 2d texture attached to currently bound FBO",	deleteTex2DAttachedToBoundFboTest));
6373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(new FboApiCase(m_context, "delete_tex_cube_attached_to_bound_fbo",		"Delete cubemap attached to currently bound FBO",		deleteTexCubeAttachedToBoundFboTest));
6383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(new FboApiCase(m_context, "delete_rbo_attached_to_bound_fbo",			"Delete renderbuffer attached to currently bound FBO",	deleteRboAttachedToBoundFboTest));
6393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(new FboApiCase(m_context, "delete_tex_2d_attached_to_not_bound_fbo",	"Delete 2d texture attached to FBO",					deleteTex2DAttachedToNotBoundFboTest));
6413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(new FboApiCase(m_context, "delete_tex_cube_attached_to_not_bound_fbo",	"Delete cubemap attached to FBO",						deleteTexCubeAttachedToNotBoundFboTest));
6423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(new FboApiCase(m_context, "delete_rbo_attached_to_not_bound_fbo",		"Delete renderbuffer attached to FBO",					deleteRboAttachedToNotBoundFboTest));
6433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
6443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // Functional
6463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // gles2
6473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // deqp
648