#ifndef _TGL45TESTPACKAGE_HPP
#define _TGL45TESTPACKAGE_HPP
/*-------------------------------------------------------------------------
 * OpenGL Conformance Test Suite
 * -----------------------------
 *
 * Copyright (c) 2019 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 OpenGL ES 3.1 Test Package that runs on GL4.5 context
 *//*--------------------------------------------------------------------*/

#include "tcuDefs.hpp"
#include "tcuTestPackage.hpp"
#include "tes31Context.hpp"
#include "tcuResource.hpp"
#include "deSharedPtr.hpp"

namespace tcu
{
    class WaiverUtil;
}

namespace deqp
{
namespace gles31
{

class TestPackageGL45 : public tcu::TestPackage
{
public:
									TestPackageGL45			(tcu::TestContext& testCtx);
	virtual							~TestPackageGL45		(void);

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

	tcu::TestCaseExecutor*			createExecutor			(void) const;

	tcu::Archive*					getArchive				(void) { return &m_archive; }
	Context*						getContext				(void) { return m_context; }

private:
	tcu::ResourcePrefix				m_archive;
	Context*						m_context;
    de::SharedPtr<tcu::WaiverUtil>	m_waiverMechanism;
};

} // gles31
} // deqp

#endif // _TGL45TESTPACKAGE_HPP
