#ifndef _GL4CINDIRECTPARAMETERSTESTS_HPP
#define _GL4CINDIRECTPARAMETERSTESTS_HPP
/*-------------------------------------------------------------------------
 * OpenGL Conformance Test Suite
 * -----------------------------
 *
 * Copyright (c) 2017 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  gl4cIndirectParametersTests.hpp
 * \brief Conformance tests for the GL_ARB_indirect_parameters functionality.
 */ /*-------------------------------------------------------------------*/

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

using namespace glw;
using namespace glu;

namespace gl4cts
{

typedef struct
{
    GLuint count;
    GLuint instanceCount;
    GLuint first;
    GLuint baseInstance;
} DrawArraysIndirectCommand;

typedef struct
{
    GLuint count;
    GLuint instanceCount;
    GLuint firstIndex;
    GLuint baseVertex;
    GLuint baseInstance;
} DrawElementsIndirectCommand;

/** Test verifies if operations on new buffer object PARAMETER_BUFFER_ARB works as expected.
 **/
class ParameterBufferOperationsCase : public deqp::TestCase
{
public:
    /* Public methods */
    ParameterBufferOperationsCase(deqp::Context &context);

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

private:
    /* Private methods */
    /* Private members */
};

/** Base class for specific vertex array indirect drawing classes.
 **/
class VertexArrayIndirectDrawingBaseCase : public deqp::TestCase
{
public:
    /* Public methods */
    VertexArrayIndirectDrawingBaseCase(deqp::Context &context, const char *name, const char *description);

    virtual void init()   = DE_NULL;
    virtual void deinit() = DE_NULL;
    virtual tcu::TestNode::IterateResult iterate();

protected:
    /* Protected methods */
    virtual bool draw() = DE_NULL;
    virtual bool verify();
    virtual bool verifyErrors() = DE_NULL;
};

/** Test verifies if MultiDrawArraysIndirectCountARB function works properly.
 **/
class MultiDrawArraysIndirectCountCase : public VertexArrayIndirectDrawingBaseCase
{
public:
    /* Public methods */
    MultiDrawArraysIndirectCountCase(deqp::Context &context);

    virtual void init();
    virtual void deinit();

protected:
    /* Protected methods */
    virtual bool draw();
    virtual bool verifyErrors();

    /* Protected methods */
    GLuint m_vao;
    GLuint m_arrayBuffer;
    GLuint m_drawIndirectBuffer;
    GLuint m_parameterBuffer;
};

/** Test verifies if MultiDrawArraysIndirectCountARB function works properly.
 **/
class MultiDrawElementsIndirectCountCase : public VertexArrayIndirectDrawingBaseCase
{
public:
    /* Public methods */
    MultiDrawElementsIndirectCountCase(deqp::Context &context);

    virtual void init();
    virtual void deinit();

protected:
    /* Protected methods */
    virtual bool draw();
    virtual bool verifyErrors();

    /* Protected methods */
    GLuint m_vao;
    GLuint m_arrayBuffer;
    GLuint m_elementBuffer;
    GLuint m_drawIndirectBuffer;
    GLuint m_parameterBuffer;
};

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

    void init();

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

} // namespace gl4cts

#endif // _GL4CINDIRECTPARAMETERSTESTS_HPP
