1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// found in the LICENSE file. 4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/ozone/platform/egltest/ozone_platform_egltest.h" 6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/bind.h" 8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/command_line.h" 9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/environment.h" 10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/files/file_path.h" 11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/path_service.h" 12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "library_loaders/libeglplatform_shim.h" 135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "third_party/khronos/EGL/egl.h" 14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/events/ozone/device/device_manager.h" 15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/events/ozone/evdev/event_factory_evdev.h" 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/events/ozone/events_ozone.h" 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/events/platform/platform_event_dispatcher.h" 18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/gfx/vsync_provider.h" 196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "ui/ozone/public/cursor_factory_ozone.h" 206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "ui/ozone/public/gpu_platform_support.h" 216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "ui/ozone/public/gpu_platform_support_host.h" 22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/ozone/public/ozone_platform.h" 23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/ozone/public/ozone_switches.h" 24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/ozone/public/surface_factory_ozone.h" 256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "ui/ozone/public/surface_ozone_egl.h" 26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/platform_window/platform_window.h" 27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/platform_window/platform_window_delegate.h" 28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(OS_CHROMEOS) 30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/ozone/common/chromeos/native_display_delegate_ozone.h" 31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif 32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace ui { 34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace { 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kEglplatformShim[] = "EGLPLATFORM_SHIM"; 38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kEglplatformShimDefault[] = "libeglplatform_shim.so.1"; 39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kDefaultEglSoname[] = "libEGL.so.1"; 40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kDefaultGlesSoname[] = "libGLESv2.so.2"; 41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Get the library soname to load. 43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)std::string GetShimLibraryName() { 44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string library; 45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<base::Environment> env(base::Environment::Create()); 46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (env->GetVar(kEglplatformShim, &library)) 47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return library; 48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return kEglplatformShimDefault; 49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 51116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass EgltestWindow : public PlatformWindow, public PlatformEventDispatcher { 52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public: 53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EgltestWindow(PlatformWindowDelegate* delegate, 54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch LibeglplatformShimLoader* eglplatform_shim, 5503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EventFactoryEvdev* event_factory, 56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const gfx::Rect& bounds); 57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual ~EgltestWindow(); 58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // PlatformWindow: 60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual gfx::Rect GetBounds() OVERRIDE; 61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void SetBounds(const gfx::Rect& bounds) OVERRIDE; 62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void Show() OVERRIDE; 63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void Hide() OVERRIDE; 64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void Close() OVERRIDE; 65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void SetCapture() OVERRIDE; 66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void ReleaseCapture() OVERRIDE; 67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void ToggleFullscreen() OVERRIDE; 68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void Maximize() OVERRIDE; 69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void Minimize() OVERRIDE; 70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void Restore() OVERRIDE; 715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void SetCursor(PlatformCursor cursor) OVERRIDE; 725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void MoveCursorTo(const gfx::Point& location) OVERRIDE; 73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // PlatformEventDispatcher: 75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual bool CanDispatchEvent(const PlatformEvent& event) OVERRIDE; 76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual uint32_t DispatchEvent(const PlatformEvent& event) OVERRIDE; 77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private: 79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch PlatformWindowDelegate* delegate_; 80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch LibeglplatformShimLoader* eglplatform_shim_; 8103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EventFactoryEvdev* event_factory_; 82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch gfx::Rect bounds_; 83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ShimNativeWindowId window_id_; 84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DISALLOW_COPY_AND_ASSIGN(EgltestWindow); 86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}; 87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 88116680a4aac90f2aa7413d9095a592090648e557Ben MurdochEgltestWindow::EgltestWindow(PlatformWindowDelegate* delegate, 89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch LibeglplatformShimLoader* eglplatform_shim, 9003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EventFactoryEvdev* event_factory, 91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const gfx::Rect& bounds) 92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : delegate_(delegate), 93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch eglplatform_shim_(eglplatform_shim), 9403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) event_factory_(event_factory), 95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bounds_(bounds), 96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch window_id_(SHIM_NO_WINDOW_ID) { 97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch window_id_ = eglplatform_shim_->ShimCreateWindow(); 98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch delegate_->OnAcceleratedWidgetAvailable(window_id_); 99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::PlatformEventSource::GetInstance()->AddPlatformEventDispatcher(this); 100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 102116680a4aac90f2aa7413d9095a592090648e557Ben MurdochEgltestWindow::~EgltestWindow() { 103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::PlatformEventSource::GetInstance()->RemovePlatformEventDispatcher(this); 104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (window_id_ != SHIM_NO_WINDOW_ID) 105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch eglplatform_shim_->ShimDestroyWindow(window_id_); 106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 108116680a4aac90f2aa7413d9095a592090648e557Ben Murdochgfx::Rect EgltestWindow::GetBounds() { 109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return bounds_; 110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 112116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EgltestWindow::SetBounds(const gfx::Rect& bounds) { 113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bounds_ = bounds; 114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch delegate_->OnBoundsChanged(bounds); 115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 117116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EgltestWindow::Show() { 118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 120116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EgltestWindow::Hide() { 121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 123116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EgltestWindow::Close() { 124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 126116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EgltestWindow::SetCapture() { 127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 129116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EgltestWindow::ReleaseCapture() { 130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 132116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EgltestWindow::ToggleFullscreen() { 133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 135116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EgltestWindow::Maximize() { 136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 138116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EgltestWindow::Minimize() { 139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 141116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EgltestWindow::Restore() { 142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void EgltestWindow::SetCursor(PlatformCursor cursor) { 1455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void EgltestWindow::MoveCursorTo(const gfx::Point& location) { 14803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) event_factory_->WarpCursorTo(window_id_, location); 1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 151116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool EgltestWindow::CanDispatchEvent(const ui::PlatformEvent& ne) { 152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return true; 153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciuint32_t EgltestWindow::DispatchEvent(const ui::PlatformEvent& native_event) { 1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DispatchEventFromNativeUiEvent( 1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci native_event, 1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Bind(&PlatformWindowDelegate::DispatchEvent, 1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Unretained(delegate_))); 1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return ui::POST_DISPATCH_STOP_PROPAGATION; 162116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// EGL surface wrapper for libeglplatform_shim. 165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// 166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// This just manages the native window lifetime using 167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// ShimGetNativeWindow & ShimReleaseNativeWindow. 1686d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)class SurfaceOzoneEgltest : public SurfaceOzoneEGL { 169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public: 170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SurfaceOzoneEgltest(ShimNativeWindowId window_id, 171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) LibeglplatformShimLoader* eglplatform_shim) 172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) : eglplatform_shim_(eglplatform_shim) { 173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) native_window_ = eglplatform_shim_->ShimGetNativeWindow(window_id); 174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual ~SurfaceOzoneEgltest() { 1765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool ret = eglplatform_shim_->ShimReleaseNativeWindow(native_window_); 1775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(ret); 178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual intptr_t GetNativeWindow() OVERRIDE { return native_window_; } 181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 182cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual bool OnSwapBuffers() OVERRIDE { return true; } 183cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 184cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual bool ResizeNativeWindow(const gfx::Size& viewport_size) OVERRIDE { 185cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return true; 186cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 187cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 188cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual scoped_ptr<gfx::VSyncProvider> CreateVSyncProvider() OVERRIDE { 189cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return scoped_ptr<gfx::VSyncProvider>(); 190cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 191cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 192cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private: 193cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) LibeglplatformShimLoader* eglplatform_shim_; 194cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) intptr_t native_window_; 195cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 196cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 197cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// EGL surface factory for libeglplatform_shim. 198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// 199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// This finds the right EGL/GLES2 libraries for loading, and creates 200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// a single native window via ShimCreateWindow for drawing 201cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// into. 2026d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)class SurfaceFactoryEgltest : public ui::SurfaceFactoryOzone { 203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public: 204cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SurfaceFactoryEgltest(LibeglplatformShimLoader* eglplatform_shim) 205116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : eglplatform_shim_(eglplatform_shim) {} 206116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual ~SurfaceFactoryEgltest() {} 207cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 208cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // SurfaceFactoryOzone: 209cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual intptr_t GetNativeDisplay() OVERRIDE; 2106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) virtual scoped_ptr<SurfaceOzoneEGL> CreateEGLSurfaceForWidget( 211cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) gfx::AcceleratedWidget widget) OVERRIDE; 212cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual const int32* GetEGLSurfaceProperties( 213cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const int32* desired_list) OVERRIDE; 214cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual bool LoadEGLGLES2Bindings( 215cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) AddGLLibraryCallback add_gl_library, 216cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetGLGetProcAddressProcCallback set_gl_get_proc_address) OVERRIDE; 217cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 218cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private: 219cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) LibeglplatformShimLoader* eglplatform_shim_; 220cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 221cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 222cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)intptr_t SurfaceFactoryEgltest::GetNativeDisplay() { 223cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return eglplatform_shim_->ShimGetNativeDisplay(); 224cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 225cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)scoped_ptr<SurfaceOzoneEGL> SurfaceFactoryEgltest::CreateEGLSurfaceForWidget( 227cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) gfx::AcceleratedWidget widget) { 2286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return make_scoped_ptr<SurfaceOzoneEGL>( 229cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new SurfaceOzoneEgltest(widget, eglplatform_shim_)); 230cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 231cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 232cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool SurfaceFactoryEgltest::LoadEGLGLES2Bindings( 233cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) AddGLLibraryCallback add_gl_library, 234cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetGLGetProcAddressProcCallback set_gl_get_proc_address) { 235cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const char* egl_soname = eglplatform_shim_->ShimQueryString(SHIM_EGL_LIBRARY); 236cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const char* gles_soname = 237cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) eglplatform_shim_->ShimQueryString(SHIM_GLES_LIBRARY); 238cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!egl_soname) 239cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) egl_soname = kDefaultEglSoname; 240cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!gles_soname) 241cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) gles_soname = kDefaultGlesSoname; 242cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 243cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::NativeLibraryLoadError error; 244cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::NativeLibrary egl_library = 245cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::LoadNativeLibrary(base::FilePath(egl_soname), &error); 246cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!egl_library) { 247cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) LOG(WARNING) << "Failed to load EGL library: " << error.ToString(); 248cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return false; 249cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 250cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 251cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::NativeLibrary gles_library = 252cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::LoadNativeLibrary(base::FilePath(gles_soname), &error); 253cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!gles_library) { 254cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) LOG(WARNING) << "Failed to load GLES library: " << error.ToString(); 255cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::UnloadNativeLibrary(egl_library); 256cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return false; 257cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 258cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 259cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GLGetProcAddressProc get_proc_address = 260cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) reinterpret_cast<GLGetProcAddressProc>( 261cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::GetFunctionPointerFromNativeLibrary(egl_library, 262cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "eglGetProcAddress")); 263cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!get_proc_address) { 264cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) LOG(ERROR) << "eglGetProcAddress not found."; 265cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::UnloadNativeLibrary(egl_library); 266cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::UnloadNativeLibrary(gles_library); 267cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return false; 268cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 269cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 270cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) set_gl_get_proc_address.Run(get_proc_address); 271cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) add_gl_library.Run(egl_library); 272cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) add_gl_library.Run(gles_library); 273cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return true; 274cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 275cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 276cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const int32* SurfaceFactoryEgltest::GetEGLSurfaceProperties( 277cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const int32* desired_list) { 278cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static const int32 broken_props[] = { 279cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, 280cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EGL_SURFACE_TYPE, EGL_WINDOW_BIT | EGL_PBUFFER_BIT, 281cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EGL_NONE, 282cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) }; 283cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return broken_props; 284cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 285cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 286cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Test platform for EGL. 287cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// 288cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// This is a tiny EGL-based platform. Creation of the native window is 289cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// handled by a separate library called eglplatform_shim.so.1 because 290cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// this itself is platform specific and we want to test out multiple 291cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// hardware platforms. 292cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class OzonePlatformEgltest : public OzonePlatform { 293cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public: 294cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) OzonePlatformEgltest() : shim_initialized_(false) {} 295cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual ~OzonePlatformEgltest() { 296cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (shim_initialized_) 297cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) eglplatform_shim_.ShimTerminate(); 298cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 299cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 300cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void LoadShim() { 301cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string library = GetShimLibraryName(); 302cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 303cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (eglplatform_shim_.Load(library)) 304cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 305cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 306cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::FilePath module_path; 307cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!PathService::Get(base::DIR_MODULE, &module_path)) 308cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) LOG(ERROR) << "failed to get DIR_MODULE from PathService"; 309cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::FilePath library_path = module_path.Append(library); 310cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 311cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (eglplatform_shim_.Load(library_path.value())) 312cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 313cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 314cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) LOG(FATAL) << "failed to load " << library; 315cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 316cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 317cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void Initialize() { 318cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) LoadShim(); 319cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) shim_initialized_ = eglplatform_shim_.ShimInitialize(); 320cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 321cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 322cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // OzonePlatform: 3236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) virtual ui::SurfaceFactoryOzone* GetSurfaceFactoryOzone() OVERRIDE { 324cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return surface_factory_ozone_.get(); 325cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 326cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual CursorFactoryOzone* GetCursorFactoryOzone() OVERRIDE { 327cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return cursor_factory_ozone_.get(); 328cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 3296d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) virtual GpuPlatformSupport* GetGpuPlatformSupport() OVERRIDE { 3306d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return gpu_platform_support_.get(); 3316d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } 3326d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) virtual GpuPlatformSupportHost* GetGpuPlatformSupportHost() OVERRIDE { 3336d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return gpu_platform_support_host_.get(); 3346d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } 335116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual scoped_ptr<PlatformWindow> CreatePlatformWindow( 336116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch PlatformWindowDelegate* delegate, 337116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const gfx::Rect& bounds) OVERRIDE { 338116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return make_scoped_ptr<PlatformWindow>( 33903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) new EgltestWindow(delegate, 34003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) &eglplatform_shim_, 34103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) event_factory_ozone_.get(), 34203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) bounds)); 343116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 344cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 345cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(OS_CHROMEOS) 346cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual scoped_ptr<NativeDisplayDelegate> CreateNativeDisplayDelegate() 347cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) OVERRIDE { 348cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return scoped_ptr<NativeDisplayDelegate>(new NativeDisplayDelegateOzone()); 349cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 350cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif 351cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 352cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void InitializeUI() OVERRIDE { 353cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) device_manager_ = CreateDeviceManager(); 354116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!surface_factory_ozone_) 355116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch surface_factory_ozone_.reset( 356116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch new SurfaceFactoryEgltest(&eglplatform_shim_)); 357cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) event_factory_ozone_.reset( 358cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new EventFactoryEvdev(NULL, device_manager_.get())); 359cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) cursor_factory_ozone_.reset(new CursorFactoryOzone()); 3606d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) gpu_platform_support_host_.reset(CreateStubGpuPlatformSupportHost()); 361cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 362cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 363cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void InitializeGPU() OVERRIDE { 364116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!surface_factory_ozone_) 365116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch surface_factory_ozone_.reset( 366116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch new SurfaceFactoryEgltest(&eglplatform_shim_)); 3676d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) gpu_platform_support_.reset(CreateStubGpuPlatformSupport()); 368cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 369cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 370cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private: 371cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) LibeglplatformShimLoader eglplatform_shim_; 372cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<DeviceManager> device_manager_; 373cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<SurfaceFactoryEgltest> surface_factory_ozone_; 374cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<EventFactoryEvdev> event_factory_ozone_; 375cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<CursorFactoryOzone> cursor_factory_ozone_; 3766d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) scoped_ptr<GpuPlatformSupport> gpu_platform_support_; 3776d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) scoped_ptr<GpuPlatformSupportHost> gpu_platform_support_host_; 378cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 379cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool shim_initialized_; 380cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 381cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(OzonePlatformEgltest); 382cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 383cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 384cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} // namespace 385cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 386cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)OzonePlatform* CreateOzonePlatformEgltest() { 387cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) OzonePlatformEgltest* platform = new OzonePlatformEgltest; 388cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) platform->Initialize(); 389cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return platform; 390cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 391cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 392cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} // namespace ui 393