• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*-------------------------------------------------------------------------
2  * drawElements Quality Program Tester Core
3  * ----------------------------------------
4  *
5  * Copyright (c) 2014 The Android Open Source Project
6  * Copyright (c) 2016 The Khronos Group Inc.
7  * Copyright (c) 2016 Mun Gwan-gyeong <elongbug@gmail.com>
8  *
9  * Licensed under the Apache License, Version 2.0 (the "License");
10  * you may not use this file except in compliance with the License.
11  * You may obtain a copy of the License at
12  *
13  *      http://www.apache.org/licenses/LICENSE-2.0
14  *
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  *
21  *//*!
22  * \file
23  * \brief wayland Egl Platform.
24  *//*--------------------------------------------------------------------*/
25 
26 #include "tcuWaylandEglPlatform.hpp"
27 #include "egluGLContextFactory.hpp"
28 #include "eglwLibrary.hpp"
29 #include "eglwFunctions.hpp"
30 #include "eglwEnums.hpp"
31 
32 namespace tcu
33 {
34 namespace wayland
35 {
36 namespace egl
37 {
38 
39 using std::string;
40 
41 using de::MovePtr;
42 using de::UniquePtr;
43 using glu::ContextFactory;
44 using eglu::GLContextFactory;
45 using eglu::NativeDisplay;
46 using eglu::NativeDisplayFactory;
47 using eglu::NativeWindow;
48 using eglu::NativeWindowFactory;
49 using eglu::NativePixmap;
50 using eglu::NativePixmapFactory;
51 using eglu::WindowParams;
52 using tcu::TextureLevel;
53 
54 class Display : public NativeDisplay
55 {
56 public:
57 	static const Capability CAPABILITIES		= Capability(CAPABILITY_GET_DISPLAY_LEGACY|
58 															 CAPABILITY_GET_DISPLAY_PLATFORM);
59 
Display(MovePtr<wayland::Display> waylandDisplay)60 								Display				(MovePtr<wayland::Display> waylandDisplay)
61 									: NativeDisplay	(CAPABILITIES,
62 													 EGL_PLATFORM_WAYLAND_KHR,
63 													 "EGL_KHR_platform_wayland")
64 									, m_display		(waylandDisplay)
65 									, m_library		("libEGL.so") {}
66 
~Display(void)67 	~Display(void) {}
getWaylandDisplay(void)68 	wayland::Display&			getWaylandDisplay	(void)	{ return *m_display; }
getLegacyNative(void)69 	eglw::EGLNativeDisplayType	getLegacyNative		(void)	{ return reinterpret_cast<eglw::EGLNativeDisplayType>(m_display->getDisplay()); }
getPlatformNative(void)70 	void*						getPlatformNative	(void)	{ return m_display->getDisplay(); }
getLibrary(void) const71 	const eglw::Library&		getLibrary			(void) const	{ return m_library; }
getPlatformAttributes(void) const72 	const eglw::EGLAttrib*		getPlatformAttributes	(void) const	{ return DE_NULL; }
73 
74 private:
75 	UniquePtr<wayland::Display>		m_display;
76 	eglw::DefaultLibrary			m_library;
77 };
78 
79 class Window : public NativeWindow
80 {
81 public:
82 	static const Capability	CAPABILITIES		= Capability(CAPABILITY_CREATE_SURFACE_LEGACY |
83 															 CAPABILITY_GET_SURFACE_SIZE |
84 															 CAPABILITY_SET_SURFACE_SIZE |
85 															 CAPABILITY_GET_SCREEN_SIZE);
86 
87 								Window				(Display&				display,
88 													 const WindowParams&	params);
89 
getLegacyNative(void)90 	eglw::EGLNativeWindowType	getLegacyNative		(void) { return reinterpret_cast<eglw::EGLNativeWindowType>(m_window.getWindow()); }
91 	IVec2						getSurfaceSize		(void) const;
92 	void						setSurfaceSize		(IVec2 size);
getScreenSize(void) const93 	IVec2						getScreenSize		(void) const { return getSurfaceSize(); }
94 
95 private:
96 	wayland::Window				m_window;
97 };
98 
Window(Display & display,const WindowParams & params)99 Window::Window (Display& display, const WindowParams& params)
100 	: NativeWindow	(CAPABILITIES)
101 	, m_window		(display.getWaylandDisplay(), params.width, params.height)
102 {
103 }
104 
getSurfaceSize(void) const105 IVec2 Window::getSurfaceSize (void) const
106 {
107 	IVec2 ret;
108 	m_window.getDimensions(&ret.x(), &ret.y());
109 	return ret;
110 }
111 
setSurfaceSize(IVec2 size)112 void Window::setSurfaceSize (IVec2 size)
113 {
114 	m_window.setDimensions(size.x(), size.y());
115 }
116 
117 class WindowFactory : public NativeWindowFactory
118 {
119 public:
120 						WindowFactory		(void);
121 
122 	NativeWindow*		createWindow		(NativeDisplay*			nativeDisplay,
123 											 const WindowParams&	params) const;
124 
125 	NativeWindow*		createWindow		(NativeDisplay*			nativeDisplay,
126 											 eglw::EGLDisplay		display,
127 											 eglw::EGLConfig		config,
128 											 const eglw::EGLAttrib*	attribList,
129 											 const WindowParams&	params) const;
130 };
131 
WindowFactory(void)132 WindowFactory::WindowFactory (void)
133 	: NativeWindowFactory ("window", "Wayland Window", Window::CAPABILITIES)
134 {
135 }
136 
createWindow(NativeDisplay * nativeDisplay,const WindowParams & params) const137 NativeWindow* WindowFactory::createWindow (NativeDisplay*		nativeDisplay,
138 										   const WindowParams&	params) const
139 {
140 	Display&	display	= *dynamic_cast<Display*>(nativeDisplay);
141 
142 	return new Window(display, params);
143 }
144 
createWindow(NativeDisplay * nativeDisplay,eglw::EGLDisplay eglDisplay,eglw::EGLConfig config,const eglw::EGLAttrib * attribList,const WindowParams & params) const145 NativeWindow* WindowFactory::createWindow (NativeDisplay*			nativeDisplay,
146 										   eglw::EGLDisplay			eglDisplay,
147 										   eglw::EGLConfig			config,
148 										   const eglw::EGLAttrib*	attribList,
149 										   const WindowParams&		params) const
150 {
151 	DE_UNREF(eglDisplay);
152 	DE_UNREF(config);
153 	DE_UNREF(attribList);
154 
155 	Display&	display = *dynamic_cast<Display*>(nativeDisplay);
156 
157 	return new Window(display, params);
158 }
159 
160 class DisplayFactory : public NativeDisplayFactory
161 {
162 public:
163 						DisplayFactory		(EventState& eventState);
164 
165 	NativeDisplay*		createDisplay		(const eglw::EGLAttrib* attribList) const;
166 
167 private:
168 	EventState&			m_eventState;
169 };
170 
DisplayFactory(EventState & eventState)171 DisplayFactory::DisplayFactory (EventState& eventState)
172 	: NativeDisplayFactory	("Wayland", "Native Wayland Display",
173 							 Display::CAPABILITIES,
174 							 EGL_PLATFORM_WAYLAND_KHR,
175 							 "EGL_KHR_platform_wayland")
176 	, m_eventState			(eventState)
177 {
178 	m_nativeWindowRegistry.registerFactory(new WindowFactory());
179 }
180 
createDisplay(const eglw::EGLAttrib * attribList) const181 NativeDisplay* DisplayFactory::createDisplay (const eglw::EGLAttrib* attribList) const
182 {
183 	DE_UNREF(attribList);
184 
185 	MovePtr<wayland::Display>	waylandDisplay	(new wayland::Display(m_eventState, DE_NULL));
186 
187 	return new Display(waylandDisplay);
188 }
189 
Platform(EventState & eventState)190 Platform::Platform (EventState& eventState)
191 {
192 	m_nativeDisplayFactoryRegistry.registerFactory(new DisplayFactory(eventState));
193 }
194 
createContextFactory(void)195 MovePtr<ContextFactory> Platform::createContextFactory (void)
196 {
197 	return MovePtr<ContextFactory>(new GLContextFactory(m_nativeDisplayFactoryRegistry));
198 }
199 
200 } // egl
201 } // wayland
202 } // tcu
203