13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*-------------------------------------------------------------------------
23c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * drawElements Quality Program OpenGL ES 3.0 Module
33c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * -------------------------------------------------
43c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
53c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Copyright 2014 The Android Open Source Project
63c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
73c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Licensed under the Apache License, Version 2.0 (the "License");
83c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * you may not use this file except in compliance with the License.
93c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * You may obtain a copy of the License at
103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *      http://www.apache.org/licenses/LICENSE-2.0
123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Unless required by applicable law or agreed to in writing, software
143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * distributed under the License is distributed on an "AS IS" BASIS,
153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * See the License for the specific language governing permissions and
173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * limitations under the License.
183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*!
203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \file
213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Vertex array object tests
223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "es3fVertexArrayObjectTests.hpp"
243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluShaderProgram.hpp"
263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluPixelTransfer.hpp"
273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluRenderContext.hpp"
283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuTestLog.hpp"
303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuImageCompare.hpp"
313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuSurface.hpp"
323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuRenderTarget.hpp"
333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deRandom.hpp"
353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deString.h"
363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deMemory.h"
373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <vector>
393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <string>
403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <memory>
413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glw.h"
433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
443c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing std::vector;
453c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing std::string;
463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
473c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace deqp
483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
493c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace gles3
503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
513c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace Functional
523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
543c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace
553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
563c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystruct Attribute
573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				Attribute (void);
593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLboolean	enabled;
603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLint		size;
613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLint		stride;
623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLenum		type;
633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLboolean	integer;
643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLint		divisor;
653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLint		offset;
663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLboolean	normalized;
673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int			bufferNdx;
693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
713c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystruct VertexArrayState
723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry						VertexArrayState	(void);
743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	vector<Attribute>	attributes;
763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int					elementArrayBuffer;
773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
793c827367444ee418f129b2c238299f49d3264554Jarkko PoyryVertexArrayState::VertexArrayState (void)
803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: elementArrayBuffer(-1)
813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
843c827367444ee418f129b2c238299f49d3264554Jarkko PoyryAttribute::Attribute (void)
853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: enabled		(GL_FALSE)
863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, size			(1)
873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, stride		(0)
883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, type			(GL_FLOAT)
893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, integer		(GL_FALSE)
903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, divisor		(0)
913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, offset		(0)
923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, normalized	(GL_FALSE)
933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, bufferNdx		(0)
943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
973c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystruct BufferSpec
983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int		count;
1003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int		size;
1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int		componentCount;
1023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int		stride;
1033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int		offset;
1043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLenum	type;
1063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int		intRangeMin;
1083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int		intRangeMax;
1093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float	floatRangeMin;
1113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float	floatRangeMax;
1123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
1133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1143c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystruct Spec
1153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry						Spec	(void);
1173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int					count;
1193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int					instances;
1203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool				useDrawElements;
1213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLenum				indexType;
1223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int					indexOffset;
1233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int					indexRangeMin;
1243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int					indexRangeMax;
1253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int					indexCount;
1263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	VertexArrayState	state;
1273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	VertexArrayState	vao;
1283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	vector<BufferSpec>	buffers;
1293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
1303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1313c827367444ee418f129b2c238299f49d3264554Jarkko PoyrySpec::Spec (void)
1323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: count				(-1)
1333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, instances			(-1)
1343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, useDrawElements	(false)
1353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, indexType			(GL_NONE)
1363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, indexOffset		(-1)
1373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, indexRangeMin		(-1)
1383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, indexRangeMax		(-1)
1393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, indexCount		(-1)
1403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // anonymous
1443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1453c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass VertexArrayObjectTest : public TestCase
1463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1473c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
1483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							VertexArrayObjectTest	(Context& context, const Spec& spec, const char* name, const char* description);
1503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							~VertexArrayObjectTest	(void);
1513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual void			init					(void);
1523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual void			deinit					(void);
1533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual IterateResult	iterate					(void);
1543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1553c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
1563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Spec					m_spec;
1573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	tcu::TestLog&			m_log;
1583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	vector<GLuint>			m_buffers;
1593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glu::ShaderProgram*		m_vaoProgram;
1603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glu::ShaderProgram*		m_stateProgram;
1613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	de::Random				m_random;
1623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint8*				m_indices;
1633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void					logVertexArrayState (tcu::TestLog& log, const VertexArrayState& state, const std::string& msg);
1653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint8*				createRandomBufferData	(const BufferSpec& buffer);
1663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint8*				generateIndices			(void);
1673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glu::ShaderProgram*		createProgram			(const VertexArrayState& state);
1683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void					setState				(const VertexArrayState& state);
1693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void					render					(tcu::Surface& vaoResult, tcu::Surface& defaultResult);
1703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void					makeDrawCall			(const VertexArrayState& state);
1713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void					genReferences			(tcu::Surface& vaoRef, tcu::Surface& defaultRef);
1723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							VertexArrayObjectTest	(const VertexArrayObjectTest&);
1743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	VertexArrayObjectTest&	operator=				(const VertexArrayObjectTest&);
1753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
1763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1773c827367444ee418f129b2c238299f49d3264554Jarkko PoyryVertexArrayObjectTest::VertexArrayObjectTest (Context& context, const Spec& spec, const char* name, const char* description)
1783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: TestCase			(context, name, description)
1793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_spec			(spec)
1803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_log				(context.getTestContext().getLog())
1813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_vaoProgram		(NULL)
1823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_stateProgram	(NULL)
1833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_random			(deStringHash(name))
1843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_indices			(NULL)
1853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Makes zero to zero mapping for buffers
1873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_buffers.push_back(0);
1883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1903c827367444ee418f129b2c238299f49d3264554Jarkko PoyryVertexArrayObjectTest::~VertexArrayObjectTest (void)
1913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1943c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid VertexArrayObjectTest::logVertexArrayState (tcu::TestLog& log, const VertexArrayState& state, const std::string& msg)
1953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	std::stringstream message;
1973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	message << msg << "\n";
1993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	message << "GL_ELEMENT_ARRAY_BUFFER : " << state.elementArrayBuffer << "\n";
2003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int attribNdx = 0; attribNdx < (int)state.attributes.size(); attribNdx++)
2023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		message
2043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "attribute : " << attribNdx << "\n"
2053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "\tGL_VERTEX_ATTRIB_ARRAY_ENABLED : " << (state.attributes[attribNdx].enabled ? "GL_TRUE" : "GL_FALSE") <<  "\n"
2063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "\tGL_VERTEX_ATTRIB_ARRAY_SIZE : " << state.attributes[attribNdx].size <<  "\n"
2073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "\tGL_VERTEX_ATTRIB_ARRAY_STRIDE : " << state.attributes[attribNdx].stride <<  "\n"
2083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "\tGL_VERTEX_ATTRIB_ARRAY_TYPE : " << state.attributes[attribNdx].type <<  "\n"
2093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "\tGL_VERTEX_ATTRIB_ARRAY_NORMALIZED : " << (state.attributes[attribNdx].normalized ? "GL_TRUE" : "GL_FALSE") <<  "\n"
2103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "\tGL_VERTEX_ATTRIB_ARRAY_INTEGER : " << (state.attributes[attribNdx].integer ? "GL_TRUE" : "GL_FALSE") <<  "\n"
2113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "\tGL_VERTEX_ATTRIB_ARRAY_DIVISOR : " << state.attributes[attribNdx].divisor <<  "\n"
2123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "\tGL_VERTEX_ATTRIB_ARRAY_POINTER : " << state.attributes[attribNdx].offset <<  "\n"
2133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "\tGL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING : " << m_buffers[state.attributes[attribNdx].bufferNdx] <<  "\n";
2143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
2153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	log << tcu::TestLog::Message << message.str() << tcu::TestLog::EndMessage;
2163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2193c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid VertexArrayObjectTest::init (void)
2203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// \note [mika] Index 0 is reserved for 0 buffer
2223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int bufferNdx = 0; bufferNdx < (int)m_spec.buffers.size(); bufferNdx++)
2233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		deUint8* data = createRandomBufferData(m_spec.buffers[bufferNdx]);
2253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		try
2273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
2283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint buffer;
2293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLU_CHECK_CALL(glGenBuffers(1, &buffer));
2303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_buffers.push_back(buffer);
2313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLU_CHECK_CALL(glBindBuffer(GL_ARRAY_BUFFER, buffer));
2333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLU_CHECK_CALL(glBufferData(GL_ARRAY_BUFFER, m_spec.buffers[bufferNdx].size, data, GL_DYNAMIC_DRAW));
2343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLU_CHECK_CALL(glBindBuffer(GL_ARRAY_BUFFER, 0));
2353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		} catch (...) {
2373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			delete[] data;
2383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			throw;
2393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
2403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		delete[] data;
2423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
2433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_vaoProgram	= createProgram(m_spec.vao);
2453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_log << tcu::TestLog::Message << "Program used with Vertex Array Object" << tcu::TestLog::EndMessage;
2463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_log << *m_vaoProgram;
2473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_stateProgram	= createProgram(m_spec.state);
2483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_log << tcu::TestLog::Message << "Program used with Vertex Array State" << tcu::TestLog::EndMessage;
2493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_log << *m_stateProgram;
2503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!m_vaoProgram->isOk() || !m_stateProgram->isOk())
2523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TCU_FAIL("Failed to compile shaders");
2533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_spec.useDrawElements && (m_spec.vao.elementArrayBuffer == 0 || m_spec.state.elementArrayBuffer == 0))
2553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_indices = generateIndices();
2563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2583c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid VertexArrayObjectTest::deinit (void)
2593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glDeleteBuffers((GLsizei)m_buffers.size(), &(m_buffers[0])));
2613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_buffers.clear();
2623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	delete m_vaoProgram;
2633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	delete m_stateProgram;
2643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	delete[] m_indices;
2653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2673c827367444ee418f129b2c238299f49d3264554Jarkko PoyrydeUint8* VertexArrayObjectTest::generateIndices (void)
2683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int typeSize = 0;
2703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	switch (m_spec.indexType)
2713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_UNSIGNED_INT:	typeSize = sizeof(GLuint);		break;
2733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_UNSIGNED_SHORT:	typeSize = sizeof(GLushort);	break;
2743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_UNSIGNED_BYTE:	typeSize = sizeof(GLubyte);		break;
2753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		default:
2763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DE_ASSERT(false);
2773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
2783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint8* indices = new deUint8[m_spec.indexCount * typeSize];
2803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int i = 0; i < m_spec.indexCount; i++)
2823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		deUint8* pos = indices + typeSize * i;
2843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		switch (m_spec.indexType)
2863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
2873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			case GL_UNSIGNED_INT:
2883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
2893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLuint v = (GLuint)m_random.getInt(m_spec.indexRangeMin, m_spec.indexRangeMax);
2903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				deMemcpy(pos, &v, sizeof(v));
2913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				break;
2923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
2933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			case GL_UNSIGNED_SHORT:
2953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
2963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLushort v = (GLushort)m_random.getInt(m_spec.indexRangeMin, m_spec.indexRangeMax);
2973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				deMemcpy(pos, &v, sizeof(v));
2983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				break;
2993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
3003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			case GL_UNSIGNED_BYTE:
3023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
3033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLubyte v = (GLubyte)m_random.getInt(m_spec.indexRangeMin, m_spec.indexRangeMax);
3043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				deMemcpy(pos, &v, sizeof(v));
3053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				break;
3063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
3073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			default:
3093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				DE_ASSERT(false);
3103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
3113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
3123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return indices;
3143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3163c827367444ee418f129b2c238299f49d3264554Jarkko PoyrydeUint8* VertexArrayObjectTest::createRandomBufferData (const BufferSpec& buffer)
3173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint8* data = new deUint8[buffer.size];
3193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int stride;
3213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (buffer.stride != 0)
3233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
3243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		stride = buffer.stride;
3253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
3263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
3273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
3283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		switch (buffer.type)
3293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
330b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry			case GL_FLOAT:			stride = buffer.componentCount * (int)sizeof(GLfloat);	break;
331b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry			case GL_INT:			stride = buffer.componentCount * (int)sizeof(GLint);	break;
332b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry			case GL_UNSIGNED_INT:	stride = buffer.componentCount * (int)sizeof(GLuint);	break;
333b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry			case GL_SHORT:			stride = buffer.componentCount * (int)sizeof(GLshort);	break;
334b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry			case GL_UNSIGNED_SHORT:	stride = buffer.componentCount * (int)sizeof(GLushort);	break;
335b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry			case GL_BYTE:			stride = buffer.componentCount * (int)sizeof(GLbyte);	break;
336b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry			case GL_UNSIGNED_BYTE:	stride = buffer.componentCount * (int)sizeof(GLubyte);	break;
3373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			default:
3393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				stride = 0;
3403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				DE_ASSERT(DE_FALSE);
3413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
3423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
3433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint8* itr = data;
3453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int pos = 0; pos < buffer.count; pos++)
3473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
3483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		deUint8* componentItr = itr;
3493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int componentNdx = 0; componentNdx < buffer.componentCount; componentNdx++)
3503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
3513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			switch (buffer.type)
3523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
3533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				case GL_FLOAT:
3543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				{
3553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					float v = buffer.floatRangeMin + (buffer.floatRangeMax - buffer.floatRangeMin) * m_random.getFloat();
3563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					deMemcpy(componentItr, &v, sizeof(v));
3573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					componentItr += sizeof(v);
3583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					break;
3593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				}
3603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				case GL_INT:
3623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				{
3633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					GLint v = m_random.getInt(buffer.intRangeMin, buffer.intRangeMax);
3643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					deMemcpy(componentItr, &v, sizeof(v));
3653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					componentItr += sizeof(v);
3663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					break;
3673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				}
3683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				case GL_UNSIGNED_INT:
3703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				{
3713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					GLuint v = m_random.getInt(buffer.intRangeMin, buffer.intRangeMax);
3723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					deMemcpy(componentItr, &v, sizeof(v));
3733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					componentItr += sizeof(v);
3743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					break;
3753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				}
3763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				case GL_SHORT:
3783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				{
379b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry					GLshort v = (GLshort)m_random.getInt(buffer.intRangeMin, buffer.intRangeMax);
3803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					deMemcpy(componentItr, &v, sizeof(v));
3813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					componentItr += sizeof(v);
3823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					break;
3833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				}
3843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				case GL_UNSIGNED_SHORT:
3863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				{
387b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry					GLushort v = (GLushort)m_random.getInt(buffer.intRangeMin, buffer.intRangeMax);
3883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					deMemcpy(componentItr, &v, sizeof(v));
3893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					componentItr += sizeof(v);
3903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					break;
3913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				}
3923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				case GL_BYTE:
3943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				{
395b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry					GLbyte v = (GLbyte)m_random.getInt(buffer.intRangeMin, buffer.intRangeMax);
3963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					deMemcpy(componentItr, &v, sizeof(v));
3973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					componentItr += sizeof(v);
3983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					break;
3993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				}
4003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				case GL_UNSIGNED_BYTE:
4023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				{
403b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry					GLubyte v = (GLubyte)m_random.getInt(buffer.intRangeMin, buffer.intRangeMax);
4043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					deMemcpy(componentItr, &v, sizeof(v));
4053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					componentItr += sizeof(v);
4063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					break;
4073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				}
4083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				default:
4103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					DE_ASSERT(false);
4113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			};
4123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
4133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		itr += stride;
4153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
4163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return data;
4183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
4193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4203c827367444ee418f129b2c238299f49d3264554Jarkko Poyryglu::ShaderProgram* VertexArrayObjectTest::createProgram (const VertexArrayState& state)
4213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	std::stringstream vertexShaderStream;
4233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	std::stringstream value;
4243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	vertexShaderStream << "#version 300 es\n";
4263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int attribNdx = 0; attribNdx < (int)state.attributes.size(); attribNdx++)
4283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
4293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (state.attributes[attribNdx].integer)
4303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			vertexShaderStream << "layout(location = " << attribNdx << ") in mediump ivec4 a_attrib" << attribNdx << ";\n";
4313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
4323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			vertexShaderStream << "layout(location = " << attribNdx << ") in mediump vec4 a_attrib" << attribNdx << ";\n";
4333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (state.attributes[attribNdx].integer)
4353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
4363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			float scale = 0.0f;
4373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			switch (state.attributes[0].type)
4393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
440b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry				case GL_SHORT:			scale  = (1.0f/float((1u<<14)-1u));	break;
441b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry				case GL_UNSIGNED_SHORT:	scale  = (1.0f/float((1u<<15)-1u));	break;
442b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry				case GL_INT:			scale  = (1.0f/float((1u<<30)-1u));	break;
443b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry				case GL_UNSIGNED_INT:	scale  = (1.0f/float((1u<<31)-1u));	break;
444b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry				case GL_BYTE:			scale  = (1.0f/float((1u<<6)-1u));	break;
445b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry				case GL_UNSIGNED_BYTE:	scale  = (1.0f/float((1u<<7)-1u));	break;
4463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				default:
4483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					DE_ASSERT(DE_FALSE);
4493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
4503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			value << (attribNdx != 0 ? " + " : "" ) << scale << " * vec4(a_attrib" << attribNdx << ")";
4513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
4523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else if (state.attributes[attribNdx].type != GL_FLOAT && !state.attributes[attribNdx].normalized)
4533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
4543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			float scale = 0.0f;
4553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			switch (state.attributes[0].type)
4573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
458b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry				case GL_SHORT:			scale  = (0.5f/float((1u<<14)-1u));	break;
459b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry				case GL_UNSIGNED_SHORT:	scale  = (0.5f/float((1u<<15)-1u));	break;
460b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry				case GL_INT:			scale  = (0.5f/float((1u<<30)-1u));	break;
461b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry				case GL_UNSIGNED_INT:	scale  = (0.5f/float((1u<<31)-1u));	break;
462b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry				case GL_BYTE:			scale  = (0.5f/float((1u<<6)-1u));	break;
463b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry				case GL_UNSIGNED_BYTE:	scale  = (0.5f/float((1u<<7)-1u));	break;
4643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				default:
4663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					DE_ASSERT(DE_FALSE);
4673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
4683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			value << (attribNdx != 0 ? " + " : "" ) << scale << " * a_attrib" << attribNdx;
4693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
4703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
4713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			value << (attribNdx != 0 ? " + " : "" ) << "a_attrib" << attribNdx;
4723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
4733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	vertexShaderStream
4753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "out mediump vec4 v_value;\n"
4763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "void main (void)\n"
4773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "{\n"
4783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "\tv_value = " << value.str() << ";\n";
4793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (state.attributes[0].integer)
4813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
4823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		float scale = 0.0f;
4833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		switch (state.attributes[0].type)
4853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
486b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry			case GL_SHORT:			scale  = (1.0f/float((1u<<14)-1u));	break;
487b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry			case GL_UNSIGNED_SHORT:	scale  = (1.0f/float((1u<<15)-1u));	break;
488b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry			case GL_INT:			scale  = (1.0f/float((1u<<30)-1u));	break;
489b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry			case GL_UNSIGNED_INT:	scale  = (1.0f/float((1u<<31)-1u));	break;
490b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry			case GL_BYTE:			scale  = (1.0f/float((1u<<6)-1u));	break;
491b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry			case GL_UNSIGNED_BYTE:	scale  = (1.0f/float((1u<<7)-1u));	break;
4923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			default:
4943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				DE_ASSERT(DE_FALSE);
4953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
4963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		vertexShaderStream
4983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< "\tgl_Position = vec4(" << scale << " * " <<  "vec3(a_attrib0.xyz), 1.0);\n"
4993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< "}";
5003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
5013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
5023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
5033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (state.attributes[0].normalized || state.attributes[0].type == GL_FLOAT)
5043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
5053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			vertexShaderStream
5063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< "\tgl_Position = vec4(a_attrib0.xyz, 1.0);\n"
5073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< "}";
5083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
5093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
5103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
5113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			float scale = 0.0f;
5123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			switch (state.attributes[0].type)
5143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
515b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry				case GL_SHORT:			scale  = (1.0f/float((1u<<14)-1u));	break;
516b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry				case GL_UNSIGNED_SHORT:	scale  = (1.0f/float((1u<<15)-1u));	break;
517b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry				case GL_INT:			scale  = (1.0f/float((1u<<30)-1u));	break;
518b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry				case GL_UNSIGNED_INT:	scale  = (1.0f/float((1u<<31)-1u));	break;
519b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry				case GL_BYTE:			scale  = (1.0f/float((1u<<6)-1u));	break;
520b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry				case GL_UNSIGNED_BYTE:	scale  = (1.0f/float((1u<<7)-1u));	break;
5213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				default:
5233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					DE_ASSERT(DE_FALSE);
5243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
5253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
526b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry			scale *= 0.5f;
5273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			vertexShaderStream
5293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< "\tgl_Position = vec4(" << scale << " * " <<  "a_attrib0.xyz, 1.0);\n"
5303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< "}";
5313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
5323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
5333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const char* fragmentShader =
5353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	"#version 300 es\n"
5363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	"in mediump vec4 v_value;\n"
5373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	"layout(location = 0) out mediump vec4 fragColor;\n"
5383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	"void main (void)\n"
5393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	"{\n"
5403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	"\tfragColor = vec4(v_value.xyz, 1.0);\n"
5413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	"}";
5423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return new glu::ShaderProgram(m_context.getRenderContext(), glu::makeVtxFragSources(vertexShaderStream.str(), fragmentShader));
5443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
5453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5463c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid VertexArrayObjectTest::setState (const VertexArrayState& state)
5473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_buffers[state.elementArrayBuffer]));
5493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int attribNdx = 0; attribNdx < (int)state.attributes.size(); attribNdx++)
5513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
5523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GLU_CHECK_CALL(glBindBuffer(GL_ARRAY_BUFFER, m_buffers[state.attributes[attribNdx].bufferNdx]));
5533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (state.attributes[attribNdx].enabled)
5543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLU_CHECK_CALL(glEnableVertexAttribArray(attribNdx));
5553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
5563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLU_CHECK_CALL(glDisableVertexAttribArray(attribNdx));
5573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (state.attributes[attribNdx].integer)
5593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLU_CHECK_CALL(glVertexAttribIPointer(attribNdx, state.attributes[attribNdx].size, state.attributes[attribNdx].type, state.attributes[attribNdx].stride, (const GLvoid*)((GLintptr)state.attributes[attribNdx].offset)));
5603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
5613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLU_CHECK_CALL(glVertexAttribPointer(attribNdx, state.attributes[attribNdx].size, state.attributes[attribNdx].type, state.attributes[attribNdx].normalized, state.attributes[attribNdx].stride, (const GLvoid*)((GLintptr)state.attributes[attribNdx].offset)));
5623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GLU_CHECK_CALL(glVertexAttribDivisor(attribNdx, state.attributes[attribNdx].divisor));
5643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
5653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
5663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5673c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid VertexArrayObjectTest::makeDrawCall (const VertexArrayState& state)
5683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glClearColor(0.7f, 0.7f, 0.7f, 1.0f));
5703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glClear(GL_COLOR_BUFFER_BIT));
5713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_spec.useDrawElements)
5733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
5743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (state.elementArrayBuffer == 0)
5753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
5763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (m_spec.instances == 0)
5773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLU_CHECK_CALL(glDrawElements(GL_TRIANGLES, m_spec.count, m_spec.indexType, m_indices));
5783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			else
5793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLU_CHECK_CALL(glDrawElementsInstanced(GL_TRIANGLES, m_spec.count, m_spec.indexType, m_indices, m_spec.instances));
5803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
5813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
5823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
5833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (m_spec.instances == 0)
5843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLU_CHECK_CALL(glDrawElements(GL_TRIANGLES, m_spec.count, m_spec.indexType, (GLvoid*)((GLintptr)m_spec.indexOffset)));
5853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			else
5863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLU_CHECK_CALL(glDrawElementsInstanced(GL_TRIANGLES, m_spec.count, m_spec.indexType, (GLvoid*)((GLintptr)m_spec.indexOffset), m_spec.instances));
5873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
5883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
5893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
5903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
5913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_spec.instances == 0)
5923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLU_CHECK_CALL(glDrawArrays(GL_TRIANGLES, 0, m_spec.count));
5933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
5943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLU_CHECK_CALL(glDrawArraysInstanced(GL_TRIANGLES, 0, m_spec.count, m_spec.instances));
5953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
5963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
5973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5983c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid VertexArrayObjectTest::render (tcu::Surface& vaoResult, tcu::Surface& defaultResult)
5993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
6003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLuint vao = 0;
6013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glGenVertexArrays(1, &vao));
6033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glBindVertexArray(vao));
6043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	setState(m_spec.vao);
6053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glBindVertexArray(0));
6063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	setState(m_spec.state);
6083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glBindVertexArray(vao));
6103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glUseProgram(m_vaoProgram->getProgram()));
6113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	makeDrawCall(m_spec.vao);
6123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glu::readPixels(m_context.getRenderContext(), 0, 0, vaoResult.getAccess());
6133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	setState(m_spec.vao);
6143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glBindVertexArray(0));
6153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glUseProgram(m_stateProgram->getProgram()));
6173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	makeDrawCall(m_spec.state);
6183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glu::readPixels(m_context.getRenderContext(), 0, 0, defaultResult.getAccess());
6193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
6203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6213c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid VertexArrayObjectTest::genReferences (tcu::Surface& vaoRef, tcu::Surface& defaultRef)
6223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
6233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	setState(m_spec.vao);
6243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glUseProgram(m_vaoProgram->getProgram()));
6253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	makeDrawCall(m_spec.vao);
6263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glu::readPixels(m_context.getRenderContext(), 0, 0, vaoRef.getAccess());
6273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	setState(m_spec.state);
6293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glUseProgram(m_stateProgram->getProgram()));
6303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	makeDrawCall(m_spec.state);
6313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glu::readPixels(m_context.getRenderContext(), 0, 0, defaultRef.getAccess());
6323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
6333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6343c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTestCase::IterateResult VertexArrayObjectTest::iterate (void)
6353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
6363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	tcu::Surface	vaoReference	(m_context.getRenderContext().getRenderTarget().getWidth(), m_context.getRenderContext().getRenderTarget().getHeight());
6373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	tcu::Surface	stateReference	(m_context.getRenderContext().getRenderTarget().getWidth(), m_context.getRenderContext().getRenderTarget().getHeight());
6383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	tcu::Surface	vaoResult		(m_context.getRenderContext().getRenderTarget().getWidth(), m_context.getRenderContext().getRenderTarget().getHeight());
6403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	tcu::Surface	stateResult		(m_context.getRenderContext().getRenderTarget().getWidth(), m_context.getRenderContext().getRenderTarget().getHeight());
6413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool			isOk;
6433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	logVertexArrayState(m_log, m_spec.vao, "Vertex Array Object State");
6453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	logVertexArrayState(m_log, m_spec.state, "OpenGL Vertex Array State");
6463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	genReferences(stateReference, vaoReference);
6473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	render(stateResult, vaoResult);
6483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	isOk = tcu::pixelThresholdCompare (m_log, "Results", "Comparison result from rendering with Vertex Array State", stateReference, stateResult, tcu::RGBA(0,0,0,0), tcu::COMPARE_LOG_RESULT);
6503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	isOk = isOk && tcu::pixelThresholdCompare (m_log, "Results", "Comparison result from rendering with Vertex Array Object", vaoReference, vaoResult, tcu::RGBA(0,0,0,0), tcu::COMPARE_LOG_RESULT);
6513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (isOk)
6533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
6543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
6553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return STOP;
6563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
6573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
6583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
6593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
6603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return STOP;
6613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
6623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
6633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6643c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass MultiVertexArrayObjectTest : public TestCase
6653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
6663c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
6673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							MultiVertexArrayObjectTest	(Context& context, const char* name, const char* description);
6693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							~MultiVertexArrayObjectTest	(void);
6703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual void			init						(void);
6713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual void			deinit						(void);
6723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual IterateResult	iterate						(void);
6733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6743c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
6753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Spec					m_spec;
6763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	tcu::TestLog&			m_log;
6773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	vector<GLuint>			m_buffers;
6783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glu::ShaderProgram*		m_vaoProgram;
6793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glu::ShaderProgram*		m_stateProgram;
6803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	de::Random				m_random;
6813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint8*				m_indices;
6823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void					logVertexArrayState			(tcu::TestLog& log, const VertexArrayState& state, const std::string& msg);
6843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint8*				createRandomBufferData		(const BufferSpec& buffer);
6853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint8*				generateIndices				(void);
6863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glu::ShaderProgram*		createProgram				(const VertexArrayState& state);
6873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void					setState					(const VertexArrayState& state);
6883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void					render						(tcu::Surface& vaoResult, tcu::Surface& defaultResult);
6893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void					makeDrawCall				(const VertexArrayState& state);
6903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void					genReferences				(tcu::Surface& vaoRef, tcu::Surface& defaultRef);
6913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							MultiVertexArrayObjectTest	(const MultiVertexArrayObjectTest&);
6933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	MultiVertexArrayObjectTest&	operator=				(const MultiVertexArrayObjectTest&);
6943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
6953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6963c827367444ee418f129b2c238299f49d3264554Jarkko PoyryMultiVertexArrayObjectTest::MultiVertexArrayObjectTest (Context& context, const char* name, const char* description)
6973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: TestCase			(context, name, description)
6983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_log				(context.getTestContext().getLog())
6993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_vaoProgram		(NULL)
7003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_stateProgram	(NULL)
7013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_random			(deStringHash(name))
7023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_indices			(NULL)
7033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
7043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Makes zero to zero mapping for buffers
7053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_buffers.push_back(0);
7063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
7073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7083c827367444ee418f129b2c238299f49d3264554Jarkko PoyryMultiVertexArrayObjectTest::~MultiVertexArrayObjectTest (void)
7093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
7103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
7113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7123c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid MultiVertexArrayObjectTest::logVertexArrayState (tcu::TestLog& log, const VertexArrayState& state, const std::string& msg)
7133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
7143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	std::stringstream message;
7153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	message << msg << "\n";
7173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	message << "GL_ELEMENT_ARRAY_BUFFER : " << state.elementArrayBuffer << "\n";
7183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int attribNdx = 0; attribNdx < (int)state.attributes.size(); attribNdx++)
7203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
7213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		message
7223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "attribute : " << attribNdx << "\n"
7233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "\tGL_VERTEX_ATTRIB_ARRAY_ENABLED : " << (state.attributes[attribNdx].enabled ? "GL_TRUE" : "GL_FALSE") <<  "\n"
7243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "\tGL_VERTEX_ATTRIB_ARRAY_SIZE : " << state.attributes[attribNdx].size <<  "\n"
7253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "\tGL_VERTEX_ATTRIB_ARRAY_STRIDE : " << state.attributes[attribNdx].stride <<  "\n"
7263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "\tGL_VERTEX_ATTRIB_ARRAY_TYPE : " << state.attributes[attribNdx].type <<  "\n"
7273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "\tGL_VERTEX_ATTRIB_ARRAY_NORMALIZED : " << (state.attributes[attribNdx].normalized ? "GL_TRUE" : "GL_FALSE") <<  "\n"
7283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "\tGL_VERTEX_ATTRIB_ARRAY_INTEGER : " << (state.attributes[attribNdx].integer ? "GL_TRUE" : "GL_FALSE") <<  "\n"
7293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "\tGL_VERTEX_ATTRIB_ARRAY_DIVISOR : " << state.attributes[attribNdx].divisor <<  "\n"
7303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "\tGL_VERTEX_ATTRIB_ARRAY_POINTER : " << state.attributes[attribNdx].offset <<  "\n"
7313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "\t GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING : " << m_buffers[state.attributes[attribNdx].bufferNdx] <<  "\n";
7323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
7333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	log << tcu::TestLog::Message << message.str() << tcu::TestLog::EndMessage;
7343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
7353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7373c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid MultiVertexArrayObjectTest::init (void)
7383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
7393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLint attribCount;
7403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &attribCount));
7423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_spec.useDrawElements			= false;
7443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_spec.instances				= 0;
7453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_spec.count					= 24;
7463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_spec.indexOffset				= 0;
7473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_spec.indexRangeMin			= 0;
7483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_spec.indexRangeMax			= 0;
7493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_spec.indexType				= GL_NONE;
7503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_spec.indexCount				= 0;
7513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_spec.vao.elementArrayBuffer	= 0;
7523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_spec.state.elementArrayBuffer	= 0;
7533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int attribNdx = 0; attribNdx < attribCount; attribNdx++)
7553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
7563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		BufferSpec shortCoordBuffer48 = { 48, 2*384, 4, 0, 0, GL_SHORT, -32768, 32768, 0.0f, 0.0f };
7573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_spec.buffers.push_back(shortCoordBuffer48);
7583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_spec.state.attributes.push_back(Attribute());
7603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_spec.state.attributes[attribNdx].enabled		= (m_random.getInt(0, 4) == 0) ? GL_FALSE : GL_TRUE;
7613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_spec.state.attributes[attribNdx].size			= m_random.getInt(2,4);
7623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_spec.state.attributes[attribNdx].stride		= 2*m_random.getInt(1, 3);
7633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_spec.state.attributes[attribNdx].type			= GL_SHORT;
7643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_spec.state.attributes[attribNdx].integer		= m_random.getBool();
7653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_spec.state.attributes[attribNdx].divisor		= m_random.getInt(0, 1);
7663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_spec.state.attributes[attribNdx].offset		= 2*m_random.getInt(0, 2);
7673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_spec.state.attributes[attribNdx].normalized	= m_random.getBool();
7683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_spec.state.attributes[attribNdx].bufferNdx	= attribNdx+1;
7693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (attribNdx == 0)
7713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
7723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_spec.state.attributes[attribNdx].divisor	= 0;
7733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_spec.state.attributes[attribNdx].enabled	= GL_TRUE;
7743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_spec.state.attributes[attribNdx].size		= 2;
7753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
7763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_spec.vao.attributes.push_back(Attribute());
7783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_spec.vao.attributes[attribNdx].enabled		= (m_random.getInt(0, 4) == 0) ? GL_FALSE : GL_TRUE;
7793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_spec.vao.attributes[attribNdx].size			= m_random.getInt(2,4);
7803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_spec.vao.attributes[attribNdx].stride			= 2*m_random.getInt(1, 3);
7813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_spec.vao.attributes[attribNdx].type			= GL_SHORT;
7823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_spec.vao.attributes[attribNdx].integer		= m_random.getBool();
7833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_spec.vao.attributes[attribNdx].divisor		= m_random.getInt(0, 1);
7843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_spec.vao.attributes[attribNdx].offset			= 2*m_random.getInt(0, 2);
7853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_spec.vao.attributes[attribNdx].normalized		= m_random.getBool();
7863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_spec.vao.attributes[attribNdx].bufferNdx		= attribCount - attribNdx;
7873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (attribNdx == 0)
7893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
7903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_spec.vao.attributes[attribNdx].divisor	= 0;
7913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_spec.vao.attributes[attribNdx].enabled	= GL_TRUE;
7923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_spec.vao.attributes[attribNdx].size		= 2;
7933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
7943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
7963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// \note [mika] Index 0 is reserved for 0 buffer
7983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int bufferNdx = 0; bufferNdx < (int)m_spec.buffers.size(); bufferNdx++)
7993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
8003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		deUint8* data = createRandomBufferData(m_spec.buffers[bufferNdx]);
8013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		try
8033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
8043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLuint buffer;
8053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLU_CHECK_CALL(glGenBuffers(1, &buffer));
8063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_buffers.push_back(buffer);
8073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLU_CHECK_CALL(glBindBuffer(GL_ARRAY_BUFFER, buffer));
8093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLU_CHECK_CALL(glBufferData(GL_ARRAY_BUFFER, m_spec.buffers[bufferNdx].size, data, GL_DYNAMIC_DRAW));
8103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLU_CHECK_CALL(glBindBuffer(GL_ARRAY_BUFFER, 0));
8113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		} catch (...) {
8133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			delete[] data;
8143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			throw;
8153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
8163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		delete[] data;
8183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
8193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_vaoProgram	= createProgram(m_spec.vao);
8213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_log << tcu::TestLog::Message << "Program used with Vertex Array Object" << tcu::TestLog::EndMessage;
8223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_log << *m_vaoProgram;
8233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_stateProgram	= createProgram(m_spec.state);
8243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_log << tcu::TestLog::Message << "Program used with Vertex Array State" << tcu::TestLog::EndMessage;
8253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_log << *m_stateProgram;
8263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!m_vaoProgram->isOk() || !m_stateProgram->isOk())
8283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TCU_FAIL("Failed to compile shaders");
8293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_spec.useDrawElements && (m_spec.vao.elementArrayBuffer == 0 || m_spec.state.elementArrayBuffer == 0))
8313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_indices = generateIndices();
8323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
8333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8343c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid MultiVertexArrayObjectTest::deinit (void)
8353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
8363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glDeleteBuffers((GLsizei)m_buffers.size(), &(m_buffers[0])));
8373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_buffers.clear();
8383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	delete m_vaoProgram;
8393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	delete m_stateProgram;
8403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	delete[] m_indices;
8413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
8423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8433c827367444ee418f129b2c238299f49d3264554Jarkko PoyrydeUint8* MultiVertexArrayObjectTest::generateIndices (void)
8443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
8453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int typeSize = 0;
8463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	switch (m_spec.indexType)
8473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
8483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_UNSIGNED_INT:	typeSize = sizeof(GLuint);		break;
8493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_UNSIGNED_SHORT:	typeSize = sizeof(GLushort);	break;
8503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_UNSIGNED_BYTE:	typeSize = sizeof(GLubyte);		break;
8513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		default:
8523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DE_ASSERT(false);
8533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
8543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint8* indices = new deUint8[m_spec.indexCount * typeSize];
8563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int i = 0; i < m_spec.indexCount; i++)
8583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
8593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		deUint8* pos = indices + typeSize * i;
8603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		switch (m_spec.indexType)
8623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
8633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			case GL_UNSIGNED_INT:
8643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
8653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLuint v = (GLuint)m_random.getInt(m_spec.indexRangeMin, m_spec.indexRangeMax);
8663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				deMemcpy(pos, &v, sizeof(v));
8673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				break;
8683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
8693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			case GL_UNSIGNED_SHORT:
8713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
8723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLushort v = (GLushort)m_random.getInt(m_spec.indexRangeMin, m_spec.indexRangeMax);
8733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				deMemcpy(pos, &v, sizeof(v));
8743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				break;
8753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
8763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			case GL_UNSIGNED_BYTE:
8783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
8793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLubyte v = (GLubyte)m_random.getInt(m_spec.indexRangeMin, m_spec.indexRangeMax);
8803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				deMemcpy(pos, &v, sizeof(v));
8813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				break;
8823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
8833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			default:
8853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				DE_ASSERT(false);
8863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
8873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
8883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return indices;
8903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
8913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8923c827367444ee418f129b2c238299f49d3264554Jarkko PoyrydeUint8* MultiVertexArrayObjectTest::createRandomBufferData (const BufferSpec& buffer)
8933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
8943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint8* data = new deUint8[buffer.size];
8953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int stride;
8973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (buffer.stride != 0)
8993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
9003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		stride = buffer.stride;
9013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
9023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
9033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
9043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		switch (buffer.type)
9053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
906b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry			case GL_FLOAT:			stride = buffer.componentCount * (int)sizeof(GLfloat);	break;
907b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry			case GL_INT:			stride = buffer.componentCount * (int)sizeof(GLint);	break;
908b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry			case GL_UNSIGNED_INT:	stride = buffer.componentCount * (int)sizeof(GLuint);	break;
909b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry			case GL_SHORT:			stride = buffer.componentCount * (int)sizeof(GLshort);	break;
910b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry			case GL_UNSIGNED_SHORT:	stride = buffer.componentCount * (int)sizeof(GLushort);	break;
911b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry			case GL_BYTE:			stride = buffer.componentCount * (int)sizeof(GLbyte);	break;
912b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry			case GL_UNSIGNED_BYTE:	stride = buffer.componentCount * (int)sizeof(GLubyte);	break;
9133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			default:
9153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				stride = 0;
9163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				DE_ASSERT(DE_FALSE);
9173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
9183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
9193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint8* itr = data;
9213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int pos = 0; pos < buffer.count; pos++)
9233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
9243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		deUint8* componentItr = itr;
9253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int componentNdx = 0; componentNdx < buffer.componentCount; componentNdx++)
9263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
9273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			switch (buffer.type)
9283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
9293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				case GL_FLOAT:
9303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				{
9313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					float v = buffer.floatRangeMin + (buffer.floatRangeMax - buffer.floatRangeMin) * m_random.getFloat();
9323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					deMemcpy(componentItr, &v, sizeof(v));
9333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					componentItr += sizeof(v);
9343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					break;
9353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				}
9363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				case GL_INT:
9383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				{
9393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					GLint v = m_random.getInt(buffer.intRangeMin, buffer.intRangeMax);
9403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					deMemcpy(componentItr, &v, sizeof(v));
9413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					componentItr += sizeof(v);
9423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					break;
9433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				}
9443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				case GL_UNSIGNED_INT:
9463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				{
947b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry					GLuint v = (GLuint)m_random.getInt(buffer.intRangeMin, buffer.intRangeMax);
9483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					deMemcpy(componentItr, &v, sizeof(v));
9493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					componentItr += sizeof(v);
9503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					break;
9513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				}
9523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				case GL_SHORT:
9543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				{
955b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry					GLshort v = (GLshort)m_random.getInt(buffer.intRangeMin, buffer.intRangeMax);
9563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					deMemcpy(componentItr, &v, sizeof(v));
9573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					componentItr += sizeof(v);
9583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					break;
9593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				}
9603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				case GL_UNSIGNED_SHORT:
9623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				{
963b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry					GLushort v = (GLushort)m_random.getInt(buffer.intRangeMin, buffer.intRangeMax);
9643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					deMemcpy(componentItr, &v, sizeof(v));
9653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					componentItr += sizeof(v);
9663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					break;
9673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				}
9683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				case GL_BYTE:
9703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				{
971b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry					GLbyte v = (GLbyte)m_random.getInt(buffer.intRangeMin, buffer.intRangeMax);
9723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					deMemcpy(componentItr, &v, sizeof(v));
9733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					componentItr += sizeof(v);
9743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					break;
9753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				}
9763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				case GL_UNSIGNED_BYTE:
9783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				{
979b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry					GLubyte v = (GLubyte)m_random.getInt(buffer.intRangeMin, buffer.intRangeMax);
9803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					deMemcpy(componentItr, &v, sizeof(v));
9813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					componentItr += sizeof(v);
9823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					break;
9833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				}
9843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				default:
9863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					DE_ASSERT(false);
9873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			};
9883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
9893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		itr += stride;
9913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
9923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return data;
9943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
9953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9963c827367444ee418f129b2c238299f49d3264554Jarkko Poyryglu::ShaderProgram* MultiVertexArrayObjectTest::createProgram (const VertexArrayState& state)
9973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
9983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	std::stringstream vertexShaderStream;
9993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	std::stringstream value;
10003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	vertexShaderStream << "#version 300 es\n";
10023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int attribNdx = 0; attribNdx < (int)state.attributes.size(); attribNdx++)
10043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
10053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (state.attributes[attribNdx].integer)
10063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			vertexShaderStream << "layout(location = " << attribNdx << ") in mediump ivec4 a_attrib" << attribNdx << ";\n";
10073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
10083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			vertexShaderStream << "layout(location = " << attribNdx << ") in mediump vec4 a_attrib" << attribNdx << ";\n";
10093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (state.attributes[attribNdx].integer)
10113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
10123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			float scale = 0.0f;
10133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			switch (state.attributes[0].type)
10153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
1016b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry				case GL_SHORT:			scale  = (1.0f/float((1u<<14)-1u));	break;
1017b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry				case GL_UNSIGNED_SHORT:	scale  = (1.0f/float((1u<<15)-1u));	break;
1018b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry				case GL_INT:			scale  = (1.0f/float((1u<<30)-1u));	break;
1019b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry				case GL_UNSIGNED_INT:	scale  = (1.0f/float((1u<<31)-1u));	break;
1020b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry				case GL_BYTE:			scale  = (1.0f/float((1u<<6)-1u));	break;
1021b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry				case GL_UNSIGNED_BYTE:	scale  = (1.0f/float((1u<<7)-1u));	break;
10223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				default:
10243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					DE_ASSERT(DE_FALSE);
10253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
10263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			value << (attribNdx != 0 ? " + " : "" ) << scale << " * vec4(a_attrib" << attribNdx << ")";
10273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
10283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else if (state.attributes[attribNdx].type != GL_FLOAT && !state.attributes[attribNdx].normalized)
10293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
10303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			float scale = 0.0f;
10313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			switch (state.attributes[0].type)
10333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
1034b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry				case GL_SHORT:			scale  = (0.5f/float((1u<<14)-1u));	break;
1035b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry				case GL_UNSIGNED_SHORT:	scale  = (0.5f/float((1u<<15)-1u));	break;
1036b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry				case GL_INT:			scale  = (0.5f/float((1u<<30)-1u));	break;
1037b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry				case GL_UNSIGNED_INT:	scale  = (0.5f/float((1u<<31)-1u));	break;
1038b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry				case GL_BYTE:			scale  = (0.5f/float((1u<<6)-1u));	break;
1039b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry				case GL_UNSIGNED_BYTE:	scale  = (0.5f/float((1u<<7)-1u));	break;
10403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				default:
10423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					DE_ASSERT(DE_FALSE);
10433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
10443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			value << (attribNdx != 0 ? " + " : "" ) << scale << " * a_attrib" << attribNdx;
10453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
10463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
10473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			value << (attribNdx != 0 ? " + " : "" ) << "a_attrib" << attribNdx;
10483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
10493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	vertexShaderStream
10513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "out mediump vec4 v_value;\n"
10523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "void main (void)\n"
10533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "{\n"
10543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		<< "\tv_value = " << value.str() << ";\n";
10553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (state.attributes[0].integer)
10573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
10583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		float scale = 0.0f;
10593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		switch (state.attributes[0].type)
10613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
1062b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry			case GL_SHORT:			scale  = (1.0f/float((1u<<14)-1u));	break;
1063b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry			case GL_UNSIGNED_SHORT:	scale  = (1.0f/float((1u<<15)-1u));	break;
1064b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry			case GL_INT:			scale  = (1.0f/float((1u<<30)-1u));	break;
1065b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry			case GL_UNSIGNED_INT:	scale  = (1.0f/float((1u<<31)-1u));	break;
1066b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry			case GL_BYTE:			scale  = (1.0f/float((1u<<6)-1u));	break;
1067b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry			case GL_UNSIGNED_BYTE:	scale  = (1.0f/float((1u<<7)-1u));	break;
10683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			default:
10713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				DE_ASSERT(DE_FALSE);
10723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
10733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		vertexShaderStream
10753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< "\tgl_Position = vec4(" << scale << " * " <<  "a_attrib0.xyz, 1.0);\n"
10763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< "}";
10773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
10783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
10793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
10803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (state.attributes[0].normalized || state.attributes[0].type == GL_FLOAT)
10813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
10823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			vertexShaderStream
10833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< "\tgl_Position = vec4(a_attrib0.xyz, 1.0);\n"
10843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< "}";
10853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
10863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
10873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
10883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			float scale = 0.0f;
10893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			switch (state.attributes[0].type)
10913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
1092b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry				case GL_SHORT:			scale  = (1.0f/float((1u<<14)-1u));	break;
1093b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry				case GL_UNSIGNED_SHORT:	scale  = (1.0f/float((1u<<15)-1u));	break;
1094b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry				case GL_INT:			scale  = (1.0f/float((1u<<30)-1u));	break;
1095b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry				case GL_UNSIGNED_INT:	scale  = (1.0f/float((1u<<31)-1u));	break;
1096b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry				case GL_BYTE:			scale  = (1.0f/float((1u<<6)-1u));	break;
1097b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry				case GL_UNSIGNED_BYTE:	scale  = (1.0f/float((1u<<7)-1u));	break;
10983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
10993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				default:
11003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					DE_ASSERT(DE_FALSE);
11013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
11023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1103b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry			scale *= 0.5f;
11043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			vertexShaderStream
11063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< "\tgl_Position = vec4(" << scale << " * " <<  "vec3(a_attrib0.xyz), 1.0);\n"
11073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				<< "}";
11083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
11093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
11103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const char* fragmentShader =
11123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	"#version 300 es\n"
11133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	"in mediump vec4 v_value;\n"
11143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	"layout(location = 0) out mediump vec4 fragColor;\n"
11153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	"void main (void)\n"
11163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	"{\n"
11173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	"\tfragColor = vec4(v_value.xyz, 1.0);\n"
11183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	"}";
11193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return new glu::ShaderProgram(m_context.getRenderContext(), glu::makeVtxFragSources(vertexShaderStream.str(), fragmentShader));
11213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
11223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11233c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid MultiVertexArrayObjectTest::setState (const VertexArrayState& state)
11243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
11253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_buffers[state.elementArrayBuffer]));
11263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int attribNdx = 0; attribNdx < (int)state.attributes.size(); attribNdx++)
11283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
11293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GLU_CHECK_CALL(glBindBuffer(GL_ARRAY_BUFFER, m_buffers[state.attributes[attribNdx].bufferNdx]));
11303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (state.attributes[attribNdx].enabled)
11313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLU_CHECK_CALL(glEnableVertexAttribArray(attribNdx));
11323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
11333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLU_CHECK_CALL(glDisableVertexAttribArray(attribNdx));
11343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (state.attributes[attribNdx].integer)
11363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLU_CHECK_CALL(glVertexAttribIPointer(attribNdx, state.attributes[attribNdx].size, state.attributes[attribNdx].type, state.attributes[attribNdx].stride, (const GLvoid*)((GLintptr)state.attributes[attribNdx].offset)));
11373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
11383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLU_CHECK_CALL(glVertexAttribPointer(attribNdx, state.attributes[attribNdx].size, state.attributes[attribNdx].type, state.attributes[attribNdx].normalized, state.attributes[attribNdx].stride, (const GLvoid*)((GLintptr)state.attributes[attribNdx].offset)));
11393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GLU_CHECK_CALL(glVertexAttribDivisor(attribNdx, state.attributes[attribNdx].divisor));
11413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
11423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
11433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11443c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid MultiVertexArrayObjectTest::makeDrawCall (const VertexArrayState& state)
11453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
11463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glClearColor(0.7f, 0.7f, 0.7f, 1.0f));
11473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glClear(GL_COLOR_BUFFER_BIT));
11483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_spec.useDrawElements)
11503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
11513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (state.elementArrayBuffer == 0)
11523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
11533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (m_spec.instances == 0)
11543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLU_CHECK_CALL(glDrawElements(GL_TRIANGLES, m_spec.count, m_spec.indexType, m_indices));
11553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			else
11563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLU_CHECK_CALL(glDrawElementsInstanced(GL_TRIANGLES, m_spec.count, m_spec.indexType, m_indices, m_spec.instances));
11573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
11583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
11593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
11603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (m_spec.instances == 0)
11613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLU_CHECK_CALL(glDrawElements(GL_TRIANGLES, m_spec.count, m_spec.indexType, (GLvoid*)((GLintptr)m_spec.indexOffset)));
11623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			else
11633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				GLU_CHECK_CALL(glDrawElementsInstanced(GL_TRIANGLES, m_spec.count, m_spec.indexType, (GLvoid*)((GLintptr)m_spec.indexOffset), m_spec.instances));
11643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
11653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
11663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
11673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
11683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (m_spec.instances == 0)
11693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLU_CHECK_CALL(glDrawArrays(GL_TRIANGLES, 0, m_spec.count));
11703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
11713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLU_CHECK_CALL(glDrawArraysInstanced(GL_TRIANGLES, 0, m_spec.count, m_spec.instances));
11723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
11733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
11743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11753c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid MultiVertexArrayObjectTest::render (tcu::Surface& vaoResult, tcu::Surface& defaultResult)
11763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
11773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLuint vao = 0;
11783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glGenVertexArrays(1, &vao));
11803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glBindVertexArray(vao));
11813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	setState(m_spec.vao);
11823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glBindVertexArray(0));
11833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	setState(m_spec.state);
11853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glBindVertexArray(vao));
11873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glUseProgram(m_vaoProgram->getProgram()));
11883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	makeDrawCall(m_spec.vao);
11893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glu::readPixels(m_context.getRenderContext(), 0, 0, vaoResult.getAccess());
11903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	setState(m_spec.vao);
11913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glBindVertexArray(0));
11923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glUseProgram(m_stateProgram->getProgram()));
11943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	makeDrawCall(m_spec.state);
11953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glu::readPixels(m_context.getRenderContext(), 0, 0, defaultResult.getAccess());
11963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
11973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
11983c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid MultiVertexArrayObjectTest::genReferences (tcu::Surface& vaoRef, tcu::Surface& defaultRef)
11993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
12003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	setState(m_spec.vao);
12013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glUseProgram(m_vaoProgram->getProgram()));
12023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	makeDrawCall(m_spec.vao);
12033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glu::readPixels(m_context.getRenderContext(), 0, 0, vaoRef.getAccess());
12043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	setState(m_spec.state);
12063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glUseProgram(m_stateProgram->getProgram()));
12073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	makeDrawCall(m_spec.state);
12083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glu::readPixels(m_context.getRenderContext(), 0, 0, defaultRef.getAccess());
12093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
12103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12113c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTestCase::IterateResult MultiVertexArrayObjectTest::iterate (void)
12123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
12133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	tcu::Surface	vaoReference	(m_context.getRenderContext().getRenderTarget().getWidth(), m_context.getRenderContext().getRenderTarget().getHeight());
12143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	tcu::Surface	stateReference	(m_context.getRenderContext().getRenderTarget().getWidth(), m_context.getRenderContext().getRenderTarget().getHeight());
12153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	tcu::Surface	vaoResult		(m_context.getRenderContext().getRenderTarget().getWidth(), m_context.getRenderContext().getRenderTarget().getHeight());
12173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	tcu::Surface	stateResult		(m_context.getRenderContext().getRenderTarget().getWidth(), m_context.getRenderContext().getRenderTarget().getHeight());
12183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool			isOk;
12203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	logVertexArrayState(m_log, m_spec.vao, "Vertex Array Object State");
12223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	logVertexArrayState(m_log, m_spec.state, "OpenGL Vertex Array State");
12233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	genReferences(stateReference, vaoReference);
12243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	render(stateResult, vaoResult);
12253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	isOk = tcu::pixelThresholdCompare (m_log, "Results", "Comparison result from rendering with Vertex Array State", stateReference, stateResult, tcu::RGBA(0,0,0,0), tcu::COMPARE_LOG_RESULT);
12273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	isOk = isOk && tcu::pixelThresholdCompare (m_log, "Results", "Comparison result from rendering with Vertex Array Object", vaoReference, vaoResult, tcu::RGBA(0,0,0,0), tcu::COMPARE_LOG_RESULT);
12283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (isOk)
12303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
12313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
12323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return STOP;
12333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
12343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
12353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
12363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
12373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return STOP;
12383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
12393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
12403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12413c827367444ee418f129b2c238299f49d3264554Jarkko PoyryVertexArrayObjectTestGroup::VertexArrayObjectTestGroup (Context& context)
12423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: TestCaseGroup(context, "vertex_array_objects", "Vertex array object test cases")
12433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
12443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
12453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12463c827367444ee418f129b2c238299f49d3264554Jarkko PoyryVertexArrayObjectTestGroup::~VertexArrayObjectTestGroup (void)
12473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
12483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
12493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12503c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid VertexArrayObjectTestGroup::init (void)
12513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
12523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	BufferSpec floatCoordBuffer48_1 = { 48, 384, 2, 0, 0, GL_FLOAT, 0, 0, -1.0f, 1.0f };
12533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	BufferSpec floatCoordBuffer48_2 = { 48, 384, 2, 0, 0, GL_FLOAT, 0, 0, -1.0f, 1.0f };
12543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	BufferSpec shortCoordBuffer48 = { 48, 192, 2, 0, 0, GL_SHORT, -32768, 32768, 0.0f, 0.0f };
12563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Different buffer
12583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
12593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		Spec spec;
12603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		VertexArrayState state;
12623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes.push_back(Attribute());
12643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].enabled		= true;
12663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].size		= 2;
12673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].stride		= 0;
12683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].type		= GL_FLOAT;
12693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].integer		= GL_FALSE;
12703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].divisor		= 0;
12713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].offset		= 0;
12723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].normalized	= GL_FALSE;
12733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.elementArrayBuffer = 0;
12753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.buffers.push_back(floatCoordBuffer48_1);
12773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.buffers.push_back(floatCoordBuffer48_2);
12783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.useDrawElements	= false;
12803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.instances			= 0;
12813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.count				= 48;
12823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.vao				= state;
12833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.state				= state;
12843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.indexOffset		= 0;
12853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.indexRangeMin		= 0;
12863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.indexRangeMax		= 0;
12873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.indexType			= GL_NONE;
12883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.indexCount			= 0;
12893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.state.attributes[0].bufferNdx	= 1;
12913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.vao.attributes[0].bufferNdx	= 2;
12923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		addChild(new VertexArrayObjectTest(m_context, spec, "diff_buffer", "diff_buffer"));
12933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
12943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Different size
12953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
12963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		Spec spec;
12973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
12983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		VertexArrayState state;
12993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes.push_back(Attribute());
13013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].enabled		= true;
13033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].size		= 2;
13043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].stride		= 0;
13053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].type		= GL_FLOAT;
13063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].integer		= GL_FALSE;
13073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].divisor		= 0;
13083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].offset		= 0;
13093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].normalized	= GL_FALSE;
13103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].bufferNdx	= 1;
13113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.elementArrayBuffer = 0;
13133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.buffers.push_back(floatCoordBuffer48_1);
13153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.useDrawElements	= false;
13173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.instances			= 0;
13183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.count				= 24;
13193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.vao				= state;
13203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.state				= state;
13213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.indexOffset		= 0;
13223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.indexRangeMin		= 0;
13233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.indexRangeMax		= 0;
13243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.indexType			= GL_NONE;
13253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.indexCount			= 0;
13263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.state.attributes[0].size		= 2;
13283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.vao.attributes[0].size			= 3;
13293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		addChild(new VertexArrayObjectTest(m_context, spec, "diff_size", "diff_size"));
13303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
13313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Different stride
13333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
13343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		Spec spec;
13353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		VertexArrayState state;
13373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes.push_back(Attribute());
13393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].enabled		= true;
13413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].size		= 2;
13423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].stride		= 0;
13433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].type		= GL_SHORT;
13443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].integer		= GL_FALSE;
13453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].divisor		= 0;
13463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].offset		= 0;
13473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].normalized	= GL_TRUE;
13483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].bufferNdx	= 1;
13493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.elementArrayBuffer = 0;
13513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.buffers.push_back(shortCoordBuffer48);
13533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.useDrawElements	= false;
13553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.instances			= 0;
13563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.count				= 24;
13573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.vao				= state;
13583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.state				= state;
13593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.indexOffset		= 0;
13603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.indexRangeMin		= 0;
13613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.indexRangeMax		= 0;
13623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.indexType			= GL_NONE;
13633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.indexCount			= 0;
13643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.vao.attributes[0].stride	= 2;
13663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.state.attributes[0].stride	= 4;
13673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		addChild(new VertexArrayObjectTest(m_context, spec, "diff_stride", "diff_stride"));
13683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
13693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Different types
13713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
13723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		Spec spec;
13733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		VertexArrayState state;
13753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes.push_back(Attribute());
13773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].enabled		= true;
13793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].size		= 2;
13803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].stride		= 0;
13813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].type		= GL_SHORT;
13823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].integer		= GL_FALSE;
13833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].divisor		= 0;
13843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].offset		= 0;
13853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].normalized	= GL_TRUE;
13863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].bufferNdx	= 1;
13873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.elementArrayBuffer = 0;
13893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.buffers.push_back(shortCoordBuffer48);
13913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
13923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.useDrawElements	= false;
13933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.instances			= 0;
13943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.count				= 24;
13953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.vao				= state;
13963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.state				= state;
13973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.indexOffset		= 0;
13983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.indexRangeMin		= 0;
13993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.indexRangeMax		= 0;
14003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.indexType			= GL_NONE;
14013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.indexCount			= 0;
14023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.vao.attributes[0].type		= GL_SHORT;
14043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.state.attributes[0].type	= GL_BYTE;
14053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		addChild(new VertexArrayObjectTest(m_context, spec, "diff_type", "diff_type"));
14063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
14073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Different "integer"
14083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
14093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		Spec spec;
14103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		VertexArrayState state;
14123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes.push_back(Attribute());
14143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].enabled		= true;
14163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].size		= 2;
14173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].stride		= 0;
14183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].type		= GL_BYTE;
14193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].integer		= GL_TRUE;
14203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].divisor		= 0;
14213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].offset		= 0;
14223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].normalized	= GL_FALSE;
14233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].bufferNdx	= 1;
14243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.elementArrayBuffer = 0;
14263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.buffers.push_back(shortCoordBuffer48);
14283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.useDrawElements	= false;
14303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.count				= 24;
14313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.vao				= state;
14323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.state				= state;
14333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.instances			= 0;
14343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.indexOffset		= 0;
14353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.indexRangeMin		= 0;
14363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.indexRangeMax		= 0;
14373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.indexType			= GL_NONE;
14383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.indexCount			= 0;
14393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.state.attributes[0].integer	= GL_FALSE;
14413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.vao.attributes[0].integer		= GL_TRUE;
14423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		addChild(new VertexArrayObjectTest(m_context, spec, "diff_integer", "diff_integer"));
14433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
14443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Different divisor
14453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
14463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		Spec spec;
14473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		VertexArrayState state;
14493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes.push_back(Attribute());
14513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes.push_back(Attribute());
14523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].enabled		= true;
14543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].size		= 2;
14553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].stride		= 0;
14563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].type		= GL_SHORT;
14573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].integer		= GL_FALSE;
14583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].divisor		= 0;
14593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].offset		= 0;
14603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].normalized	= GL_TRUE;
14613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].bufferNdx	= 1;
14623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[1].enabled		= true;
14643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[1].size		= 4;
14653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[1].stride		= 0;
14663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[1].type		= GL_FLOAT;
14673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[1].integer		= GL_FALSE;
14683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[1].divisor		= 0;
14693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[1].offset		= 0;
14703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[1].normalized	= GL_FALSE;
14713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[1].bufferNdx	= 2;
14723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.elementArrayBuffer = 0;
14743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.buffers.push_back(shortCoordBuffer48);
14763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.buffers.push_back(floatCoordBuffer48_1);
14773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.useDrawElements	= false;
14793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.instances			= 10;
14803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.count				= 12;
14813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.vao				= state;
14823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.state				= state;
14833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.indexOffset		= 0;
14843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.indexRangeMin		= 0;
14853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.indexRangeMax		= 0;
14863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.indexType			= GL_NONE;
14873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.indexCount			= 0;
14883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.vao.attributes[1].divisor		= 3;
14903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.state.attributes[1].divisor	= 2;
14913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		addChild(new VertexArrayObjectTest(m_context, spec, "diff_divisor", "diff_divisor"));
14933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
14943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Different offset
14953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
14963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		Spec spec;
14973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
14983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		VertexArrayState state;
14993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes.push_back(Attribute());
15013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].enabled		= true;
15033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].size		= 2;
15043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].stride		= 0;
15053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].type		= GL_SHORT;
15063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].integer		= GL_FALSE;
15073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].divisor		= 0;
15083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].offset		= 0;
15093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].normalized	= GL_TRUE;
15103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].bufferNdx	= 1;
15113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.elementArrayBuffer = 0;
15133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.buffers.push_back(shortCoordBuffer48);
15153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.useDrawElements	= false;
15173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.instances			= 0;
15183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.count				= 24;
15193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.vao				= state;
15203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.state				= state;
15213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.indexOffset		= 0;
15223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.indexRangeMin		= 0;
15233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.indexRangeMax		= 0;
15243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.indexType			= GL_NONE;
15253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.indexCount			= 0;
15263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.vao.attributes[0].offset	= 2;
15283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.state.attributes[0].offset	= 4;
15293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		addChild(new VertexArrayObjectTest(m_context, spec, "diff_offset", "diff_offset"));
15303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
15313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Different normalize
15323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
15333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		Spec spec;
15343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		VertexArrayState state;
15363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes.push_back(Attribute());
15383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].enabled		= true;
15403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].size		= 2;
15413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].stride		= 0;
15423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].type		= GL_SHORT;
15433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].integer		= GL_FALSE;
15443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].divisor		= 0;
15453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].offset		= 0;
15463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].normalized	= GL_TRUE;
15473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].bufferNdx	= 1;
15483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.elementArrayBuffer = 0;
15503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.buffers.push_back(shortCoordBuffer48);
15523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.useDrawElements	= false;
15543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.instances			= 0;
15553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.count				= 48;
15563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.vao				= state;
15573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.state				= state;
15583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.indexOffset		= 0;
15593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.indexRangeMin		= 0;
15603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.indexRangeMax		= 0;
15613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.indexType			= GL_NONE;
15623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.indexCount			= 0;
15633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.vao.attributes[0].normalized	= GL_TRUE;
15653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.state.attributes[0].normalized	= GL_FALSE;;
15663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		addChild(new VertexArrayObjectTest(m_context, spec, "diff_normalize", "diff_normalize"));
15673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
15683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// DrawElements with buffer / Pointer
15693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
15703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		Spec spec;
15713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		VertexArrayState state;
15733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes.push_back(Attribute());
15753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].enabled		= true;
15773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].size		= 2;
15783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].stride		= 0;
15793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].type		= GL_FLOAT;
15803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].integer		= GL_FALSE;
15813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].divisor		= 0;
15823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].offset		= 0;
15833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].normalized	= GL_TRUE;
15843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.attributes[0].bufferNdx	= 1;
15853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		state.elementArrayBuffer = 0;
15873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.buffers.push_back(floatCoordBuffer48_1);
15893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		BufferSpec indexBuffer = { 24, 192, 1, 0, 0, GL_UNSIGNED_SHORT, 0, 48, 0.0f, 0.0f };
15913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.buffers.push_back(indexBuffer);
15923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
15933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.useDrawElements	= true;
15943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.count				= 24;
15953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.vao				= state;
15963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.state				= state;
15973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.instances			= 0;
15983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.indexOffset		= 0;
15993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.indexRangeMin		= 0;
16003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.indexRangeMax		= 48;
16013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.indexType			= GL_UNSIGNED_SHORT;
16023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.indexCount			= 24;
16033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.state.elementArrayBuffer	= 0;
16053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		spec.vao.elementArrayBuffer		= 2;
16063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		addChild(new VertexArrayObjectTest(m_context, spec, "diff_indices", "diff_indices"));
16073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
16083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Use all attributes
16093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	addChild(new MultiVertexArrayObjectTest(m_context, "all_attributes", "all_attributes"));
16113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
16123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
16133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // Functional
16143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // gles3
16153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // deqp
1616