13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#ifndef _TCUANDROIDRENDERACTIVITY_HPP 23c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define _TCUANDROIDRENDERACTIVITY_HPP 33c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*------------------------------------------------------------------------- 43c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * drawElements Quality Program Tester Core 53c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * ---------------------------------------- 63c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 73c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Copyright 2014 The Android Open Source Project 83c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 93c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Licensed under the Apache License, Version 2.0 (the "License"); 103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * you may not use this file except in compliance with the License. 113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * You may obtain a copy of the License at 123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * http://www.apache.org/licenses/LICENSE-2.0 143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Unless required by applicable law or agreed to in writing, software 163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * distributed under the License is distributed on an "AS IS" BASIS, 173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * See the License for the specific language governing permissions and 193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * limitations under the License. 203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*! 223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \file 233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief RenderActivity base class. 243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/ 253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuDefs.hpp" 273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuAndroidNativeActivity.hpp" 283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deThread.hpp" 293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deThreadSafeRingBuffer.hpp" 303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 313c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace tcu 323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 333c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace Android 343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 363c827367444ee418f129b2c238299f49d3264554Jarkko Poyryenum MessageType 373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Execution control messages. No data argument. 393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry MESSAGE_RESUME = 0, 403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry MESSAGE_PAUSE, 413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry MESSAGE_FINISH, 423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Window messages. Argument is ANativeWindow pointer. 443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry MESSAGE_WINDOW_CREATED, 453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry MESSAGE_WINDOW_RESIZED, 463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry MESSAGE_WINDOW_DESTROYED, 473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Input queue messages. Argument is AInputQueue pointer. 493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry MESSAGE_INPUT_QUEUE_CREATED, 503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry MESSAGE_INPUT_QUEUE_DESTROYED, 513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry MESSAGE_SYNC, //!< Main thread requests sync. Data argument is de::Semaphore* that needs to be incremented. 533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry MESSAGETYPE_LAST 553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 573c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystruct Message 583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 5967e56c9a76571b87c58a174bdad44fa1425d40fePyry Haulos MessageType type; //!< Message type. 6067e56c9a76571b87c58a174bdad44fa1425d40fePyry Haulos union 6167e56c9a76571b87c58a174bdad44fa1425d40fePyry Haulos { 6267e56c9a76571b87c58a174bdad44fa1425d40fePyry Haulos ANativeWindow* window; 6367e56c9a76571b87c58a174bdad44fa1425d40fePyry Haulos AInputQueue* inputQueue; 6467e56c9a76571b87c58a174bdad44fa1425d40fePyry Haulos de::Semaphore* semaphore; 6567e56c9a76571b87c58a174bdad44fa1425d40fePyry Haulos } payload; //!< Optional data argument. 663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Message (void) 6867e56c9a76571b87c58a174bdad44fa1425d40fePyry Haulos : type(MESSAGETYPE_LAST) 6967e56c9a76571b87c58a174bdad44fa1425d40fePyry Haulos { 7067e56c9a76571b87c58a174bdad44fa1425d40fePyry Haulos } 7167e56c9a76571b87c58a174bdad44fa1425d40fePyry Haulos 7267e56c9a76571b87c58a174bdad44fa1425d40fePyry Haulos explicit Message (MessageType type_) 7367e56c9a76571b87c58a174bdad44fa1425d40fePyry Haulos : type(type_) 7467e56c9a76571b87c58a174bdad44fa1425d40fePyry Haulos { 7567e56c9a76571b87c58a174bdad44fa1425d40fePyry Haulos DE_ASSERT(type_ == MESSAGE_RESUME || 7667e56c9a76571b87c58a174bdad44fa1425d40fePyry Haulos type_ == MESSAGE_PAUSE || 7767e56c9a76571b87c58a174bdad44fa1425d40fePyry Haulos type_ == MESSAGE_FINISH); 7867e56c9a76571b87c58a174bdad44fa1425d40fePyry Haulos } 7967e56c9a76571b87c58a174bdad44fa1425d40fePyry Haulos 8067e56c9a76571b87c58a174bdad44fa1425d40fePyry Haulos Message (MessageType type_, ANativeWindow* window) 8167e56c9a76571b87c58a174bdad44fa1425d40fePyry Haulos : type(type_) 8267e56c9a76571b87c58a174bdad44fa1425d40fePyry Haulos { 8367e56c9a76571b87c58a174bdad44fa1425d40fePyry Haulos DE_ASSERT(type_ == MESSAGE_WINDOW_CREATED || 8467e56c9a76571b87c58a174bdad44fa1425d40fePyry Haulos type_ == MESSAGE_WINDOW_DESTROYED || 8567e56c9a76571b87c58a174bdad44fa1425d40fePyry Haulos type_ == MESSAGE_WINDOW_RESIZED); 8667e56c9a76571b87c58a174bdad44fa1425d40fePyry Haulos DE_ASSERT(window); 8767e56c9a76571b87c58a174bdad44fa1425d40fePyry Haulos payload.window = window; 8867e56c9a76571b87c58a174bdad44fa1425d40fePyry Haulos } 8967e56c9a76571b87c58a174bdad44fa1425d40fePyry Haulos 9067e56c9a76571b87c58a174bdad44fa1425d40fePyry Haulos Message (MessageType type_, AInputQueue* inputQueue) 9167e56c9a76571b87c58a174bdad44fa1425d40fePyry Haulos : type(type_) 923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 9367e56c9a76571b87c58a174bdad44fa1425d40fePyry Haulos DE_ASSERT(type_ == MESSAGE_INPUT_QUEUE_CREATED || 9467e56c9a76571b87c58a174bdad44fa1425d40fePyry Haulos type_ == MESSAGE_INPUT_QUEUE_DESTROYED); 9567e56c9a76571b87c58a174bdad44fa1425d40fePyry Haulos DE_ASSERT(inputQueue); 9667e56c9a76571b87c58a174bdad44fa1425d40fePyry Haulos payload.inputQueue = inputQueue; 973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 9967e56c9a76571b87c58a174bdad44fa1425d40fePyry Haulos Message (MessageType type_, de::Semaphore* semaphore) 10067e56c9a76571b87c58a174bdad44fa1425d40fePyry Haulos : type(type_) 1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 10267e56c9a76571b87c58a174bdad44fa1425d40fePyry Haulos DE_ASSERT(type_ == MESSAGE_SYNC); 10367e56c9a76571b87c58a174bdad44fa1425d40fePyry Haulos DE_ASSERT(semaphore); 10467e56c9a76571b87c58a174bdad44fa1425d40fePyry Haulos payload.semaphore = semaphore; 1053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 1063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 1073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1083c827367444ee418f129b2c238299f49d3264554Jarkko Poyryenum WindowState 1093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry WINDOWSTATE_NOT_CREATED = 0, //!< Framework hasn't signaled window creation. 1113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry WINDOWSTATE_NOT_INITIALIZED, //!< Framework hasn't signaled first resize after creation and thus size is not final. 1123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry WINDOWSTATE_READY, //!< Window is ready for use. 1133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry WINDOWSTATE_DESTROYED, //!< Window has been destroyed. 1143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry WINDOWSTATE_LAST 1163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 1173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1183c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytypedef de::ThreadSafeRingBuffer<Message> MessageQueue; 1193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1203c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass RenderThread : private de::Thread 1213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1223c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic: 1233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry RenderThread (NativeActivity& activity); 1243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ~RenderThread (void); 1253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void start (void); 1273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void resume (void); 1283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void pause (void); 129217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos void stop (void); 130217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos 1313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void enqueue (const Message& message); 1323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void sync (void); 1333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void run (void); 1353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1363c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprotected: 1373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry virtual void onInputEvent (AInputEvent* event) { DE_UNREF(event); } 1383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry virtual void onWindowCreated (ANativeWindow* window) = 0; 1393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry virtual void onWindowResized (ANativeWindow* window) = 0; 1403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry virtual void onWindowDestroyed (ANativeWindow* window) = 0; 1413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry virtual bool render (void) = 0; 1423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry NativeActivity& getNativeActivity (void) { return m_activity; } 1443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1453c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate: 1463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void processMessage (const Message& message); 1473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Shared state. 1493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry NativeActivity& m_activity; 1503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry MessageQueue m_msgQueue; 1513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Parent thread state. 1533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry bool m_threadRunning; 1543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Thread state. 1563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry AInputQueue* m_inputQueue; 1573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry WindowState m_windowState; 1583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ANativeWindow* m_window; 1593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry bool m_paused; //!< Is rendering paused? 1603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry bool m_finish; //!< Has thread received FINISH message? 1613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 1623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1633c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass RenderActivity : public NativeActivity 1643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1653c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic: 1663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry RenderActivity (ANativeActivity* activity); 1673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry virtual ~RenderActivity (void); 1683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry virtual void onStart (void); 1703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry virtual void onResume (void); 1713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry virtual void onPause (void); 1723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry virtual void onStop (void); 1733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry virtual void onDestroy (void); 1743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry virtual void onNativeWindowCreated (ANativeWindow* window); 1763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry virtual void onNativeWindowResized (ANativeWindow* window); 1773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry virtual void onNativeWindowRedrawNeeded (ANativeWindow* window); 1783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry virtual void onNativeWindowDestroyed (ANativeWindow* window); 1793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry virtual void onInputQueueCreated (AInputQueue* queue); 1813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry virtual void onInputQueueDestroyed (AInputQueue* queue); 1823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1833c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprotected: 1843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry //! Set rendering thread. Must be called at construction time. 1853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void setThread (RenderThread* thread); 1863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1873c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate: 1883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry RenderActivity (const RenderActivity& other); 1893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry RenderActivity& operator= (const RenderActivity& other); 1903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry RenderThread* m_thread; 1923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 1933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // Android 1953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // tcu 1963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#endif // _TCUANDROIDRENDERACTIVITY_HPP 198