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