148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/*-------------------------------------------------------------------------
248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * OpenGL Conformance Test Suite
348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * -----------------------------
448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * Copyright (c) 2014-2016 The Khronos Group Inc.
648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * Licensed under the Apache License, Version 2.0 (the "License");
848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * you may not use this file except in compliance with the License.
948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * You may obtain a copy of the License at
1048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
1148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *      http://www.apache.org/licenses/LICENSE-2.0
1248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
1348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * Unless required by applicable law or agreed to in writing, software
1448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * distributed under the License is distributed on an "AS IS" BASIS,
1548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * See the License for the specific language governing permissions and
1748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * limitations under the License.
1848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
1984322c9402f810da3cd80b52e9f9ef72150a9004Alexander Galazin */ /*!
2048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * \file
2148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * \brief
2284322c9402f810da3cd80b52e9f9ef72150a9004Alexander Galazin */ /*-------------------------------------------------------------------*/
2348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
2448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "es31cVertexAttribBindingTests.hpp"
2548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "glwEnums.hpp"
2648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "tcuMatrix.hpp"
2748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "tcuRenderTarget.hpp"
2848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include <cstdarg>
2948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
3048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include <cmath>
3148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
3248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosnamespace glcts
3348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
3448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosusing namespace glw;
3548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosusing tcu::Vec4;
3648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosusing tcu::IVec4;
3748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosusing tcu::UVec4;
3848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosusing tcu::Vec3;
3948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosusing tcu::IVec3;
4048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosusing tcu::UVec3;
4148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosusing tcu::Vec2;
4248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosusing tcu::IVec2;
4348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosusing tcu::UVec2;
4448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosusing tcu::Mat4;
4548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
4648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosnamespace
4748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
4848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
4948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass VertexAttribBindingBase : public glcts::SubcaseBase
5048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
5148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual std::string Title()
5248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
5348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NL "";
5448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
5548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
5648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual std::string Purpose()
5748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
5848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NL "";
5948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
6048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
6148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual std::string Method()
6248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
6348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NL "";
6448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
6548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
6648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual std::string PassCriteria()
6748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
6848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NL "";
6948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
7048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
7148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulospublic:
7248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool IsSSBOInVSFSAvailable(int required)
7348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
7448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLint blocksVS, blocksFS;
7548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGetIntegerv(GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS, &blocksVS);
7648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGetIntegerv(GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS, &blocksFS);
7748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (blocksVS >= required && blocksFS >= required)
7848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return true;
7948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		else
8048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
8148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			std::ostringstream reason;
8248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			reason << "Required " << required << " VS storage blocks but only " << blocksVS << " available."
8348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				   << std::endl
8448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				   << "Required " << required << " FS storage blocks but only " << blocksFS << " available."
8548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				   << std::endl;
8648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			OutputNotSupported(reason.str());
8748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return false;
8848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
8948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
9048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
9148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	int getWindowWidth()
9248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
9348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const tcu::RenderTarget& renderTarget = m_context.getRenderTarget();
9448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return renderTarget.getWidth();
9548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
9648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
9748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	int getWindowHeight()
9848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
9948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const tcu::RenderTarget& renderTarget = m_context.getRenderTarget();
10048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return renderTarget.getHeight();
10148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
10248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
10348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	inline bool ColorEqual(const Vec4& c0, const Vec4& c1, const Vec4& epsilon)
10448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
10548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (fabs(c0[0] - c1[0]) > epsilon[0])
10648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return false;
10748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (fabs(c0[1] - c1[1]) > epsilon[1])
10848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return false;
10948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (fabs(c0[2] - c1[2]) > epsilon[2])
11048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return false;
11148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (fabs(c0[3] - c1[3]) > epsilon[3])
11248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return false;
11348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return true;
11448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
11548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
11648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool CheckProgram(GLuint program)
11748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
11848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLint status;
11948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGetProgramiv(program, GL_LINK_STATUS, &status);
12048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
12148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (status == GL_FALSE)
12248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
12348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLint attached_shaders;
12448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glGetProgramiv(program, GL_ATTACHED_SHADERS, &attached_shaders);
12548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
12648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (attached_shaders > 0)
12748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
12848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				std::vector<GLuint> shaders(attached_shaders);
12948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				glGetAttachedShaders(program, attached_shaders, NULL, &shaders[0]);
13048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
13148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				for (GLint i = 0; i < attached_shaders; ++i)
13248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				{
13348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					GLenum type;
13448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					glGetShaderiv(shaders[i], GL_SHADER_TYPE, reinterpret_cast<GLint*>(&type));
13548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					switch (type)
13648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					{
13748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					case GL_VERTEX_SHADER:
1383890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski						m_context.getTestContext().getLog()
1393890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski							<< tcu::TestLog::Message << "*** Vertex Shader ***" << tcu::TestLog::EndMessage;
14048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						break;
14148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					case GL_FRAGMENT_SHADER:
1423890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski						m_context.getTestContext().getLog()
1433890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski							<< tcu::TestLog::Message << "*** Fragment Shader ***" << tcu::TestLog::EndMessage;
14448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						break;
14548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					default:
1463890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski						m_context.getTestContext().getLog()
1473890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski							<< tcu::TestLog::Message << "*** Unknown Shader ***" << tcu::TestLog::EndMessage;
14848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						break;
14948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					}
15048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					GLint length;
15148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					glGetShaderiv(shaders[i], GL_SHADER_SOURCE_LENGTH, &length);
15248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					if (length > 0)
15348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					{
15448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						std::vector<GLchar> source(length);
15548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						glGetShaderSource(shaders[i], length, NULL, &source[0]);
1563890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski						m_context.getTestContext().getLog()
1573890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski							<< tcu::TestLog::Message << &source[0] << tcu::TestLog::EndMessage;
15848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					}
15948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					glGetShaderiv(shaders[i], GL_INFO_LOG_LENGTH, &length);
16048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					if (length > 0)
16148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					{
16248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						std::vector<GLchar> log(length);
16348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						glGetShaderInfoLog(shaders[i], length, NULL, &log[0]);
1643890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski						m_context.getTestContext().getLog()
1653890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski							<< tcu::TestLog::Message << &log[0] << tcu::TestLog::EndMessage;
16648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					}
16748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				}
16848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
16948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLint length;
17048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glGetProgramiv(program, GL_INFO_LOG_LENGTH, &length);
17148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (length > 0)
17248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
17348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				std::vector<GLchar> log(length);
17448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				glGetProgramInfoLog(program, length, NULL, &log[0]);
1753890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				m_context.getTestContext().getLog() << tcu::TestLog::Message << &log[0] << tcu::TestLog::EndMessage;
17648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
17748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
17848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return status == GL_TRUE ? true : false;
17948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
18048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
18148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool IsEqual(IVec4 a, IVec4 b)
18248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
18348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return (a[0] == b[0]) && (a[1] == b[1]) && (a[2] == b[2]) && (a[3] == b[3]);
18448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
18548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
18648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool IsEqual(UVec4 a, UVec4 b)
18748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
18848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return (a[0] == b[0]) && (a[1] == b[1]) && (a[2] == b[2]) && (a[3] == b[3]);
18948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
19048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
19148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool IsEqual(Vec2 a, Vec2 b)
19248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
19348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return (a[0] == b[0]) && (a[1] == b[1]);
19448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
19548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
19648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool IsEqual(IVec2 a, IVec2 b)
19748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
19848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return (a[0] == b[0]) && (a[1] == b[1]);
19948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
20048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
20148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool IsEqual(UVec2 a, UVec2 b)
20248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
20348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return (a[0] == b[0]) && (a[1] == b[1]);
20448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
20548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
20648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool CheckFB(Vec3 expected)
20748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
20848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const tcu::RenderTarget& renderTarget = m_context.getRenderContext().getRenderTarget();
20948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const tcu::PixelFormat&  pixelFormat  = renderTarget.getPixelFormat();
21048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		Vec3					 g_color_eps  = Vec3(1.f / static_cast<float>(1 << pixelFormat.redBits),
21148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								1.f / static_cast<float>(1 << pixelFormat.greenBits),
21248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								1.f / static_cast<float>(1 << pixelFormat.blueBits));
21348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		Vec3				 g_color_max = Vec3(255);
21448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		std::vector<GLubyte> fb(getWindowWidth() * getWindowHeight() * 4);
21548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		int					 fb_w = getWindowWidth();
21648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		int					 fb_h = getWindowHeight();
21748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glReadPixels(0, 0, fb_w, fb_h, GL_RGBA, GL_UNSIGNED_BYTE, &fb[0]);
21848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (GLint i = 0, y = 0; y < fb_h; ++y)
21948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			for (GLint x = 0; x < fb_w; ++x, i += 4)
22048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
22148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				if (fabs(fb[i + 0] / g_color_max[0] - expected[0]) > g_color_eps[0] ||
22248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					fabs(fb[i + 1] / g_color_max[1] - expected[1]) > g_color_eps[1] ||
22348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					fabs(fb[i + 2] / g_color_max[2] - expected[2]) > g_color_eps[2])
22448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				{
2253890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski					m_context.getTestContext().getLog()
2263890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski						<< tcu::TestLog::Message << "Incorrect framebuffer color at pixel (" << x << " " << y
2273890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski						<< "). Color is (" << fb[i + 0] / g_color_max[0] << " " << fb[i + 1] / g_color_max[1] << " "
2283890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski						<< fb[i + 2] / g_color_max[2] << ". Color should be (" << expected[0] << " " << expected[1]
2293890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski						<< " " << expected[2] << ")." << tcu::TestLog::EndMessage;
23048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					return false;
23148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				}
23248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
23348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return true;
23448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
23548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
23648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLhalf FloatToHalf(float f)
23748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
23848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const unsigned int HALF_FLOAT_MIN_BIASED_EXP_AS_SINGLE_FP_EXP = 0x38000000;
23948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* max exponent value in single precision that will be converted */
24048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* to Inf or Nan when stored as a half-float */
24148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const unsigned int HALF_FLOAT_MAX_BIASED_EXP_AS_SINGLE_FP_EXP = 0x47800000;
24248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* 255 is the max exponent biased value */
24348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const unsigned int FLOAT_MAX_BIASED_EXP		 = (0xFF << 23);
24448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const unsigned int HALF_FLOAT_MAX_BIASED_EXP = (0x1F << 10);
24548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		char*			   c						 = reinterpret_cast<char*>(&f);
24648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		unsigned int	   x						 = *reinterpret_cast<unsigned int*>(c);
24748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		unsigned int	   sign						 = (GLhalf)(x >> 31);
24848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		unsigned int	   mantissa;
24948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		unsigned int	   exp;
25048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLhalf			   hf;
25148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
25248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* get mantissa */
25348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		mantissa = x & ((1 << 23) - 1);
25448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* get exponent bits */
25548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		exp = x & FLOAT_MAX_BIASED_EXP;
25648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (exp >= HALF_FLOAT_MAX_BIASED_EXP_AS_SINGLE_FP_EXP)
25748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
25848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* check if the original single precision float number is a NaN */
25948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (mantissa && (exp == FLOAT_MAX_BIASED_EXP))
26048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
26148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				/* we have a single precision NaN */
26248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				mantissa = (1 << 23) - 1;
26348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
26448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			else
26548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
26648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				/* 16-bit half-float representation stores number as Inf */
26748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				mantissa = 0;
26848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
26948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			hf = (GLhalf)((((GLhalf)sign) << 15) | (GLhalf)(HALF_FLOAT_MAX_BIASED_EXP) | (GLhalf)(mantissa >> 13));
27048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
27148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* check if exponent is <= -15 */
27248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		else if (exp <= HALF_FLOAT_MIN_BIASED_EXP_AS_SINGLE_FP_EXP)
27348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
27448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* store a denorm half-float value or zero */
27548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			exp = (HALF_FLOAT_MIN_BIASED_EXP_AS_SINGLE_FP_EXP - exp) >> 23;
27648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			mantissa |= (1 << 23);
27748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			mantissa >>= (14 + exp);
27848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			hf = (GLhalf)((((GLhalf)sign) << 15) | (GLhalf)(mantissa));
27948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
28048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		else
28148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
28248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			hf = (GLhalf)((((GLhalf)sign) << 15) | (GLhalf)((exp - HALF_FLOAT_MIN_BIASED_EXP_AS_SINGLE_FP_EXP) >> 13) |
28348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						  (GLhalf)(mantissa >> 13));
28448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
28548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
28648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return hf;
28748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
28848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos};
28948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//=============================================================================
29048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos// 1.1 BasicUsage
29148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//-----------------------------------------------------------------------------
29248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass BasicUsage : public VertexAttribBindingBase
29348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
29448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool pipeline;
29548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
29648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint m_vsp, m_fsp, m_ppo, m_vao, m_vbo;
29748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
29848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Setup()
29948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
30048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (pipeline)
30148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
30248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_vsp = m_fsp = 0;
30348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glGenProgramPipelines(1, &m_ppo);
30448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
30548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		else
30648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
30748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_ppo = 0;
30848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
30948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGenVertexArrays(1, &m_vao);
31048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGenBuffers(1, &m_vbo);
31148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
31248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
31348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
31448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Cleanup()
31548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
31648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (pipeline)
31748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
31848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glDeleteProgram(m_vsp);
31948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glDeleteProgram(m_fsp);
32048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glDeleteProgramPipelines(1, &m_ppo);
32148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
32248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		else
32348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
32448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glUseProgram(0);
32548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glDeleteProgram(m_ppo);
32648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
32748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDeleteVertexArrays(1, &m_vao);
32848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDeleteBuffers(1, &m_vbo);
32948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
33048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
33148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
33248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Run()
33348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
33448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const char* const glsl_vs =
33548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"#version 310 es" NL "layout(location = 7) in vec4 vs_in_position;" NL
33648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"layout(location = 1) in vec3 vs_in_color;" NL "out vec3 g_color;" NL "void main() {" NL
33748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"  gl_Position = vs_in_position;" NL "  g_color = vs_in_color;" NL "}";
33848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const char* const glsl_fs =
33948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"#version 310 es" NL "precision highp float;" NL "in vec3 g_color;" NL "out vec4 fs_out_color;" NL
34048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"void main() {" NL "  fs_out_color = vec4(g_color, 1);" NL "}";
34148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (pipeline)
34248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
34348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_vsp = glCreateShaderProgramv(GL_VERTEX_SHADER, 1, &glsl_vs);
34448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_fsp = glCreateShaderProgramv(GL_FRAGMENT_SHADER, 1, &glsl_fs);
34548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (!CheckProgram(m_vsp) || !CheckProgram(m_fsp))
34648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				return ERROR;
34748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glUseProgramStages(m_ppo, GL_VERTEX_SHADER_BIT, m_vsp);
34848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glUseProgramStages(m_ppo, GL_FRAGMENT_SHADER_BIT, m_fsp);
34948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
35048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		else
35148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
35248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_ppo			 = glCreateProgram();
35348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			const GLuint sh  = glCreateShader(GL_VERTEX_SHADER);
35448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			const GLuint fsh = glCreateShader(GL_FRAGMENT_SHADER);
35548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glShaderSource(sh, 1, &glsl_vs, NULL);
35648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glShaderSource(fsh, 1, &glsl_fs, NULL);
35748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glCompileShader(sh);
35848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glCompileShader(fsh);
35948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glAttachShader(m_ppo, sh);
36048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glAttachShader(m_ppo, fsh);
36148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glDeleteShader(sh);
36248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glDeleteShader(fsh);
36348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glLinkProgram(m_ppo);
36448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (!CheckProgram(m_ppo))
36548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				return ERROR;
36648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
36748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* vbo */
36848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
36948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			const float data[] = {
37048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				-1.0f, -1.0f, 0.0f,  1.0f, 0.0f, 1.0f, -1.0f, 0.0f,  1.0f, 0.0f, -1.0f, 1.0f, 0.0f,  1.0f,
37148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				0.0f,  1.0f,  1.0f,  0.0f, 1.0f, 0.0f, -1.0f, -1.0f, 1.0f, 1.0f, 0.0f,  1.0f, -1.0f, 1.0f,
37248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				1.0f,  0.0f,  -1.0f, 1.0f, 1.0f, 1.0f, 0.0f,  1.0f,  1.0f, 1.0f, 1.0f,  0.0f,
37348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			};
37448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
37548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW);
37648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBindBuffer(GL_ARRAY_BUFFER, 0);
37748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
37848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexArray(m_vao);
37948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(7, 2, GL_FLOAT, GL_FALSE, 0);
38048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(1, 3, GL_FLOAT, GL_FALSE, 8);
38148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(7, 0);
38248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(1, 0);
38348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexBuffer(0, m_vbo, 0, 20);
38448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnableVertexAttribArray(7);
38548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnableVertexAttribArray(1);
38648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexArray(0);
38748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
38848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glClear(GL_COLOR_BUFFER_BIT);
38948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexArray(m_vao);
39048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (pipeline)
39148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBindProgramPipeline(m_ppo);
39248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		else
39348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glUseProgram(m_ppo);
39448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
39548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
39648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (!CheckFB(Vec3(0, 1, 0)))
39748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return ERROR;
39848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
39948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDrawArrays(GL_TRIANGLE_STRIP, 4, 4);
40048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (!CheckFB(Vec3(1, 1, 0)))
40148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return ERROR;
40248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
40348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
40448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
40548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
40648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulospublic:
40748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	BasicUsage() : pipeline(true)
40848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
40948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
41048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos};
41148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//=============================================================================
41248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos// BasicInputBase
41348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//-----------------------------------------------------------------------------
41448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass BasicInputBase : public VertexAttribBindingBase
41548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
41648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
41748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint m_po, m_xfbo;
41848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
41948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosprotected:
42048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	Vec4	expected_data[60];
42148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLsizei instance_count;
42248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLint   base_instance;
42348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
42448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Setup()
42548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
42648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_po = 0;
42748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGenBuffers(1, &m_xfbo);
42848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (int i			 = 0; i < 60; ++i)
42948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			expected_data[i] = Vec4(0.0f);
43048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		instance_count		 = 1;
43148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		base_instance		 = -1;
43248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
43348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
43448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
43548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Cleanup()
43648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
43748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDisable(GL_RASTERIZER_DISCARD);
43848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glUseProgram(0);
43948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDeleteProgram(m_po);
44048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDeleteBuffers(1, &m_xfbo);
44148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
44248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
44348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
44448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Run()
44548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
44648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const char* const glsl_vs =
44748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"#version 310 es" NL "layout(location = 0) in vec4 vs_in_attrib0;" NL
44848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"layout(location = 1) in vec4 vs_in_attrib1;" NL "layout(location = 2) in vec4 vs_in_attrib2;" NL
44948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"layout(location = 3) in vec4 vs_in_attrib3;" NL "layout(location = 4) in vec4 vs_in_attrib4;" NL
45048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"layout(location = 5) in vec4 vs_in_attrib5;" NL "layout(location = 6) in vec4 vs_in_attrib6;" NL
45148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"layout(location = 7) in vec4 vs_in_attrib7;" NL "layout(location = 8) in vec4 vs_in_attrib8;" NL
45248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"layout(location = 9) in vec4 vs_in_attrib9;" NL "layout(location = 10) in vec4 vs_in_attrib10;" NL
45348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"layout(location = 11) in vec4 vs_in_attrib11;" NL "layout(location = 12) in vec4 vs_in_attrib12;" NL
45448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"layout(location = 13) in vec4 vs_in_attrib13;" NL "layout(location = 14) in vec4 vs_in_attrib14;" NL
45548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"out vec4 attrib[15];" NL "void main() {" NL "  attrib[0] = vs_in_attrib0;" NL
45648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"  attrib[1] = vs_in_attrib1;" NL "  attrib[2] = vs_in_attrib2;" NL "  attrib[3] = vs_in_attrib3;" NL
45748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"  attrib[4] = vs_in_attrib4;" NL "  attrib[5] = vs_in_attrib5;" NL "  attrib[6] = vs_in_attrib6;" NL
45848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"  attrib[7] = vs_in_attrib7;" NL "  attrib[8] = vs_in_attrib8;" NL "  attrib[9] = vs_in_attrib9;" NL
45948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"  attrib[10] = vs_in_attrib10;" NL "  attrib[11] = vs_in_attrib11;" NL "  attrib[12] = vs_in_attrib12;" NL
46048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"  attrib[13] = vs_in_attrib13;" NL "  attrib[14] = vs_in_attrib14;" NL "}";
46148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const char* const glsl_fs = "#version 310 es" NL "precision mediump float;" NL "in vec4 attrib[15];" NL
46248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									"out vec4 fs_out_color;" NL "void main() {" NL "  fs_out_color = attrib[8];" NL "}";
46348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_po = glCreateProgram();
46448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* attach shader */
46548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
46648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			const GLuint sh  = glCreateShader(GL_VERTEX_SHADER);
46748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			const GLuint fsh = glCreateShader(GL_FRAGMENT_SHADER);
46848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glShaderSource(sh, 1, &glsl_vs, NULL);
46948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glShaderSource(fsh, 1, &glsl_fs, NULL);
47048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glCompileShader(sh);
47148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glCompileShader(fsh);
47248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glAttachShader(m_po, sh);
47348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glAttachShader(m_po, fsh);
47448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glDeleteShader(sh);
47548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glDeleteShader(fsh);
47648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
47748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* setup XFB */
47848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
47948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			const GLchar* const v[15] = { "attrib[0]",  "attrib[1]",  "attrib[2]",  "attrib[3]",  "attrib[4]",
48048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										  "attrib[5]",  "attrib[6]",  "attrib[7]",  "attrib[8]",  "attrib[9]",
48148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										  "attrib[10]", "attrib[11]", "attrib[12]", "attrib[13]", "attrib[14]" };
48248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glTransformFeedbackVaryings(m_po, 15, v, GL_INTERLEAVED_ATTRIBS);
48348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
48448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glLinkProgram(m_po);
48548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (!CheckProgram(m_po))
48648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return ERROR;
48748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
48848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* buffer data */
48948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
49048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			std::vector<GLubyte> zero(sizeof(expected_data));
49148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, m_xfbo);
49248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, sizeof(expected_data), &zero[0], GL_DYNAMIC_DRAW);
49348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
49448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
49548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		// capture
49648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnable(GL_RASTERIZER_DISCARD);
49748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glUseProgram(m_po);
49848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBeginTransformFeedback(GL_POINTS);
49948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (base_instance != -1)
50048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
50148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glDrawArraysInstancedBaseInstance(GL_POINTS, 0, 2, instance_count, static_cast<GLuint>(base_instance));
50248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
50348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		else
50448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
50548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glDrawArraysInstanced(GL_POINTS, 0, 2, instance_count);
50648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
50748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEndTransformFeedback();
50848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
50948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		Vec4* data =
51048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			static_cast<Vec4*>(glMapBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, 0, sizeof(Vec4) * 60, GL_MAP_READ_BIT));
51148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
51248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		long status = NO_ERROR;
51348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (int i = 0; i < 60; ++i)
51448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
51548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (!ColorEqual(expected_data[i], data[i], Vec4(0.01f)))
51648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
5173890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				m_context.getTestContext().getLog()
5183890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski					<< tcu::TestLog::Message << "Data is: " << data[i][0] << " " << data[i][1] << " " << data[i][2]
5193890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski					<< " " << data[i][3] << ", data should be: " << expected_data[i][0] << " " << expected_data[i][1]
5203890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski					<< " " << expected_data[i][2] << " " << expected_data[i][3] << ", index is: " << i
5213890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski					<< tcu::TestLog::EndMessage;
52248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				status = ERROR;
52348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				break;
52448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
52548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
52648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return status;
52748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
52848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos};
52948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
53048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//=============================================================================
53148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos// 1.2.1 BasicInputCase1
53248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//-----------------------------------------------------------------------------
53348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass BasicInputCase1 : public BasicInputBase
53448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
53548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
53648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint m_vao, m_vbo;
53748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
53848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Setup()
53948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
54048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		BasicInputBase::Setup();
54148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGenVertexArrays(1, &m_vao);
54248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGenBuffers(1, &m_vbo);
54348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
54448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
54548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
54648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Cleanup()
54748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
54848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		BasicInputBase::Cleanup();
54948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDeleteVertexArrays(1, &m_vao);
55048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDeleteBuffers(1, &m_vbo);
55148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
55248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
55348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
55448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Run()
55548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
55648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (GLuint i = 0; i < 16; ++i)
55748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
55848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glVertexAttrib4f(i, 0.0f, 0.0f, 0.0f, 0.0f);
55948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
56048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
56148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBufferData(GL_ARRAY_BUFFER, sizeof(Vec3) * 2, NULL, GL_STATIC_DRAW);
56248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Vec3), &Vec3(1.0f, 2.0f, 3.0f)[0]);
56348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBufferSubData(GL_ARRAY_BUFFER, 12, sizeof(Vec3), &Vec3(4.0f, 5.0f, 6.0f)[0]);
56448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ARRAY_BUFFER, 0);
56548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
56648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexArray(m_vao);
56748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexBuffer(0, m_vbo, 0, 12);
56848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(1, 3, GL_FLOAT, GL_FALSE, 0);
56948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(1, 0);
57048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnableVertexAttribArray(1);
57148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[1]  = Vec4(1.0f, 2.0f, 3.0f, 1.0f);
57248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[16] = Vec4(4.0f, 5.0f, 6.0f, 1.0f);
57348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return BasicInputBase::Run();
57448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
57548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos};
57648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//=============================================================================
57748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos// 1.2.2 BasicInputCase2
57848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//-----------------------------------------------------------------------------
57948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass BasicInputCase2 : public BasicInputBase
58048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
58148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
58248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint m_vao, m_vbo;
58348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
58448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Setup()
58548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
58648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		BasicInputBase::Setup();
58748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGenVertexArrays(1, &m_vao);
58848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGenBuffers(1, &m_vbo);
58948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
59048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
59148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
59248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Cleanup()
59348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
59448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		BasicInputBase::Cleanup();
59548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDeleteVertexArrays(1, &m_vao);
59648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDeleteBuffers(1, &m_vbo);
59748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
59848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
59948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
60048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Run()
60148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
60248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (GLuint i = 0; i < 16; ++i)
60348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
60448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glVertexAttrib4f(i, 0.0f, 0.0f, 0.0f, 0.0f);
60548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
60648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
60748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBufferData(GL_ARRAY_BUFFER, sizeof(Vec3) * 2, NULL, GL_STATIC_DRAW);
60848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Vec3), &Vec3(1.0f, 2.0f, 3.0f)[0]);
60948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBufferSubData(GL_ARRAY_BUFFER, 12, sizeof(Vec3), &Vec3(4.0f, 5.0f, 6.0f)[0]);
61048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ARRAY_BUFFER, 0);
61148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
61248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexArray(m_vao);
61348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(1, 0);
61448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(0, 2, GL_FLOAT, GL_FALSE, 0);
61548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(1, 3, GL_FLOAT, GL_FALSE, 0);
61648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(7, 1, GL_FLOAT, GL_FALSE, 8);
61748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(14, 2, GL_FLOAT, GL_FALSE, 4);
61848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(0, 0);
61948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(7, 0);
62048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(14, 0);
62148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexBuffer(0, m_vbo, 0, 12);
62248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnableVertexAttribArray(0);
62348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnableVertexAttribArray(1);
62448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnableVertexAttribArray(7);
62548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnableVertexAttribArray(14);
62648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
62748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[0]  = Vec4(1.0f, 2.0f, 0.0f, 1.0f);
62848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[1]  = Vec4(1.0f, 2.0f, 3.0f, 1.0f);
62948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[7]  = Vec4(3.0f, 0.0f, 0.0f, 1.0f);
63048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[14] = Vec4(2.0f, 3.0f, 0.0f, 1.0f);
63148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[15] = Vec4(4.0f, 5.0f, 0.0f, 1.0f);
63248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[16] = Vec4(4.0f, 5.0f, 6.0f, 1.0f);
63348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[22] = Vec4(6.0f, 0.0f, 0.0f, 1.0f);
63448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[29] = Vec4(5.0f, 6.0f, 0.0f, 1.0f);
63548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return BasicInputBase::Run();
63648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
63748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos};
63848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//=============================================================================
63948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos// 1.2.3 BasicInputCase3
64048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//-----------------------------------------------------------------------------
64148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass BasicInputCase3 : public BasicInputBase
64248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
64348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
64448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint m_vao, m_vbo;
64548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
64648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Setup()
64748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
64848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		BasicInputBase::Setup();
64948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGenVertexArrays(1, &m_vao);
65048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGenBuffers(1, &m_vbo);
65148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
65248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
65348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
65448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Cleanup()
65548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
65648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		BasicInputBase::Cleanup();
65748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDeleteVertexArrays(1, &m_vao);
65848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDeleteBuffers(1, &m_vbo);
65948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
66048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
66148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
66248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Run()
66348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
66448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (GLuint i = 0; i < 16; ++i)
66548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
66648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glVertexAttrib4f(i, 0.0f, 0.0f, 0.0f, 0.0f);
66748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
66848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
66948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBufferData(GL_ARRAY_BUFFER, 36 * 2, NULL, GL_STATIC_DRAW);
67048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
67148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
67248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLubyte d[] = { 1, 2, 3, 4 };
67348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(d), d);
67448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
67548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBufferSubData(GL_ARRAY_BUFFER, 16, sizeof(Vec3), &Vec3(5.0f, 6.0f, 7.0f)[0]);
67648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBufferSubData(GL_ARRAY_BUFFER, 28, sizeof(Vec2), &Vec2(8.0f, 9.0f)[0]);
67748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
67848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
67948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLubyte d[] = { 10, 11, 12, 13 };
68048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 0 + 36, sizeof(d), d);
68148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
68248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBufferSubData(GL_ARRAY_BUFFER, 16 + 36, sizeof(Vec3), &Vec3(14.0f, 15.0f, 16.0f)[0]);
68348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBufferSubData(GL_ARRAY_BUFFER, 28 + 36, sizeof(Vec2), &Vec2(17.0f, 18.0f)[0]);
68448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ARRAY_BUFFER, 0);
68548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
68648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexArray(m_vao);
68748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnableVertexAttribArray(1);
68848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(0, 4, GL_UNSIGNED_BYTE, GL_FALSE, 0);
68948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(1, 3);
69048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(1, 3, GL_FLOAT, GL_FALSE, 16);
69148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(2, 3);
69248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(2, 2, GL_FLOAT, GL_FALSE, 28);
69348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(0, 3);
69448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexBuffer(3, m_vbo, 0, 36);
69548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnableVertexAttribArray(0);
69648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnableVertexAttribArray(2);
69748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
69848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[0]	  = Vec4(1.0f, 2.0f, 3.0f, 4.0f);
69948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[1]	  = Vec4(5.0f, 6.0f, 7.0f, 1.0f);
70048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[2]	  = Vec4(8.0f, 9.0f, 0.0f, 1.0f);
70148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[0 + 15] = Vec4(10.0f, 11.0f, 12.0f, 13.0f);
70248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[1 + 15] = Vec4(14.0f, 15.0f, 16.0f, 1.0f);
70348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[2 + 15] = Vec4(17.0f, 18.0f, 0.0f, 1.0f);
70448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return BasicInputBase::Run();
70548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
70648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos};
70748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//=============================================================================
70848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos// 1.2.4 BasicInputCase4
70948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//-----------------------------------------------------------------------------
71048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass BasicInputCase4 : public BasicInputBase
71148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
71248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
71348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint m_vao, m_vbo[2];
71448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
71548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Setup()
71648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
71748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		BasicInputBase::Setup();
71848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGenVertexArrays(1, &m_vao);
71948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGenBuffers(2, m_vbo);
72048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
72148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
72248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
72348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Cleanup()
72448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
72548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		BasicInputBase::Cleanup();
72648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDeleteVertexArrays(1, &m_vao);
72748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDeleteBuffers(2, m_vbo);
72848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
72948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
73048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
73148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Run()
73248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
73348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (GLuint i = 0; i < 16; ++i)
73448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
73548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glVertexAttrib4f(i, 0.0f, 0.0f, 0.0f, 0.0f);
73648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
73748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ARRAY_BUFFER, m_vbo[0]);
73848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBufferData(GL_ARRAY_BUFFER, 20 * 2, NULL, GL_STATIC_DRAW);
73948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
74048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
74148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLbyte d[] = { -127, 127, -127, 127 };
74248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(d), d);
74348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
74448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
74548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
74648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLushort d[] = { 1, 2, 3, 4 };
74748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 4, sizeof(d), d);
74848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
74948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
75048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
75148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLuint d[] = { 5, 6 };
75248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 12, sizeof(d), d);
75348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
75448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
75548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
75648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLbyte d[] = { 127, -127, 127, -127 };
75748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 0 + 20, sizeof(d), d);
75848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
75948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
76048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
76148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLushort d[] = { 7, 8, 9, 10 };
76248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 4 + 20, sizeof(d), d);
76348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
76448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
76548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
76648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLuint d[] = { 11, 12 };
76748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 12 + 20, sizeof(d), d);
76848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
76948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ARRAY_BUFFER, m_vbo[1]);
77048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBufferData(GL_ARRAY_BUFFER, 24 * 2 + 8, NULL, GL_STATIC_DRAW);
77148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
77248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
77348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLhalf d[] = { FloatToHalf(0.0), FloatToHalf(100.0), FloatToHalf(200.0) };
77448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(d), d);
77548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
77648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
77748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
77848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLhalf d[] = { FloatToHalf(300.0), FloatToHalf(400.0) };
77948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 26, sizeof(d), d);
78048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
78148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ARRAY_BUFFER, 0);
78248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
78348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexArray(m_vao);
78448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(0, 4, GL_BYTE, GL_TRUE, 0);
78548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(1, 4, GL_UNSIGNED_SHORT, GL_FALSE, 4);
78648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(2, 2, GL_UNSIGNED_INT, GL_FALSE, 12);
78748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(5, 2, GL_HALF_FLOAT, GL_FALSE, 0);
78848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(0, 0);
78948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(1, 0);
79048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(2, 0);
79148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(5, 6);
79248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexBuffer(0, m_vbo[0], 0, 20);
79348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexBuffer(6, m_vbo[1], 2, 24);
79448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnableVertexAttribArray(0);
79548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnableVertexAttribArray(1);
79648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnableVertexAttribArray(2);
79748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnableVertexAttribArray(5);
79848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
79948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[0]	  = Vec4(-1.0f, 1.0f, -1.0f, 1.0f);
80048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[1]	  = Vec4(1.0f, 2.0f, 3.0f, 4.0f);
80148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[2]	  = Vec4(5.0f, 6.0f, 0.0f, 1.0f);
80248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[5]	  = Vec4(100.0f, 200.0f, 0.0f, 1.0f);
80348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[0 + 15] = Vec4(1.0f, -1.0f, 1.0f, -1.0f);
80448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[1 + 15] = Vec4(7.0f, 8.0f, 9.0f, 10.0f);
80548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[2 + 15] = Vec4(11.0f, 12.0f, 0.0f, 1.0f);
80648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[5 + 15] = Vec4(300.0f, 400.0f, 0.0f, 1.0f);
80748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return BasicInputBase::Run();
80848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
80948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos};
81048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//=============================================================================
81148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos// 1.2.5 BasicInputCase5
81248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//-----------------------------------------------------------------------------
81348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass BasicInputCase5 : public BasicInputBase
81448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
81548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
81648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint m_vao, m_vbo;
81748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
81848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Setup()
81948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
82048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		BasicInputBase::Setup();
82148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGenVertexArrays(1, &m_vao);
82248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGenBuffers(1, &m_vbo);
82348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
82448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
82548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
82648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Cleanup()
82748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
82848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		BasicInputBase::Cleanup();
82948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDeleteVertexArrays(1, &m_vao);
83048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDeleteBuffers(1, &m_vbo);
83148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
83248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
83348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
83448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Run()
83548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
83648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (GLuint i = 0; i < 16; ++i)
83748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
83848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glVertexAttrib4f(i, 0.0f, 0.0f, 0.0f, 0.0f);
83948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
84048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const int kStride = 116;
84148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
84248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBufferData(GL_ARRAY_BUFFER, kStride * 2, NULL, GL_STATIC_DRAW);
84348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
84448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
84548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLubyte d[] = { 0, 0xff, 0xff / 2, 0 };
84648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(d), d);
84748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
84848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
84948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
85048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLushort d[] = { 0, 0xffff, 0xffff / 2, 0 };
85148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 4, sizeof(d), d);
85248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
85348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
85448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
85548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLuint d[] = { 0, 0xffffffff, 0xffffffff / 2, 0 };
85648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 12, sizeof(d), d);
85748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
85848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
85948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
86048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLbyte d[] = { 0, -127, 127, 0 };
86148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 28, sizeof(d), d);
86248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
86348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
86448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
86548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLshort d[] = { 0, -32767, 32767, 0 };
86648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 32, sizeof(d), d);
86748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
86848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
86948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
87048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLint d[] = { 0, -2147483647, 2147483647, 0 };
87148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 40, sizeof(d), d);
87248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
87348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
87448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
87548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLfloat d[] = { 0, 1.0f, 2.0f, 0 };
87648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 56, sizeof(d), d);
87748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
87848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
87948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
88048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLhalf d[] = { FloatToHalf(0.0), FloatToHalf(10.0), FloatToHalf(20.0), FloatToHalf(0.0) };
88148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 72, sizeof(d), d);
88248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
88348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
88448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
88548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLubyte d[] = { 0, 0xff / 4, 0xff / 2, 0xff };
88648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 104, sizeof(d), d);
88748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
88848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
88948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
89048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLuint d = 0 | (1023 << 10) | (511 << 20) | (1 << 30);
89148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 108, sizeof(d), &d);
89248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
89348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
89448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
89548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLint d = 0 | (511 << 10) | (255 << 20) | (0 << 30);
89648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 112, sizeof(d), &d);
89748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
89848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
89948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
90048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
90148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLubyte d[] = { 0xff, 0xff, 0xff / 2, 0 };
90248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 0 + kStride, sizeof(d), d);
90348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
90448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
90548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
90648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLushort d[] = { 0xffff, 0xffff, 0xffff / 2, 0 };
90748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 4 + kStride, sizeof(d), d);
90848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
90948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
91048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
91148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLuint d[] = { 0xffffffff, 0xffffffff, 0xffffffff / 2, 0 };
91248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 12 + kStride, sizeof(d), d);
91348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
91448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
91548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
91648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLbyte d[] = { 127, -127, 127, 0 };
91748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 28 + kStride, sizeof(d), d);
91848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
91948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
92048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
92148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLshort d[] = { 32767, -32767, 32767, 0 };
92248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 32 + kStride, sizeof(d), d);
92348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
92448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
92548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
92648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLint d[] = { 2147483647, -2147483647, 2147483647, 0 };
92748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 40 + kStride, sizeof(d), d);
92848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
92948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
93048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
93148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLfloat d[] = { 0, 3.0f, 4.0f, 0 };
93248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 56 + kStride, sizeof(d), d);
93348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
93448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
93548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
93648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLhalf d[] = { FloatToHalf(0.0), FloatToHalf(30.0), FloatToHalf(40.0), FloatToHalf(0.0) };
93748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 72 + kStride, sizeof(d), d);
93848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
93948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
94048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
94148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLubyte d[] = { 0xff, 0xff / 2, 0xff / 4, 0 };
94248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 104 + kStride, sizeof(d), d);
94348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
94448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
94548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
94648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLuint d = 0 | (1023 << 10) | (511 << 20) | (2u << 30);
94748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 108 + kStride, sizeof(d), &d);
94848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
94948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
95048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
95148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLint d = (-511 & 0x3ff) | (511 << 10) | (255 << 20) | 3 << 30;
95248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 112 + kStride, sizeof(d), &d);
95348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
95448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ARRAY_BUFFER, 0);
95548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
95648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexArray(m_vao);
95748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(0, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0);
95848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(1, 4, GL_UNSIGNED_SHORT, GL_TRUE, 4);
95948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(2, 4, GL_UNSIGNED_INT, GL_TRUE, 12);
96048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(3, 4, GL_BYTE, GL_TRUE, 28);
96148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(4, 4, GL_SHORT, GL_TRUE, 32);
96248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(5, 4, GL_INT, GL_TRUE, 40);
96348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(6, 4, GL_FLOAT, GL_TRUE, 56);
96448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(7, 4, GL_HALF_FLOAT, GL_TRUE, 72);
96548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(8, 4, GL_UNSIGNED_BYTE, GL_TRUE, 104);
96648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(9, 4, GL_UNSIGNED_INT_2_10_10_10_REV, GL_TRUE, 108);
96748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(10, 4, GL_UNSIGNED_INT_2_10_10_10_REV, GL_TRUE, 108);
96848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(11, 4, GL_INT_2_10_10_10_REV, GL_TRUE, 112);
96948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(12, 4, GL_INT_2_10_10_10_REV, GL_TRUE, 112);
97048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (GLuint i = 0; i < 13; ++i)
97148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
97248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glVertexAttribBinding(i, 0);
97348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glEnableVertexAttribArray(i);
97448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
97548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexBuffer(0, m_vbo, 0, kStride);
97648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
97748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[0]	   = Vec4(0.0f, 1.0f, 0.5f, 0.0f);
97848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[1]	   = Vec4(0.0f, 1.0f, 0.5f, 0.0f);
97948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[2]	   = Vec4(0.0f, 1.0f, 0.5f, 0.0f);
98048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[3]	   = Vec4(0.0f, -1.0f, 1.0f, 0.0f);
98148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[4]	   = Vec4(0.0f, -1.0f, 1.0f, 0.0f);
98248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[5]	   = Vec4(0.0f, -1.0f, 1.0f, 0.0f);
98348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[6]	   = Vec4(0.0f, 1.0f, 2.0f, 0.0f);
98448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[7]	   = Vec4(0.0f, 10.0f, 20.0f, 0.0f);
98548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[8]	   = Vec4(0.0f, 0.25f, 0.5f, 1.0f);
98648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[9]	   = Vec4(0.0f, 1.0f, 0.5f, 0.33f);
98748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[10]	  = Vec4(0.0f, 1.0f, 0.5f, 0.33f);
98848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[11]	  = Vec4(0.0f, 1.0f, 0.5f, 0.0f);
98948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[12]	  = Vec4(0.0f, 1.0f, 0.5f, 0.0f);
99048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[0 + 15]  = Vec4(1.0f, 1.0f, 0.5f, 0.0f);
99148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[1 + 15]  = Vec4(1.0f, 1.0f, 0.5f, 0.0f);
99248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[2 + 15]  = Vec4(1.0f, 1.0f, 0.5f, 0.0f);
99348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[3 + 15]  = Vec4(1.0f, -1.0f, 1.0f, 0.0f);
99448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[4 + 15]  = Vec4(1.0f, -1.0f, 1.0f, 0.0f);
99548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[5 + 15]  = Vec4(1.0f, -1.0f, 1.0f, 0.0f);
99648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[6 + 15]  = Vec4(0.0f, 3.0f, 4.0f, 0.0f);
99748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[7 + 15]  = Vec4(0.0f, 30.0f, 40.0f, 0.0f);
99848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[8 + 15]  = Vec4(1.0f, 0.5f, 0.25f, 0.0f);
99948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[9 + 15]  = Vec4(0.0f, 1.0f, 0.5f, 0.66f);
100048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[10 + 15] = Vec4(0.0f, 1.0f, 0.5f, 0.66f);
100148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[11 + 15] = Vec4(-1.0f, 1.0f, 0.5f, -1.0f);
100248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[12 + 15] = Vec4(-1.0f, 1.0f, 0.5f, -1.0f);
100348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return BasicInputBase::Run();
100448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
100548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos};
100648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//=============================================================================
100748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos// 1.2.6 BasicInputCase6
100848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//-----------------------------------------------------------------------------
100948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass BasicInputCase6 : public BasicInputBase
101048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
101148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
101248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint m_vao, m_vbo;
101348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
101448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Setup()
101548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
101648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		BasicInputBase::Setup();
101748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGenVertexArrays(1, &m_vao);
101848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGenBuffers(1, &m_vbo);
101948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
102048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
102148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
102248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Cleanup()
102348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
102448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		BasicInputBase::Cleanup();
102548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDeleteVertexArrays(1, &m_vao);
102648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDeleteBuffers(1, &m_vbo);
102748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
102848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
102948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
103048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Run()
103148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
103248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (GLuint i = 0; i < 16; ++i)
103348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
103448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glVertexAttrib4f(i, 0.0f, 0.0f, 0.0f, 0.0f);
103548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
103648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const int kStride = 112;
103748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
103848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBufferData(GL_ARRAY_BUFFER, kStride * 2, NULL, GL_STATIC_DRAW);
103948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
104048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
104148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLubyte d[] = { 1, 2, 3, 4 };
104248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(d), d);
104348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
104448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
104548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
104648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLushort d[] = { 5, 6, 7, 8 };
104748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 4, sizeof(d), d);
104848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
104948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
105048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
105148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLuint d[] = { 9, 10, 11, 12 };
105248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 12, sizeof(d), d);
105348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
105448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
105548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
105648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLbyte d[] = { -1, 2, -3, 4 };
105748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 28, sizeof(d), d);
105848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
105948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
106048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
106148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLshort d[] = { -5, 6, -7, 8 };
106248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 32, sizeof(d), d);
106348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
106448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
106548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
106648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLint d[] = { -9, 10, -11, 12 };
106748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 40, sizeof(d), d);
106848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
106948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
107048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
107148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLfloat d[] = { -13.0f, 14.0f, -15.0f, 16.0f };
107248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 56, sizeof(d), d);
107348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
107448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
107548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
107648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLhalf d[] = { FloatToHalf(-18.0), FloatToHalf(19.0), FloatToHalf(-20.0), FloatToHalf(21.0) };
107748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 72, sizeof(d), d);
107848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
107948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
108048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
108148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLuint d = 0 | (11 << 10) | (12 << 20) | (2u << 30);
108248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 104, sizeof(d), &d);
108348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
108448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
108548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
108648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLint d = 0 | ((0xFFFFFFF5 << 10) & (0x3ff << 10)) | (12 << 20) | (1 << 30);
108748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 108, sizeof(d), &d);
108848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
108948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
109048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
109148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
109248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLubyte d[] = { 22, 23, 24, 25 };
109348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 0 + kStride, sizeof(d), d);
109448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
109548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
109648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
109748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLushort d[] = { 26, 27, 28, 29 };
109848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 4 + kStride, sizeof(d), d);
109948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
110048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
110148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
110248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLuint d[] = { 30, 31, 32, 33 };
110348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 12 + kStride, sizeof(d), d);
110448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
110548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
110648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
110748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLbyte d[] = { -34, 35, -36, 37 };
110848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 28 + kStride, sizeof(d), d);
110948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
111048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
111148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
111248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLshort d[] = { -38, 39, -40, 41 };
111348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 32 + kStride, sizeof(d), d);
111448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
111548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
111648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
111748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLint d[] = { -42, 43, -44, 45 };
111848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 40 + kStride, sizeof(d), d);
111948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
112048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
112148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
112248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLfloat d[] = { -46.0f, 47.0f, -48.0f, 49.0f };
112348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 56 + kStride, sizeof(d), d);
112448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
112548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
112648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
112748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLhalf d[] = { FloatToHalf(-50.0), FloatToHalf(51.0), FloatToHalf(-52.0), FloatToHalf(53.0) };
112848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 72 + kStride, sizeof(d), d);
112948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
113048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
113148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
113248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLuint d = 0 | (11 << 10) | (12 << 20) | (1 << 30);
113348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 104 + kStride, sizeof(d), &d);
113448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
113548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
113648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
113748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLint d = 123 | ((0xFFFFFFFD << 10) & (0x3ff << 10)) | ((0xFFFFFE0C << 20) & (0x3ff << 20)) |
113848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					  ((0xFFFFFFFF << 30) & (0x3 << 30));
113948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 108 + kStride, sizeof(d), &d);
114048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
114148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ARRAY_BUFFER, 0);
114248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
114348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexArray(m_vao);
114448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(0, 4, GL_UNSIGNED_BYTE, GL_FALSE, 0);
114548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(1, 4, GL_UNSIGNED_SHORT, GL_FALSE, 4);
114648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(2, 4, GL_UNSIGNED_INT, GL_FALSE, 12);
114748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(3, 4, GL_BYTE, GL_FALSE, 28);
114848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(4, 4, GL_SHORT, GL_FALSE, 32);
114948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(5, 4, GL_INT, GL_FALSE, 40);
115048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(6, 4, GL_FLOAT, GL_FALSE, 56);
115148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(7, 4, GL_HALF_FLOAT, GL_FALSE, 72);
115248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(8, 4, GL_UNSIGNED_INT_2_10_10_10_REV, GL_FALSE, 104);
115348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(9, 4, GL_INT_2_10_10_10_REV, GL_FALSE, 108);
115448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (GLuint i = 0; i < 10; ++i)
115548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
115648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glVertexAttribBinding(i, 0);
115748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glEnableVertexAttribArray(i);
115848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
115948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexBuffer(0, m_vbo, 0, kStride);
116048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
116148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[0]	  = Vec4(1.0f, 2.0f, 3.0f, 4.0f);
116248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[1]	  = Vec4(5.0f, 6.0f, 7.0f, 8.0f);
116348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[2]	  = Vec4(9.0f, 10.0f, 11.0f, 12.0f);
116448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[3]	  = Vec4(-1.0f, 2.0f, -3.0f, 4.0f);
116548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[4]	  = Vec4(-5.0f, 6.0f, -7.0f, 8.0f);
116648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[5]	  = Vec4(-9.0f, 10.0f, -11.0f, 12.0f);
116748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[6]	  = Vec4(-13.0f, 14.0f, -15.0f, 16.0f);
116848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[7]	  = Vec4(-18.0f, 19.0f, -20.0f, 21.0f);
116948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[8]	  = Vec4(0.0f, 11.0f, 12.0f, 2.0f);
117048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[9]	  = Vec4(0.0f, -11.0f, 12.0f, 1.0f);
117148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[0 + 15] = Vec4(22.0f, 23.0f, 24.0f, 25.0f);
117248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[1 + 15] = Vec4(26.0f, 27.0f, 28.0f, 29.0f);
117348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[2 + 15] = Vec4(30.0f, 31.0f, 32.0f, 33.0f);
117448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[3 + 15] = Vec4(-34.0f, 35.0f, -36.0f, 37.0f);
117548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[4 + 15] = Vec4(-38.0f, 39.0f, -40.0f, 41.0f);
117648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[5 + 15] = Vec4(-42.0f, 43.0f, -44.0f, 45.0f);
117748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[6 + 15] = Vec4(-46.0f, 47.0f, -48.0f, 49.0f);
117848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[7 + 15] = Vec4(-50.0f, 51.0f, -52.0f, 53.0f);
117948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[8 + 15] = Vec4(0.0f, 11.0f, 12.0f, 1.0f);
118048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[9 + 15] = Vec4(123.0f, -3.0f, -500.0f, -1.0f);
118148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return BasicInputBase::Run();
118248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
118348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos};
118448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//=============================================================================
118548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos// 1.2.8 BasicInputCase8
118648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//-----------------------------------------------------------------------------
118748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass BasicInputCase8 : public BasicInputBase
118848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
118948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
119048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint m_vao, m_vbo[2];
119148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
119248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Setup()
119348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
119448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		BasicInputBase::Setup();
119548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGenVertexArrays(1, &m_vao);
119648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGenBuffers(2, m_vbo);
119748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
119848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
119948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
120048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Cleanup()
120148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
120248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		BasicInputBase::Cleanup();
120348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDeleteVertexArrays(1, &m_vao);
120448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDeleteBuffers(2, m_vbo);
120548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
120648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
120748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
120848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Run()
120948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
121048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (GLuint i = 0; i < 16; ++i)
121148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
121248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glVertexAttrib4f(i, 0.0f, 0.0f, 0.0f, 0.0f);
121348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
121448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ARRAY_BUFFER, m_vbo[0]);
121548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBufferData(GL_ARRAY_BUFFER, 6 * 4, NULL, GL_STATIC_DRAW);
121648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
121748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
121848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLfloat d[] = { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f };
121948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(d), d);
122048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
122148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
122248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ARRAY_BUFFER, m_vbo[1]);
122348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBufferData(GL_ARRAY_BUFFER, 10 * 4, NULL, GL_STATIC_DRAW);
122448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
122548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
122648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLfloat d[] = { -1.0f, -2.0f, -3.0f, -4.0f, -5.0f, -6.0f, -7.0f, -8.0f, -9.0f, -10.0f };
122748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(d), d);
122848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
122948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ARRAY_BUFFER, 0);
123048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
123148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexArray(m_vao);
123248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(0, 3, GL_FLOAT, GL_FALSE, 0);
123348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(1, 3, GL_FLOAT, GL_FALSE, 0);
123448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(2, 1, GL_FLOAT, GL_FALSE, 4);
123548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(5, 4, GL_FLOAT, GL_FALSE, 12);
123648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(14, 2, GL_FLOAT, GL_FALSE, 8);
123748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(0, 0);
123848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(1, 1);
123948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(2, 1);
124048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(5, 15);
124148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(14, 7);
124248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexBuffer(0, m_vbo[0], 0, 12);
124348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexBuffer(1, m_vbo[0], 4, 4);
124448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexBuffer(7, m_vbo[1], 8, 16);
124548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexBuffer(15, m_vbo[1], 12, 0);
124648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnableVertexAttribArray(0);
124748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnableVertexAttribArray(1);
124848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnableVertexAttribArray(2);
124948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnableVertexAttribArray(5);
125048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnableVertexAttribArray(14);
125148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
125248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[0]	   = Vec4(1.0f, 2.0f, 3.0f, 1.0f);
125348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[1]	   = Vec4(2.0f, 3.0f, 4.0f, 1.0f);
125448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[2]	   = Vec4(3.0f, 0.0f, 0.0f, 1.0f);
125548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[5]	   = Vec4(-7.0f, -8.0f, -9.0f, -10.0f);
125648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[14]	  = Vec4(-5.0f, -6.0f, 0.0f, 1.0f);
125748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[0 + 15]  = Vec4(4.0f, 5.0f, 6.0f, 1.0f);
125848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[1 + 15]  = Vec4(3.0f, 4.0f, 5.0f, 1.0f);
125948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[2 + 15]  = Vec4(4.0f, 0.0f, 0.0f, 1.0f);
126048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[5 + 15]  = Vec4(-7.0f, -8.0f, -9.0f, -10.0f);
126148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[14 + 15] = Vec4(-9.0f, -10.0f, 0.0f, 1.0f);
126248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return BasicInputBase::Run();
126348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
126448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos};
126548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//=============================================================================
126648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos// 1.2.9 BasicInputCase9
126748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//-----------------------------------------------------------------------------
126848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass BasicInputCase9 : public BasicInputBase
126948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
127048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
127148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint m_vao, m_vbo[2];
127248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
127348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Setup()
127448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
127548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		BasicInputBase::Setup();
127648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGenVertexArrays(1, &m_vao);
127748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGenBuffers(2, m_vbo);
127848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
127948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
128048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
128148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Cleanup()
128248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
128348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		BasicInputBase::Cleanup();
128448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDeleteVertexArrays(1, &m_vao);
128548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDeleteBuffers(2, m_vbo);
128648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
128748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
128848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
128948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Run()
129048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
129148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (GLuint i = 0; i < 16; ++i)
129248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
129348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glVertexAttrib4f(i, 0.0f, 0.0f, 0.0f, 0.0f);
129448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
129548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ARRAY_BUFFER, m_vbo[0]);
129648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBufferData(GL_ARRAY_BUFFER, sizeof(Vec4) * 3, NULL, GL_STATIC_DRAW);
129748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Vec4), &Vec4(1.0f, 2.0f, 3.0f, 4.0f)[0]);
129848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBufferSubData(GL_ARRAY_BUFFER, 16, sizeof(Vec4), &Vec4(5.0f, 6.0f, 7.0f, 8.0f)[0]);
129948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBufferSubData(GL_ARRAY_BUFFER, 32, sizeof(Vec4), &Vec4(9.0f, 10.0f, 11.0f, 12.0f)[0]);
130048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ARRAY_BUFFER, m_vbo[1]);
130148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBufferData(GL_ARRAY_BUFFER, sizeof(Vec4) * 3, NULL, GL_STATIC_DRAW);
130248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Vec4), &Vec4(10.0f, 20.0f, 30.0f, 40.0f)[0]);
130348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBufferSubData(GL_ARRAY_BUFFER, 16, sizeof(Vec4), &Vec4(50.0f, 60.0f, 70.0f, 80.0f)[0]);
130448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ARRAY_BUFFER, 0);
130548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
130648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexArray(m_vao);
130748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(0, 4, GL_FLOAT, GL_FALSE, 0);
130848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(2, 4, GL_FLOAT, GL_FALSE, 0);
130948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(4, 2, GL_FLOAT, GL_FALSE, 4);
131048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(0, 0);
131148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(2, 1);
131248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(4, 3);
131348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnableVertexAttribArray(0);
131448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnableVertexAttribArray(2);
131548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnableVertexAttribArray(4);
131648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexBuffer(0, m_vbo[0], 0, 16);
131748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexBuffer(1, m_vbo[0], 0, 16);
131848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexBuffer(3, m_vbo[1], 4, 8);
131948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexBindingDivisor(1, 1);
132048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
132148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		instance_count		  = 2;
132248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[0]	  = Vec4(1.0f, 2.0f, 3.0f, 4.0f);
132348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[2]	  = Vec4(1.0f, 2.0f, 3.0f, 4.0f);
132448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[4]	  = Vec4(30.0f, 40.0f, 0.0f, 1.0f);
132548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[0 + 15] = Vec4(5.0f, 6.0f, 7.0f, 8.0f);
132648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[2 + 15] = Vec4(1.0f, 2.0f, 3.0f, 4.0f);
132748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[4 + 15] = Vec4(50.0f, 60.0f, 0.0f, 1.0f);
132848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
132948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[0 + 30]	  = Vec4(1.0f, 2.0f, 3.0f, 4.0f);
133048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[2 + 30]	  = Vec4(5.0f, 6.0f, 7.0f, 8.0f);
133148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[4 + 30]	  = Vec4(30.0f, 40.0f, 0.0f, 1.0f);
133248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[0 + 15 + 30] = Vec4(5.0f, 6.0f, 7.0f, 8.0f);
133348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[2 + 15 + 30] = Vec4(5.0f, 6.0f, 7.0f, 8.0f);
133448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[4 + 15 + 30] = Vec4(50.0f, 60.0f, 0.0f, 1.0f);
133548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return BasicInputBase::Run();
133648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
133748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos};
133848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//=============================================================================
133948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos// 1.2.11 BasicInputCase11
134048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//-----------------------------------------------------------------------------
134148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass BasicInputCase11 : public BasicInputBase
134248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
134348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
134448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint m_vao, m_vbo[2];
134548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
134648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Setup()
134748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
134848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		BasicInputBase::Setup();
134948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGenVertexArrays(1, &m_vao);
135048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGenBuffers(2, m_vbo);
135148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
135248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
135348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
135448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Cleanup()
135548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
135648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		BasicInputBase::Cleanup();
135748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDeleteVertexArrays(1, &m_vao);
135848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDeleteBuffers(2, m_vbo);
135948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
136048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
136148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
136248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Run()
136348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
136448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (GLuint i = 0; i < 16; ++i)
136548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
136648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glVertexAttrib4f(i, 0.0f, 0.0f, 0.0f, 0.0f);
136748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
136848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ARRAY_BUFFER, m_vbo[0]);
136948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBufferData(GL_ARRAY_BUFFER, sizeof(Vec4) * 3, NULL, GL_STATIC_DRAW);
137048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Vec4), &Vec4(1.0f, 2.0f, 3.0f, 4.0f)[0]);
137148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBufferSubData(GL_ARRAY_BUFFER, 16, sizeof(Vec4), &Vec4(5.0f, 6.0f, 7.0f, 8.0f)[0]);
137248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBufferSubData(GL_ARRAY_BUFFER, 32, sizeof(Vec4), &Vec4(9.0f, 10.0f, 11.0f, 12.0f)[0]);
137348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ARRAY_BUFFER, m_vbo[1]);
137448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBufferData(GL_ARRAY_BUFFER, sizeof(Vec4) * 3, NULL, GL_STATIC_DRAW);
137548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Vec4), &Vec4(10.0f, 20.0f, 30.0f, 40.0f)[0]);
137648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBufferSubData(GL_ARRAY_BUFFER, 16, sizeof(Vec4), &Vec4(50.0f, 60.0f, 70.0f, 80.0f)[0]);
137748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ARRAY_BUFFER, 0);
137848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
137948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexArray(m_vao);
138048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(0, 4, GL_FLOAT, GL_FALSE, 0);
138148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(2, 4, GL_FLOAT, GL_FALSE, 0);
138248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(4, 2, GL_FLOAT, GL_FALSE, 4);
138348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(0, 0);
138448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(2, 1);
138548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(4, 2);
138648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnableVertexAttribArray(0);
138748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnableVertexAttribArray(2);
138848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnableVertexAttribArray(4);
138948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexBuffer(0, m_vbo[0], 0, 16);
139048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexBuffer(1, m_vbo[0], 0, 16);
139148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexBuffer(2, m_vbo[1], 4, 8);
139248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexBindingDivisor(1, 1);
139348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
139448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		instance_count		  = 2;
139548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[0]	  = Vec4(1.0f, 2.0f, 3.0f, 4.0f);
139648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[2]	  = Vec4(1.0f, 2.0f, 3.0f, 4.0f);
139748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[4]	  = Vec4(30.0f, 40.0f, 0.0f, 1.0f);
139848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[0 + 15] = Vec4(5.0f, 6.0f, 7.0f, 8.0f);
139948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[2 + 15] = Vec4(1.0f, 2.0f, 3.0f, 4.0f);
140048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[4 + 15] = Vec4(50.0f, 60.0f, 0.0f, 1.0f);
140148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
140248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[0 + 30]	  = Vec4(1.0f, 2.0f, 3.0f, 4.0f);
140348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[2 + 30]	  = Vec4(5.0f, 6.0f, 7.0f, 8.0f);
140448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[4 + 30]	  = Vec4(30.0f, 40.0f, 0.0f, 1.0f);
140548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[0 + 15 + 30] = Vec4(5.0f, 6.0f, 7.0f, 8.0f);
140648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[2 + 15 + 30] = Vec4(5.0f, 6.0f, 7.0f, 8.0f);
140748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[4 + 15 + 30] = Vec4(50.0f, 60.0f, 0.0f, 1.0f);
140848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return BasicInputBase::Run();
140948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
141048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos};
141148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//=============================================================================
141248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos// 1.2.12 BasicInputCase12
141348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//-----------------------------------------------------------------------------
141448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass BasicInputCase12 : public BasicInputBase
141548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
141648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
141748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint m_vao, m_vbo;
141848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
141948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Setup()
142048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
142148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		BasicInputBase::Setup();
142248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGenVertexArrays(1, &m_vao);
142348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGenBuffers(1, &m_vbo);
142448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
142548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
142648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
142748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Cleanup()
142848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
142948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		BasicInputBase::Cleanup();
143048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDeleteVertexArrays(1, &m_vao);
143148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDeleteBuffers(1, &m_vbo);
143248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
143348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
143448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
143548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Run()
143648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
143748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (GLuint i = 0; i < 16; ++i)
143848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
143948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glVertexAttrib4f(i, 0.0f, 0.0f, 0.0f, 0.0f);
144048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
144148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
144248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBufferData(GL_ARRAY_BUFFER, sizeof(Vec3) * 2, NULL, GL_STATIC_DRAW);
144348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Vec3), &Vec3(1.0f, 2.0f, 3.0f)[0]);
144448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBufferSubData(GL_ARRAY_BUFFER, 12, sizeof(Vec3), &Vec3(4.0f, 5.0f, 6.0f)[0]);
144548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ARRAY_BUFFER, 0);
144648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
144748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexArray(m_vao);
144848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
144948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		//glVertexAttribFormat(1, 3, GL_FLOAT, GL_FALSE, 0);
145048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		//glVertexAttribBinding(1, 1);
145148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		//glBindVertexBuffer(1, m_vbo, 0, 12);
145248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
145348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 12, 0);
145448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ARRAY_BUFFER, 0);
145548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
145648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(0, 3, GL_FLOAT, GL_FALSE, 0);
145748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(0, 1);
145848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
145948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnableVertexAttribArray(0);
146048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnableVertexAttribArray(1);
146148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
146248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[0]	  = Vec4(1.0f, 2.0f, 3.0f, 1.0f);
146348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[1]	  = Vec4(1.0f, 2.0f, 3.0f, 1.0f);
146448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[0 + 15] = Vec4(4.0f, 5.0f, 6.0f, 1.0f);
146548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_data[1 + 15] = Vec4(4.0f, 5.0f, 6.0f, 1.0f);
146648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return BasicInputBase::Run();
146748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
146848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos};
146948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//=============================================================================
147048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos// BasicInputIBase
147148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//-----------------------------------------------------------------------------
147248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass BasicInputIBase : public VertexAttribBindingBase
147348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
147448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
147548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint m_po, m_xfbo;
147648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
147748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosprotected:
147848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	IVec4   expected_datai[32];
147948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	UVec4   expected_dataui[32];
148048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLsizei instance_count;
148148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint  base_instance;
148248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
148348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Setup()
148448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
148548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_po = 0;
148648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGenBuffers(1, &m_xfbo);
148748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (int i = 0; i < 32; ++i)
148848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
148948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			expected_datai[i]  = IVec4(0);
149048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			expected_dataui[i] = UVec4(0);
149148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
149248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		instance_count = 1;
149348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
149448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
149548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
149648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Cleanup()
149748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
149848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDisable(GL_RASTERIZER_DISCARD);
149948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glUseProgram(0);
150048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDeleteProgram(m_po);
150148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDeleteBuffers(1, &m_xfbo);
150248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
150348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
150448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
150548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Run()
150648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
150748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const char* const glsl_vs =
150848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"#version 310 es" NL "layout(location = 0) in ivec4 vs_in_attribi0;" NL
150948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"layout(location = 1) in ivec4 vs_in_attribi1;" NL "layout(location = 2) in ivec4 vs_in_attribi2;" NL
151048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"layout(location = 3) in ivec4 vs_in_attribi3;" NL "layout(location = 4) in ivec4 vs_in_attribi4;" NL
151148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"layout(location = 5) in ivec4 vs_in_attribi5;" NL "layout(location = 6) in ivec4 vs_in_attribi6;" NL
151248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"layout(location = 7) in ivec4 vs_in_attribi7;" NL "layout(location = 8) in uvec4 vs_in_attribui8;" NL
151348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"layout(location = 9) in uvec4 vs_in_attribui9;" NL "layout(location = 10) in uvec4 vs_in_attribui10;" NL
151448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"layout(location = 11) in uvec4 vs_in_attribui11;" NL "layout(location = 12) in uvec4 vs_in_attribui12;" NL
151548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"layout(location = 13) in uvec4 vs_in_attribui13;" NL "layout(location = 14) in uvec4 vs_in_attribui14;" NL
151648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"layout(location = 15) in uvec4 vs_in_attribui15;" NL "flat out ivec4 attribi[8];" NL
151748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"flat out uvec4 attribui[7];" NL "void main() {" NL "  attribi[0] = vs_in_attribi0;" NL
151848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"  attribi[1] = vs_in_attribi1;" NL "  attribi[2] = vs_in_attribi2;" NL "  attribi[3] = vs_in_attribi3;" NL
151948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"  attribi[4] = vs_in_attribi4;" NL "  attribi[5] = vs_in_attribi5;" NL "  attribi[6] = vs_in_attribi6;" NL
152048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"  attribi[7] = vs_in_attribi7;" NL "  attribui[0] = vs_in_attribui8;" NL
152148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"  attribui[1] = vs_in_attribui9;" NL "  attribui[2] = vs_in_attribui10;" NL
152248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"  attribui[3] = vs_in_attribui11;" NL "  attribui[4] = vs_in_attribui12;" NL
152348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"  attribui[5] = vs_in_attribui13;" NL "  attribui[6] = vs_in_attribui14;" NL "}";
152448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const char* const glsl_fs = "#version 310 es" NL "precision mediump float;" NL "flat in ivec4 attribi[8];" NL
152548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									"flat in uvec4 attribui[7];" NL "out vec4 fs_out_color;" NL "void main() {" NL
152648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									"  fs_out_color = vec4(attribui[1]);" NL "}";
152748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_po = glCreateProgram();
152848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* attach shader */
152948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
153048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			const GLuint sh  = glCreateShader(GL_VERTEX_SHADER);
153148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			const GLuint fsh = glCreateShader(GL_FRAGMENT_SHADER);
153248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glShaderSource(sh, 1, &glsl_vs, NULL);
153348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glShaderSource(fsh, 1, &glsl_fs, NULL);
153448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glCompileShader(sh);
153548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glCompileShader(fsh);
153648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glAttachShader(m_po, sh);
153748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glAttachShader(m_po, fsh);
153848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glDeleteShader(sh);
153948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glDeleteShader(fsh);
154048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
154148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* setup XFB */
154248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
154348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			const GLchar* const v[15] = { "attribi[0]",  "attribi[1]",  "attribi[2]",  "attribi[3]",  "attribi[4]",
154448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										  "attribi[5]",  "attribi[6]",  "attribi[7]",  "attribui[0]", "attribui[1]",
154548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										  "attribui[2]", "attribui[3]", "attribui[4]", "attribui[5]", "attribui[6]" };
154648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glTransformFeedbackVaryings(m_po, 15, v, GL_INTERLEAVED_ATTRIBS);
154748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
154848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glLinkProgram(m_po);
154948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (!CheckProgram(m_po))
155048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return ERROR;
155148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
155248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* buffer data */
155348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
155448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			std::vector<GLubyte> zero(64 * 16);
155548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, m_xfbo);
155648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, (GLsizeiptr)zero.size(), &zero[0], GL_DYNAMIC_COPY);
155748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
155848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
155948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnable(GL_RASTERIZER_DISCARD);
156048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glUseProgram(m_po);
156148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBeginTransformFeedback(GL_POINTS);
156248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDrawArraysInstanced(GL_POINTS, 0, 2, instance_count);
156348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEndTransformFeedback();
156448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
156548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		void*  data   = glMapBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, 0, sizeof(UVec4) * 64, GL_MAP_READ_BIT);
156648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		IVec4* datai  = static_cast<IVec4*>(data);
156748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		UVec4* dataui = (static_cast<UVec4*>(data)) + 8;
156848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
156948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (int i = 0; i < 4; ++i)
157048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			for (int j = 0; j < 8; ++j)
157148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
157248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				if (!IsEqual(expected_datai[i * 8 + j], datai[i * 15 + j]))
157348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				{
15743890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski					m_context.getTestContext().getLog()
15753890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski						<< tcu::TestLog::Message << "Datai is: " << datai[i * 15 + j][0] << " " << datai[i * 15 + j][1]
15763890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski						<< " " << datai[i * 15 + j][2] << " " << datai[i * 15 + j][3]
15773890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski						<< ", data should be: " << expected_datai[i * 8 + j][0] << " " << expected_datai[i * 8 + j][1]
15783890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski						<< " " << expected_datai[i * 8 + j][2] << " " << expected_datai[i * 8 + j][3]
15793890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski						<< ", index is: " << i * 8 + j << tcu::TestLog::EndMessage;
158048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					return ERROR;
158148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				}
158248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				if (j != 7 && !IsEqual(expected_dataui[i * 8 + j], dataui[i * 15 + j]))
158348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				{
15843890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski					m_context.getTestContext().getLog()
15853890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski						<< tcu::TestLog::Message << "Dataui is: " << dataui[i * 15 + j][0] << " "
15863890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski						<< dataui[i * 15 + j][1] << " " << dataui[i * 15 + j][2] << " " << dataui[i * 15 + j][3]
15873890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski						<< ", data should be: " << expected_datai[i * 8 + j][0] << " " << expected_datai[i * 8 + j][1]
15883890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski						<< " " << expected_datai[i * 8 + j][2] << " " << expected_datai[i * 8 + j][3]
15893890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski						<< ", index is: " << i * 8 + j << tcu::TestLog::EndMessage;
159048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					return ERROR;
159148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				}
159248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
159348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
159448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
159548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos};
159648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//=============================================================================
159748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos// 1.3.1 BasicInputICase1
159848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//-----------------------------------------------------------------------------
159948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass BasicInputICase1 : public BasicInputIBase
160048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
160148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
160248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint m_vao, m_vbo;
160348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
160448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Setup()
160548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
160648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		BasicInputIBase::Setup();
160748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGenVertexArrays(1, &m_vao);
160848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGenBuffers(1, &m_vbo);
160948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
161048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
161148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
161248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Cleanup()
161348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
161448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		BasicInputIBase::Cleanup();
161548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDeleteVertexArrays(1, &m_vao);
161648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDeleteBuffers(1, &m_vbo);
161748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
161848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
161948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
162048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Run()
162148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
162248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (GLuint i = 0; i < 8; ++i)
162348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
162448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glVertexAttribI4i(i, 0, 0, 0, 0);
162548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glVertexAttribI4ui(i + 8, 0, 0, 0, 0);
162648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
162748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const int kStride = 88;
162848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
162948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBufferData(GL_ARRAY_BUFFER, kStride * 2, NULL, GL_STATIC_DRAW);
163048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
163148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
163248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLbyte d[] = { 1, -2, 3, -4 };
163348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(d), d);
163448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
163548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
163648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
163748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLshort d[] = { 5, -6, 7, -8 };
163848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 4, sizeof(d), d);
163948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
164048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
164148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
164248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLint d[] = { 9, -10, 11, -12 };
164348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 12, sizeof(d), d);
164448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
164548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
164648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
164748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLubyte d[] = { 13, 14, 15, 16 };
164848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 28, sizeof(d), d);
164948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
165048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
165148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
165248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLushort d[] = { 17, 18, 19, 20 };
165348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 32, sizeof(d), d);
165448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
165548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
165648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
165748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLuint d[] = { 21, 22, 23, 24 };
165848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 40, sizeof(d), d);
165948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
166048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
166148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
166248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLint d[] = { 90, -91, 92, -93 };
166348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 56, sizeof(d), d);
166448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
166548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
166648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
166748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLuint d[] = { 94, 95, 96, 97 };
166848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 72, sizeof(d), d);
166948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
167048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
167148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
167248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
167348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLbyte d[] = { 25, -26, 27, -28 };
167448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 0 + kStride, sizeof(d), d);
167548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
167648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
167748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
167848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLshort d[] = { 29, -30, 31, -32 };
167948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 4 + kStride, sizeof(d), d);
168048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
168148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
168248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
168348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLint d[] = { 33, -34, 35, -36 };
168448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 12 + kStride, sizeof(d), d);
168548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
168648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
168748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
168848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLubyte d[] = { 37, 38, 39, 40 };
168948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 28 + kStride, sizeof(d), d);
169048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
169148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
169248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
169348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLushort d[] = { 41, 42, 43, 44 };
169448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 32 + kStride, sizeof(d), d);
169548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
169648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
169748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
169848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLuint d[] = { 45, 46, 47, 48 };
169948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 40 + kStride, sizeof(d), d);
170048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
170148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
170248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
170348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLint d[] = { 98, -99, 100, -101 };
170448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 56 + kStride, sizeof(d), d);
170548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
170648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
170748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
170848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLuint d[] = { 102, 103, 104, 105 };
170948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferSubData(GL_ARRAY_BUFFER, 72 + kStride, sizeof(d), d);
171048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
171148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ARRAY_BUFFER, 0);
171248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
171348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexArray(m_vao);
171448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribIFormat(0, 1, GL_BYTE, 0);
171548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribIFormat(1, 2, GL_SHORT, 4);
171648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribIFormat(2, 3, GL_INT, 12);
171748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribIFormat(3, 4, GL_INT, 56);
171848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribIFormat(8, 3, GL_UNSIGNED_BYTE, 28);
171948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribIFormat(9, 2, GL_UNSIGNED_SHORT, 32);
172048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribIFormat(10, 1, GL_UNSIGNED_INT, 40);
172148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribIFormat(11, 4, GL_UNSIGNED_INT, 72);
172248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(0, 0);
172348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(1, 0);
172448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(2, 0);
172548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(3, 0);
172648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(8, 0);
172748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(9, 0);
172848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(10, 0);
172948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(11, 0);
173048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexBuffer(0, m_vbo, 0, kStride);
173148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnableVertexAttribArray(0);
173248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnableVertexAttribArray(1);
173348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnableVertexAttribArray(2);
173448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnableVertexAttribArray(3);
173548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnableVertexAttribArray(8);
173648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnableVertexAttribArray(9);
173748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnableVertexAttribArray(10);
173848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnableVertexAttribArray(11);
173948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
174048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_datai[0]   = IVec4(1, 0, 0, 1);
174148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_datai[1]   = IVec4(5, -6, 0, 1);
174248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_datai[2]   = IVec4(9, -10, 11, 1);
174348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_datai[3]   = IVec4(90, -91, 92, -93);
174448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_dataui[0]  = UVec4(13, 14, 15, 1);
174548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_dataui[1]  = UVec4(17, 18, 0, 1);
174648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_dataui[2]  = UVec4(21, 0, 0, 1);
174748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_dataui[3]  = UVec4(94, 95, 96, 97);
174848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_datai[8]   = IVec4(25, 0, 0, 1);
174948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_datai[9]   = IVec4(29, -30, 0, 1);
175048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_datai[10]  = IVec4(33, -34, 35, 1);
175148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_datai[11]  = IVec4(98, -99, 100, -101);
175248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_dataui[8]  = UVec4(37, 38, 39, 1);
175348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_dataui[9]  = UVec4(41, 42, 0, 1);
175448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_dataui[10] = UVec4(45, 0, 0, 1);
175548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_dataui[11] = UVec4(102, 103, 104, 105);
175648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return BasicInputIBase::Run();
175748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
175848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos};
175948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//=============================================================================
176048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos// 1.3.2 BasicInputICase2
176148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//-----------------------------------------------------------------------------
176248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass BasicInputICase2 : public BasicInputIBase
176348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
176448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
176548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint m_vao, m_vbo[2];
176648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
176748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Setup()
176848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
176948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		BasicInputIBase::Setup();
177048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGenVertexArrays(1, &m_vao);
177148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGenBuffers(2, m_vbo);
177248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
177348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
177448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
177548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Cleanup()
177648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
177748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		BasicInputIBase::Cleanup();
177848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDeleteVertexArrays(1, &m_vao);
177948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDeleteBuffers(2, m_vbo);
178048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
178148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
178248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
178348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Run()
178448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
178548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (GLuint i = 0; i < 8; ++i)
178648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
178748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glVertexAttribI4i(i, 0, 0, 0, 0);
178848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glVertexAttribI4ui(i + 8, 0, 0, 0, 0);
178948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
179048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ARRAY_BUFFER, m_vbo[0]);
179148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBufferData(GL_ARRAY_BUFFER, sizeof(IVec3) * 2, NULL, GL_STATIC_DRAW);
179248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(IVec3), &IVec3(1, 2, 3)[0]);
179348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBufferSubData(GL_ARRAY_BUFFER, 12, sizeof(IVec3), &IVec3(4, 5, 6)[0]);
179448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
179548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ARRAY_BUFFER, m_vbo[1]);
179648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBufferData(GL_ARRAY_BUFFER, sizeof(UVec4), NULL, GL_STATIC_DRAW);
179748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(UVec4), &UVec4(10, 20, 30, 40)[0]);
179848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ARRAY_BUFFER, 0);
179948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
180048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexArray(m_vao);
180148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribIFormat(0, 3, GL_INT, 0);
180248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribIFormat(2, 2, GL_INT, 4);
180348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribIFormat(14, 1, GL_UNSIGNED_INT, 0);
180448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(0, 2);
180548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(2, 0);
180648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(14, 7);
180748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnableVertexAttribArray(0);
180848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnableVertexAttribArray(2);
180948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnableVertexAttribArray(14);
181048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexBuffer(0, m_vbo[0], 0, 8);
181148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexBuffer(2, m_vbo[0], 0, 12);
181248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexBuffer(7, m_vbo[1], 4, 16);
181348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexBindingDivisor(0, 1);
181448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexBindingDivisor(2, 0);
181548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexBindingDivisor(7, 2);
181648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
181748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		instance_count		= 2;
181848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_datai[0]   = IVec4(1, 2, 3, 1);
181948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_datai[2]   = IVec4(2, 3, 0, 1);
182048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_dataui[6]  = UVec4(20, 0, 0, 1);
182148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_datai[8]   = IVec4(4, 5, 6, 1);
182248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_datai[10]  = IVec4(2, 3, 0, 1);
182348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_dataui[14] = UVec4(20, 0, 0, 1);
182448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
182548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_datai[16]  = IVec4(1, 2, 3, 1);
182648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_datai[18]  = IVec4(4, 5, 0, 1);
182748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_dataui[22] = UVec4(20, 0, 0, 1);
182848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_datai[24]  = IVec4(4, 5, 6, 1);
182948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_datai[26]  = IVec4(4, 5, 0, 1);
183048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_dataui[30] = UVec4(20, 0, 0, 1);
183148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return BasicInputIBase::Run();
183248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
183348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos};
183448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//=============================================================================
183548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos// 1.3.3 BasicInputICase3
183648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//-----------------------------------------------------------------------------
183748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass BasicInputICase3 : public BasicInputIBase
183848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
183948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
184048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint m_vao, m_vbo;
184148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
184248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Setup()
184348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
184448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		BasicInputIBase::Setup();
184548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGenVertexArrays(1, &m_vao);
184648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGenBuffers(1, &m_vbo);
184748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
184848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
184948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
185048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Cleanup()
185148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
185248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		BasicInputIBase::Cleanup();
185348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDeleteVertexArrays(1, &m_vao);
185448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDeleteBuffers(1, &m_vbo);
185548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
185648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
185748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
185848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Run()
185948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
186048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (GLuint i = 0; i < 8; ++i)
186148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
186248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glVertexAttribI4i(i, 0, 0, 0, 0);
186348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glVertexAttribI4ui(i + 8, 0, 0, 0, 0);
186448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
186548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
186648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBufferData(GL_ARRAY_BUFFER, sizeof(IVec3) * 2, NULL, GL_STATIC_DRAW);
186748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(IVec3), &IVec3(1, 2, 3)[0]);
186848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBufferSubData(GL_ARRAY_BUFFER, 12, sizeof(IVec3), &IVec3(4, 5, 6)[0]);
186948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ARRAY_BUFFER, 0);
187048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
187148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexArray(m_vao);
187248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
187348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
187448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribIPointer(7, 3, GL_INT, 12, 0);
187548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ARRAY_BUFFER, 0);
187648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
187748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribIFormat(0, 2, GL_INT, 4);
187848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(0, 7);
187948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
188048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnableVertexAttribArray(0);
188148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnableVertexAttribArray(7);
188248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
188348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_datai[0]	 = IVec4(2, 3, 0, 1);
188448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_datai[7]	 = IVec4(1, 2, 3, 1);
188548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_datai[0 + 8] = IVec4(5, 6, 0, 1);
188648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		expected_datai[7 + 8] = IVec4(4, 5, 6, 1);
188748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return BasicInputIBase::Run();
188848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
188948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos};
189048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
189148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass VertexAttribState : public glcts::GLWrapper
189248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
189348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulospublic:
189484322c9402f810da3cd80b52e9f9ef72150a9004Alexander Galazin	int		  array_enabled;
189584322c9402f810da3cd80b52e9f9ef72150a9004Alexander Galazin	int		  array_size;
189684322c9402f810da3cd80b52e9f9ef72150a9004Alexander Galazin	int		  array_stride;
189784322c9402f810da3cd80b52e9f9ef72150a9004Alexander Galazin	int		  array_type;
189884322c9402f810da3cd80b52e9f9ef72150a9004Alexander Galazin	int		  array_normalized;
189984322c9402f810da3cd80b52e9f9ef72150a9004Alexander Galazin	int		  array_integer;
190084322c9402f810da3cd80b52e9f9ef72150a9004Alexander Galazin	int		  array_divisor;
190184322c9402f810da3cd80b52e9f9ef72150a9004Alexander Galazin	deUintptr array_pointer;
190284322c9402f810da3cd80b52e9f9ef72150a9004Alexander Galazin	int		  array_buffer_binding;
190384322c9402f810da3cd80b52e9f9ef72150a9004Alexander Galazin	int		  binding;
190484322c9402f810da3cd80b52e9f9ef72150a9004Alexander Galazin	int		  relative_offset;
190584322c9402f810da3cd80b52e9f9ef72150a9004Alexander Galazin	int		  index;
190648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
190748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	VertexAttribState(int attribindex)
190848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		: array_enabled(0)
190948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		, array_size(4)
191048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		, array_stride(0)
191148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		, array_type(GL_FLOAT)
191248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		, array_normalized(0)
191348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		, array_integer(0)
191448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		, array_divisor(0)
191548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		, array_pointer(0)
191648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		, array_buffer_binding(0)
191748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		, binding(attribindex)
191848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		, relative_offset(0)
191948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		, index(attribindex)
192048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
192148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
192248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
192348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool stateVerify()
192448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
192548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLint p;
192648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		bool  status = true;
192748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_ENABLED, &p);
192848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (p != array_enabled)
192948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
19303890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog()
19313890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::Message << "GL_VERTEX_ATTRIB_ARRAY_ENABLED(" << index << ") is " << p << " should be "
19323890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< array_enabled << tcu::TestLog::EndMessage;
193348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			status = false;
193448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
193548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_SIZE, &p);
193648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (p != array_size)
193748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
19383890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog()
19393890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::Message << "GL_VERTEX_ATTRIB_ARRAY_SIZE(" << index << ") is " << p << " should be "
19403890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< array_size << tcu::TestLog::EndMessage;
194148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			status = false;
194248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
194348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_STRIDE, &p);
194448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (p != array_stride)
194548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
19463890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog()
19473890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::Message << "GL_VERTEX_ATTRIB_ARRAY_STRIDE(" << index << ") is " << p << " should be "
19483890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< array_stride << tcu::TestLog::EndMessage;
194948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			status = false;
195048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
195148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_TYPE, &p);
195248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (p != array_type)
195348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
19543890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog()
19553890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::Message << "GL_VERTEX_ATTRIB_ARRAY_TYPE(" << index << ") is " << tcu::toHex(p)
19563890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< " should be " << tcu::toHex(array_type) << tcu::TestLog::EndMessage;
195748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			status = false;
195848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
195948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_NORMALIZED, &p);
196048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (p != array_normalized)
196148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
19623890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog()
19633890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::Message << "GL_VERTEX_ATTRIB_ARRAY_NORMALIZED(" << index << ") is " << p
19643890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< " should be " << array_normalized << tcu::TestLog::EndMessage;
196548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			status = false;
196648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
196748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_INTEGER, &p);
196848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (p != array_integer)
196948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
19703890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog()
19713890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::Message << "GL_VERTEX_ATTRIB_ARRAY_INTEGER(" << index << ") is " << p << " should be "
19723890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< array_integer << tcu::TestLog::EndMessage;
197348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			status = false;
197448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
197548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_DIVISOR, &p);
197648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (p != array_divisor)
197748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
19783890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog()
19793890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::Message << "GL_VERTEX_ATTRIB_ARRAY_DIVISOR(" << index << ") is " << p << " should be "
19803890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< array_divisor << tcu::TestLog::EndMessage;
198148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			status = false;
198248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
198348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		void* pp;
198448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGetVertexAttribPointerv(index, GL_VERTEX_ATTRIB_ARRAY_POINTER, &pp);
198548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (reinterpret_cast<deUintptr>(pp) != array_pointer)
198648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
19873890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog()
19883890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::Message << "GL_VERTEX_ATTRIB_ARRAY_POINTER(" << index << ") is " << pp << " should be "
19893890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< reinterpret_cast<void*>(array_pointer) << tcu::TestLog::EndMessage;
199048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			status = false;
199148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
199248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, &p);
199348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (p != array_buffer_binding)
199448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
19953890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog()
19963890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::Message << "GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING(" << index << ") is " << p
19973890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< " should be " << array_buffer_binding << tcu::TestLog::EndMessage;
199848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			status = false;
199948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
200048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_BINDING, &p);
200148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (static_cast<GLint>(binding) != p)
200248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
20033890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog() << tcu::TestLog::Message << "GL_VERTEX_ATTRIB_BINDING(" << index
20043890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski												<< ") is " << p << " should be " << binding << tcu::TestLog::EndMessage;
200548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			status = false;
200648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
200748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_RELATIVE_OFFSET, &p);
200848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (p != relative_offset)
200948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
20103890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog()
20113890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::Message << "GL_VERTEX_ATTRIB_RELATIVE_OFFSET(" << index << ") is " << p
20123890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< " should be " << relative_offset << tcu::TestLog::EndMessage;
201348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			status = false;
201448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
201548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return status;
201648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
201748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos};
201848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass VertexBindingState : public glcts::GLWrapper
201948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
202048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulospublic:
202148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	int		 buffer;
202248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	long int offset;
202348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	int		 stride;
202448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	int		 divisor;
202548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	int		 index;
202648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
202748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	VertexBindingState(int bindingindex) : buffer(0), offset(0), stride(16), divisor(0), index(bindingindex)
202848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
202948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
203048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool stateVerify()
203148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
203248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		bool  status = true;
203348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLint p;
203448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGetIntegeri_v(GL_VERTEX_BINDING_BUFFER, index, &p);
203548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (p != buffer)
203648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
20373890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog() << tcu::TestLog::Message << "GL_VERTEX_BINDING_BUFFER(" << index
20383890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski												<< ") is " << p << " should be " << buffer << tcu::TestLog::EndMessage;
203948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			status = false;
204048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
204148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLint64 p64;
204248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGetInteger64i_v(GL_VERTEX_BINDING_OFFSET, index, &p64);
204348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (p64 != offset)
204448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
20453890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog()
20463890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::Message << "GL_VERTEX_BINDING_OFFSET(" << index << ") is " << p64 << " should be "
20473890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< offset << tcu::TestLog::EndMessage;
204848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			status = false;
204948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
205048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGetIntegeri_v(GL_VERTEX_BINDING_STRIDE, index, &p);
205148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (p != stride)
205248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
20533890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog() << tcu::TestLog::Message << "GL_VERTEX_BINDING_STRIDE(" << index
20543890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski												<< ") is " << p << " should be " << stride << tcu::TestLog::EndMessage;
205548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			status = false;
205648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
205748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGetIntegeri_v(GL_VERTEX_BINDING_DIVISOR, index, &p);
205848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (p != divisor)
205948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
20603890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog() << tcu::TestLog::Message << "GL_VERTEX_BINDING_DIVISOR(" << index
20613890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski												<< ") is " << p << " should be " << divisor << tcu::TestLog::EndMessage;
206248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			status = false;
206348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
206448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return status;
206548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
206648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos};
206748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//=============================================================================
206848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos// 1.5 BasicState1
206948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//-----------------------------------------------------------------------------
207048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass BasicState1 : public VertexAttribBindingBase
207148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
207248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
207348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint m_vao, m_vbo[3];
207448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
207548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Setup()
207648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
207748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGenVertexArrays(1, &m_vao);
207848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGenBuffers(3, m_vbo);
207948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
208048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
208148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
208248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Cleanup()
208348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
208448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDeleteVertexArrays(1, &m_vao);
208548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDeleteBuffers(3, m_vbo);
208648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
208748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
208848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
208948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Run()
209048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
209148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		bool status = true;
209248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ARRAY_BUFFER, m_vbo[0]);
209348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBufferData(GL_ARRAY_BUFFER, 10000, NULL, GL_DYNAMIC_COPY);
209448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ARRAY_BUFFER, m_vbo[1]);
209548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBufferData(GL_ARRAY_BUFFER, 10000, NULL, GL_DYNAMIC_COPY);
209648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ARRAY_BUFFER, m_vbo[2]);
209748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBufferData(GL_ARRAY_BUFFER, 10000, NULL, GL_DYNAMIC_COPY);
209848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ARRAY_BUFFER, 0);
209948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
210048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLint p;
210148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGetIntegerv(GL_MAX_VERTEX_ATTRIB_BINDINGS, &p);
210248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (p < 16)
210348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
21043890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog() << tcu::TestLog::Message << "GL_MAX_VERTEX_ATTRIB_BINDINGS is" << p
21053890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski												<< "but must be at least 16." << tcu::TestLog::EndMessage;
210648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			status = false;
210748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
210848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGetIntegerv(GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET, &p);
210948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (p < 2047)
211048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
21113890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog() << tcu::TestLog::Message << "GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET is"
21123890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski												<< p << "but must be at least 2047." << tcu::TestLog::EndMessage;
211348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			status = false;
211448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
211548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGetIntegerv(GL_MAX_VERTEX_ATTRIB_STRIDE, &p);
211648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (p < 2048)
211748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
21183890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog() << tcu::TestLog::Message << "GL_MAX_VERTEX_ATTRIB_STRIDE is" << p
21193890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski												<< "but must be at least 2048." << tcu::TestLog::EndMessage;
212048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			status = false;
212148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
212248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
212348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexArray(m_vao);
212448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		// check default state
212548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &p);
212648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (0 != p)
212748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
21283890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog() << tcu::TestLog::Message << "GL_ELEMENT_ARRAY_BUFFER_BINDING is" << p
21293890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski												<< "should be 0." << tcu::TestLog::EndMessage;
213048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			status = false;
213148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
213248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (GLuint i = 0; i < 16; ++i)
213348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
213448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			VertexAttribState va(i);
213548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (!va.stateVerify())
213648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				status = false;
213748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
213848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (GLuint i = 0; i < 16; ++i)
213948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
214048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			VertexBindingState vb(i);
214148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (!vb.stateVerify())
214248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				status = false;
214348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
214448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (!status)
214548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
21463890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog()
21473890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::Message << "Default state check failed." << tcu::TestLog::EndMessage;
214848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			status = false;
214948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
215048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
215148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		VertexAttribState va0(0);
215248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		va0.array_size		 = 2;
215348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		va0.array_type		 = GL_BYTE;
215448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		va0.array_normalized = 1;
215548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		va0.relative_offset  = 16;
215648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		VertexBindingState vb0(0);
215748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(0, 2, GL_BYTE, GL_TRUE, 16);
215848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (!va0.stateVerify() || !vb0.stateVerify())
215948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
21603890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog()
21613890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::Message << "glVertexAttribFormat state change check failed."
21623890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::EndMessage;
216348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			status = false;
216448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
216548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
216648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		VertexAttribState va2(2);
216748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		va2.array_size		= 3;
216848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		va2.array_type		= GL_INT;
216948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		va2.array_integer   = 1;
217048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		va2.relative_offset = 512;
217148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		VertexBindingState vb2(2);
217248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribIFormat(2, 3, GL_INT, 512);
217348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (!va2.stateVerify() || !vb2.stateVerify())
217448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
21753890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog()
21763890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::Message << "glVertexAttribIFormat state change check failed."
21773890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::EndMessage;
217848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			status = false;
217948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
218048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
218148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		va0.array_buffer_binding = m_vbo[0];
218248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		vb0.buffer				 = m_vbo[0];
218348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		vb0.offset				 = 2048;
218448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		vb0.stride				 = 128;
218548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexBuffer(0, m_vbo[0], 2048, 128);
218648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (!va0.stateVerify() || !vb0.stateVerify())
218748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
21883890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog()
21893890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::Message << "glBindVertexBuffer state change check failed." << tcu::TestLog::EndMessage;
219048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			status = false;
219148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
219248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
219348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		va2.array_buffer_binding = m_vbo[2];
219448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		vb2.buffer				 = m_vbo[2];
219548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		vb2.offset				 = 64;
219648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		vb2.stride				 = 256;
219748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexBuffer(2, m_vbo[2], 64, 256);
219848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (!va2.stateVerify() || !vb2.stateVerify())
219948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
22003890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog()
22013890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::Message << "glBindVertexBuffer state change check failed." << tcu::TestLog::EndMessage;
220248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			status = false;
220348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
220448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
220548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(2, 0);
220648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		va2.binding				 = 0;
220748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		va2.array_buffer_binding = m_vbo[0];
220848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (!va0.stateVerify() || !vb0.stateVerify() || !va2.stateVerify() || !vb2.stateVerify())
220948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
22103890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog()
22113890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::Message << "glVertexAttribBinding state change check failed."
22123890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::EndMessage;
221348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			status = false;
221448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
221548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
221648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		VertexAttribState  va15(15);
221748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		VertexBindingState vb15(15);
221848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(0, 15);
221948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		va0.binding				 = 15;
222048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		va0.array_buffer_binding = 0;
222148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (!va0.stateVerify() || !vb0.stateVerify() || !va15.stateVerify() || !vb15.stateVerify())
222248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
22233890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog()
22243890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::Message << "glVertexAttribBinding state change check failed."
22253890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::EndMessage;
222648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			status = false;
222748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
222848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
222948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexBuffer(15, m_vbo[1], 16, 32);
223048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		va0.array_buffer_binding  = m_vbo[1];
223148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		va15.array_buffer_binding = m_vbo[1];
223248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		vb15.buffer				  = m_vbo[1];
223348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		vb15.offset				  = 16;
223448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		vb15.stride				  = 32;
223548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (!va0.stateVerify() || !vb0.stateVerify() || !va15.stateVerify() || !vb15.stateVerify())
223648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
22373890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog()
22383890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::Message << "glBindVertexBuffer state change check failed." << tcu::TestLog::EndMessage;
223948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			status = false;
224048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
224148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
224248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(15, 1, GL_HALF_FLOAT, GL_FALSE, 1024);
224348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		va15.array_size		 = 1;
224448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		va15.array_type		 = GL_HALF_FLOAT;
224548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		va15.relative_offset = 1024;
224648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (!va0.stateVerify() || !vb0.stateVerify() || !va2.stateVerify() || !vb2.stateVerify() ||
224748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			!va15.stateVerify() || !vb15.stateVerify())
224848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
22493890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog()
22503890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::Message << "glVertexAttribFormat state change check failed."
22513890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::EndMessage;
225248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			status = false;
225348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
225448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
225548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ARRAY_BUFFER, m_vbo[2]);
225648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribPointer(0, 4, GL_UNSIGNED_BYTE, GL_FALSE, 8, (void*)640);
225748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ARRAY_BUFFER, 0);
225848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		va0.array_size			 = 4;
225948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		va0.array_type			 = GL_UNSIGNED_BYTE;
226048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		va0.array_stride		 = 8;
226148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		va0.array_pointer		 = 640;
226248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		va0.relative_offset		 = 0;
226348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		va0.array_normalized	 = 0;
226448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		va0.binding				 = 0;
226548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		va0.array_buffer_binding = m_vbo[2];
226648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		vb0.buffer				 = m_vbo[2];
226748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		vb0.offset				 = 640;
226848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		vb0.stride				 = 8;
226948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		va2.array_buffer_binding = m_vbo[2];
227048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (!va0.stateVerify() || !vb0.stateVerify() || !va2.stateVerify() || !vb2.stateVerify() ||
227148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			!va15.stateVerify() || !vb15.stateVerify())
227248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
22733890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog()
22743890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::Message << "glVertexAttribPointer state change check failed."
22753890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::EndMessage;
227648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			status = false;
227748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
227848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
227948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexBuffer(0, m_vbo[1], 80, 24);
228048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		vb0.buffer				 = m_vbo[1];
228148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		vb0.offset				 = 80;
228248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		vb0.stride				 = 24;
228348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		va2.array_buffer_binding = m_vbo[1];
228448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		va0.array_buffer_binding = m_vbo[1];
228548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (!va0.stateVerify() || !vb0.stateVerify() || !va2.stateVerify() || !vb2.stateVerify() ||
228648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			!va15.stateVerify() || !vb15.stateVerify())
228748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
22883890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog()
22893890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::Message << "glBindVertexBuffer state change check failed." << tcu::TestLog::EndMessage;
229048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			status = false;
229148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
229248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
229348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (status)
229448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return NO_ERROR;
229548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		else
229648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return ERROR;
229748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
229848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos};
229948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//=============================================================================
230048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos// 1.6 BasicState2
230148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//-----------------------------------------------------------------------------
230248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass BasicState2 : public VertexAttribBindingBase
230348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
230448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
230548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint m_vao;
230648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
230748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Setup()
230848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
230948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGenVertexArrays(1, &m_vao);
231048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
231148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
231248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
231348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Cleanup()
231448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
231548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDeleteVertexArrays(1, &m_vao);
231648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
231748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
231848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
231948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Run()
232048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
232148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		bool status = true;
232248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexArray(m_vao);
232348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
232448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (GLuint i = 0; i < 16; ++i)
232548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
232648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			VertexAttribState  va(i);
232748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			VertexBindingState vb(i);
232848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glVertexAttribDivisor(i, i + 7);
232948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			va.array_divisor = i + 7;
233048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			vb.divisor		 = i + 7;
233148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (!va.stateVerify() || !vb.stateVerify())
233248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
23333890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				m_context.getTestContext().getLog()
23343890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski					<< tcu::TestLog::Message << "glVertexAttribDivisor state change check failed."
23353890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski					<< tcu::TestLog::EndMessage;
233648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				status = false;
233748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
233848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
233948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (GLuint i = 0; i < 16; ++i)
234048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
234148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			VertexAttribState  va(i);
234248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			VertexBindingState vb(i);
234348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glVertexBindingDivisor(i, i);
234448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			va.array_divisor = i;
234548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			vb.divisor		 = i;
234648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (!va.stateVerify() || !vb.stateVerify())
234748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
23483890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				m_context.getTestContext().getLog()
23493890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski					<< tcu::TestLog::Message << "glVertexBindingDivisor state change check failed."
23503890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski					<< tcu::TestLog::EndMessage;
235148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				status = false;
235248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
235348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
235448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
235548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(2, 5);
235648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		VertexAttribState va5(5);
235748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		va5.array_divisor = 5;
235848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		VertexBindingState vb5(5);
235948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		vb5.divisor = 5;
236048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		VertexAttribState va2(2);
236148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		va2.array_divisor = 5; // binding state seen thru mapping
236248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		VertexBindingState vb2(2);
236348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		vb2.divisor = 2;
236448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		va2.binding = 5;
236548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (!va5.stateVerify() || !vb5.stateVerify() || !va2.stateVerify() || !vb2.stateVerify())
236648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
23673890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog()
23683890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::Message << "glVertexAttribBinding state change check failed."
23693890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::EndMessage;
237048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			status = false;
237148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
237248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
237348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribDivisor(2, 23);
237448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		va2.binding		  = 2; // glVAD defaults mapping
237548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		va2.array_divisor = 23;
237648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		vb2.divisor		  = 23;
237748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (!va5.stateVerify() || !vb5.stateVerify() || !va2.stateVerify() || !vb2.stateVerify())
237848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
23793890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog()
23803890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::Message << "glVertexAttribDivisor state change check failed."
23813890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::EndMessage;
238248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			status = false;
238348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
238448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
238548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (status)
238648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return NO_ERROR;
238748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		else
238848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return ERROR;
238948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
239048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos};
239148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//=============================================================================
239248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos// 2.1 AdvancedBindingUpdate
239348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//-----------------------------------------------------------------------------
239448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass AdvancedBindingUpdate : public VertexAttribBindingBase
239548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
239648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool   pipeline;
239748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint m_vao[2], m_vbo[2], m_ebo[2], m_vsp, m_fsp, m_ppo;
239848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
239948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Setup()
240048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
240148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGenVertexArrays(2, m_vao);
240248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGenBuffers(2, m_vbo);
240348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGenBuffers(2, m_ebo);
240448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (pipeline)
240548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
240648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_vsp = m_fsp = 0;
240748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glGenProgramPipelines(1, &m_ppo);
240848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
240948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		else
241048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
241148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_ppo = 0;
241248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
241348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
241448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
241548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
241648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Cleanup()
241748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
241848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDeleteVertexArrays(2, m_vao);
241948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDeleteBuffers(2, m_vbo);
242048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDeleteBuffers(2, m_ebo);
242148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (pipeline)
242248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
242348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glDeleteProgram(m_vsp);
242448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glDeleteProgram(m_fsp);
242548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glDeleteProgramPipelines(1, &m_ppo);
242648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
242748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		else
242848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
242948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glUseProgram(0);
243048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glDeleteProgram(m_ppo);
243148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
243248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
243348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
243448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
243548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Run()
243648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
243748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const char* const glsl_vs =
243848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"#version 310 es" NL "layout(location = 0) in vec4 vs_in_position;" NL
243948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"layout(location = 1) in vec2 vs_in_color_rg;" NL "layout(location = 2) in float vs_in_color_b;" NL
244048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"layout(location = 3) in uvec3 vs_in_data0;" NL "layout(location = 4) in ivec2 vs_in_data1;" NL
244148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"out vec2 color_rg;" NL "out float color_b;" NL "flat out uvec3 data0;" NL "flat out ivec2 data1;" NL
244248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"void main() {" NL "  data0 = vs_in_data0;" NL "  data1 = vs_in_data1;" NL "  color_b = vs_in_color_b;" NL
244348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"  color_rg = vs_in_color_rg;" NL "  gl_Position = vs_in_position;" NL "}";
244448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const char* const glsl_fs =
244548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"#version 310 es" NL "precision highp float;" NL "precision highp int;" NL "in vec2 color_rg;" NL
244648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"in float color_b;" NL "flat in uvec3 data0;" NL "flat in ivec2 data1;" NL "out vec4 fs_out_color;" NL
244748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"uniform uvec3 g_expected_data0;" NL "uniform ivec2 g_expected_data1;" NL "void main() {" NL
244848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"  fs_out_color = vec4(color_rg, color_b, 1);" NL
244948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"  if (data0 != g_expected_data0) fs_out_color = vec4(1);" NL
245048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"  if (data1 != g_expected_data1) fs_out_color = vec4(1);" NL "}";
245148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (pipeline)
245248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
245348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_vsp = glCreateShaderProgramv(GL_VERTEX_SHADER, 1, &glsl_vs);
245448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_fsp = glCreateShaderProgramv(GL_FRAGMENT_SHADER, 1, &glsl_fs);
245548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (!CheckProgram(m_vsp) || !CheckProgram(m_fsp))
245648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				return ERROR;
245748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glUseProgramStages(m_ppo, GL_VERTEX_SHADER_BIT, m_vsp);
245848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glUseProgramStages(m_ppo, GL_FRAGMENT_SHADER_BIT, m_fsp);
245948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
246048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		else
246148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
246248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_ppo			 = glCreateProgram();
246348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			const GLuint sh  = glCreateShader(GL_VERTEX_SHADER);
246448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			const GLuint fsh = glCreateShader(GL_FRAGMENT_SHADER);
246548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glShaderSource(sh, 1, &glsl_vs, NULL);
246648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glShaderSource(fsh, 1, &glsl_fs, NULL);
246748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glCompileShader(sh);
246848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glCompileShader(fsh);
246948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glAttachShader(m_ppo, sh);
247048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glAttachShader(m_ppo, fsh);
247148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glDeleteShader(sh);
247248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glDeleteShader(fsh);
247348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glLinkProgram(m_ppo);
247448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (!CheckProgram(m_ppo))
247548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				return ERROR;
247648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
247748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
247848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const GLsizei  kStride[2] = { 52, 64 };
247948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const GLintptr kOffset[2] = { 0, 8 };
248048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ARRAY_BUFFER, m_vbo[0]);
248148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* first VBO */
248248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
248348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferData(GL_ARRAY_BUFFER, kOffset[0] + 4 * kStride[0], NULL, GL_STATIC_DRAW);
248448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLubyte* ptr = static_cast<GLubyte*>(
248548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				glMapBufferRange(GL_ARRAY_BUFFER, 0, kOffset[0] + 4 * kStride[0], GL_MAP_WRITE_BIT));
248648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			*reinterpret_cast<Vec2*>(&ptr[kOffset[0] + 0 * kStride[0]]) = Vec2(-1.0f, -1.0f);
248748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			*reinterpret_cast<Vec2*>(&ptr[kOffset[0] + 1 * kStride[0]]) = Vec2(1.0f, -1.0f);
248848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			*reinterpret_cast<Vec2*>(&ptr[kOffset[0] + 2 * kStride[0]]) = Vec2(1.0f, 1.0f);
248948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			*reinterpret_cast<Vec2*>(&ptr[kOffset[0] + 3 * kStride[0]]) = Vec2(-1.0f, 1.0f);
249048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			for (int i = 0; i < 4; ++i)
249148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
249248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				*reinterpret_cast<Vec2*>(&ptr[kOffset[0] + 8 + i * kStride[0]])   = Vec2(0.0f, 1.0f);
249348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				*reinterpret_cast<float*>(&ptr[kOffset[0] + 16 + i * kStride[0]]) = 0.0f;
249448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				*reinterpret_cast<UVec3*>(&ptr[kOffset[0] + 20 + i * kStride[0]]) = UVec3(1, 2, 3);
249548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				*reinterpret_cast<IVec2*>(&ptr[kOffset[0] + 44 + i * kStride[0]]) = IVec2(1, 2);
249648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
249748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glUnmapBuffer(GL_ARRAY_BUFFER);
249848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
249948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ARRAY_BUFFER, m_vbo[1]);
250048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* second VBO */
250148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
250248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferData(GL_ARRAY_BUFFER, kOffset[1] + 4 * kStride[1], NULL, GL_STATIC_DRAW);
250348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLubyte* ptr = static_cast<GLubyte*>(
250448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				glMapBufferRange(GL_ARRAY_BUFFER, 0, kOffset[1] + 4 * kStride[1], GL_MAP_WRITE_BIT));
250548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			*reinterpret_cast<Vec2*>(&ptr[kOffset[1] + 0 * kStride[1]]) = Vec2(-1.0f, 1.0f);
250648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			*reinterpret_cast<Vec2*>(&ptr[kOffset[1] + 1 * kStride[1]]) = Vec2(1.0f, 1.0f);
250748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			*reinterpret_cast<Vec2*>(&ptr[kOffset[1] + 2 * kStride[1]]) = Vec2(1.0f, -1.0f);
250848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			*reinterpret_cast<Vec2*>(&ptr[kOffset[1] + 3 * kStride[1]]) = Vec2(-1.0f, -1.0f);
250948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			for (int i = 0; i < 4; ++i)
251048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
251148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				*reinterpret_cast<Vec2*>(&ptr[kOffset[1] + 8 + i * kStride[1]])   = Vec2(0.0f, 0.0f);
251248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				*reinterpret_cast<float*>(&ptr[kOffset[1] + 16 + i * kStride[1]]) = 1.0f;
251348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				*reinterpret_cast<UVec3*>(&ptr[kOffset[1] + 20 + i * kStride[1]]) = UVec3(4, 5, 6);
251448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				*reinterpret_cast<IVec2*>(&ptr[kOffset[1] + 44 + i * kStride[1]]) = IVec2(3, 4);
251548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
251648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glUnmapBuffer(GL_ARRAY_BUFFER);
251748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
251848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ARRAY_BUFFER, 0);
251948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
252048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ebo[0]);
252148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* first EBO */
252248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
252348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLushort data[4] = { 0, 1, 3, 2 };
252448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW);
252548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
252648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ebo[1]);
252748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* second EBO */
252848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
252948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLuint data[4] = { 3, 2, 0, 1 };
253048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW);
253148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
253248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
253348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
253448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexArray(m_vao[0]);
253548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(0, 2, GL_FLOAT, GL_FALSE, 0);
253648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(1, 2, GL_FLOAT, GL_FALSE, 8);
253748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(2, 1, GL_FLOAT, GL_FALSE, 16);
253848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribIFormat(3, 3, GL_UNSIGNED_INT, 20);
253948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribIFormat(4, 2, GL_INT, 44);
254048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (GLuint i = 0; i < 5; ++i)
254148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
254248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glVertexAttribBinding(i, 0);
254348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glEnableVertexAttribArray(i);
254448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
254548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexArray(m_vao[1]);
254648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(0, 2, GL_FLOAT, GL_FALSE, 0);
254748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(1, 2, GL_FLOAT, GL_FALSE, 8);
254848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(2, 1, GL_FLOAT, GL_FALSE, 16);
254948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribIFormat(3, 3, GL_UNSIGNED_INT, 20);
255048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribIFormat(4, 2, GL_INT, 44);
255148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(0, 1);
255248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(1, 8);
255348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(2, 1);
255448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(3, 1);
255548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(4, 8);
255648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnableVertexAttribArray(0);
255748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnableVertexAttribArray(1);
255848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnableVertexAttribArray(2);
255948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnableVertexAttribArray(3);
256048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnableVertexAttribArray(4);
256148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexBuffer(1, m_vbo[1], kOffset[1], kStride[1]);
256248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexBuffer(8, m_vbo[0], kOffset[0], kStride[0]);
256348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ebo[1]);
256448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexArray(0);
256548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
256648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glClear(GL_COLOR_BUFFER_BIT);
256748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLuint ppo;
256848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (pipeline)
256948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
257048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBindProgramPipeline(m_ppo);
257148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			ppo = m_fsp;
257248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
257348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		else
257448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
257548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glUseProgram(m_ppo);
257648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			ppo = m_ppo;
257748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
257848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexArray(m_vao[0]);
257948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
258048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		// Bind first VBO
258148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glProgramUniform3ui(ppo, glGetUniformLocation(ppo, "g_expected_data0"), 1, 2, 3);
258248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glProgramUniform2i(ppo, glGetUniformLocation(ppo, "g_expected_data1"), 1, 2);
258348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexBuffer(0, m_vbo[0], kOffset[0], kStride[0]);
258448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ebo[0]);
258548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDrawElementsInstanced(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_SHORT, 0, 1);
258648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
258748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		bool status = true;
258848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (!CheckFB(Vec3(0, 1, 0)))
258948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			status = false;
259048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (!status)
259148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return ERROR;
259248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
259348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		// Bind second VBO (change all vertex attribs with one call)
259448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glProgramUniform3ui(ppo, glGetUniformLocation(ppo, "g_expected_data0"), 4, 5, 6);
259548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glProgramUniform2i(ppo, glGetUniformLocation(ppo, "g_expected_data1"), 3, 4);
259648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
259748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexBuffer(0, m_vbo[1], kOffset[1], kStride[1]);
259848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ebo[1]);
259948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDrawElementsInstanced(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_INT, 0, 1);
260048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
260148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (!CheckFB(Vec3(0, 0, 1)))
260248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			status = false;
260348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (!status)
260448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return ERROR;
260548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
260648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		// Change attrib bindings (all attribs from one buffer)
260748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexBuffer(0, 0, 0, 0); // "unbind" buffer
260848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
260948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glProgramUniform3ui(ppo, glGetUniformLocation(ppo, "g_expected_data0"), 1, 2, 3);
261048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glProgramUniform2i(ppo, glGetUniformLocation(ppo, "g_expected_data1"), 1, 2);
261148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
261248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (GLuint i = 0; i < 5; ++i)
261348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glVertexAttribBinding(i, 15);
261448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexBuffer(15, m_vbo[0], kOffset[0], kStride[0]);
261548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ebo[0]);
261648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDrawElementsInstanced(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_SHORT, 0, 1);
261748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
261848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (!CheckFB(Vec3(0, 1, 0)))
261948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			status = false;
262048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (!status)
262148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return ERROR;
262248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
262348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		// Change attrib bindings (attribs from two buffers)
262448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexBuffer(15, 0, 0, 0); // "unbind" buffer
262548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
262648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glProgramUniform3ui(ppo, glGetUniformLocation(ppo, "g_expected_data0"), 1, 2, 3);
262748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glProgramUniform2i(ppo, glGetUniformLocation(ppo, "g_expected_data1"), 3, 4);
262848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
262948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexBuffer(7, m_vbo[0], kOffset[0], kStride[0]);
263048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexBuffer(12, m_vbo[1], kOffset[1], kStride[1]);
263148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(0, 7);
263248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(1, 12);
263348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(2, 12);
263448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(3, 7);
263548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(4, 12);
263648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ebo[0]);
263748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDrawElementsInstanced(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_SHORT, 0, 1);
263848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
263948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (!CheckFB(Vec3(0, 0, 1)))
264048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			status = false;
264148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (!status)
264248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return ERROR;
264348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
264448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		// Disable one of the attribs
264548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glClear(GL_COLOR_BUFFER_BIT);
264648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glProgramUniform2i(ppo, glGetUniformLocation(ppo, "g_expected_data1"), 0, 0);
264748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDisableVertexAttribArray(4);
264848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribI4i(4, 0, 0, 0, 0);
264948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDrawElementsInstanced(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_SHORT, 0, 1);
265048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
265148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (!CheckFB(Vec3(0, 0, 1)))
265248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			status = false;
265348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (!status)
265448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return ERROR;
265548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
265648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		// Change VAO
265748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glProgramUniform3ui(ppo, glGetUniformLocation(ppo, "g_expected_data0"), 4, 5, 6);
265848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glProgramUniform2i(ppo, glGetUniformLocation(ppo, "g_expected_data1"), 1, 2);
265948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
266048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexArray(m_vao[1]);
266148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDrawElementsInstanced(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_INT, 0, 1);
266248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
266348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (!CheckFB(Vec3(0, 1, 1)))
266448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			status = false;
266548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (!status)
266648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return ERROR;
266748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
266848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
266948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
267048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
267148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulospublic:
267248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	AdvancedBindingUpdate() : pipeline(true)
267348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
267448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
267548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos};
267648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//=============================================================================
267748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos// 2.3 AdvancedIterations
267848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//-----------------------------------------------------------------------------
267948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass AdvancedIterations : public VertexAttribBindingBase
268048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
268148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
268248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint m_po, m_vao[2], m_xfo[2], m_buffer[2];
268348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
268448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Setup()
268548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
268648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_po = 0;
268748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGenVertexArrays(2, m_vao);
268848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGenTransformFeedbacks(2, m_xfo);
268948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGenBuffers(2, m_buffer);
269048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
269148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
269248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
269348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Cleanup()
269448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
269548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDisable(GL_RASTERIZER_DISCARD);
269648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glUseProgram(0);
269748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDeleteProgram(m_po);
269848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDeleteVertexArrays(2, m_vao);
269948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDeleteTransformFeedbacks(2, m_xfo);
270048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDeleteBuffers(2, m_buffer);
270148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
270248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
270348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
270448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Run()
270548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
270648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const char* const glsl_vs = "#version 310 es" NL "in ivec4 vs_in_data;" NL "flat out ivec4 data;" NL
270748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									"void main() {" NL "  data = vs_in_data + 1;" NL "}";
270848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const char* const glsl_fs =
270948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"#version 310 es" NL "precision mediump float;" NL "flat in ivec4 data;" NL "out vec4 fs_out_color;" NL
271048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"void main() {" NL "  fs_out_color = vec4(data);" NL "}";
271148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_po = glCreateProgram();
271248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* attach shader */
271348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
271448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			const GLuint sh  = glCreateShader(GL_VERTEX_SHADER);
271548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			const GLuint fsh = glCreateShader(GL_FRAGMENT_SHADER);
271648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glShaderSource(sh, 1, &glsl_vs, NULL);
271748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glShaderSource(fsh, 1, &glsl_fs, NULL);
271848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glCompileShader(sh);
271948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glCompileShader(fsh);
272048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glAttachShader(m_po, sh);
272148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glAttachShader(m_po, fsh);
272248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glDeleteShader(sh);
272348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glDeleteShader(fsh);
272448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
272548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (!RelinkProgram(1))
272648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return ERROR;
272748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
272848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ARRAY_BUFFER, m_buffer[0]);
272948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		IVec4 zero(0);
273048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBufferData(GL_ARRAY_BUFFER, 16, &zero, GL_STATIC_DRAW);
273148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ARRAY_BUFFER, 0);
273248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
273348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, m_buffer[1]);
273448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 16, &zero, GL_DYNAMIC_READ);
273548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, 0);
273648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
273748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexArray(m_vao[0]);
273848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribIFormat(1, 4, GL_INT, 0);
273948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnableVertexAttribArray(1);
274048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexBuffer(1, m_buffer[0], 0, 16);
274148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexArray(m_vao[1]);
274248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribIFormat(1, 4, GL_INT, 0);
274348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnableVertexAttribArray(1);
274448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexBuffer(1, m_buffer[1], 0, 16);
274548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexArray(0);
274648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
274748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, m_xfo[0]);
274848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, m_buffer[1]);
274948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, m_xfo[1]);
275048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, m_buffer[0]);
275148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
275248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
275348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnable(GL_RASTERIZER_DISCARD);
275448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glUseProgram(m_po);
275548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
275648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (int i = 0; i < 10; ++i)
275748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
275848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBindVertexArray(m_vao[i % 2]);
275948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, m_xfo[i % 2]);
276048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBeginTransformFeedback(GL_POINTS);
276148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glDrawArrays(GL_POINTS, 0, 1);
276248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glEndTransformFeedback();
276348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
276448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
276548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
276648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			IVec4* data =
276748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				static_cast<IVec4*>(glMapBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, 0, sizeof(IVec4), GL_MAP_READ_BIT));
276848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (!IsEqual(*data, IVec4(10)))
276948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
27703890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				m_context.getTestContext().getLog()
27713890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski					<< tcu::TestLog::Message << "Data is: " << (*data)[0] << " " << (*data)[1] << " " << (*data)[2]
27723890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski					<< " " << (*data)[3] << ", data should be: 10 10 10 10." << tcu::TestLog::EndMessage;
277348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				return ERROR;
277448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
277548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glUnmapBuffer(GL_TRANSFORM_FEEDBACK_BUFFER);
277648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
277748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
277848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (!RelinkProgram(5))
277948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return ERROR;
278048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexArray(m_vao[0]);
278148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDisableVertexAttribArray(1);
278248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexBuffer(1, 0, 0, 0);
278348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribIFormat(5, 4, GL_INT, 0);
278448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnableVertexAttribArray(5);
278548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexBuffer(5, m_buffer[0], 0, 16);
278648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexArray(m_vao[1]);
278748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDisableVertexAttribArray(1);
278848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexBuffer(1, 0, 0, 0);
278948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribIFormat(5, 4, GL_INT, 0);
279048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnableVertexAttribArray(5);
279148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexBuffer(7, m_buffer[1], 0, 16);
279248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(5, 7);
279348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexArray(0);
279448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
279548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (int i = 0; i < 10; ++i)
279648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
279748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBindVertexArray(m_vao[i % 2]);
279848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, m_xfo[i % 2]);
279948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBeginTransformFeedback(GL_POINTS);
280048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glDrawArrays(GL_POINTS, 0, 1);
280148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glEndTransformFeedback();
280248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
280348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
280448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
280548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			IVec4* data =
280648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				static_cast<IVec4*>(glMapBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, 0, sizeof(IVec4), GL_MAP_READ_BIT));
280748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (!IsEqual(*data, IVec4(20)))
280848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
28093890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				m_context.getTestContext().getLog()
28103890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski					<< tcu::TestLog::Message << "Data is: " << (*data)[0] << " " << (*data)[1] << " " << (*data)[2]
28113890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski					<< " " << (*data)[3] << ", data should be: 20 20 20 20." << tcu::TestLog::EndMessage;
281248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				return ERROR;
281348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
281448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glUnmapBuffer(GL_TRANSFORM_FEEDBACK_BUFFER);
281548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
281648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
281748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (!RelinkProgram(11))
281848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return ERROR;
281948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
282048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexArray(m_vao[0]);
282148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDisableVertexAttribArray(5);
282248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexBuffer(5, 0, 0, 0);
282348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribIFormat(11, 4, GL_INT, 0);
282448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnableVertexAttribArray(11);
282548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (int i = 0; i < 10; ++i)
282648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
282748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBindVertexBuffer(11, m_buffer[i % 2], 0, 16);
282848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, m_buffer[(i + 1) % 2]);
282948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBeginTransformFeedback(GL_POINTS);
283048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glDrawArrays(GL_POINTS, 0, 1);
283148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glEndTransformFeedback();
283248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
283348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
283448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
283548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			IVec4* data =
283648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				static_cast<IVec4*>(glMapBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, 0, sizeof(IVec4), GL_MAP_READ_BIT));
283748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (!IsEqual(*data, IVec4(30)))
283848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
28393890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				m_context.getTestContext().getLog()
28403890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski					<< tcu::TestLog::Message << "Data is: " << (*data)[0] << " " << (*data)[1] << " " << (*data)[2]
28413890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski					<< " " << (*data)[3] << ", data should be: 30 30 30 30." << tcu::TestLog::EndMessage;
284248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				return ERROR;
284348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
284448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
284548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
284648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
284748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
284848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
284948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool RelinkProgram(GLuint index)
285048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
285148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindAttribLocation(m_po, index, "vs_in_data");
285248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* setup XFB */
285348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
285448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			const GLchar* const v[1] = { "data" };
285548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glTransformFeedbackVaryings(m_po, 1, v, GL_INTERLEAVED_ATTRIBS);
285648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
285748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glLinkProgram(m_po);
285848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (!CheckProgram(m_po))
285948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return false;
286048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return true;
286148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
286248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos};
286348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//=============================================================================
286448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos// 2.4 AdvancedLargeStrideAndOffsetsNewAndLegacyAPI
286548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//-----------------------------------------------------------------------------
286648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass AdvancedLargeStrideAndOffsetsNewAndLegacyAPI : public VertexAttribBindingBase
286748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
286848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool   pipeline;
286948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint m_vsp, m_fsp, m_ppo, m_ssbo, m_vao, m_vbo;
287048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
287148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Setup()
287248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
287348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_vsp = 0;
287448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (pipeline)
287548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
287648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_vsp = m_fsp = 0;
287748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glGenProgramPipelines(1, &m_ppo);
287848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
287948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		else
288048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
288148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_ppo = 0;
288248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
288348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGenBuffers(1, &m_ssbo);
288448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGenVertexArrays(1, &m_vao);
288548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGenBuffers(1, &m_vbo);
288648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
288748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
288848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
288948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Cleanup()
289048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
289148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDisable(GL_RASTERIZER_DISCARD);
289248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (pipeline)
289348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
289448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glDeleteProgram(m_vsp);
289548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glDeleteProgram(m_fsp);
289648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glDeleteProgramPipelines(1, &m_ppo);
289748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
289848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		else
289948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
290048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glUseProgram(0);
290148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glDeleteProgram(m_ppo);
290248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
290348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDeleteBuffers(1, &m_ssbo);
290448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDeleteVertexArrays(1, &m_vao);
290548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDeleteBuffers(1, &m_vbo);
290648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
290748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
290848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
290948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Run()
291048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
291148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (!IsSSBOInVSFSAvailable(2))
291248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return NOT_SUPPORTED;
291348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const char* const glsl_vs =
291448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"#version 310 es" NL "layout(location = 0) in vec2 vs_in_attrib0;" NL
291548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"layout(location = 4) in ivec2 vs_in_attrib1;" NL "layout(location = 8) in uvec2 vs_in_attrib2;" NL
291648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"layout(location = 15) in float vs_in_attrib3;" NL "layout(std430, binding = 1) buffer Output {" NL
291748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"  vec2 attrib0[4];" NL "  ivec2 attrib1[4];" NL "  uvec2 attrib2[4];" NL "  float attrib3[4];" NL
291848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"} g_output;" NL "void main() {" NL
291948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"  g_output.attrib0[2 * gl_InstanceID + gl_VertexID] = vs_in_attrib0;" NL
292048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"  g_output.attrib1[2 * gl_InstanceID + gl_VertexID] = vs_in_attrib1;" NL
292148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"  g_output.attrib2[2 * gl_InstanceID + gl_VertexID] = vs_in_attrib2;" NL
292248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			"  g_output.attrib3[2 * gl_InstanceID + gl_VertexID] = vs_in_attrib3;" NL "}";
292348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const char* const glsl_fs = "#version 310 es" NL "precision mediump float;" NL "out vec4 fs_out_color;" NL
292448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									"void main() {" NL "  fs_out_color = vec4(0.5,0.5,0.5,1.0);" NL "}";
292548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (pipeline)
292648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
292748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_vsp = glCreateShaderProgramv(GL_VERTEX_SHADER, 1, &glsl_vs);
292848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_fsp = glCreateShaderProgramv(GL_FRAGMENT_SHADER, 1, &glsl_fs);
292948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (!CheckProgram(m_vsp) || !CheckProgram(m_fsp))
293048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				return ERROR;
293148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glUseProgramStages(m_ppo, GL_VERTEX_SHADER_BIT, m_vsp);
293248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glUseProgramStages(m_ppo, GL_FRAGMENT_SHADER_BIT, m_fsp);
293348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
293448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		else
293548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
293648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_ppo			 = glCreateProgram();
293748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			const GLuint sh  = glCreateShader(GL_VERTEX_SHADER);
293848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			const GLuint fsh = glCreateShader(GL_FRAGMENT_SHADER);
293948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glShaderSource(sh, 1, &glsl_vs, NULL);
294048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glShaderSource(fsh, 1, &glsl_fs, NULL);
294148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glCompileShader(sh);
294248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glCompileShader(fsh);
294348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glAttachShader(m_ppo, sh);
294448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glAttachShader(m_ppo, fsh);
294548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glDeleteShader(sh);
294648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glDeleteShader(fsh);
294748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glLinkProgram(m_ppo);
294848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (!CheckProgram(m_ppo))
294948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				return ERROR;
295048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
295148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
295248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* vbo */
295348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
295448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
295548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBufferData(GL_ARRAY_BUFFER, 100000, NULL, GL_STATIC_DRAW);
295648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLubyte* ptr = static_cast<GLubyte*>(glMapBufferRange(GL_ARRAY_BUFFER, 0, 100000, GL_MAP_WRITE_BIT));
295748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			// attrib0
295848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			*reinterpret_cast<Vec2*>(&ptr[16 + 0 * 2048]) = Vec2(1.0f, 2.0f);
295948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			*reinterpret_cast<Vec2*>(&ptr[16 + 1 * 2048]) = Vec2(3.0f, 4.0f);
296048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			// attrib1
296148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			*reinterpret_cast<IVec2*>(&ptr[128 + 0 * 2048]) = IVec2(5, 6);
296248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			*reinterpret_cast<IVec2*>(&ptr[128 + 1 * 2048]) = IVec2(7, 8);
296348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			// attrib2
296448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			*reinterpret_cast<UVec2*>(&ptr[1024 + 0 * 2048]) = UVec2(9, 10);
296548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			*reinterpret_cast<UVec2*>(&ptr[1024 + 1 * 2048]) = UVec2(11, 12);
296648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			// attrib3
296748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			*reinterpret_cast<float*>(&ptr[2032 + 0 * 2048]) = 13.0f;
296848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			*reinterpret_cast<float*>(&ptr[2032 + 1 * 2048]) = 14.0f;
296948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glUnmapBuffer(GL_ARRAY_BUFFER);
297048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBindBuffer(GL_ARRAY_BUFFER, 0);
297148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
297248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		// vao
297348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexArray(m_vao);
297448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(0, 2, GL_FLOAT, GL_FALSE, 16);
297548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribIFormat(8, 2, GL_UNSIGNED_INT, 1024);
297648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(15, 1, GL_FLOAT, GL_FALSE, 2032);
297748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
297848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribIPointer(4, 2, GL_INT, 2048, reinterpret_cast<void*>(128));
297948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ARRAY_BUFFER, 0);
298048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(8, 3);
298148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(15, 3);
298248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexBuffer(0, m_vbo, 0, 2048);
298348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexBuffer(3, m_vbo, 0, 2048);
298448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnableVertexAttribArray(0);
298548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnableVertexAttribArray(4);
298648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnableVertexAttribArray(8);
298748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnableVertexAttribArray(15);
298848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexArray(0);
298948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
299048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		// ssbo
299148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		std::vector<GLubyte> data((sizeof(Vec2) + sizeof(IVec2) + sizeof(UVec2) + sizeof(float)) * 4, 0xff);
299248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, m_ssbo);
299348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBufferData(GL_SHADER_STORAGE_BUFFER, (GLsizeiptr)data.size(), &data[0], GL_DYNAMIC_DRAW);
299448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
299548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glEnable(GL_RASTERIZER_DISCARD);
299648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (pipeline)
299748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBindProgramPipeline(m_ppo);
299848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		else
299948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glUseProgram(m_ppo);
300048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexArray(m_vao);
300148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDrawArraysInstanced(GL_POINTS, 0, 2, 2);
300248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
300348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* */
300448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
300548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_ssbo);
300648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLubyte* ptr = static_cast<GLubyte*>(
300748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				glMapBufferRange(GL_SHADER_STORAGE_BUFFER, 0, (GLsizeiptr)data.size(), GL_MAP_READ_BIT));
300848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			// attrib0
300948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			Vec2 i0_v0_a0 = *reinterpret_cast<Vec2*>(&ptr[0]);
301048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			Vec2 i0_v1_a0 = *reinterpret_cast<Vec2*>(&ptr[8]);
301148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			Vec2 i1_v0_a0 = *reinterpret_cast<Vec2*>(&ptr[16]);
301248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			Vec2 i1_v1_a0 = *reinterpret_cast<Vec2*>(&ptr[24]);
301348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (!IsEqual(i0_v0_a0, Vec2(1.0f, 2.0f)))
301448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				return ERROR;
301548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (!IsEqual(i0_v1_a0, Vec2(3.0f, 4.0f)))
301648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				return ERROR;
301748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (!IsEqual(i1_v0_a0, Vec2(1.0f, 2.0f)))
301848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				return ERROR;
301948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (!IsEqual(i1_v1_a0, Vec2(3.0f, 4.0f)))
302048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				return ERROR;
302148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			// attrib1
302248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			IVec2 i0_v0_a1 = *reinterpret_cast<IVec2*>(&ptr[32]);
302348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			IVec2 i0_v1_a1 = *reinterpret_cast<IVec2*>(&ptr[40]);
302448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			IVec2 i1_v0_a1 = *reinterpret_cast<IVec2*>(&ptr[48]);
302548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			IVec2 i1_v1_a1 = *reinterpret_cast<IVec2*>(&ptr[56]);
302648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (!IsEqual(i0_v0_a1, IVec2(5, 6)))
302748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				return ERROR;
302848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (!IsEqual(i0_v1_a1, IVec2(7, 8)))
302948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				return ERROR;
303048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (!IsEqual(i1_v0_a1, IVec2(5, 6)))
303148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				return ERROR;
303248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (!IsEqual(i1_v1_a1, IVec2(7, 8)))
303348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				return ERROR;
303448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			// attrib2
303548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			UVec2 i0_v0_a2 = *reinterpret_cast<UVec2*>(&ptr[64]);
303648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			UVec2 i0_v1_a2 = *reinterpret_cast<UVec2*>(&ptr[72]);
303748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			UVec2 i1_v0_a2 = *reinterpret_cast<UVec2*>(&ptr[80]);
303848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			UVec2 i1_v1_a2 = *reinterpret_cast<UVec2*>(&ptr[88]);
303948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (!IsEqual(i0_v0_a2, UVec2(9, 10)))
304048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				return ERROR;
304148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (!IsEqual(i0_v1_a2, UVec2(11, 12)))
304248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				return ERROR;
304348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (!IsEqual(i1_v0_a2, UVec2(9, 10)))
304448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				return ERROR;
304548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (!IsEqual(i1_v1_a2, UVec2(11, 12)))
304648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				return ERROR;
304748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			// attrib3
304848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			float i0_v0_a3 = *reinterpret_cast<float*>(&ptr[96]);
304948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			float i0_v1_a3 = *reinterpret_cast<float*>(&ptr[100]);
305048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			float i1_v0_a3 = *reinterpret_cast<float*>(&ptr[104]);
305148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			float i1_v1_a3 = *reinterpret_cast<float*>(&ptr[108]);
305248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (i0_v0_a3 != 13.0f)
305348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				return ERROR;
305448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (i0_v1_a3 != 14.0f)
305548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				return ERROR;
305648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (i1_v0_a3 != 13.0f)
305748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				return ERROR;
305848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (i1_v1_a3 != 14.0f)
305948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				return ERROR;
306048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glUnmapBuffer(GL_SHADER_STORAGE_BUFFER);
306148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
306248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
306348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
306448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
306548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulospublic:
306648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	AdvancedLargeStrideAndOffsetsNewAndLegacyAPI() : pipeline(true)
306748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
306848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
306948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos};
307048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//=============================================================================
307148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos// 4.1 NegativeBindVertexBuffer
307248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//-----------------------------------------------------------------------------
307348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass NegativeBindVertexBuffer : public VertexAttribBindingBase
307448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
307548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
307648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint m_vao, m_vbo;
307748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
307848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Setup()
307948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
308048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGenVertexArrays(1, &m_vao);
308148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGenBuffers(1, &m_vbo);
308248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
308348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
308448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
308548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Cleanup()
308648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
308748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDeleteVertexArrays(1, &m_vao);
308848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDeleteBuffers(1, &m_vbo);
308948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
309048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
309148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
309248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Run()
309348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
309448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/*
309548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 Errors
309648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 An INVALID_OPERATION error is generated if buffer is not zero or a name
309748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 returned from a previous call to GenBuffers, or if such a name has since been
309848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 deleted with DeleteBuffers.
309948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 An INVALID_VALUE error is generated if bindingindex is greater than or
310048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 equal to the value of MAX_VERTEX_ATTRIB_BINDINGS.
310148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 OpenGL 4.4 (Core Profile) - July 21, 2013
310248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 10.3. VERTEX ARRAYS 315
310348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 An INVALID_VALUE error is generated if stride or offset is negative, or if
310448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 stride is greater than the value of MAX_VERTEX_ATTRIB_STRIDE.
310548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 An INVALID_OPERATION error is generated if no vertex array object is
310648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 bound.
310748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 */
310848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
310948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBufferData(GL_ARRAY_BUFFER, 1000, NULL, GL_STATIC_DRAW);
311048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ARRAY_BUFFER, 0);
311148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
311248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexArray(m_vao);
311348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
311448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexBuffer(0, 1234, 0, 12);
311548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (glGetError() != GL_INVALID_OPERATION)
311648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
31173890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog()
31183890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::Message << "INVALID_OPERATION should be generated (buffer name not genned)."
31193890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::EndMessage;
312048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return ERROR;
312148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
312248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
312348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLint p;
312448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGetIntegerv(GL_MAX_VERTEX_ATTRIB_BINDINGS, &p);
312548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexBuffer(p + 1, m_vbo, 0, 12);
312648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (glGetError() != GL_INVALID_VALUE)
312748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
31283890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog()
31293890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::Message
31303890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< "INVALID_VALUE should be generated (bindingIndex greater than GL_MAX_VERTEX_ATTRIB_BINDINGS)."
31313890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::EndMessage;
313248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return ERROR;
313348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
313448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
313548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexBuffer(0, m_vbo, -10, 12);
313648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (glGetError() != GL_INVALID_VALUE)
313748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
31383890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog()
31393890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::Message << "INVALID_VALUE should be generated (negative offset)."
31403890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::EndMessage;
314148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return ERROR;
314248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
314348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexBuffer(0, m_vbo, 0, -12);
314448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (glGetError() != GL_INVALID_VALUE)
314548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
31463890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog()
31473890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::Message << "INVALID_VALUE should be generated (negative stride)."
31483890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::EndMessage;
314948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return ERROR;
315048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
315148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
315248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGetIntegerv(GL_MAX_VERTEX_ATTRIB_STRIDE, &p);
315348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexBuffer(0, m_vbo, 0, p + 4);
315448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (glGetError() != GL_INVALID_VALUE)
315548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
31563890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog()
31573890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::Message
31583890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< "INVALID_VALUE should be generated (stride greater than GL_MAX_VERTEX_ATTRIB_STRIDE)."
31593890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::EndMessage;
316048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return ERROR;
316148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
316248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
316348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexArray(0);
316448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexBuffer(0, m_vbo, 0, 12);
316548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (glGetError() != GL_INVALID_OPERATION)
316648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
31673890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog()
31683890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::Message << "INVALID_OPERATION should be generated (default VAO)."
31693890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::EndMessage;
317048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return ERROR;
317148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
317248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
317348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
317448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
317548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos};
317648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//=============================================================================
317748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos// 4.2 NegativeVertexAttribFormat
317848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//-----------------------------------------------------------------------------
317948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass NegativeVertexAttribFormat : public VertexAttribBindingBase
318048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
318148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
318248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint m_vao, m_vbo;
318348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
318448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Setup()
318548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
318648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGenVertexArrays(1, &m_vao);
318748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGenBuffers(1, &m_vbo);
318848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
318948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
319048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
319148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Cleanup()
319248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
319348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDeleteVertexArrays(1, &m_vao);
319448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDeleteBuffers(1, &m_vbo);
319548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
319648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
319748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
319848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Run()
319948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
320048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/*
320148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 Errors
320248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 An INVALID_VALUE error is generated if attribindex is greater than or
320348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 equal to the value of MAX_VERTEX_ATTRIBS.
320448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 An INVALID_VALUE error is generated if size is not one of the values
320548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 shown in table 10.2 for the corresponding command.
320648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 An INVALID_ENUM error is generated if type is not one of the parameter
320748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 token names from table 8.2 corresponding to one of the allowed GL data types
320848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 for that command as shown in table 10.2.
320948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 An INVALID_OPERATION error is generated under any of the following
321048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 conditions:
321148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 - if no vertex array object is currently bound (see section 10.4);
321248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 - type is INT_2_10_10_10_REV or UNSIGNED_INT_2_10_10_10_-
321348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 REV, and size is not 4;
321448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 An INVALID_VALUE error is generated if relativeoffset is larger than the
321548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 value of MAX_VERTEX_ATTRIB_RELATIVE_OFFSET.
321648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 */
321748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
321848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBufferData(GL_ARRAY_BUFFER, 1000, NULL, GL_STATIC_DRAW);
321948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindBuffer(GL_ARRAY_BUFFER, 0);
322048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
322148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexArray(m_vao);
322248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
322348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLint p;
322448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &p);
322548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(p + 1, 4, GL_FLOAT, GL_FALSE, 0);
322648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (glGetError() != GL_INVALID_VALUE)
322748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
32283890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog()
32293890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::Message
32303890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< "INVALID_VALUE should be generated (attribindex greater than GL_MAX_VERTEX_ATTRIBS)."
32313890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::EndMessage;
323248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return ERROR;
323348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
323448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribIFormat(p + 2, 4, GL_INT, 0);
323548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (glGetError() != GL_INVALID_VALUE)
323648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
32373890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog()
32383890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::Message
32393890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< "INVALID_VALUE should be generated (attribindex greater than GL_MAX_VERTEX_ATTRIBS)."
32403890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::EndMessage;
324148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return ERROR;
324248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
324348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(0, 0, GL_FLOAT, GL_FALSE, 0);
324448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (glGetError() != GL_INVALID_VALUE)
324548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
32463890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog()
32473890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::Message << "INVALID_VALUE should be generated (invalid number of components)."
32483890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::EndMessage;
324948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return ERROR;
325048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
325148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(0, 5, GL_FLOAT, GL_FALSE, 0);
325248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (glGetError() != GL_INVALID_VALUE)
325348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
32543890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog()
32553890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::Message << "INVALID_VALUE should be generated (invalid number of components)."
32563890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::EndMessage;
325748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return ERROR;
325848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
325948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribIFormat(0, 5, GL_INT, 0);
326048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (glGetError() != GL_INVALID_VALUE)
326148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
32623890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog()
32633890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::Message << "INVALID_VALUE should be generated (invalid number of components)."
32643890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::EndMessage;
326548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return ERROR;
326648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
326748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(0, 4, GL_R32F, GL_FALSE, 0);
326848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (glGetError() != GL_INVALID_ENUM)
326948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
32703890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog()
32713890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::Message << "INVALID_ENUM should be generated (invalid type)."
32723890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::EndMessage;
327348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return ERROR;
327448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
327548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribIFormat(0, 4, GL_FLOAT, 0);
327648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (glGetError() != GL_INVALID_ENUM)
327748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
32783890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog()
32793890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::Message << "INVALID_ENUM should be generated (invalid type)."
32803890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::EndMessage;
328148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return ERROR;
328248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
328348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(0, 3, GL_INT_2_10_10_10_REV, GL_FALSE, 0);
328448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (glGetError() != GL_INVALID_OPERATION)
328548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
32863890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog()
32873890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::Message
32883890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< "INVALID_OPERATION should be generated (invalid number of components for packed type)."
32893890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::EndMessage;
329048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return ERROR;
329148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
329248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGetIntegerv(GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET, &p);
329348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(0, 4, GL_FLOAT, GL_FALSE, p + 10);
329448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (glGetError() != GL_INVALID_VALUE)
329548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
32963890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog()
32973890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::Message << "INVALID_VALUE should be generated (relativeoffset greater than "
32983890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski											"GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET)."
32993890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::EndMessage;
330048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return ERROR;
330148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
330248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribIFormat(0, 4, GL_INT, p + 10);
330348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (glGetError() != GL_INVALID_VALUE)
330448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
33053890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog()
33063890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::Message << "INVALID_VALUE should be generated (relativeoffset greater than "
33073890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski											"GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET)."
33083890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::EndMessage;
330948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return ERROR;
331048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
331148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexArray(0);
331248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribFormat(0, 4, GL_FLOAT, GL_FALSE, 0);
331348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (glGetError() != GL_INVALID_OPERATION)
331448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
33153890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog()
33163890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::Message << "INVALID_OPERATION should be generated (default VAO)."
33173890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::EndMessage;
331848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return ERROR;
331948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
332048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribIFormat(0, 4, GL_INT, 0);
332148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (glGetError() != GL_INVALID_OPERATION)
332248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
33233890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog()
33243890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::Message << "INVALID_OPERATION should be generated (default VAO)."
33253890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::EndMessage;
332648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return ERROR;
332748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
332848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
332948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
333048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos};
333148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
333248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//=============================================================================
333348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos// 4.3 NegativeVertexAttribBinding
333448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//-----------------------------------------------------------------------------
333548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass NegativeVertexAttribBinding : public VertexAttribBindingBase
333648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
333748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint m_vao;
333848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
333948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Setup()
334048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
334148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGenVertexArrays(1, &m_vao);
334248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
334348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
334448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
334548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Cleanup()
334648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
334748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDeleteVertexArrays(1, &m_vao);
334848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
334948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
335048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
335148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Run()
335248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
335348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/*
335448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 Errors
335548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 An INVALID_VALUE error is generated if attribindex is greater than or
335648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 equal to the value of MAX_VERTEX_ATTRIBS.
335748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 An INVALID_VALUE error is generated if bindingindex is greater than or
335848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 equal to the value of MAX_VERTEX_ATTRIB_BINDINGS.
335948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 An INVALID_OPERATION error is generated if no vertex array object is
336048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 bound.
336148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 */
336248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexArray(m_vao);
336348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLint p;
336448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &p);
336548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(p + 1, 0);
336648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (glGetError() != GL_INVALID_VALUE)
336748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
33683890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog()
33693890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::Message
33703890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< "INVALID_VALUE should be generated (attribindex greater than GL_MAX_VERTEX_ATTRIBS)."
33713890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::EndMessage;
337248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return ERROR;
337348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
337448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGetIntegerv(GL_MAX_VERTEX_ATTRIB_BINDINGS, &p);
337548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(0, p + 1);
337648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (glGetError() != GL_INVALID_VALUE)
337748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
33783890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog()
33793890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::Message
33803890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< "INVALID_VALUE should be generated (bindingIndex greater than GL_MAX_VERTEX_ATTRIB_BINDINGS)."
33813890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::EndMessage;
338248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return ERROR;
338348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
338448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexArray(0);
338548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexAttribBinding(0, 0);
338648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (glGetError() != GL_INVALID_OPERATION)
338748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
33883890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog()
33893890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::Message << "INVALID_OPERATION should be generated (default VAO)."
33903890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::EndMessage;
339148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return ERROR;
339248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
339348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
339448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
339548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos};
339648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//=============================================================================
339748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos// 4.4 NegativeVertexAttribDivisor
339848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//-----------------------------------------------------------------------------
339948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass NegativeVertexAttribDivisor : public VertexAttribBindingBase
340048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
340148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
340248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint m_vao;
340348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
340448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Setup()
340548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
340648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGenVertexArrays(1, &m_vao);
340748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
340848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
340948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
341048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Cleanup()
341148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
341248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glDeleteVertexArrays(1, &m_vao);
341348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
341448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
341548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
341648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	virtual long Run()
341748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
341848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/*
341948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 Errors
342048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 An INVALID_VALUE error is generated if index is greater than or equal to
342148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 the value of MAX_VERTEX_ATTRIBS.
342248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 An INVALID_OPERATION error is generated if no vertex array object is
342348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 bound.
342448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		 */
342548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexArray(m_vao);
342648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLint p;
342748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &p);
342848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexBindingDivisor(p + 1, 1);
342948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (glGetError() != GL_INVALID_VALUE)
343048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
34313890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog()
34323890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::Message
34333890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< "INVALID_VALUE should be generated (bindingIndex greater than GL_MAX_VERTEX_ATTRIBS)."
34343890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::EndMessage;
343548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return ERROR;
343648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
343748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glBindVertexArray(0);
343848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glVertexBindingDivisor(0, 1);
343948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (glGetError() != GL_INVALID_OPERATION)
344048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
34413890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog()
34423890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::Message << "INVALID_OPERATION should be generated (default VAO)."
34433890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				<< tcu::TestLog::EndMessage;
344448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return ERROR;
344548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
344648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return NO_ERROR;
344748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
344848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos};
344948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//=============================================================================
345048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
345148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} // namespace
345248087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosVertexAttribBindingTests::VertexAttribBindingTests(glcts::Context& context)
345348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: TestCaseGroup(context, "vertex_attrib_binding", "")
345448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
345548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
345648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
345748087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosVertexAttribBindingTests::~VertexAttribBindingTests(void)
345848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
345948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
346048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
346148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid VertexAttribBindingTests::init()
346248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
346348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	using namespace glcts;
346448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new TestSubcase(m_context, "basic-usage", TestSubcase::Create<BasicUsage>));
346548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new TestSubcase(m_context, "basic-input-case1", TestSubcase::Create<BasicInputCase1>));
346648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new TestSubcase(m_context, "basic-input-case2", TestSubcase::Create<BasicInputCase2>));
346748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new TestSubcase(m_context, "basic-input-case3", TestSubcase::Create<BasicInputCase3>));
346848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new TestSubcase(m_context, "basic-input-case4", TestSubcase::Create<BasicInputCase4>));
346948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new TestSubcase(m_context, "basic-input-case5", TestSubcase::Create<BasicInputCase5>));
347048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new TestSubcase(m_context, "basic-input-case6", TestSubcase::Create<BasicInputCase6>));
347148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new TestSubcase(m_context, "basic-input-case8", TestSubcase::Create<BasicInputCase8>));
347248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new TestSubcase(m_context, "basic-input-case9", TestSubcase::Create<BasicInputCase9>));
347348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new TestSubcase(m_context, "basic-input-case11", TestSubcase::Create<BasicInputCase11>));
347448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new TestSubcase(m_context, "basic-input-case12", TestSubcase::Create<BasicInputCase12>));
347548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new TestSubcase(m_context, "basic-inputI-case1", TestSubcase::Create<BasicInputICase1>));
347648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new TestSubcase(m_context, "basic-inputI-case2", TestSubcase::Create<BasicInputICase2>));
347748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new TestSubcase(m_context, "basic-inputI-case3", TestSubcase::Create<BasicInputICase3>));
347848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new TestSubcase(m_context, "basic-state1", TestSubcase::Create<BasicState1>));
347948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new TestSubcase(m_context, "basic-state2", TestSubcase::Create<BasicState2>));
348048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new TestSubcase(m_context, "advanced-bindingUpdate", TestSubcase::Create<AdvancedBindingUpdate>));
348148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new TestSubcase(m_context, "advanced-iterations", TestSubcase::Create<AdvancedIterations>));
348248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new TestSubcase(m_context, "advanced-largeStrideAndOffsetsNewAndLegacyAPI",
348348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							 TestSubcase::Create<AdvancedLargeStrideAndOffsetsNewAndLegacyAPI>));
348448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new TestSubcase(m_context, "negative-bindVertexBuffer", TestSubcase::Create<NegativeBindVertexBuffer>));
348548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(
348648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		new TestSubcase(m_context, "negative-vertexAttribFormat", TestSubcase::Create<NegativeVertexAttribFormat>));
348748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(
348848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		new TestSubcase(m_context, "negative-vertexAttribBinding", TestSubcase::Create<NegativeVertexAttribBinding>));
348948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(
349048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		new TestSubcase(m_context, "negative-vertexAttribDivisor", TestSubcase::Create<NegativeVertexAttribDivisor>));
349148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
349248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
3493