13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#ifndef _GLSVERTEXARRAYTESTS_HPP
23c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define _GLSVERTEXARRAYTESTS_HPP
33c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*-------------------------------------------------------------------------
43c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * drawElements Quality Program OpenGL (ES) Module
53c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * -----------------------------------------------
63c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
73c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Copyright 2014 The Android Open Source Project
83c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
93c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Licensed under the Apache License, Version 2.0 (the "License");
103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * you may not use this file except in compliance with the License.
113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * You may obtain a copy of the License at
123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *      http://www.apache.org/licenses/LICENSE-2.0
143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Unless required by applicable law or agreed to in writing, software
163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * distributed under the License is distributed on an "AS IS" BASIS,
173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * See the License for the specific language governing permissions and
193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * limitations under the License.
203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*!
223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \file
233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Vertex array and buffer tests
243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuTestCase.hpp"
273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuVector.hpp"
283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuSurface.hpp"
293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluRenderContext.hpp"
303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluCallLogWrapper.hpp"
313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuTestLog.hpp"
323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluShaderProgram.hpp"
333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deFloat16.h"
343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuFloat.hpp"
353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuPixelFormat.hpp"
363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "sglrContext.hpp"
373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
383c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace sglr
393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
413c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass ReferenceContextBuffers;
423c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass ReferenceContext;
433c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Context;
443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // sglr
463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
473c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace deqp
483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
493c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace gls
503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
523c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Array
533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
543c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	enum Target
563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// \note [mika] Are these actualy used somewhere?
583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TARGET_ELEMENT_ARRAY = 0,
593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TARGET_ARRAY,
603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TARGET_LAST
623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	enum InputType
653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		INPUTTYPE_FLOAT = 0,
673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		INPUTTYPE_FIXED,
683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		INPUTTYPE_DOUBLE,
693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		INPUTTYPE_BYTE,
713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		INPUTTYPE_SHORT,
723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		INPUTTYPE_UNSIGNED_BYTE,
743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		INPUTTYPE_UNSIGNED_SHORT,
753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		INPUTTYPE_INT,
773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		INPUTTYPE_UNSIGNED_INT,
783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		INPUTTYPE_HALF,
793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		INPUTTYPE_UNSIGNED_INT_2_10_10_10,
803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		INPUTTYPE_INT_2_10_10_10,
813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		INPUTTYPE_LAST
833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	enum OutputType
863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		OUTPUTTYPE_FLOAT = 0,
883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		OUTPUTTYPE_VEC2,
893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		OUTPUTTYPE_VEC3,
903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		OUTPUTTYPE_VEC4,
913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		OUTPUTTYPE_INT,
933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		OUTPUTTYPE_UINT,
943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		OUTPUTTYPE_IVEC2,
963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		OUTPUTTYPE_IVEC3,
973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		OUTPUTTYPE_IVEC4,
983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		OUTPUTTYPE_UVEC2,
1003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		OUTPUTTYPE_UVEC3,
1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		OUTPUTTYPE_UVEC4,
1023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		OUTPUTTYPE_LAST
1043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
1053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	enum Usage
1073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		USAGE_DYNAMIC_DRAW = 0,
1093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		USAGE_STATIC_DRAW,
1103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		USAGE_STREAM_DRAW,
1113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		USAGE_STREAM_READ,
1133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		USAGE_STREAM_COPY,
1143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		USAGE_STATIC_READ,
1163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		USAGE_STATIC_COPY,
1173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		USAGE_DYNAMIC_READ,
1193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		USAGE_DYNAMIC_COPY,
1203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		USAGE_LAST
1223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
1233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	enum Storage
1253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		STORAGE_USER = 0,
1273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		STORAGE_BUFFER,
1283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		STORAGE_LAST
1303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
1313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	enum Primitive
1333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		PRIMITIVE_POINTS = 0,
1353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		PRIMITIVE_TRIANGLES,
1363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		PRIMITIVE_TRIANGLE_FAN,
1373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		PRIMITIVE_TRIANGLE_STRIP,
1383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		PRIMITIVE_LAST
1403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
1413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static std::string	targetToString		(Target target);
1433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static std::string	inputTypeToString	(InputType type);
1443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static std::string	outputTypeToString	(OutputType type);
1453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static std::string	usageTypeToString	(Usage usage);
1463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static std::string	storageToString		(Storage storage);
1473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static std::string	primitiveToString	(Primitive primitive);
1483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static int			inputTypeSize		(InputType type);
1493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual				~Array				(void) {}
1513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual void		data				(Target target, int size, const char* data, Usage usage) = 0;
1523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual void		subdata				(Target target, int offset, int size, const char* data) = 0;
1533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual void		bind				(int attribNdx, int offset, int size, InputType inType, OutputType outType, bool normalized, int stride) = 0;
1543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual void		unBind				(void) = 0;
1553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual bool		isBound				(void) const = 0;
1573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual int			getComponentCount	(void) const = 0;
1583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual Target		getTarget			(void) const = 0;
1593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual InputType	getInputType		(void) const = 0;
1603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual OutputType	getOutputType		(void) const = 0;
1613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual Storage		getStorageType		(void) const = 0;
1623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual bool		getNormalized		(void) const = 0;
1633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual int			getStride			(void) const = 0;
1643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual int			getAttribNdx		(void) const = 0;
1653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual void		setAttribNdx		(int attribNdx) = 0;
1663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
1673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1683c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass ContextArray : public Array
1693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1703c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
1713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								ContextArray		(Storage storage, sglr::Context& context);
1723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual						~ContextArray		(void);
1733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual void				data				(Target target, int size, const char* data, Usage usage);
1743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual void				subdata				(Target target, int offset, int size, const char* data);
1753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual void				bind				(int attribNdx, int offset, int size, InputType inType, OutputType outType, bool normalized, int stride);
1763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual void				bindIndexArray		(Array::Target storage);
1773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual void				unBind				(void) { m_bound = false; }
1783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual bool				isBound				(void) const { return m_bound; }
1793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual int					getComponentCount	(void) const { return m_componentCount; }
1813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual Array::Target		getTarget			(void) const { return m_target; }
1823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual Array::InputType	getInputType		(void) const { return m_inputType; }
1833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual Array::OutputType	getOutputType		(void) const { return m_outputType; }
1843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual Array::Storage		getStorageType		(void) const { return m_storage; }
1853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual bool				getNormalized		(void) const { return m_normalize; }
1863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual int					getStride			(void) const { return m_stride; }
1873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual int					getAttribNdx		(void) const { return m_attribNdx; }
1883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual void				setAttribNdx		(int attribNdx) { m_attribNdx = attribNdx; }
1893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void						glBind				(deUint32 loc);
1913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static deUint32				targetToGL			(Array::Target target);
1923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static deUint32				usageToGL			(Array::Usage usage);
1933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static deUint32				inputTypeToGL		(Array::InputType type);
1943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static std::string			outputTypeToGLType	(Array::OutputType type);
1953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static deUint32				primitiveToGL		(Array::Primitive primitive);
1963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1973c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
1983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Storage						m_storage;
1993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	sglr::Context&				m_ctx;
2003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32					m_glBuffer;
2013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool						m_bound;
2033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int							m_attribNdx;
2043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int							m_size;
2053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	char*						m_data;
2063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int							m_componentCount;
2073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Array::Target				m_target;
2083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Array::InputType			m_inputType;
2093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Array::OutputType			m_outputType;
2103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool						m_normalize;
2113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int							m_stride;
2123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int							m_offset;
2133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
2143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2153c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass ContextArrayPack
2163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2173c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
2183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								ContextArrayPack	(glu::RenderContext& renderCtx, sglr::Context& drawContext);
2193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual						~ContextArrayPack	(void);
2203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual Array*				getArray			(int i);
2213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual int					getArrayCount		(void);
2223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual	void				newArray			(Array::Storage storage);
2233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual void				render 				(Array::Primitive primitive, int firstVertex, int vertexCount, bool useVao, float coordScale, float colorScale);
2243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const tcu::Surface&			getSurface			(void) const { return m_screen; }
2263c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
2273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void 						updateProgram		(void);
2283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glu::RenderContext&			m_renderCtx;
2293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	sglr::Context&				m_ctx;
2303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	std::vector<ContextArray*>	m_arrays;
2323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	sglr::ShaderProgram*		m_program;
2333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	tcu::Surface				m_screen;
2343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
2353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2363c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass GLValue
2373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2383c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
2393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	template<class Type>
2413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	class WrappedType
2423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	public:
2443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		static WrappedType<Type>	create			(Type value)							{ WrappedType<Type> v; v.m_value = value; return v; }
2453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inline Type					getValue		(void) const							{ return m_value; }
2463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inline WrappedType<Type>	operator+		(const WrappedType<Type>& other) const	{ return WrappedType<Type>::create(m_value + other.getValue()); }
2483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inline WrappedType<Type>	operator*		(const WrappedType<Type>& other) const	{ return WrappedType<Type>::create(m_value * other.getValue()); }
2493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inline WrappedType<Type>	operator/		(const WrappedType<Type>& other) const	{ return WrappedType<Type>::create(m_value / other.getValue()); }
2503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inline WrappedType<Type>	operator-		(const WrappedType<Type>& other) const	{ return WrappedType<Type>::create(m_value - other.getValue()); }
2513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inline WrappedType<Type>&	operator+=		(const WrappedType<Type>& other)		{ m_value += other.getValue(); return *this; }
2533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inline WrappedType<Type>&	operator*=		(const WrappedType<Type>& other)		{ m_value *= other.getValue(); return *this; }
2543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inline WrappedType<Type>&	operator/=		(const WrappedType<Type>& other)		{ m_value /= other.getValue(); return *this; }
2553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inline WrappedType<Type>&	operator-=		(const WrappedType<Type>& other)		{ m_value -= other.getValue(); return *this; }
2563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inline bool					operator==		(const WrappedType<Type>& other) const	{ return m_value == other.m_value; }
2583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inline bool					operator!=		(const WrappedType<Type>& other) const	{ return m_value != other.m_value; }
2593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inline bool					operator<		(const WrappedType<Type>& other) const	{ return m_value < other.m_value; }
2603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inline bool					operator>		(const WrappedType<Type>& other) const	{ return m_value > other.m_value; }
2613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inline bool					operator<=		(const WrappedType<Type>& other) const	{ return m_value <= other.m_value; }
2623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inline bool					operator>=		(const WrappedType<Type>& other) const	{ return m_value >= other.m_value; }
2633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inline 						operator Type	(void) const							{ return m_value; }
2653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		template<class T>
2663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inline T					to				(void) const							{ return (T)m_value; }
2673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	private:
2683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		Type	m_value;
2693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
2703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	typedef WrappedType<deInt16>	Short;
2723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	typedef WrappedType<deUint16>	Ushort;
2733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	typedef WrappedType<deInt8>		Byte;
2753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	typedef WrappedType<deUint8>	Ubyte;
2763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	typedef WrappedType<float>		Float;
2783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	typedef WrappedType<double>		Double;
2793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	typedef WrappedType<deInt32>	Int;
2813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	typedef WrappedType<deUint32>	Uint;
2823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	class Half
2843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	public:
2863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		static Half			create			(float value)				{ Half h; h.m_value = floatToHalf(value); return h; }
2873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inline deFloat16	getValue		(void) const				{ return m_value; }
2883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inline Half			operator+		(const Half& other) const	{ return create(halfToFloat(m_value) + halfToFloat(other.getValue())); }
2903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inline Half			operator*		(const Half& other) const	{ return create(halfToFloat(m_value) * halfToFloat(other.getValue())); }
2913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inline Half			operator/		(const Half& other) const	{ return create(halfToFloat(m_value) / halfToFloat(other.getValue())); }
2923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inline Half			operator-		(const Half& other) const	{ return create(halfToFloat(m_value) - halfToFloat(other.getValue())); }
2933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inline Half&		operator+=		(const Half& other)			{ m_value = floatToHalf(halfToFloat(other.getValue()) + halfToFloat(m_value)); return *this; }
2953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inline Half&		operator*=		(const Half& other)			{ m_value = floatToHalf(halfToFloat(other.getValue()) * halfToFloat(m_value)); return *this; }
2963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inline Half&		operator/=		(const Half& other)			{ m_value = floatToHalf(halfToFloat(other.getValue()) / halfToFloat(m_value)); return *this; }
2973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inline Half&		operator-=		(const Half& other)			{ m_value = floatToHalf(halfToFloat(other.getValue()) - halfToFloat(m_value)); return *this; }
2983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inline bool			operator==		(const Half& other) const	{ return m_value == other.m_value; }
3003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inline bool			operator!=		(const Half& other) const	{ return m_value != other.m_value; }
3013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inline bool			operator<		(const Half& other) const	{ return halfToFloat(m_value) < halfToFloat(other.m_value); }
3023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inline bool			operator>		(const Half& other) const	{ return halfToFloat(m_value) > halfToFloat(other.m_value); }
3033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inline bool			operator<=		(const Half& other) const	{ return halfToFloat(m_value) <= halfToFloat(other.m_value); }
3043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inline bool			operator>=		(const Half& other) const	{ return halfToFloat(m_value) >= halfToFloat(other.m_value); }
3053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		template<class T>
3073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inline T			to				(void) const				{ return (T)halfToFloat(m_value); }
3083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inline static deFloat16	floatToHalf		(float f);
3103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inline static float		halfToFloat		(deFloat16 h);
3113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	private:
3123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		deFloat16 m_value;
3133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
3143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	class Fixed
3163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
3173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	public:
3183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		static Fixed		create			(deInt32 value)				{ Fixed v; v.m_value = value; return v; }
3193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inline deInt32		getValue		(void) const				{ return m_value; }
3203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inline Fixed		operator+		(const Fixed& other) const	{ return create(m_value + other.getValue()); }
3223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inline Fixed		operator*		(const Fixed& other) const	{ return create(m_value * other.getValue()); }
3233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inline Fixed		operator/		(const Fixed& other) const	{ return create(m_value / other.getValue()); }
3243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inline Fixed		operator-		(const Fixed& other) const	{ return create(m_value - other.getValue()); }
3253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inline Fixed&		operator+=		(const Fixed& other)		{ m_value += other.getValue(); return *this; }
3273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inline Fixed&		operator*=		(const Fixed& other)		{ m_value *= other.getValue(); return *this; }
3283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inline Fixed&		operator/=		(const Fixed& other)		{ m_value /= other.getValue(); return *this; }
3293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inline Fixed&		operator-=		(const Fixed& other)		{ m_value -= other.getValue(); return *this; }
3303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inline bool			operator==		(const Fixed& other) const	{ return m_value == other.m_value; }
3323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inline bool			operator!=		(const Fixed& other) const	{ return m_value != other.m_value; }
3333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inline bool			operator<		(const Fixed& other) const	{ return m_value < other.m_value; }
3343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inline bool			operator>		(const Fixed& other) const	{ return m_value > other.m_value; }
3353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inline bool			operator<=		(const Fixed& other) const	{ return m_value <= other.m_value; }
3363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inline bool			operator>=		(const Fixed& other) const	{ return m_value >= other.m_value; }
3373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inline 				operator deInt32 (void) const				{ return m_value; }
3393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		template<class T>
3403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inline T			to				(void) const				{ return (T)m_value; }
3413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	private:
3423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		deInt32				m_value;
3433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
3443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// \todo [mika] This is pretty messy
3463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry						GLValue			(void)			: type(Array::INPUTTYPE_LAST) {}
3473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	explicit			GLValue			(Float value)	: type(Array::INPUTTYPE_FLOAT),				fl(value)	{}
3483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	explicit			GLValue			(Fixed value)	: type(Array::INPUTTYPE_FIXED),				fi(value)	{}
3493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	explicit			GLValue			(Byte value)	: type(Array::INPUTTYPE_BYTE),				b(value)	{}
3503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	explicit			GLValue			(Ubyte value)	: type(Array::INPUTTYPE_UNSIGNED_BYTE),		ub(value)	{}
3513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	explicit			GLValue			(Short value)	: type(Array::INPUTTYPE_SHORT),				s(value)	{}
3523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	explicit			GLValue			(Ushort value)	: type(Array::INPUTTYPE_UNSIGNED_SHORT),	us(value)	{}
3533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	explicit			GLValue			(Int value)		: type(Array::INPUTTYPE_INT),				i(value)	{}
3543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	explicit			GLValue			(Uint value)	: type(Array::INPUTTYPE_UNSIGNED_INT),		ui(value)	{}
3553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	explicit			GLValue			(Half value)	: type(Array::INPUTTYPE_HALF),				h(value)	{}
3563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	explicit			GLValue			(Double value)	: type(Array::INPUTTYPE_DOUBLE),			d(value)	{}
3573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	float				toFloat			(void) const;
3593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static GLValue		getMaxValue		(Array::InputType type);
3613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static GLValue		getMinValue		(Array::InputType type);
3623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Array::InputType	type;
3643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	union
3663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
3673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		Float		fl;
3683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		Fixed		fi;
3693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		Double		d;
3703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		Byte		b;
3713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		Ubyte		ub;
3723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		Short		s;
3733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		Ushort		us;
3743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		Int			i;
3753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		Uint		ui;
3763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		Half		h;
3773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
3783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
3793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3803c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass VertexArrayTest : public tcu::TestCase
3813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3823c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
3833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									VertexArrayTest		(tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const char* name ,const char* desc);
3843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual							~VertexArrayTest	(void);
3853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual void					init				(void);
3863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual void					deinit				(void);
3873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3883c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprotected:
3893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									VertexArrayTest		(const VertexArrayTest& other);
3903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	VertexArrayTest&				operator=			(const VertexArrayTest& other);
3913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void							compare				(void);
3933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glu::RenderContext&				m_renderCtx;
3953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	sglr::ReferenceContextBuffers*	m_refBuffers;
3973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	sglr::ReferenceContext*			m_refContext;
3983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	sglr::Context*					m_glesContext;
3993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ContextArrayPack*				m_glArrayPack;
4013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ContextArrayPack*				m_rrArrayPack;
4023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool							m_isOk;
4033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								m_maxDiffRed;
4053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								m_maxDiffGreen;
4063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int								m_maxDiffBlue;
4073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
4083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4093c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass MultiVertexArrayTest : public VertexArrayTest
4103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4113c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
4123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	class Spec
4133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
4143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	public:
4153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		class ArraySpec
4163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
4173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		public:
4183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								ArraySpec	(Array::InputType inputType, Array::OutputType outputType, Array::Storage storage, Array::Usage usage, int componetCount, int offset, int stride, bool normalize, GLValue min, GLValue max);
4193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			Array::InputType	inputType;
4213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			Array::OutputType	outputType;
4223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			Array::Storage		storage;
4233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			Array::Usage		usage;
4243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			int 				componentCount;
4253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			int					offset;
4263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			int					stride;
4273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			bool				normalize;
4283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLValue				min;
4293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLValue				max;
4303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		};
4313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		std::string 			getName		(void) const;
4333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		std::string				getDesc		(void) const;
4343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		Array::Primitive		primitive;
4363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		int						drawCount;			//!<Number of primitives to draw
4373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		int						first;
4383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		std::vector<ArraySpec>	arrays;
4403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
4413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry							MultiVertexArrayTest	(tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const Spec& spec, const char* name, const char* desc);
4433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual					~MultiVertexArrayTest	(void);
4443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual IterateResult	iterate					(void);
4453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4463c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
4473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool					isUnalignedBufferOffsetTest		(void) const;
4483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool					isUnalignedBufferStrideTest		(void) const;
4493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Spec					m_spec;
4513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int						m_iteration;
4523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
4533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4543c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline deFloat16 GLValue::Half::floatToHalf (float f)
4553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// No denorm support.
4573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	tcu::Float<deUint16, 5, 10, 15, tcu::FLOAT_HAS_SIGN> v(f);
4583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_ASSERT(!v.isNaN() && !v.isInf());
4593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return v.bits();
4603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
4613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4623c827367444ee418f129b2c238299f49d3264554Jarkko Poyryinline float GLValue::Half::halfToFloat (deFloat16 h)
4633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return tcu::Float16((deUint16)h).asFloat();
4653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
4663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // gls
4683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // deqp
4693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#endif // _GLSVERTEXARRAYTESTS_HPP
471