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/dri/ozone_platform_gbm.h"
6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include <dlfcn.h>
8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <gbm.h>
96d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include <stdlib.h>
10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
11f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/at_exit.h"
1203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/command_line.h"
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/base/cursor/ozone/bitmap_cursor_factory_ozone.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/ozone/platform/dri/dri_cursor.h"
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/ozone/platform/dri/dri_window.h"
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/ozone/platform/dri/dri_window_delegate_manager.h"
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/ozone/platform/dri/dri_window_delegate_proxy.h"
2003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "ui/ozone/platform/dri/dri_window_manager.h"
21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/ozone/platform/dri/dri_wrapper.h"
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/ozone/platform/dri/gbm_buffer.h"
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/ozone/platform/dri/gbm_surface.h"
24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/ozone/platform/dri/gbm_surface_factory.h"
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/ozone/platform/dri/gpu_platform_support_gbm.h"
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/ozone/platform/dri/gpu_platform_support_host_gbm.h"
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/ozone/platform/dri/scanout_buffer.h"
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/ozone/platform/dri/screen_manager.h"
29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "ui/ozone/platform/dri/virtual_terminal_manager.h"
306d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "ui/ozone/public/cursor_factory_ozone.h"
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/ozone/public/gpu_platform_support.h"
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/ozone/public/gpu_platform_support_host.h"
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/ozone/public/ozone_platform.h"
3403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "ui/ozone/public/ozone_switches.h"
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(OS_CHROMEOS)
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/ozone/platform/dri/chromeos/display_message_handler.h"
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/ozone/platform/dri/chromeos/native_display_delegate_dri.h"
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/ozone/platform/dri/chromeos/native_display_delegate_proxy.h"
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace ui {
43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace {
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kDefaultGraphicsCardPath[] = "/dev/dri/card0";
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class GbmBufferGenerator : public ScanoutBufferGenerator {
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public:
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  GbmBufferGenerator(DriWrapper* dri)
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      : dri_(dri),
5246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        glapi_lib_(dlopen("libglapi.so.0", RTLD_LAZY | RTLD_GLOBAL)),
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        device_(gbm_create_device(dri_->get_fd())) {
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!device_)
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      LOG(FATAL) << "Unable to initialize gbm for " << kDefaultGraphicsCardPath;
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual ~GbmBufferGenerator() {
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    gbm_device_destroy(device_);
5946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (glapi_lib_)
6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      dlclose(glapi_lib_);
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  gbm_device* device() const { return device_; }
64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual scoped_refptr<ScanoutBuffer> Create(const gfx::Size& size) OVERRIDE {
665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return GbmBuffer::CreateBuffer(
675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        dri_, device_, SurfaceFactoryOzone::RGBA_8888, size, true);
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch protected:
71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DriWrapper* dri_;  // Not owned.
72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
7346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // HACK: gbm drivers have broken linkage
7446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void *glapi_lib_;
7546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  gbm_device* device_;
77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(GbmBufferGenerator);
79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class OzonePlatformGbm : public OzonePlatform {
82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public:
83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  OzonePlatformGbm(bool use_surfaceless) : use_surfaceless_(use_surfaceless) {
8403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    base::AtExitManager::RegisterTask(
85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        base::Bind(&base::DeletePointer<OzonePlatformGbm>, this));
86f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual ~OzonePlatformGbm() {}
88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // OzonePlatform:
906d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  virtual ui::SurfaceFactoryOzone* GetSurfaceFactoryOzone() OVERRIDE {
91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return surface_factory_ozone_.get();
92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual CursorFactoryOzone* GetCursorFactoryOzone() OVERRIDE {
94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return cursor_factory_ozone_.get();
95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
966d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  virtual GpuPlatformSupport* GetGpuPlatformSupport() OVERRIDE {
97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return gpu_platform_support_.get();
986d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  }
996d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  virtual GpuPlatformSupportHost* GetGpuPlatformSupportHost() OVERRIDE {
1006d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    return gpu_platform_support_host_.get();
1016d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  }
102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual scoped_ptr<PlatformWindow> CreatePlatformWindow(
103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      PlatformWindowDelegate* delegate,
104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const gfx::Rect& bounds) OVERRIDE {
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    scoped_ptr<DriWindow> platform_window(
10603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        new DriWindow(delegate,
10703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                      bounds,
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      scoped_ptr<DriWindowDelegate>(new DriWindowDelegateProxy(
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          window_manager_->NextAcceleratedWidget(),
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          gpu_platform_support_host_.get())),
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      event_factory_ozone_.get(),
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      ui_window_delegate_manager_.get(),
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      window_manager_.get()));
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    platform_window->Initialize();
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return platform_window.PassAs<PlatformWindow>();
116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(OS_CHROMEOS)
118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual scoped_ptr<NativeDisplayDelegate> CreateNativeDisplayDelegate()
119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      OVERRIDE {
120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return scoped_ptr<NativeDisplayDelegate>(new NativeDisplayDelegateProxy(
121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        gpu_platform_support_host_.get(), device_manager_.get()));
122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif
124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void InitializeUI() OVERRIDE {
125f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    vt_manager_.reset(new VirtualTerminalManager());
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ui_window_delegate_manager_.reset(new DriWindowDelegateManager());
127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Needed since the browser process creates the accelerated widgets and that
128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // happens through SFO.
129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    surface_factory_ozone_.reset(new GbmSurfaceFactory(use_surfaceless_));
130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    device_manager_ = CreateDeviceManager();
131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    gpu_platform_support_host_.reset(new GpuPlatformSupportHostGbm());
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cursor_factory_ozone_.reset(new BitmapCursorFactoryOzone);
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    window_manager_.reset(
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        new DriWindowManager(gpu_platform_support_host_.get()));
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    event_factory_ozone_.reset(new EventFactoryEvdev(window_manager_->cursor(),
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                     device_manager_.get()));
137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void InitializeGPU() OVERRIDE {
140cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    dri_.reset(new DriWrapper(kDefaultGraphicsCardPath));
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    dri_->Initialize();
1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    buffer_generator_.reset(new GbmBufferGenerator(dri_.get()));
143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    screen_manager_.reset(new ScreenManager(dri_.get(),
1445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                            buffer_generator_.get()));
1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    gpu_window_delegate_manager_.reset(new DriWindowDelegateManager());
146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (!surface_factory_ozone_)
147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      surface_factory_ozone_.reset(new GbmSurfaceFactory(use_surfaceless_));
1486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    surface_factory_ozone_->InitializeGpu(dri_.get(),
1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                          buffer_generator_->device(),
1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                          screen_manager_.get(),
1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                          gpu_window_delegate_manager_.get());
153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    gpu_platform_support_.reset(
15403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        new GpuPlatformSupportGbm(surface_factory_ozone_.get(),
1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                  gpu_window_delegate_manager_.get(),
15603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                  screen_manager_.get()));
157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(OS_CHROMEOS)
158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    gpu_platform_support_->AddHandler(scoped_ptr<GpuPlatformSupport>(
159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        new DisplayMessageHandler(
160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            scoped_ptr<NativeDisplayDelegateDri>(new NativeDisplayDelegateDri(
161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                dri_.get(),
162116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                screen_manager_.get(),
163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                NULL)))));
164116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
1655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (surface_factory_ozone_->InitializeHardware() !=
1665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        DriSurfaceFactory::INITIALIZED)
1675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      LOG(FATAL) << "failed to initialize display hardware";
168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private:
171116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool use_surfaceless_;
172f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  scoped_ptr<VirtualTerminalManager> vt_manager_;
173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<DriWrapper> dri_;
1745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_ptr<GbmBufferGenerator> buffer_generator_;
175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<ScreenManager> screen_manager_;
176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<DeviceManager> device_manager_;
177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<GbmSurfaceFactory> surface_factory_ozone_;
1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<BitmapCursorFactoryOzone> cursor_factory_ozone_;
180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<EventFactoryEvdev> event_factory_ozone_;
181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<GpuPlatformSupportGbm> gpu_platform_support_;
183116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<GpuPlatformSupportHostGbm> gpu_platform_support_host_;
1846d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<DriWindowDelegateManager> gpu_window_delegate_manager_;
1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // TODO(dnicoara) Once we have a mock channel for the software path the window
1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // can own the delegates on the browser side. Remove this then.
1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<DriWindowDelegateManager> ui_window_delegate_manager_;
1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Browser side object only.
1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<DriWindowManager> window_manager_;
19203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
193cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(OzonePlatformGbm);
194cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
195cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
196cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // namespace
197cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
198116680a4aac90f2aa7413d9095a592090648e557Ben MurdochOzonePlatform* CreateOzonePlatformGbm() {
19903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  CommandLine* cmd = CommandLine::ForCurrentProcess();
20003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return new OzonePlatformGbm(cmd->HasSwitch(switches::kOzoneUseSurfaceless));
201116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
202cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // namespace ui
204