#ifndef _GLSDRAWTEST_HPP
#define _GLSDRAWTEST_HPP
/*-------------------------------------------------------------------------
 * drawElements Quality Program OpenGL (ES) Module
 * -----------------------------------------------
 *
 * Copyright 2014 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 *//*!
 * \file
 * \brief Draw tests
 *//*--------------------------------------------------------------------*/

#include "tcuTestCase.hpp"
#include "tcuResultCollector.hpp"
#include "gluRenderContext.hpp"

namespace sglr
{

class ReferenceContextBuffers;
class ReferenceContext;
class Context;

} // sglr

namespace deqp
{
namespace gls
{

class AttributePack;

struct DrawTestSpec
{
	enum Target
	{
		TARGET_ELEMENT_ARRAY = 0,
		TARGET_ARRAY,

		TARGET_LAST
	};

	enum InputType
	{
		INPUTTYPE_FLOAT = 0,
		INPUTTYPE_FIXED,
		INPUTTYPE_DOUBLE,

		INPUTTYPE_BYTE,
		INPUTTYPE_SHORT,

		INPUTTYPE_UNSIGNED_BYTE,
		INPUTTYPE_UNSIGNED_SHORT,

		INPUTTYPE_INT,
		INPUTTYPE_UNSIGNED_INT,
		INPUTTYPE_HALF,
		INPUTTYPE_UNSIGNED_INT_2_10_10_10,
		INPUTTYPE_INT_2_10_10_10,

		INPUTTYPE_LAST
	};

	enum OutputType
	{
		OUTPUTTYPE_FLOAT = 0,
		OUTPUTTYPE_VEC2,
		OUTPUTTYPE_VEC3,
		OUTPUTTYPE_VEC4,

		OUTPUTTYPE_INT,
		OUTPUTTYPE_UINT,

		OUTPUTTYPE_IVEC2,
		OUTPUTTYPE_IVEC3,
		OUTPUTTYPE_IVEC4,

		OUTPUTTYPE_UVEC2,
		OUTPUTTYPE_UVEC3,
		OUTPUTTYPE_UVEC4,

		OUTPUTTYPE_LAST
	};

	enum Usage
	{
		USAGE_DYNAMIC_DRAW = 0,
		USAGE_STATIC_DRAW,
		USAGE_STREAM_DRAW,

		USAGE_STREAM_READ,
		USAGE_STREAM_COPY,

		USAGE_STATIC_READ,
		USAGE_STATIC_COPY,

		USAGE_DYNAMIC_READ,
		USAGE_DYNAMIC_COPY,

		USAGE_LAST
	};

	enum Storage
	{
		STORAGE_USER = 0,
		STORAGE_BUFFER,

		STORAGE_LAST
	};

	enum Primitive
	{
		PRIMITIVE_POINTS = 0,
		PRIMITIVE_TRIANGLES,
		PRIMITIVE_TRIANGLE_FAN,
		PRIMITIVE_TRIANGLE_STRIP,
		PRIMITIVE_LINES,
		PRIMITIVE_LINE_STRIP,
		PRIMITIVE_LINE_LOOP,

		PRIMITIVE_LINES_ADJACENCY,
		PRIMITIVE_LINE_STRIP_ADJACENCY,
		PRIMITIVE_TRIANGLES_ADJACENCY,
		PRIMITIVE_TRIANGLE_STRIP_ADJACENCY,

		PRIMITIVE_LAST
	};

	enum IndexType
	{
		INDEXTYPE_BYTE = 0,
		INDEXTYPE_SHORT,
		INDEXTYPE_INT,

		INDEXTYPE_LAST
	};

	enum DrawMethod
	{
		DRAWMETHOD_DRAWARRAYS = 0,
		DRAWMETHOD_DRAWARRAYS_INSTANCED,
		DRAWMETHOD_DRAWARRAYS_INDIRECT,
		DRAWMETHOD_DRAWELEMENTS,
		DRAWMETHOD_DRAWELEMENTS_RANGED,
		DRAWMETHOD_DRAWELEMENTS_INSTANCED,
		DRAWMETHOD_DRAWELEMENTS_INDIRECT,
		DRAWMETHOD_DRAWELEMENTS_BASEVERTEX,
		DRAWMETHOD_DRAWELEMENTS_INSTANCED_BASEVERTEX,
		DRAWMETHOD_DRAWELEMENTS_RANGED_BASEVERTEX,

		DRAWMETHOD_LAST
	};

