1#ifndef _TCUANDROIDWINDOW_HPP
2#define _TCUANDROIDWINDOW_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 Android window.
24 *//*--------------------------------------------------------------------*/
25
26#include "tcuDefs.hpp"
27#include "tcuVector.hpp"
28#include "deSemaphore.hpp"
29#include "deMutex.hpp"
30
31#include <vector>
32
33#include <android/native_window.h>
34
35namespace tcu
36{
37namespace Android
38{
39
40// \note Window is thread-safe, WindowRegistry is not
41
42class Window
43{
44public:
45	enum State
46	{
47		STATE_AVAILABLE	= 0,
48		STATE_IN_USE,
49		STATE_PENDING_DESTROY,
50		STATE_READY_FOR_DESTROY,
51		STATE_ACQUIRED_FOR_DESTROY,
52
53		STATE_LAST
54	};
55
56							Window				(ANativeWindow* window);
57							~Window				(void);
58
59	bool					tryAcquire			(void);
60	void					release				(void);
61
62	void					markForDestroy		(void);
63	bool					isPendingDestroy	(void) const;
64	bool					tryAcquireForDestroy(bool onlyMarked);
65
66	ANativeWindow*			getNativeWindow		(void)	{ return m_window;	}
67
68	void					setBuffersGeometry	(int width, int height, int32_t format);
69
70	IVec2					getSize				(void) const;
71
72private:
73							Window				(const Window& other);
74	Window&					operator=			(const Window& other);
75
76	ANativeWindow*			m_window;
77	mutable de::Mutex		m_stateLock;
78	State					m_state;
79};
80
81class WindowRegistry
82{
83public:
84							WindowRegistry		(void);
85							~WindowRegistry		(void);
86
87	void					addWindow			(ANativeWindow* window);
88	void					destroyWindow		(ANativeWindow* window);
89
90	Window*					tryAcquireWindow	(void);
91
92	void					garbageCollect		(void);
93
94private:
95	std::vector<Window*>	m_windows;
96};
97
98} // Android
99} // tcu
100
101#endif // _TCUANDROIDWINDOW_HPP
102