#ifndef _GL4CSPARSETEXTURE2TESTS_HPP
#define _GL4CSPARSETEXTURE2TESTS_HPP
/*-------------------------------------------------------------------------
 * OpenGL Conformance Test Suite
 * -----------------------------
 *
 * Copyright (c) 2016 The Khronos Group Inc.
 *
 * 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
 */ /*-------------------------------------------------------------------*/

/**
 */ /*!
 * \file  gl4cSparseTexture2Tests.hpp
 * \brief Conformance tests for the GL_ARB_sparse_texture2 functionality.
 */ /*-------------------------------------------------------------------*/

#include "glcTestCase.hpp"
#include "glwDefs.hpp"
#include "glwEnums.hpp"
#include "tcuDefs.hpp"
#include <map>
#include <set>
#include <vector>

#include "gl4cSparseTextureTests.hpp"
#include "gluDrawUtil.hpp"
#include "gluShaderProgram.hpp"
#include "gluTextureUtil.hpp"
#include "tcuTextureUtil.hpp"

using namespace glw;
using namespace glu;

namespace gl4cts
{

struct PageSizeStruct
{
	GLint xSize;
	GLint ySize;
	GLint zSize;

	PageSizeStruct() : xSize(0), ySize(0), zSize(0)
	{
	}
	PageSizeStruct(GLint x, GLint y, GLint z) : xSize(x), ySize(y), zSize(z)
	{
	}
};

typedef std::pair<GLint, PageSizeStruct> PageSizePair;

/** Test verifies if extension is available for GLSL
 **/
class ShaderExtensionTestCase : public deqp::TestCase
{
public:
	/* Public methods */
	ShaderExtensionTestCase(deqp::Context& context, const std::string extension);

	tcu::TestNode::IterateResult iterate();

private:
	/* Private members */
	std::string mExtension;
};

/** Test verifies if values returned by GetInternalFormat* query matches Standard Virtual Page Sizes for <pname>:
 *   - VIRTUAL_PAGE_SIZE_X_ARB,
 *   - VIRTUAL_PAGE_SIZE_Y_ARB,
 *   - VIRTUAL_PAGE_SIZE_Z_ARB.
 **/
class StandardPageSizesTestCase : public deqp::TestCase
{
public:
	/* Public methods */
	StandardPageSizesTestCase(deqp::Context& context);

	void						 init();
	tcu::TestNode::IterateResult iterate();

private:
	/* Private methods */
	std::vector<GLint> mSupportedTargets;
	std::map<GLint, PageSizeStruct> mStandardVirtualPageSizesTable;

	/* Private members */
};

/** Test verifies glTexStorage* functionality added by ARB_sparse_texture2 extension
 **/
class SparseTexture2AllocationTestCase : public SparseTextureAllocationTestCase
{
public:
	/* Public methods */
	SparseTexture2AllocationTestCase(deqp::Context& context);

	virtual void						 init();
	virtual tcu::TestNode::IterateResult iterate();

private:
	/* Private methods */
};

/** Test verifies glTexPageCommitmentARB functionality added by ARB_sparse_texture2 extension
 **/
class SparseTexture2CommitmentTestCase : public SparseTextureCommitmentTestCase
{
public:
	/* Public methods */
	SparseTexture2CommitmentTestCase(deqp::Context& context);

	SparseTexture2CommitmentTestCase(deqp::Context& context, const char* name, const char* description);

	virtual void						 init();
	virtual tcu::TestNode::IterateResult iterate();

protected:
	/* Protected members */
	struct TokenStrings
	{
		std::string format;
		std::string pointType;
		std::string pointDef;
		std::string outputType;
		std::string inputType;
		std::string returnType;
		std::string resultExpected;
		std::string resultDefault;
		std::string epsilon;
		std::string sampleDef;
	};

	/* Protected methods */
	TokenStrings createShaderTokens(GLint target, GLint verifyTarget, GLint format, GLint sample, const std::string outputBase = "image",
									const std::string inputBase = "image");

	virtual bool caseAllowed(GLint target, GLint format);

	virtual bool sparseAllocateTexture(const Functions& gl, GLint target, GLint format, GLuint& texture, GLint levels);
	virtual bool allocateTexture(const Functions& gl, GLint target, GLint format, GLuint& texture, GLint levels);
	virtual bool writeDataToTexture(const Functions& gl, GLint target, GLint format, GLuint& texture, GLint level);
	virtual bool verifyTextureData(const Functions& gl, GLint target, GLint format, GLuint& texture, GLint level);
};

/** Test verifies if access to uncommitted regions of sparse texture works as expected
 **/
class UncommittedRegionsAccessTestCase : public SparseTexture2CommitmentTestCase
{
public:
	/* Public methods */
	UncommittedRegionsAccessTestCase(deqp::Context& context);

