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