#ifndef _GLCSHADERLIBRARYCASE_HPP
#define _GLCSHADERLIBRARYCASE_HPP
/*-------------------------------------------------------------------------
 * OpenGL Conformance Test Suite
 * -----------------------------
 *
 * Copyright (c) 2016 Google Inc.
 * 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 Shader test case.
 */ /*-------------------------------------------------------------------*/

#include "glcTestCase.hpp"
#include "gluDefs.hpp"
#include "gluRenderContext.hpp"
#include "gluShaderUtil.hpp"
#include "tcuSurface.hpp"

#include <string>
#include <vector>

namespace deqp
{
namespace sl
{

// ShaderCase node.

class ShaderCase : public tcu::TestCase
{
public:
	enum CaseType
	{
		CASETYPE_COMPLETE = 0,  //!< Has both shaders.
		CASETYPE_VERTEX_ONLY,   //!< Has only vertex shader.
		CASETYPE_FRAGMENT_ONLY, //!< Has only fragment shader.

		CASETYPE_LAST
	};

	enum ExpectResult
	{
		EXPECT_PASS = 0,
		EXPECT_COMPILE_FAIL,
		EXPECT_LINK_FAIL,

		EXPECT_LAST
	};

	struct Value
	{
		enum StorageType
		{
			STORAGE_UNIFORM,
			STORAGE_INPUT,
			STORAGE_OUTPUT,

			STORAGE_LAST
		};

		/* \todo [2010-03-31 petri] Replace with another vector to allow a) arrays, b) compact representation */
		union Element {
			float   float32;
			deInt32 int32;
			deInt32 bool32;
		};

		StorageType			 storageType;
		std::string			 valueName;
		glu::DataType		 dataType;
		int					 arrayLength; // Number of elements in array (currently always 1).
		std::vector<Element> elements;	// Scalar values (length dataType.scalarSize * arrayLength).
	};

	struct ValueBlock
	{
		int				   arrayLength; // Combined array length of each value (lengths must be same, or one).
		std::vector<Value> values;
		ValueBlock(void)
		{
			arrayLength = 0;
		}
	};

	// Methods.
	ShaderCase(tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const char* caseName, const char* description,
			   ExpectResult expectResult, const std::vector<ValueBlock>& valueBlocks, glu::GLSLVersion targetVersion,
			   const char* vertexSource, const char* fragmentSource);

	virtual ~ShaderCase(void);

	CaseType getCaseType(void) const
	{
		return m_caseType;
	}
	const std::vector<ValueBlock>& getValueBlocks(void) const
	{
		return m_valueBlocks;
	}
	const char* getVertexSource(void) const
	{
		return m_vertexSource.c_str();
	}
	const char* getFragmentSource(void) const
	{
		return m_fragmentSource.c_str();
	}

	bool		  execute(void);
	IterateResult iterate(void);

private:
	ShaderCase(const ShaderCase&);			  // not allowed!
	ShaderCase& operator=(const ShaderCase&); // not allowed!

	std::string genVertexShader(const ValueBlock& valueBlock);
	std::string genFragmentShader(const ValueBlock& valueBlock);
	std::string specializeVertexShader(const char* src, const ValueBlock& valueBlock);
	std::string specializeFragmentShader(const char* src, const ValueBlock& valueBlock);

	void specializeShaders(const char* vertexSource, const char* fragmentSource, std::string& outVertexSource,
						   std::string& outFragmentSource, const ValueBlock& valueBlock);

	void dumpValues(const ValueBlock& valueBlock, int arrayNdx);

	bool checkPixels(tcu::Surface& surface, int minX, int maxX, int minY, int maxY);

	// Member variables.
	glu::RenderContext&		m_renderCtx;
	CaseType				m_caseType;
	ExpectResult			m_expectResult;
	std::vector<ValueBlock> m_valueBlocks;
	glu::GLSLVersion		m_targetVersion;
	std::string				m_vertexSource;
	std::string				m_fragmentSource;
};

} // sl
} // deqp

#endif // _GLCSHADERLIBRARYCASE_HPP
