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 EGL platform.
223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuAndroidPlatform.hpp"
254ca810727d8a06a57daf1cc9d0712284a858a40aPyry Haulos#include "tcuAndroidUtil.hpp"
263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluRenderContext.hpp"
273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "egluNativeDisplay.hpp"
283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "egluNativeWindow.hpp"
293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "egluGLContextFactory.hpp"
303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "egluUtil.hpp"
313c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos#include "eglwLibrary.hpp"
323c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos#include "eglwEnums.hpp"
33b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos#include "tcuFunctionLibrary.hpp"
3412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos#include "vkWsiPlatform.hpp"
353c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos
363c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos// Assume no call translation is needed
373c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos#include <android/native_window.h>
383c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulosstruct egl_native_pixmap_t;
393c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry HaulosDE_STATIC_ASSERT(sizeof(eglw::EGLNativeDisplayType) == sizeof(void*));
403c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry HaulosDE_STATIC_ASSERT(sizeof(eglw::EGLNativePixmapType) == sizeof(struct egl_native_pixmap_t*));
413c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry HaulosDE_STATIC_ASSERT(sizeof(eglw::EGLNativeWindowType) == sizeof(ANativeWindow*));
423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
433c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace tcu
443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
453c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace Android
463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
483c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulosusing namespace eglw;
493c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos
503c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic const eglu::NativeDisplay::Capability	DISPLAY_CAPABILITIES	= eglu::NativeDisplay::CAPABILITY_GET_DISPLAY_LEGACY;
513c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic const eglu::NativeWindow::Capability		WINDOW_CAPABILITIES		= (eglu::NativeWindow::Capability)(eglu::NativeWindow::CAPABILITY_CREATE_SURFACE_LEGACY |
523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry																										   eglu::NativeWindow::CAPABILITY_SET_SURFACE_SIZE |
533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry																										   eglu::NativeWindow::CAPABILITY_GET_SCREEN_SIZE);
543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
553c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass NativeDisplay : public eglu::NativeDisplay
563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
573c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
583c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos									NativeDisplay			(void) : eglu::NativeDisplay(DISPLAY_CAPABILITIES), m_library("libEGL.so") {}
593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual							~NativeDisplay			(void) {}
603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
613c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	virtual EGLNativeDisplayType	getLegacyNative			(void)			{ return EGL_DEFAULT_DISPLAY;	}
623c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	virtual const eglw::Library&	getLibrary				(void) const	{ return m_library;				}
633c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos
643c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulosprivate:
653c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	eglw::DefaultLibrary			m_library;
663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
683c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass NativeDisplayFactory : public eglu::NativeDisplayFactory
693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
703c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
71217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos									NativeDisplayFactory	(WindowRegistry& windowRegistry);
723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									~NativeDisplayFactory	(void) {}
733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual eglu::NativeDisplay*	createDisplay			(const EGLAttrib* attribList) const;
753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
773c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass NativeWindow : public eglu::NativeWindow
783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
793c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
80217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos									NativeWindow			(Window* window, int width, int height, int32_t format);
813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual							~NativeWindow			(void);
823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
83217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	virtual EGLNativeWindowType		getLegacyNative			(void)			{ return m_window->getNativeWindow();	}
84217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	IVec2							getScreenSize			(void) const	{ return m_window->getSize();			}
853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void							setSurfaceSize			(IVec2 size);
873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual void					processEvents			(void);
893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
903c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
91217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	Window*							m_window;
923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int32_t							m_format;
933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
953c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass NativeWindowFactory : public eglu::NativeWindowFactory
963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
973c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
98217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos									NativeWindowFactory		(WindowRegistry& windowRegistry);
993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									~NativeWindowFactory	(void);
1003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual eglu::NativeWindow*		createWindow			(eglu::NativeDisplay* nativeDisplay, const eglu::WindowParams& params) const;
1023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual eglu::NativeWindow*		createWindow			(eglu::NativeDisplay* nativeDisplay, EGLDisplay display, EGLConfig config, const EGLAttrib* attribList, const eglu::WindowParams& params) const;
1033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1043c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
105217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	virtual eglu::NativeWindow*		createWindow			(const eglu::WindowParams& params, int32_t format) const;
106217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos
107217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	WindowRegistry&					m_windowRegistry;
1083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
1093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// NativeWindow
1113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
112217426c2d19d5247e094e363615d7a0b84daf3a7Pyry HaulosNativeWindow::NativeWindow (Window* window, int width, int height, int32_t format)
1133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: eglu::NativeWindow	(WINDOW_CAPABILITIES)
1143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_window				(window)
1153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_format				(format)
1163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Set up buffers.
1183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	setSurfaceSize(IVec2(width, height));
1193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1213c827367444ee418f129b2c238299f49d3264554Jarkko PoyryNativeWindow::~NativeWindow (void)
1223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
123217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	m_window->release();
1243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1263c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid NativeWindow::processEvents (void)
1273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
128217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	if (m_window->isPendingDestroy())
129217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos		throw eglu::WindowDestroyedError("Window has been destroyed");
1303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1323c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid NativeWindow::setSurfaceSize (tcu::IVec2 size)
1333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
134217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	m_window->setBuffersGeometry(size.x() != eglu::WindowParams::SIZE_DONT_CARE ? size.x() : 0,
135217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos								 size.y() != eglu::WindowParams::SIZE_DONT_CARE ? size.y() : 0,
136217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos								 m_format);
1373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// NativeWindowFactory
1403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
141217426c2d19d5247e094e363615d7a0b84daf3a7Pyry HaulosNativeWindowFactory::NativeWindowFactory (WindowRegistry& windowRegistry)
1423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: eglu::NativeWindowFactory	("default", "Default display", WINDOW_CAPABILITIES)
143217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	, m_windowRegistry			(windowRegistry)
1443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1473c827367444ee418f129b2c238299f49d3264554Jarkko PoyryNativeWindowFactory::~NativeWindowFactory (void)
1483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1513c827367444ee418f129b2c238299f49d3264554Jarkko Poyryeglu::NativeWindow* NativeWindowFactory::createWindow (eglu::NativeDisplay* nativeDisplay, const eglu::WindowParams& params) const
1523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_UNREF(nativeDisplay);
154217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	return createWindow(params, WINDOW_FORMAT_RGBA_8888);
1553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1573c827367444ee418f129b2c238299f49d3264554Jarkko Poyryeglu::NativeWindow* NativeWindowFactory::createWindow (eglu::NativeDisplay* nativeDisplay, EGLDisplay display, EGLConfig config, const EGLAttrib* attribList, const eglu::WindowParams& params) const
1583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1593c67e4f0ec73f9c30c6b2ed2adfbfe7faaf576a4Pyry Haulos	const int32_t format = (int32_t)eglu::getConfigAttribInt(nativeDisplay->getLibrary(), display, config, EGL_NATIVE_VISUAL_ID);
1603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_UNREF(nativeDisplay && attribList);
161217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	return createWindow(params, format);
162217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos}
163217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos
164217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Hauloseglu::NativeWindow* NativeWindowFactory::createWindow (const eglu::WindowParams& params, int32_t format) const
165217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos{
166217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	Window* window = m_windowRegistry.tryAcquireWindow();
167217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos
168217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	if (!window)
169217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos		throw ResourceError("Native window is not available", DE_NULL, __FILE__, __LINE__);
170217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos
171217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	return new NativeWindow(window, params.width, params.height, format);
1723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// NativeDisplayFactory
1753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
176217426c2d19d5247e094e363615d7a0b84daf3a7Pyry HaulosNativeDisplayFactory::NativeDisplayFactory (WindowRegistry& windowRegistry)
1773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: eglu::NativeDisplayFactory("default", "Default display", DISPLAY_CAPABILITIES)
1783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
179217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	m_nativeWindowRegistry.registerFactory(new NativeWindowFactory(windowRegistry));
1803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1823c827367444ee418f129b2c238299f49d3264554Jarkko Poyryeglu::NativeDisplay* NativeDisplayFactory::createDisplay (const EGLAttrib* attribList) const
1833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_UNREF(attribList);
1853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return new NativeDisplay();
1863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
18823c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos// Vulkan
18923c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos
19023c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulosclass VulkanLibrary : public vk::Library
19123c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos{
19223c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulospublic:
19323c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos	VulkanLibrary (void)
19423c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos		: m_library	("libvulkan.so")
195b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos		, m_driver	(m_library)
19623c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos	{
19723c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos	}
19823c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos
19923c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos	const vk::PlatformInterface& getPlatformInterface (void) const
20023c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos	{
20123c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos		return m_driver;
20223c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos	}
20323c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos
20423c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulosprivate:
205b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos	const tcu::DynamicFunctionLibrary	m_library;
206b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos	const vk::PlatformDriver			m_driver;
20723c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos};
20823c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos
20912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry HaulosDE_STATIC_ASSERT(sizeof(vk::pt::AndroidNativeWindowPtr) == sizeof(ANativeWindow*));
21012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
21112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulosclass VulkanWindow : public vk::wsi::AndroidWindowInterface
21212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos{
21312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulospublic:
21412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	VulkanWindow (tcu::Android::Window& window)
21512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		: vk::wsi::AndroidWindowInterface	(vk::pt::AndroidNativeWindowPtr(window.getNativeWindow()))
21612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		, m_window							(window)
21712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	{
21812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	}
21912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
22012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	~VulkanWindow (void)
22112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	{
22212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		m_window.release();
22312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	}
22412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
22512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulosprivate:
22612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	tcu::Android::Window&	m_window;
22712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos};
22812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
22912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulosclass VulkanDisplay : public vk::wsi::Display
23012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos{
23112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulospublic:
23212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	VulkanDisplay (WindowRegistry& windowRegistry)
23312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		: m_windowRegistry(windowRegistry)
23412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	{
23512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	}
23612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
23712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	vk::wsi::Window* createWindow (const Maybe<UVec2>& initialSize) const
23812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	{
23912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		Window* const	window	= m_windowRegistry.tryAcquireWindow();
24012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
24112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		if (window)
24212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		{
24312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			try
24412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			{
24512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				if (initialSize)
24612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos					window->setBuffersGeometry((int)initialSize->x(), (int)initialSize->y(), WINDOW_FORMAT_RGBA_8888);
24712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
24812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				return new VulkanWindow(*window);
24912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			}
25012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			catch (...)
25112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			{
25212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				window->release();
25312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos				throw;
25412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			}
25512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		}
25612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		else
25712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos			TCU_THROW(ResourceError, "Native window is not available");
25812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	}
25912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
26012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulosprivate:
26112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	WindowRegistry&		m_windowRegistry;
26212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos};
26312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
264d6df5d1ee6495b60d5452ec035408fcd67c7d291Pyry Haulosstatic size_t getTotalSystemMemory (ANativeActivity* activity)
265d6df5d1ee6495b60d5452ec035408fcd67c7d291Pyry Haulos{
266d6df5d1ee6495b60d5452ec035408fcd67c7d291Pyry Haulos	const size_t	MiB		= (size_t)(1<<20);
267d6df5d1ee6495b60d5452ec035408fcd67c7d291Pyry Haulos
268d6df5d1ee6495b60d5452ec035408fcd67c7d291Pyry Haulos	try
269d6df5d1ee6495b60d5452ec035408fcd67c7d291Pyry Haulos	{
270d6df5d1ee6495b60d5452ec035408fcd67c7d291Pyry Haulos		const size_t	cddRequiredSize	= getCDDRequiredSystemMemory(activity);
271d6df5d1ee6495b60d5452ec035408fcd67c7d291Pyry Haulos
272d6df5d1ee6495b60d5452ec035408fcd67c7d291Pyry Haulos		print("Device has at least %.2f MiB total system memory per Android CDD\n", double(cddRequiredSize) / double(MiB));
273d6df5d1ee6495b60d5452ec035408fcd67c7d291Pyry Haulos
274d6df5d1ee6495b60d5452ec035408fcd67c7d291Pyry Haulos		return cddRequiredSize;
275d6df5d1ee6495b60d5452ec035408fcd67c7d291Pyry Haulos	}
276d6df5d1ee6495b60d5452ec035408fcd67c7d291Pyry Haulos	catch (const std::exception& e)
277d6df5d1ee6495b60d5452ec035408fcd67c7d291Pyry Haulos	{
278d6df5d1ee6495b60d5452ec035408fcd67c7d291Pyry Haulos		// Use relatively high fallback size to encourage CDD-compliant behavior
279d6df5d1ee6495b60d5452ec035408fcd67c7d291Pyry Haulos		const size_t	fallbackSize	= (sizeof(void*) == sizeof(deUint64)) ? 2048*MiB : 1024*MiB;
280d6df5d1ee6495b60d5452ec035408fcd67c7d291Pyry Haulos
281d6df5d1ee6495b60d5452ec035408fcd67c7d291Pyry Haulos		print("WARNING: Failed to determine system memory size required by CDD: %s\n", e.what());
282d6df5d1ee6495b60d5452ec035408fcd67c7d291Pyry Haulos		print("WARNING: Using fall-back size of %.2f MiB\n", double(fallbackSize) / double(MiB));
283d6df5d1ee6495b60d5452ec035408fcd67c7d291Pyry Haulos
284d6df5d1ee6495b60d5452ec035408fcd67c7d291Pyry Haulos		return fallbackSize;
285d6df5d1ee6495b60d5452ec035408fcd67c7d291Pyry Haulos	}
286d6df5d1ee6495b60d5452ec035408fcd67c7d291Pyry Haulos}
287d6df5d1ee6495b60d5452ec035408fcd67c7d291Pyry Haulos
2883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// Platform
2893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2904ca810727d8a06a57daf1cc9d0712284a858a40aPyry HaulosPlatform::Platform (NativeActivity& activity)
291d6df5d1ee6495b60d5452ec035408fcd67c7d291Pyry Haulos	: m_activity			(activity)
292d6df5d1ee6495b60d5452ec035408fcd67c7d291Pyry Haulos	, m_totalSystemMemory	(getTotalSystemMemory(activity.getNativeActivity()))
2933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
294217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	m_nativeDisplayFactoryRegistry.registerFactory(new NativeDisplayFactory(m_windowRegistry));
2953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_contextFactoryRegistry.registerFactory(new eglu::GLContextFactory(m_nativeDisplayFactoryRegistry));
2963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2983c827367444ee418f129b2c238299f49d3264554Jarkko PoyryPlatform::~Platform (void)
2993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
302217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulosbool Platform::processEvents (void)
303217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos{
304217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	m_windowRegistry.garbageCollect();
305217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos	return true;
306217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos}
307217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos
30823c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulosvk::Library* Platform::createLibrary (void) const
30923c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos{
31023c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos	return new VulkanLibrary();
31123c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos}
31223c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos
3134ca810727d8a06a57daf1cc9d0712284a858a40aPyry Haulosvoid Platform::describePlatform (std::ostream& dst) const
3144ca810727d8a06a57daf1cc9d0712284a858a40aPyry Haulos{
3154ca810727d8a06a57daf1cc9d0712284a858a40aPyry Haulos	tcu::Android::describePlatform(m_activity.getNativeActivity(), dst);
3164ca810727d8a06a57daf1cc9d0712284a858a40aPyry Haulos}
3174ca810727d8a06a57daf1cc9d0712284a858a40aPyry Haulos
318e1faf7ce1c23b714b474a4662a43b03fd87671f1Pyry Haulosvoid Platform::getMemoryLimits (vk::PlatformMemoryLimits& limits) const
319e1faf7ce1c23b714b474a4662a43b03fd87671f1Pyry Haulos{
320d6df5d1ee6495b60d5452ec035408fcd67c7d291Pyry Haulos	// Worst-case estimates
321d6df5d1ee6495b60d5452ec035408fcd67c7d291Pyry Haulos	const size_t	MiB				= (size_t)(1<<20);
322d6df5d1ee6495b60d5452ec035408fcd67c7d291Pyry Haulos	const size_t	baseMemUsage	= 400*MiB;
323d6df5d1ee6495b60d5452ec035408fcd67c7d291Pyry Haulos	const double	safeUsageRatio	= 0.25;
324d6df5d1ee6495b60d5452ec035408fcd67c7d291Pyry Haulos
325d6df5d1ee6495b60d5452ec035408fcd67c7d291Pyry Haulos	limits.totalSystemMemory					= de::max((size_t)(double(deInt64(m_totalSystemMemory)-deInt64(baseMemUsage)) * safeUsageRatio), 16*MiB);
326d6df5d1ee6495b60d5452ec035408fcd67c7d291Pyry Haulos
327d6df5d1ee6495b60d5452ec035408fcd67c7d291Pyry Haulos	// Assume UMA architecture
328e1faf7ce1c23b714b474a4662a43b03fd87671f1Pyry Haulos	limits.totalDeviceLocalMemory				= 0;
329d6df5d1ee6495b60d5452ec035408fcd67c7d291Pyry Haulos
330d6df5d1ee6495b60d5452ec035408fcd67c7d291Pyry Haulos	// Reasonable worst-case estimates
331e1faf7ce1c23b714b474a4662a43b03fd87671f1Pyry Haulos	limits.deviceMemoryAllocationGranularity	= 64*1024;
332e1faf7ce1c23b714b474a4662a43b03fd87671f1Pyry Haulos	limits.devicePageSize						= 4096;
333e1faf7ce1c23b714b474a4662a43b03fd87671f1Pyry Haulos	limits.devicePageTableEntrySize				= 8;
334e1faf7ce1c23b714b474a4662a43b03fd87671f1Pyry Haulos	limits.devicePageTableHierarchyLevels		= 3;
335e1faf7ce1c23b714b474a4662a43b03fd87671f1Pyry Haulos}
336e1faf7ce1c23b714b474a4662a43b03fd87671f1Pyry Haulos
33712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulosvk::wsi::Display* Platform::createWsiDisplay (vk::wsi::Type wsiType) const
33812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos{
33912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	if (wsiType == vk::wsi::TYPE_ANDROID)
34012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		return new VulkanDisplay(const_cast<WindowRegistry&>(m_windowRegistry));
34112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos	else
34212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos		TCU_THROW(NotSupportedError, "WSI type not supported on Android");
34312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos}
34412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos
3453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // Android
3463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // tcu
347