Home | History | Annotate | Download | only in wayland
      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 (at) 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 Display Factory.
     24  *//*--------------------------------------------------------------------*/
     25 
     26 #include "tcuLnxWaylandEglDisplayFactory.hpp"
     27 #include "tcuLnxWayland.hpp"
     28 #include "egluGLContextFactory.hpp"
     29 #include "eglwLibrary.hpp"
     30 #include "eglwFunctions.hpp"
     31 #include "eglwEnums.hpp"
     32 #include "deUniquePtr.hpp"
     33 
     34 namespace tcu
     35 {
     36 namespace lnx
     37 {
     38 namespace wayland
     39 {
     40 namespace egl
     41 {
     42 
     43 using std::string;
     44 
     45 using de::MovePtr;
     46 using de::UniquePtr;
     47 using glu::ContextFactory;
     48 using eglu::GLContextFactory;
     49 using eglu::NativeDisplay;
     50 using eglu::NativeDisplayFactory;
     51 using eglu::NativeWindow;
     52 using eglu::NativeWindowFactory;
     53 using eglu::NativePixmap;
     54 using eglu::NativePixmapFactory;
     55 using eglu::WindowParams;
     56 using tcu::TextureLevel;
     57 
     58 class Display : public NativeDisplay
     59 {
     60 public:
     61 	static const Capability CAPABILITIES		= Capability(CAPABILITY_GET_DISPLAY_LEGACY|
     62 															 CAPABILITY_GET_DISPLAY_PLATFORM);
     63 
     64 								Display				(MovePtr<wayland::Display> waylandDisplay)
     65 									: NativeDisplay	(CAPABILITIES,
     66 													 EGL_PLATFORM_WAYLAND_KHR,
     67 													 "EGL_KHR_platform_wayland")
     68 									, m_display		(waylandDisplay)
     69 									, m_library		("libEGL.so") {}
     70 
     71 	~Display(void) {}
     72 	wayland::Display&			getWaylandDisplay	(void)	{ return *m_display; }
     73 	eglw::EGLNativeDisplayType	getLegacyNative		(void)	{ return reinterpret_cast<eglw::EGLNativeDisplayType>(m_display->getDisplay()); }
     74 	void*						getPlatformNative	(void)	{ return m_display->getDisplay(); }
     75 	const eglw::Library&		getLibrary			(void) const	{ return m_library; }
     76 	const eglw::EGLAttrib*		getPlatformAttributes	(void) const	{ return DE_NULL; }
     77 
     78 private:
     79 	UniquePtr<wayland::Display>		m_display;
     80 	eglw::DefaultLibrary			m_library;
     81 };
     82 
     83 class Window : public NativeWindow
     84 {
     85 public:
     86 	static const Capability	CAPABILITIES		= Capability(CAPABILITY_CREATE_SURFACE_LEGACY |
     87 															 CAPABILITY_GET_SURFACE_SIZE |
     88 															 CAPABILITY_SET_SURFACE_SIZE |
     89 															 CAPABILITY_GET_SCREEN_SIZE);
     90 
     91 								Window				(Display&				display,
     92 													 const WindowParams&	params);
     93 
     94 	eglw::EGLNativeWindowType	getLegacyNative		(void) { return reinterpret_cast<eglw::EGLNativeWindowType>(m_window.getWindow()); }
     95 	IVec2						getSurfaceSize		(void) const;
     96 	void						setSurfaceSize		(IVec2 size);
     97 	IVec2						getScreenSize		(void) const { return getSurfaceSize(); }
     98 
     99 private:
    100 	wayland::Window				m_window;
    101 };
    102 
    103 Window::Window (Display& display, const WindowParams& params)
    104 	: NativeWindow	(CAPABILITIES)
    105 	, m_window		(display.getWaylandDisplay(), params.width, params.height)
    106 {
    107 }
    108 
    109 IVec2 Window::getSurfaceSize (void) const
    110 {
    111 	IVec2 ret;
    112 	m_window.getDimensions(&ret.x(), &ret.y());
    113 	return ret;
    114 }
    115 
    116 void Window::setSurfaceSize (IVec2 size)
    117 {
    118 	m_window.setDimensions(size.x(), size.y());
    119 }
    120 
    121 class WindowFactory : public NativeWindowFactory
    122 {
    123 public:
    124 						WindowFactory		(void);
    125 
    126 	NativeWindow*		createWindow		(NativeDisplay*			nativeDisplay,
    127 											 const WindowParams&	params) const;
    128 
    129 	NativeWindow*		createWindow		(NativeDisplay*			nativeDisplay,
    130 											 eglw::EGLDisplay		display,
    131 											 eglw::EGLConfig		config,
    132 											 const eglw::EGLAttrib*	attribList,
    133 											 const WindowParams&	params) const;
    134 };
    135 
    136 WindowFactory::WindowFactory (void)
    137 	: NativeWindowFactory ("window", "Wayland Window", Window::CAPABILITIES)
    138 {
    139 }
    140 
    141 NativeWindow* WindowFactory::createWindow (NativeDisplay*		nativeDisplay,
    142 										   const WindowParams&	params) const
    143 {
    144 	Display&	display	= *dynamic_cast<Display*>(nativeDisplay);
    145 
    146 	return new Window(display, params);
    147 }
    148 
    149 NativeWindow* WindowFactory::createWindow (NativeDisplay*			nativeDisplay,
    150 										   eglw::EGLDisplay			eglDisplay,
    151 										   eglw::EGLConfig			config,
    152 										   const eglw::EGLAttrib*	attribList,
    153 										   const WindowParams&		params) const
    154 {
    155 	DE_UNREF(eglDisplay);
    156 	DE_UNREF(config);
    157 	DE_UNREF(attribList);
    158 
    159 	Display&	display = *dynamic_cast<Display*>(nativeDisplay);
    160 
    161 	return new Window(display, params);
    162 }
    163 
    164 class DisplayFactory : public NativeDisplayFactory
    165 {
    166 public:
    167 						DisplayFactory		(EventState& eventState);
    168 
    169 	NativeDisplay*		createDisplay		(const eglw::EGLAttrib* attribList) const;
    170 
    171 private:
    172 	EventState&			m_eventState;
    173 };
    174 
    175 DisplayFactory::DisplayFactory (EventState& eventState)
    176 	: NativeDisplayFactory	("Wayland", "Native Wayland Display",
    177 							 Display::CAPABILITIES,
    178 							 EGL_PLATFORM_WAYLAND_KHR,
    179 							 "EGL_KHR_platform_wayland")
    180 	, m_eventState			(eventState)
    181 {
    182 	m_nativeWindowRegistry.registerFactory(new WindowFactory());
    183 }
    184 
    185 NativeDisplay* DisplayFactory::createDisplay (const eglw::EGLAttrib* attribList) const
    186 {
    187 	DE_UNREF(attribList);
    188 
    189 	MovePtr<wayland::Display>	waylandDisplay	(new wayland::Display(m_eventState, DE_NULL));
    190 
    191 	return new Display(waylandDisplay);
    192 }
    193 
    194 NativeDisplayFactory* createDisplayFactory (EventState& eventState)
    195 {
    196 	return new DisplayFactory(eventState);
    197 }
    198 
    199 } // egl
    200 } // wayland
    201 } // lnx
    202 } // tcu
    203