	virtual void						 init();
	virtual tcu::TestNode::IterateResult iterate();

private:
	/* Private members */
	GLuint mFramebuffer;
	GLuint mRenderbuffer;

	/* Private methods */
	bool readsAllowed(GLint target, GLint format, bool shaderOnly = false);
	bool atomicAllowed(GLint target, GLint format);
	bool depthStencilAllowed(GLint target, GLint format);

	bool UncommittedReads(const Functions& gl, GLint target, GLint format, GLuint& texture, GLint level);
	bool UncommittedAtomicOperations(const Functions& gl, GLint target, GLint format, GLuint& texture, GLint level);
	bool UncommittedDepthStencil(const Functions& gl, GLint target, GLint format, GLuint& texture, GLint level);

	void prepareDepthStencilFramebuffer(const Functions& gl, GLint width, GLint height);
	void cleanupDepthStencilFramebuffer(const Functions& gl);
	bool verifyTextureDataExtended(const Functions& gl, GLint target, GLint format, GLuint& texture, GLint level,
								   bool shaderOnly = false);
	bool verifyAtomicOperations(const Functions& gl, GLint target, GLint format, GLuint& texture, GLint level);
	bool verifyStencilTest(const Functions& gl, ShaderProgram& program, GLint width, GLint height,
						   GLint widthCommitted);
	bool verifyDepthTest(const Functions& gl, ShaderProgram& program, GLint width, GLint height, GLint widthCommitted);
	bool verifyDepthBoundsTest(const Functions& gl, ShaderProgram& program, GLint width, GLint height,
							   GLint widthCommitted);
};

/** Test verifies if sparse texture lookup functions for GLSL works as expected
 **/
class SparseTexture2LookupTestCase : public SparseTexture2CommitmentTestCase
{
public:
	/* Public methods */
	SparseTexture2LookupTestCase(deqp::Context& context);

	SparseTexture2LookupTestCase(deqp::Context& context, const char* name, const char* description);

	void						 init();
	tcu::TestNode::IterateResult iterate();

protected:
	/* Protected types */
	struct FunctionToken
	{
		std::string name;
		std::string arguments;

		std::set<GLint> allowedTargets;

		FunctionToken()
		{
		}

		FunctionToken(std::string fname, std::string fargs) : name(fname), arguments(fargs)
		{
		}
	};

	struct TokenStringsExt : public TokenStrings
	{
		std::string formatDef;
		std::string sizeDef;
		std::string lod;
		std::string lodDef;
		std::string coordType;
		std::string iCoordType;
		std::string coordDef;
		std::string cubeMapCoordDef;
		std::string refZDef;
		std::string cubeMapArrayRefZDef;
		std::string offsetDim;
		std::string offsetType;
		std::string nOffsetType;
		std::string componentDef;
		std::string offsetArrayDef;
		std::string pointCoord;
	};

	/* Protected members */
	std::vector<FunctionToken> mFunctions;

	/* Protected methods */
	TokenStringsExt createLookupShaderTokens(GLint target, GLint verifyTarget, GLint format, GLint level, GLint sample,
											 FunctionToken& funcToken);

	virtual bool caseAllowed(GLint target, GLint format);
	virtual bool funcAllowed(GLint target, GLint format, FunctionToken& funcToken);

	virtual bool writeDataToTexture(const Functions& gl, GLint target, GLint format, GLuint& texture, GLint level);

	virtual void setupDepthMode(const Functions& gl, GLint target, GLuint& texture);
	virtual bool verifyLookupTextureData(const Functions& gl, GLint target, GLint format, GLuint& texture, GLint level,
										 FunctionToken& funcToken);
};

/** Test group which encapsulates all sparse texture conformance tests */
class SparseTexture2Tests : public deqp::TestCaseGroup
{
public:
	/* Public methods */
	SparseTexture2Tests(deqp::Context& context);

	void init();

private:
	SparseTexture2Tests(const SparseTexture2Tests& other);
	SparseTexture2Tests& operator=(const SparseTexture2Tests& other);
};

void replaceToken(const GLchar* token, const GLchar* text, std::string& string);

} /* glcts namespace */

#endif // _GL4CSPARSETEXTURE2TESTS_HPP