	enum CompatibilityTestType
	{
		COMPATIBILITY_NONE = 0,
		COMPATIBILITY_UNALIGNED_OFFSET,
		COMPATIBILITY_UNALIGNED_STRIDE,

		COMPATIBILITY_LAST
	};

	static std::string			targetToString		(Target target);
	static std::string			inputTypeToString	(InputType type);
	static std::string			outputTypeToString	(OutputType type);
	static std::string			usageTypeToString	(Usage usage);
	static std::string			storageToString		(Storage storage);
	static std::string			primitiveToString	(Primitive primitive);
	static std::string			indexTypeToString	(IndexType type);
	static std::string			drawMethodToString	(DrawMethod method);
	static int					inputTypeSize		(InputType type);
	static int					indexTypeSize		(IndexType type);

	struct AttributeSpec
	{
		static AttributeSpec	createAttributeArray	(InputType inputType, OutputType outputType, Storage storage, Usage usage, int componentCount, int offset, int stride, bool normalize, int instanceDivisor);
		static AttributeSpec	createDefaultAttribute	(InputType inputType, OutputType outputType, int componentCount);	//!< allowed inputType values: INPUTTYPE_INT, INPUTTYPE_UNSIGNED_INT, INPUTTYPE_FLOAT

		InputType				inputType;
		OutputType				outputType;
		Storage					storage;
		Usage					usage;
		int						componentCount;
		int						offset;
		int						stride;
		bool					normalize;
		int						instanceDivisor;				//!< used only if drawMethod = Draw*Instanced
		bool					useDefaultAttribute;

		bool					additionalPositionAttribute;	//!< treat this attribute as position attribute. Attribute at index 0 is alway treated as such. False by default
		bool					bgraComponentOrder;				//!< component order of this attribute is bgra, valid only for 4-component targets. False by default.

								AttributeSpec			(void);

		int						hash					(void) const;
		bool					valid					(glu::ApiType apiType) const;
		bool					isBufferAligned			(void) const;
		bool					isBufferStrideAligned	(void) const;
	};

	std::string					getName				(void) const;
	std::string					getDesc				(void) const;
	std::string					getMultilineDesc	(void) const;

	glu::ApiType				apiType;			//!< needed in spec validation
	Primitive					primitive;
	int							primitiveCount;		//!< number of primitives to draw (per instance)

	DrawMethod					drawMethod;
	IndexType					indexType;			//!< used only if drawMethod = DrawElements*
	int							indexPointerOffset;	//!< used only if drawMethod = DrawElements*
	Storage						indexStorage;		//!< used only if drawMethod = DrawElements*
	int							first;				//!< used only if drawMethod = DrawArrays*
	int							indexMin;			//!< used only if drawMethod = Draw*Ranged
	int							indexMax;			//!< used only if drawMethod = Draw*Ranged
	int							instanceCount;		//!< used only if drawMethod = Draw*Instanced or Draw*Indirect
	int							indirectOffset;		//!< used only if drawMethod = Draw*Indirect
	int							baseVertex;			//!< used only if drawMethod = DrawElementsIndirect or *BaseVertex

	std::vector<AttributeSpec>	attribs;

								DrawTestSpec		(void);

	int							hash				(void) const;
	bool						valid				(void) const;
	CompatibilityTestType		isCompatibilityTest	(void) const;
};

class DrawTest : public tcu::TestCase
{
public:
									DrawTest				(tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const DrawTestSpec& spec, const char* name, const char* desc);
									DrawTest				(tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const char* name, const char* desc);
	virtual							~DrawTest				(void);

	void							addIteration			(const DrawTestSpec& spec, const char* description = DE_NULL);

private:
	void							init					(void);
	void							deinit					(void);
	IterateResult					iterate					(void);

	bool							compare					(gls::DrawTestSpec::Primitive primitiveType);
	float							getCoordScale			(const DrawTestSpec& spec) const;
	float							getColorScale			(const DrawTestSpec& spec) const;

	glu::RenderContext&				m_renderCtx;

	sglr::ReferenceContextBuffers*	m_refBuffers;
	sglr::ReferenceContext*			m_refContext;
	sglr::Context*					m_glesContext;

	AttributePack*					m_glArrayPack;
	AttributePack*					m_rrArrayPack;

	int								m_maxDiffRed;
	int								m_maxDiffGreen;
	int								m_maxDiffBlue;

	std::vector<DrawTestSpec>		m_specs;
	std::vector<std::string>		m_iteration_descriptions;
	int								m_iteration;
	tcu::ResultCollector			m_result;
};

} // gls
} // deqp

#endif // _GLSDRAWTEST_HPP
