#ifndef _ES31FMULTISAMPLESHADERRENDERCASE_HPP
#define _ES31FMULTISAMPLESHADERRENDERCASE_HPP
/*-------------------------------------------------------------------------
 * drawElements Quality Program OpenGL ES 3.1 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 Multisample shader render case
 *//*--------------------------------------------------------------------*/

#include "tcuDefs.hpp"
#include "tes31TestCase.hpp"

#include <map>

namespace tcu
{
class Surface;
} // tcu

namespace glu
{
class ShaderProgram;
} // glu


namespace deqp
{
namespace gles31
{
namespace Functional
{
namespace MultisampleShaderRenderUtil
{

class QualityWarning : public tcu::Exception
{
public:
	QualityWarning (const std::string& message);
};

class MultisampleRenderCase : public TestCase
{
public:
	enum RenderTarget
	{
		TARGET_DEFAULT = 0,
		TARGET_TEXTURE,
		TARGET_RENDERBUFFER,

		TARGET_LAST
	};
	enum Flags
	{
		FLAG_PER_ITERATION_SHADER				= 1,
		FLAG_VERIFY_MSAA_TEXTURE_SAMPLE_BUFFERS	= 2, // !< flag set: each sample layer is verified by verifySampleBuffer
	};

						MultisampleRenderCase			(Context& context, const char* name, const char* desc, int numSamples, RenderTarget target, int renderSize, int flags = 0);
	virtual				~MultisampleRenderCase			(void);

	virtual void		init							(void);
	virtual void		deinit							(void);
	IterateResult		iterate							(void);

private:
	virtual void		preDraw							(void);
	virtual void		postDraw						(void);
	virtual void		preTest							(void);
	virtual void		postTest						(void);
	virtual std::string	getIterationDescription			(int iteration) const;

	void				drawOneIteration				(void);
	void				verifyResultImageAndSetResult	(const tcu::Surface& resultImage);
	void				verifyResultBuffersAndSetResult	(const std::vector<tcu::Surface>& resultBuffers);
	virtual std::string	genVertexSource					(int numTargetSamples) const;
	virtual std::string	genFragmentSource				(int numTargetSamples) const = 0;
	std::string			genMSSamplerSource				(int numTargetSamples) const;
	std::string			genMSTextureResolverSource		(int numTargetSamples) const;
	std::string			genMSTextureLayerFetchSource	(int numTargetSamples) const;
	virtual bool		verifyImage						(const tcu::Surface& resultImage) = 0;
	virtual bool		verifySampleBuffers				(const std::vector<tcu::Surface>& resultBuffers);
	virtual void		setupRenderData					(void);

	glw::GLint			getMaxConformantSampleCount		(glw::GLenum target, glw::GLenum internalFormat);

protected:
	struct Attrib
	{
		int offset;
		int stride;
	};

	const int			m_numRequestedSamples;
	const RenderTarget	m_renderTarget;
	const int			m_renderSize;
	const bool			m_perIterationShader;
	const bool			m_verifyTextureSampleBuffers;
	deInt32				m_numTargetSamples;

	deUint32			m_buffer;
	deUint32			m_resolveBuffer;
	glu::ShaderProgram*	m_program;
	deUint32			m_fbo;
	deUint32			m_fboTexture;
	glu::ShaderProgram*	m_textureSamplerProgram;
	deUint32			m_fboRbo;
	deUint32			m_resolveFbo;
	deUint32			m_resolveFboTexture;
	int					m_iteration;
	int					m_numIterations;
	deUint32			m_renderMode;
	deInt32				m_renderCount;
	deUint32			m_renderVao;
	deUint32			m_resolveVao;

	std::string			m_renderSceneDescription;
	std::map<std::string, Attrib> m_renderAttribs;
};

} // MultisampleShaderRenderUtil
} // Functional
} // gles31
} // deqp

#endif // _ES31FMULTISAMPLESHADERRENDERCASE_HPP
