#ifndef _GL4CINCOMPLETETEXTUREACCESSTESTS_HPP
#define _GL4CINCOMPLETETEXTUREACCESSTESTS_HPP
/*-------------------------------------------------------------------------
 * OpenGL Conformance Test Suite
 * -----------------------------
 *
 * Copyright (c) 2015-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  gl4cIncompleteTextureAccessTests.hpp
 * \brief Declares test classes for incomplete texture access cases.
 */ /*-------------------------------------------------------------------*/

/* Includes. */

#include "glcTestCase.hpp"
#include "glwDefs.hpp"
#include "tcuDefs.hpp"

namespace gl4cts
{
namespace IncompleteTextureAccess
{
/** @class Tests
 *
 *  @brief Incomplete texture access test group.
 */
class Tests : public deqp::TestCaseGroup
{
public:
	/* Public member functions */
	Tests(deqp::Context& context);

	void init();

private:
	/* Private member functions */
	Tests(const Tests& other);
	Tests& operator=(const Tests& other);
};
/* Tests class */

/** @class IncompleteTextureAccessTest
 *
 *  Description:
 *
 *    This tests checks access to incomplete texture from shader using
 *    texture sampler functions. For OpenGL 4.5 and higher (0.0, 0.0, 0.0, 1.0)
 *    is expected for floating point non-shadow samplers. 0 is expected
 *    for the shadow sampler.
 *
 *  Steps:
 *
 *      Prepare incomplete texture of given type.
 *      Prepare framebuffer with RGBA renderbuffer 1x1 pixels in size
 *      Prepare program which draws full screen textured quad using given sampler.
 *      Make draw call.
 *      Fetch framebuffer data using glReadPixels.
 *      Compare the values with expected value.
 *
 *  Repeat the steps for following samplers:
 *   -  sampler1D,
 *   -  sampler2D,
 *   -  sampler3D,
 *   -  samplerCube,
 *   -  sampler2DRect,
 *   -  sampler1DArray,
 *   -  sampler2DArray,
 *   -  samplerCubeArray
 *  expecting (0.0, 0.0, 0.0, 1.0) and:
 *   -  sampler1DShadow,
 *   -  sampler2DShadow,
 *   -  samplerCubeShadow,
 *   -  sampler2DRectShadow,
 *   -  sampler1DArrayShadow,
 *   -  sampler2DArrayShadow,
 *   -  samplerCubeArrayShadow
 *  expecting 0.0.
 */
class SamplerTest : public deqp::TestCase
{
public:
	/* Public member functions */
	SamplerTest(deqp::Context& context);

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

private:
	/* Private member functions */
	SamplerTest(const SamplerTest& other);
	SamplerTest& operator=(const SamplerTest& other);

	glw::GLuint m_po;
	glw::GLuint m_to;
	glw::GLuint m_fbo;
	glw::GLuint m_rbo;
	glw::GLuint m_vao;

	static const struct Configuration
	{
		glw::GLenum		   texture_target;
		const glw::GLchar* sampler_template;
		const glw::GLchar* fetch_template;
		glw::GLfloat	   expected_result[4];
	} s_configurations[];

	static const glw::GLuint s_configurations_count;

	static const glw::GLchar* s_vertex_shader;
	static const glw::GLchar* s_fragment_shader_head;
	static const glw::GLchar* s_fragment_shader_body;
	static const glw::GLchar* s_fragment_shader_tail;

	void PrepareProgram(Configuration configuration);
	void PrepareTexture(Configuration configuration);
	void PrepareVertexArrays();
	void PrepareFramebuffer();
	void Draw();
	bool Check(Configuration configuration);
	void CleanCase();
	void CleanTest();
};

/* SamplerTest class */
} /* IncompleteTextureAccess namespace */
} /* gl4cts */

#endif // _GL4CINCOMPLETETEXTUREACCESSTESTS_HPP