13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*-------------------------------------------------------------------------
23c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * drawElements Quality Program Tester Core
33c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * ----------------------------------------
43c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
53c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Copyright 2014 The Android Open Source Project
63c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
73c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Licensed under the Apache License, Version 2.0 (the "License");
83c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * you may not use this file except in compliance with the License.
93c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * You may obtain a copy of the License at
103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *      http://www.apache.org/licenses/LICENSE-2.0
123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Unless required by applicable law or agreed to in writing, software
143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * distributed under the License is distributed on an "AS IS" BASIS,
153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * See the License for the specific language governing permissions and
173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * limitations under the License.
183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*!
203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \file
213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Android window.
223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuAndroidWindow.hpp"
253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
263c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace tcu
273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
283c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace Android
293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
31217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulosusing std::vector;
32217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos
33217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos// Window
34217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos
353c827367444ee418f129b2c238299f49d3264554Jarkko PoyryWindow::Window (ANativeWindow* window)
36217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	: m_window	(window)
37217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	, m_state	(STATE_AVAILABLE)
383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
413c827367444ee418f129b2c238299f49d3264554Jarkko PoyryWindow::~Window (void)
423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
453c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid Window::setBuffersGeometry (int width, int height, int32_t format)
463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	ANativeWindow_setBuffersGeometry(m_window, width, height, format);
483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
503c827367444ee418f129b2c238299f49d3264554Jarkko PoyryIVec2 Window::getSize (void) const
513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const int32_t	width	= ANativeWindow_getWidth(m_window);
533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const int32_t	height	= ANativeWindow_getHeight(m_window);
543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return IVec2(width, height);
553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
57217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulosbool Window::tryAcquire (void)
58217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos{
59217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	de::ScopedLock lock(m_stateLock);
60217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos
61217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	if (m_state == STATE_AVAILABLE)
62217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	{
63217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos		m_state = STATE_IN_USE;
64217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos		return true;
65217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	}
66217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	else
67217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos		return false;
68217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos}
69217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos
70217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulosvoid Window::release (void)
71217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos{
72217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	de::ScopedLock lock(m_stateLock);
73217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos
74217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	if (m_state == STATE_IN_USE)
75e68b30432e7ce124d6b52f4e9d4781abe4b9db40Pyry Haulos	{
76e68b30432e7ce124d6b52f4e9d4781abe4b9db40Pyry Haulos		// Reset buffer size and format back to initial state
77e68b30432e7ce124d6b52f4e9d4781abe4b9db40Pyry Haulos		ANativeWindow_setBuffersGeometry(m_window, 0, 0, 0);
78e68b30432e7ce124d6b52f4e9d4781abe4b9db40Pyry Haulos
79217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos		m_state = STATE_AVAILABLE;
80e68b30432e7ce124d6b52f4e9d4781abe4b9db40Pyry Haulos	}
81217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	else if (m_state == STATE_PENDING_DESTROY)
82217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos		m_state = STATE_READY_FOR_DESTROY;
83217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	else
841cc61b7d03cad727bbddd00cea8d78f4f6cc9047Jarkko Pöyry		DE_FATAL("Invalid window state");
85217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos}
86217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos
87217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulosvoid Window::markForDestroy (void)
88217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos{
89217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	de::ScopedLock lock(m_stateLock);
90217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos
91217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	if (m_state == STATE_AVAILABLE)
92217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos		m_state = STATE_READY_FOR_DESTROY;
93217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	else if (m_state == STATE_IN_USE)
94217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos		m_state = STATE_PENDING_DESTROY;
95217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	else
961cc61b7d03cad727bbddd00cea8d78f4f6cc9047Jarkko Pöyry		DE_FATAL("Invalid window state");
97217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos}
98217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos
99217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulosbool Window::isPendingDestroy (void) const
100217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos{
101217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	de::ScopedLock lock(m_stateLock);
102217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	return m_state == STATE_PENDING_DESTROY;
103217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos}
104217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos
105217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulosbool Window::tryAcquireForDestroy (bool onlyMarked)
106217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos{
107217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	de::ScopedLock lock(m_stateLock);
108217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos
109217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	if (m_state == STATE_READY_FOR_DESTROY ||
110217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos		(!onlyMarked && m_state == STATE_AVAILABLE))
111217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	{
112217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos		m_state = STATE_ACQUIRED_FOR_DESTROY;
113217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos		return true;
114217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	}
115217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	else
116217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos		return false;
117217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos}
118217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos
119217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos// WindowRegistry
120217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos
121217426c2d19d5247e094e363615d7a0b84daf3a7Pyry HaulosWindowRegistry::WindowRegistry (void)
122217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos{
123217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos}
124217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos
125217426c2d19d5247e094e363615d7a0b84daf3a7Pyry HaulosWindowRegistry::~WindowRegistry (void)
126217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos{
127217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	for (vector<Window*>::const_iterator winIter = m_windows.begin(); winIter != m_windows.end(); winIter++)
128217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	{
129217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos		Window* const window = *winIter;
130217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos
131217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos		if (window->tryAcquireForDestroy(false))
132217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos			delete window;
133217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos		else
134217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos		{
135217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos			print("ERROR: Window was not available for deletion, leaked tcu::Android::Window!\n");
1361cc61b7d03cad727bbddd00cea8d78f4f6cc9047Jarkko Pöyry			DE_FATAL("Window leaked");
137217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos		}
138217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	}
139217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos}
140217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos
141217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulosvoid WindowRegistry::addWindow (ANativeWindow* window)
142217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos{
143217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	m_windows.reserve(m_windows.size()+1);
144217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	m_windows.push_back(new Window(window));
145217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos}
146217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos
147217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulosvoid WindowRegistry::destroyWindow (ANativeWindow* rawHandle)
148217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos{
149217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	for (int ndx = 0; ndx < (int)m_windows.size(); ++ndx)
150217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	{
151217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos		Window* const window = m_windows[ndx];
152217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos
153217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos		if (window->getNativeWindow() == rawHandle)
154217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos		{
155217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos			if (window->tryAcquireForDestroy(false))
156217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos			{
157217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos				delete window;
158217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos				m_windows[ndx] = m_windows.back();
159217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos				m_windows.pop_back();
160217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos			}
161217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos			else
162217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos				window->markForDestroy();
163217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos
164217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos			return;
165217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos		}
166217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	}
167217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos
168217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	throw tcu::InternalError("Window not registered", DE_NULL, __FILE__, __LINE__);
169217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos}
170217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos
171217426c2d19d5247e094e363615d7a0b84daf3a7Pyry HaulosWindow* WindowRegistry::tryAcquireWindow (void)
172217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos{
173217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	for (int ndx = 0; ndx < (int)m_windows.size(); ++ndx)
174217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	{
175217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos		Window* const window = m_windows[ndx];
176217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos
177217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos		if (window->tryAcquire())
178217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos			return window;
179217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	}
180217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos
181217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	return DE_NULL;
182217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos}
183217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos
184217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulosvoid WindowRegistry::garbageCollect (void)
185217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos{
186217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	for (int ndx = 0; ndx < (int)m_windows.size(); ++ndx)
187217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	{
188217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos		Window* const window = m_windows[ndx];
189217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos
190217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos		if (window->tryAcquireForDestroy(true))
191217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos		{
192217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos			delete window;
193217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos			m_windows[ndx] = m_windows.back();
194217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos			m_windows.pop_back();
195217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos			ndx -= 1;
196217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos		}
197217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	}
198217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos}
199217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos
2003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // Android
2013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // tcu
202