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