1e5c31af7Sopenharmony_ci/*-------------------------------------------------------------------------
2e5c31af7Sopenharmony_ci * drawElements Quality Program Tester Core
3e5c31af7Sopenharmony_ci * ----------------------------------------
4e5c31af7Sopenharmony_ci *
5e5c31af7Sopenharmony_ci * Copyright 2017 The Android Open Source Project
6e5c31af7Sopenharmony_ci *
7e5c31af7Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
8e5c31af7Sopenharmony_ci * you may not use this file except in compliance with the License.
9e5c31af7Sopenharmony_ci * You may obtain a copy of the License at
10e5c31af7Sopenharmony_ci *
11e5c31af7Sopenharmony_ci *      http://www.apache.org/licenses/LICENSE-2.0
12e5c31af7Sopenharmony_ci *
13e5c31af7Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
14e5c31af7Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
15e5c31af7Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16e5c31af7Sopenharmony_ci * See the License for the specific language governing permissions and
17e5c31af7Sopenharmony_ci * limitations under the License.
18e5c31af7Sopenharmony_ci *
19e5c31af7Sopenharmony_ci *//*!
20e5c31af7Sopenharmony_ci * \file
21e5c31af7Sopenharmony_ci * \brief Linux Platform.
22e5c31af7Sopenharmony_ci *//*--------------------------------------------------------------------*/
23e5c31af7Sopenharmony_ci
24e5c31af7Sopenharmony_ci#include "tcuLnxPlatform.hpp"
25e5c31af7Sopenharmony_ci
26e5c31af7Sopenharmony_ci#include "tcuLnxVulkanPlatform.hpp"
27e5c31af7Sopenharmony_ci#include "tcuLnxEglPlatform.hpp"
28e5c31af7Sopenharmony_ci
29e5c31af7Sopenharmony_ci#include "deUniquePtr.hpp"
30e5c31af7Sopenharmony_ci#include "gluPlatform.hpp"
31e5c31af7Sopenharmony_ci#include "vkPlatform.hpp"
32e5c31af7Sopenharmony_ci
33e5c31af7Sopenharmony_ci#if defined (DEQP_SUPPORT_X11)
34e5c31af7Sopenharmony_ci#	include <X11/Xlib.h>
35e5c31af7Sopenharmony_ci#endif // DEQP_SUPPORT_X11
36e5c31af7Sopenharmony_ci
37e5c31af7Sopenharmony_ci#if defined (DEQP_SUPPORT_GLX)
38e5c31af7Sopenharmony_ci#	include "tcuLnxX11GlxPlatform.hpp"
39e5c31af7Sopenharmony_ci#endif // DEQP_SUPPORT_GLX
40e5c31af7Sopenharmony_ci
41e5c31af7Sopenharmony_ciusing de::MovePtr;
42e5c31af7Sopenharmony_ciusing de::UniquePtr;
43e5c31af7Sopenharmony_ci
44e5c31af7Sopenharmony_cinamespace tcu
45e5c31af7Sopenharmony_ci{
46e5c31af7Sopenharmony_cinamespace lnx
47e5c31af7Sopenharmony_ci{
48e5c31af7Sopenharmony_ci
49e5c31af7Sopenharmony_ciclass LinuxGLPlatform : public glu::Platform
50e5c31af7Sopenharmony_ci{
51e5c31af7Sopenharmony_cipublic:
52e5c31af7Sopenharmony_ci	void		registerFactory	(de::MovePtr<glu::ContextFactory> factory)
53e5c31af7Sopenharmony_ci	{
54e5c31af7Sopenharmony_ci		m_contextFactoryRegistry.registerFactory(factory.release());
55e5c31af7Sopenharmony_ci	}
56e5c31af7Sopenharmony_ci};
57e5c31af7Sopenharmony_ci
58e5c31af7Sopenharmony_ciclass LinuxPlatform : public tcu::Platform
59e5c31af7Sopenharmony_ci{
60e5c31af7Sopenharmony_cipublic:
61e5c31af7Sopenharmony_ci							LinuxPlatform		(void);
62e5c31af7Sopenharmony_ci	bool					processEvents		(void) { return !m_eventState.getQuitFlag(); }
63e5c31af7Sopenharmony_ci
64e5c31af7Sopenharmony_ci	const vk::Platform&		getVulkanPlatform	(void) const { return m_vkPlatform; }
65e5c31af7Sopenharmony_ci	const eglu::Platform&	getEGLPlatform		(void) const { return m_eglPlatform; }
66e5c31af7Sopenharmony_ci	const glu::Platform&	getGLPlatform		(void) const { return m_glPlatform; }
67e5c31af7Sopenharmony_ci
68e5c31af7Sopenharmony_ciprivate:
69e5c31af7Sopenharmony_ci	EventState				m_eventState;
70e5c31af7Sopenharmony_ci	VulkanPlatform			m_vkPlatform;
71e5c31af7Sopenharmony_ci	egl::Platform			m_eglPlatform;
72e5c31af7Sopenharmony_ci	LinuxGLPlatform			m_glPlatform;
73e5c31af7Sopenharmony_ci};
74e5c31af7Sopenharmony_ci
75e5c31af7Sopenharmony_ciLinuxPlatform::LinuxPlatform (void)
76e5c31af7Sopenharmony_ci	: m_vkPlatform	(m_eventState)
77e5c31af7Sopenharmony_ci	, m_eglPlatform	(m_eventState)
78e5c31af7Sopenharmony_ci{
79e5c31af7Sopenharmony_ci#if defined (DEQP_SUPPORT_GLX)
80e5c31af7Sopenharmony_ci	m_glPlatform.registerFactory(x11::glx::createContextFactory(m_eventState));
81e5c31af7Sopenharmony_ci#endif // DEQP_SUPPORT_GLX
82e5c31af7Sopenharmony_ci
83e5c31af7Sopenharmony_ci	m_glPlatform.registerFactory(m_eglPlatform.createContextFactory());
84e5c31af7Sopenharmony_ci}
85e5c31af7Sopenharmony_ci
86e5c31af7Sopenharmony_ci} // lnx
87e5c31af7Sopenharmony_ci} // tcu
88e5c31af7Sopenharmony_ci
89e5c31af7Sopenharmony_citcu::Platform* createPlatform (void)
90e5c31af7Sopenharmony_ci{
91e5c31af7Sopenharmony_ci#if defined (DEQP_SUPPORT_X11)
92e5c31af7Sopenharmony_ci	// From man:XinitThreads(3):
93e5c31af7Sopenharmony_ci	//
94e5c31af7Sopenharmony_ci	//     The XInitThreads function initializes Xlib support for concurrent
95e5c31af7Sopenharmony_ci	//     threads.  This function must be the first Xlib function
96e5c31af7Sopenharmony_ci	//     a multi-threaded program calls, and it must complete before any other
97e5c31af7Sopenharmony_ci	//     Xlib call is made.
98e5c31af7Sopenharmony_ci	DE_CHECK_RUNTIME_ERR(XInitThreads() != 0);
99e5c31af7Sopenharmony_ci#endif // DEQP_SUPPORT_X11
100e5c31af7Sopenharmony_ci
101e5c31af7Sopenharmony_ci	return new tcu::lnx::LinuxPlatform();
102e5c31af7Sopenharmony_ci}
103