1 #ifndef _EGLUNATIVEWINDOW_HPP
2 #define _EGLUNATIVEWINDOW_HPP
3 /*-------------------------------------------------------------------------
4  * drawElements Quality Program Tester Core
5  * ----------------------------------------
6  *
7  * Copyright 2014 The Android Open Source Project
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 EGL native window abstraction
24  *//*--------------------------------------------------------------------*/
25 
26 #include "tcuDefs.hpp"
27 #include "tcuFactoryRegistry.hpp"
28 #include "eglwDefs.hpp"
29 #include "tcuVector.hpp"
30 
31 namespace tcu
32 {
33 class TextureLevel;
34 }
35 
36 namespace eglu
37 {
38 
39 class NativePixmap;
40 class NativeDisplay;
41 
42 struct WindowParams
43 {
44 	enum Visibility
45 	{
46 		VISIBILITY_HIDDEN = 0,
47 		VISIBILITY_VISIBLE,
48 		VISIBILITY_FULLSCREEN,
49 		VISIBILITY_DONT_CARE,
50 
51 		VISIBILITY_LAST
52 	};
53 
54 	enum
55 	{
56 		SIZE_DONT_CARE = - 1
57 	};
58 
59 	int			width;		//!< Positive size, or SIZE_DONT_CARE
60 	int			height;		//!< Positive size, or SIZE_DONT_CARE
61 	Visibility	visibility;	//!< Visibility for window
62 
WindowParamseglu::WindowParams63 	WindowParams (void) : width(SIZE_DONT_CARE), height(SIZE_DONT_CARE), visibility(VISIBILITY_DONT_CARE) {}
WindowParamseglu::WindowParams64 	WindowParams (int width_, int height_, Visibility visibility_) : width(width_), height(height_), visibility(visibility_) {}
65 };
66 
67 class WindowDestroyedError : public tcu::ResourceError
68 {
69 public:
WindowDestroyedError(const std::string & message)70 	WindowDestroyedError (const std::string& message) : tcu::ResourceError(message) {}
71 };
72 
73 class NativeWindow
74 {
75 public:
76 	enum Capability
77 	{
78 		CAPABILITY_CREATE_SURFACE_LEGACY				= (1<<0),	//!< EGL surface can be created with eglCreateWindowSurface()
79 		CAPABILITY_CREATE_SURFACE_PLATFORM_EXTENSION	= (1<<1),	//!< EGL surface can be created with eglCreatePlatformWindowSurfaceEXT()
80 		CAPABILITY_CREATE_SURFACE_PLATFORM				= (1<<2),	//!< EGL surface can be created with eglCreatePlatformWindowSurface()
81 		CAPABILITY_GET_SURFACE_SIZE						= (1<<3),
82 		CAPABILITY_SET_SURFACE_SIZE						= (1<<4),
83 		CAPABILITY_GET_SCREEN_SIZE						= (1<<5),
84 		CAPABILITY_READ_SCREEN_PIXELS					= (1<<6),
85 		CAPABILITY_CHANGE_VISIBILITY					= (1<<7)
86 	};
87 
~NativeWindow(void)88 	virtual								~NativeWindow					(void) {}
89 
90 	//! Return EGLNativeWindowType that can be used with eglCreateWindowSurface(). Default implementation throws tcu::NotSupportedError().
91 	virtual eglw::EGLNativeWindowType	getLegacyNative					(void);
92 
93 	//! Return native pointer that can be used with eglCreatePlatformWindowSurfaceEXT(). Default implementation throws tcu::NotSupportedError().
94 	virtual void*						getPlatformExtension			(void);
95 
96 	//! Return native pointer that can be used with eglCreatePlatformWindowSurface(). Default implementation throws tcu::NotSupportedError().
97 	virtual void*						getPlatformNative				(void);
98 
99 	// Process window events. Defaults to dummy implementation, that does nothing.
processEvents(void)100 	virtual void						processEvents					(void) {}
101 
102 	// Get current size of window's logical surface. Default implementation throws tcu::NotSupportedError()
103 	virtual tcu::IVec2					getSurfaceSize					(void) const;
104 
105 	// Set the size of the window's logical surface. Default implementation throws tcu::NotSupportedError()
106 	virtual void						setSurfaceSize					(tcu::IVec2 size);
107 
108 	// Get the size of the window in screen pixels. Default implementation throws tcu::NotSupportedError()
109 	virtual tcu::IVec2					getScreenSize					(void) const;
110 
111 	// Read screen (visible) pixels from window. Default implementation throws tcu::NotSupportedError()
112 	virtual void						readScreenPixels				(tcu::TextureLevel* dst) const;
113 
114 	// Change window visibility. Default throws tcu::NotSupportedError().
115 	virtual void						setVisibility					(WindowParams::Visibility visibility);
116 
getCapabilities(void) const117 	Capability							getCapabilities					(void) const { return m_capabilities; }
118 
119 protected:
120 										NativeWindow					(Capability capabilities);
121 
122 private:
123 										NativeWindow					(const NativeWindow&);
124 	NativeWindow&						operator=						(const NativeWindow&);
125 
126 	const Capability					m_capabilities;
127 };
128 
129 class NativeWindowFactory : public tcu::FactoryBase
130 {
131 public:
132 	virtual								~NativeWindowFactory			(void);
133 
134 	//! Create generic NativeWindow
135 	virtual NativeWindow*				createWindow					(NativeDisplay* nativeDisplay, const WindowParams& params) const = 0;
136 
137 	//! Create NativeWindow that matches given config. Defaults to generic createWindow().
138 	virtual NativeWindow*				createWindow					(NativeDisplay* nativeDisplay, eglw::EGLDisplay display, eglw::EGLConfig config, const eglw::EGLAttrib* attribList, const WindowParams& params) const;
139 
getCapabilities(void) const140 	NativeWindow::Capability			getCapabilities					(void) const { return m_capabilities; }
141 
142 protected:
143 										NativeWindowFactory				(const std::string& name, const std::string& description, NativeWindow::Capability capabilities);
144 
145 private:
146 										NativeWindowFactory				(const NativeWindowFactory&);
147 	NativeWindowFactory&				operator=						(const NativeWindowFactory&);
148 
149 	const NativeWindow::Capability		m_capabilities;
150 };
151 
152 typedef tcu::FactoryRegistry<NativeWindowFactory> NativeWindowFactoryRegistry;
153 
154 } // eglu
155 
156 #endif // _EGLUNATIVEWINDOW_HPP
157