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