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" 253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluRenderContext.hpp" 263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "egluNativeDisplay.hpp" 273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "egluNativeWindow.hpp" 283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "egluGLContextFactory.hpp" 293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "egluUtil.hpp" 303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 313c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace tcu 323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 333c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace Android 343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 363c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic const eglu::NativeDisplay::Capability DISPLAY_CAPABILITIES = eglu::NativeDisplay::CAPABILITY_GET_DISPLAY_LEGACY; 373c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic const eglu::NativeWindow::Capability WINDOW_CAPABILITIES = (eglu::NativeWindow::Capability)(eglu::NativeWindow::CAPABILITY_CREATE_SURFACE_LEGACY | 383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry eglu::NativeWindow::CAPABILITY_SET_SURFACE_SIZE | 393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry eglu::NativeWindow::CAPABILITY_GET_SCREEN_SIZE); 403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 413c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass NativeDisplay : public eglu::NativeDisplay 423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 433c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic: 443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry NativeDisplay (void) : eglu::NativeDisplay(DISPLAY_CAPABILITIES) {} 453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry virtual ~NativeDisplay (void) {} 463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry virtual EGLNativeDisplayType getLegacyNative (void) { return EGL_DEFAULT_DISPLAY; } 483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 503c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass NativeDisplayFactory : public eglu::NativeDisplayFactory 513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 523c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic: 53217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos NativeDisplayFactory (WindowRegistry& windowRegistry); 543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ~NativeDisplayFactory (void) {} 553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry virtual eglu::NativeDisplay* createDisplay (const EGLAttrib* attribList) const; 573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 593c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass NativeWindow : public eglu::NativeWindow 603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 613c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic: 62217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos NativeWindow (Window* window, int width, int height, int32_t format); 633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry virtual ~NativeWindow (void); 643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 65217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos virtual EGLNativeWindowType getLegacyNative (void) { return m_window->getNativeWindow(); } 66217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos IVec2 getScreenSize (void) const { return m_window->getSize(); } 673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void setSurfaceSize (IVec2 size); 693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry virtual void processEvents (void); 713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 723c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate: 73217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos Window* m_window; 743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int32_t m_format; 753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 773c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass NativeWindowFactory : public eglu::NativeWindowFactory 783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 793c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic: 80217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos NativeWindowFactory (WindowRegistry& windowRegistry); 813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ~NativeWindowFactory (void); 823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry virtual eglu::NativeWindow* createWindow (eglu::NativeDisplay* nativeDisplay, const eglu::WindowParams& params) const; 843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry virtual eglu::NativeWindow* createWindow (eglu::NativeDisplay* nativeDisplay, EGLDisplay display, EGLConfig config, const EGLAttrib* attribList, const eglu::WindowParams& params) const; 853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 863c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate: 87217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos virtual eglu::NativeWindow* createWindow (const eglu::WindowParams& params, int32_t format) const; 88217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos 89217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos WindowRegistry& m_windowRegistry; 903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// NativeWindow 933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 94217426c2d19d5247e094e363615d7a0b84daf3a7Pyry HaulosNativeWindow::NativeWindow (Window* window, int width, int height, int32_t format) 953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry : eglu::NativeWindow (WINDOW_CAPABILITIES) 963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_window (window) 973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_format (format) 983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Set up buffers. 1003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setSurfaceSize(IVec2(width, height)); 1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1033c827367444ee418f129b2c238299f49d3264554Jarkko PoyryNativeWindow::~NativeWindow (void) 1043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 105217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos m_window->release(); 1063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1083c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid NativeWindow::processEvents (void) 1093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 110217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos if (m_window->isPendingDestroy()) 111217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos throw eglu::WindowDestroyedError("Window has been destroyed"); 1123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1143c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid NativeWindow::setSurfaceSize (tcu::IVec2 size) 1153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 116217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos m_window->setBuffersGeometry(size.x() != eglu::WindowParams::SIZE_DONT_CARE ? size.x() : 0, 117217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos size.y() != eglu::WindowParams::SIZE_DONT_CARE ? size.y() : 0, 118217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos m_format); 1193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// NativeWindowFactory 1223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 123217426c2d19d5247e094e363615d7a0b84daf3a7Pyry HaulosNativeWindowFactory::NativeWindowFactory (WindowRegistry& windowRegistry) 1243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry : eglu::NativeWindowFactory ("default", "Default display", WINDOW_CAPABILITIES) 125217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos , m_windowRegistry (windowRegistry) 1263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1293c827367444ee418f129b2c238299f49d3264554Jarkko PoyryNativeWindowFactory::~NativeWindowFactory (void) 1303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1333c827367444ee418f129b2c238299f49d3264554Jarkko Poyryeglu::NativeWindow* NativeWindowFactory::createWindow (eglu::NativeDisplay* nativeDisplay, const eglu::WindowParams& params) const 1343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_UNREF(nativeDisplay); 136217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos return createWindow(params, WINDOW_FORMAT_RGBA_8888); 1373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1393c827367444ee418f129b2c238299f49d3264554Jarkko Poyryeglu::NativeWindow* NativeWindowFactory::createWindow (eglu::NativeDisplay* nativeDisplay, EGLDisplay display, EGLConfig config, const EGLAttrib* attribList, const eglu::WindowParams& params) const 1403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const int32_t format = (int32_t)eglu::getConfigAttribInt(display, config, EGL_NATIVE_VISUAL_ID); 1423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_UNREF(nativeDisplay && attribList); 143217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos return createWindow(params, format); 144217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos} 145217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos 146217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos 147217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Hauloseglu::NativeWindow* NativeWindowFactory::createWindow (const eglu::WindowParams& params, int32_t format) const 148217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos{ 149217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos Window* window = m_windowRegistry.tryAcquireWindow(); 150217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos 151217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos if (!window) 152217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos throw ResourceError("Native window is not available", DE_NULL, __FILE__, __LINE__); 153217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos 154217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos return new NativeWindow(window, params.width, params.height, format); 1553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// NativeDisplayFactory 1583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 159217426c2d19d5247e094e363615d7a0b84daf3a7Pyry HaulosNativeDisplayFactory::NativeDisplayFactory (WindowRegistry& windowRegistry) 1603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry : eglu::NativeDisplayFactory("default", "Default display", DISPLAY_CAPABILITIES) 1613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 162217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos m_nativeWindowRegistry.registerFactory(new NativeWindowFactory(windowRegistry)); 1633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1653c827367444ee418f129b2c238299f49d3264554Jarkko Poyryeglu::NativeDisplay* NativeDisplayFactory::createDisplay (const EGLAttrib* attribList) const 1663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_UNREF(attribList); 1683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return new NativeDisplay(); 1693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// Platform 1723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 173217426c2d19d5247e094e363615d7a0b84daf3a7Pyry HaulosPlatform::Platform (void) 1743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 175217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos m_nativeDisplayFactoryRegistry.registerFactory(new NativeDisplayFactory(m_windowRegistry)); 1763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_contextFactoryRegistry.registerFactory(new eglu::GLContextFactory(m_nativeDisplayFactoryRegistry)); 1773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1793c827367444ee418f129b2c238299f49d3264554Jarkko PoyryPlatform::~Platform (void) 1803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 183217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulosbool Platform::processEvents (void) 184217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos{ 185217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos m_windowRegistry.garbageCollect(); 186217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos return true; 187217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos} 188217426c2d19d5247e094e363615d7a0b84daf3a7Pyry Haulos 1893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // Android 1903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // tcu 191