/*-------------------------------------------------------------------------
 * drawElements Quality Program Tester Core
 * ----------------------------------------
 *
 * Copyright 2017 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 Linux Platform.
 *//*--------------------------------------------------------------------*/

#include "tcuLnxPlatform.hpp"

#include "tcuLnxVulkanPlatform.hpp"
#include "tcuLnxEglPlatform.hpp"

#include "deUniquePtr.hpp"
#include "gluPlatform.hpp"
#include "vkPlatform.hpp"

#if defined (DEQP_SUPPORT_GLX)
#	include "tcuLnxX11GlxPlatform.hpp"
#endif // DEQP_SUPPORT_GLX

using de::MovePtr;
using de::UniquePtr;

namespace tcu
{
namespace lnx
{

class LinuxGLPlatform : public glu::Platform
{
public:
	void		registerFactory	(de::MovePtr<glu::ContextFactory> factory)
	{
		m_contextFactoryRegistry.registerFactory(factory.release());
	}
};

class LinuxPlatform : public tcu::Platform
{
public:
							LinuxPlatform		(void);
	bool					processEvents		(void) { return !m_eventState.getQuitFlag(); }

	const vk::Platform&		getVulkanPlatform	(void) const { return m_vkPlatform; }
	const eglu::Platform&	getEGLPlatform		(void) const { return m_eglPlatform; }
	const glu::Platform&	getGLPlatform		(void) const { return m_glPlatform; }

private:
	EventState				m_eventState;
	VulkanPlatform			m_vkPlatform;
	egl::Platform			m_eglPlatform;
	LinuxGLPlatform			m_glPlatform;
};

LinuxPlatform::LinuxPlatform (void)
	: m_vkPlatform	(m_eventState)
	, m_eglPlatform	(m_eventState)
{
#if defined (DEQP_SUPPORT_GLX)
	m_glPlatform.registerFactory(x11::glx::createContextFactory(m_eventState));
#endif // DEQP_SUPPORT_GLX

	m_glPlatform.registerFactory(m_eglPlatform.createContextFactory());
}

} // lnx
} // tcu

tcu::Platform* createPlatform (void)
{
	return new tcu::lnx::LinuxPlatform();
}
