1fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com// Copyright 2014 The Chromium Authors. All rights reserved.
2fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com// Use of this source code is governed by a BSD-style license that can be
3fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com// found in the LICENSE file.
4fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com
5fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com#include "ui/ozone/platform/dri/ozone_platform_gbm.h"
6fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com
7b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com#include <dlfcn.h>
8fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com#include <gbm.h>
9fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com#include <stdlib.h>
10fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com
11fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com#include "base/at_exit.h"
1215fa138f2276a77679530fb608463ff5b4133f7bcaryclark@google.com#include "base/command_line.h"
1315fa138f2276a77679530fb608463ff5b4133f7bcaryclark@google.com#include "ui/base/cursor/ozone/bitmap_cursor_factory_ozone.h"
1415fa138f2276a77679530fb608463ff5b4133f7bcaryclark@google.com#include "ui/events/ozone/device/device_manager.h"
15b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com#include "ui/events/ozone/evdev/event_factory_evdev.h"
16b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com#include "ui/ozone/platform/dri/dri_cursor.h"
1715fa138f2276a77679530fb608463ff5b4133f7bcaryclark@google.com#include "ui/ozone/platform/dri/dri_window.h"
1815fa138f2276a77679530fb608463ff5b4133f7bcaryclark@google.com#include "ui/ozone/platform/dri/dri_window_delegate_manager.h"
1915fa138f2276a77679530fb608463ff5b4133f7bcaryclark@google.com#include "ui/ozone/platform/dri/dri_window_delegate_proxy.h"
2047580694fbe974a065caf7c39c3d2075708c2018caryclark@google.com#include "ui/ozone/platform/dri/dri_window_manager.h"
2115fa138f2276a77679530fb608463ff5b4133f7bcaryclark@google.com#include "ui/ozone/platform/dri/dri_wrapper.h"
22fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com#include "ui/ozone/platform/dri/gbm_buffer.h"
2347580694fbe974a065caf7c39c3d2075708c2018caryclark@google.com#include "ui/ozone/platform/dri/gbm_surface.h"
2447580694fbe974a065caf7c39c3d2075708c2018caryclark@google.com#include "ui/ozone/platform/dri/gbm_surface_factory.h"
2547580694fbe974a065caf7c39c3d2075708c2018caryclark@google.com#include "ui/ozone/platform/dri/gpu_platform_support_gbm.h"
2647580694fbe974a065caf7c39c3d2075708c2018caryclark@google.com#include "ui/ozone/platform/dri/gpu_platform_support_host_gbm.h"
2747580694fbe974a065caf7c39c3d2075708c2018caryclark@google.com#include "ui/ozone/platform/dri/scanout_buffer.h"
28f839c0359c308fd06895d9f73fc12c4f3869e399caryclark@google.com#include "ui/ozone/platform/dri/screen_manager.h"
290b7da433fe0eaa2833d1b2900715b013b36d93dacaryclark@google.com#include "ui/ozone/platform/dri/virtual_terminal_manager.h"
308f9f468b0555e95b8fc3cf4e6ee1f1fbf5492a1bcaryclark@google.com#include "ui/ozone/public/cursor_factory_ozone.h"
3173ca6243b31e225e9fd5b75a96cbc82d62557de6caryclark@google.com#include "ui/ozone/public/gpu_platform_support.h"
32a461ff0866526bc51dbd4c4f9f066a727ec21510caryclark@google.com#include "ui/ozone/public/gpu_platform_support_host.h"
3347580694fbe974a065caf7c39c3d2075708c2018caryclark@google.com#include "ui/ozone/public/ozone_platform.h"
34beda389e646d6be3cfef853584a78ca8ba39d0fccaryclark@google.com#include "ui/ozone/public/ozone_switches.h"
3547580694fbe974a065caf7c39c3d2075708c2018caryclark@google.com
3631143cf37fa38dc98f71c71e518ecc21c83b5e27caryclark@google.com#if defined(OS_CHROMEOS)
37fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com#include "ui/ozone/platform/dri/chromeos/display_message_handler.h"
3847580694fbe974a065caf7c39c3d2075708c2018caryclark@google.com#include "ui/ozone/platform/dri/chromeos/native_display_delegate_dri.h"
39fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com#include "ui/ozone/platform/dri/chromeos/native_display_delegate_proxy.h"
40beda389e646d6be3cfef853584a78ca8ba39d0fccaryclark@google.com#endif
4147580694fbe974a065caf7c39c3d2075708c2018caryclark@google.com
424eeda37a7456876cb8d509a4ea43c7f4c684477acaryclark@google.comnamespace ui {
43fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com
4447580694fbe974a065caf7c39c3d2075708c2018caryclark@google.comnamespace {
45c899ad9c7fa28234d99479ab09afb6866bbd8dc3caryclark@google.com
46e7bd5f4041701cbab87f6e779eb18fbb9fe74216caryclark@google.comconst char kDefaultGraphicsCardPath[] = "/dev/dri/card0";
4747580694fbe974a065caf7c39c3d2075708c2018caryclark@google.com
488dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.comclass GbmBufferGenerator : public ScanoutBufferGenerator {
49e7bd5f4041701cbab87f6e779eb18fbb9fe74216caryclark@google.com public:
5047580694fbe974a065caf7c39c3d2075708c2018caryclark@google.com  GbmBufferGenerator(DriWrapper* dri)
51f839c0359c308fd06895d9f73fc12c4f3869e399caryclark@google.com      : dri_(dri),
52729e1c46cea63dfaa6e4a05608b8f3be41e19dcecaryclark@google.com        glapi_lib_(dlopen("libglapi.so.0", RTLD_LAZY | RTLD_GLOBAL)),
5347580694fbe974a065caf7c39c3d2075708c2018caryclark@google.com        device_(gbm_create_device(dri_->get_fd())) {
548f9f468b0555e95b8fc3cf4e6ee1f1fbf5492a1bcaryclark@google.com    if (!device_)
55afe56de6361a81eef537ddd8f6d5626c8546d4c7caryclark@google.com      LOG(FATAL) << "Unable to initialize gbm for " << kDefaultGraphicsCardPath;
568dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com  }
578f9f468b0555e95b8fc3cf4e6ee1f1fbf5492a1bcaryclark@google.com  virtual ~GbmBufferGenerator() {
58fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com    gbm_device_destroy(device_);
59fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com    if (glapi_lib_)
60fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com      dlclose(glapi_lib_);
6147580694fbe974a065caf7c39c3d2075708c2018caryclark@google.com  }
62fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com
63beda389e646d6be3cfef853584a78ca8ba39d0fccaryclark@google.com  gbm_device* device() const { return device_; }
64c91dfe417a51f73c28ecf2708df1e0bee942c6eacaryclark@google.com
654eeda37a7456876cb8d509a4ea43c7f4c684477acaryclark@google.com  virtual scoped_refptr<ScanoutBuffer> Create(const gfx::Size& size) OVERRIDE {
666aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com    return GbmBuffer::CreateBuffer(
676aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com        dri_, device_, SurfaceFactoryOzone::RGBA_8888, size, true);
683350c3c68ab75cd08721da3a938b8d2b10096d70caryclark@google.com  }
69e7bd5f4041701cbab87f6e779eb18fbb9fe74216caryclark@google.com
703350c3c68ab75cd08721da3a938b8d2b10096d70caryclark@google.com protected:
71534aa5b9460639a09b9dc30d29e77782e44b8fffcaryclark@google.com  DriWrapper* dri_;  // Not owned.
72e7bd5f4041701cbab87f6e779eb18fbb9fe74216caryclark@google.com
733350c3c68ab75cd08721da3a938b8d2b10096d70caryclark@google.com  // HACK: gbm drivers have broken linkage
7465f9f0a1664a9cb38157ccfbcc3e0e936af0a58ecaryclark@google.com  void *glapi_lib_;
75729e1c46cea63dfaa6e4a05608b8f3be41e19dcecaryclark@google.com
7647580694fbe974a065caf7c39c3d2075708c2018caryclark@google.com  gbm_device* device_;
778f9f468b0555e95b8fc3cf4e6ee1f1fbf5492a1bcaryclark@google.com
78afe56de6361a81eef537ddd8f6d5626c8546d4c7caryclark@google.com  DISALLOW_COPY_AND_ASSIGN(GbmBufferGenerator);
7947580694fbe974a065caf7c39c3d2075708c2018caryclark@google.com};
808f9f468b0555e95b8fc3cf4e6ee1f1fbf5492a1bcaryclark@google.com
81fa0588ff672564af1c235a63589573829035a60bcaryclark@google.comclass OzonePlatformGbm : public OzonePlatform {
82fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com public:
83fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com  OzonePlatformGbm(bool use_surfaceless) : use_surfaceless_(use_surfaceless) {
84beda389e646d6be3cfef853584a78ca8ba39d0fccaryclark@google.com    base::AtExitManager::RegisterTask(
85beda389e646d6be3cfef853584a78ca8ba39d0fccaryclark@google.com        base::Bind(&base::DeletePointer<OzonePlatformGbm>, this));
86027de226c144d9e6b7a76acb2e904952b5620a5ecaryclark@google.com  }
87fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com  virtual ~OzonePlatformGbm() {}
88beda389e646d6be3cfef853584a78ca8ba39d0fccaryclark@google.com
89fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com  // OzonePlatform:
9065f9f0a1664a9cb38157ccfbcc3e0e936af0a58ecaryclark@google.com  virtual ui::SurfaceFactoryOzone* GetSurfaceFactoryOzone() OVERRIDE {
91fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com    return surface_factory_ozone_.get();
92fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com  }
93fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com  virtual CursorFactoryOzone* GetCursorFactoryOzone() OVERRIDE {
94fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com    return cursor_factory_ozone_.get();
958dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com  }
968dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com  virtual GpuPlatformSupport* GetGpuPlatformSupport() OVERRIDE {
978dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com    return gpu_platform_support_.get();
988dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com  }
9932546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com  virtual GpuPlatformSupportHost* GetGpuPlatformSupportHost() OVERRIDE {
10032546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com    return gpu_platform_support_host_.get();
10132546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com  }
10232546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com  virtual scoped_ptr<PlatformWindow> CreatePlatformWindow(
10332546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com      PlatformWindowDelegate* delegate,
10432546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com      const gfx::Rect& bounds) OVERRIDE {
10532546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com    scoped_ptr<DriWindow> platform_window(
10632546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com        new DriWindow(delegate,
10732546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com                      bounds,
108fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com                      scoped_ptr<DriWindowDelegate>(new DriWindowDelegateProxy(
109fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com                          window_manager_->NextAcceleratedWidget(),
11032546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com                          gpu_platform_support_host_.get())),
11132546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com                      event_factory_ozone_.get(),
112fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com                      ui_window_delegate_manager_.get(),
113fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com                      window_manager_.get()));
114fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com    platform_window->Initialize();
115fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com    return platform_window.PassAs<PlatformWindow>();
116fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com  }
11732546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com#if defined(OS_CHROMEOS)
11832546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com  virtual scoped_ptr<NativeDisplayDelegate> CreateNativeDisplayDelegate()
1193350c3c68ab75cd08721da3a938b8d2b10096d70caryclark@google.com      OVERRIDE {
120fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com    return scoped_ptr<NativeDisplayDelegate>(new NativeDisplayDelegateProxy(
121fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com        gpu_platform_support_host_.get(), device_manager_.get()));
12232546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com  }
123fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com#endif
12432546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com  virtual void InitializeUI() OVERRIDE {
12532546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com    vt_manager_.reset(new VirtualTerminalManager());
12673ca6243b31e225e9fd5b75a96cbc82d62557de6caryclark@google.com    ui_window_delegate_manager_.reset(new DriWindowDelegateManager());
127fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com    // Needed since the browser process creates the accelerated widgets and that
128fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com    // happens through SFO.
129fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com    surface_factory_ozone_.reset(new GbmSurfaceFactory(use_surfaceless_));
130fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com    device_manager_ = CreateDeviceManager();
13132546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com    gpu_platform_support_host_.reset(new GpuPlatformSupportHostGbm());
13232546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com    cursor_factory_ozone_.reset(new BitmapCursorFactoryOzone);
133235f56a92f6eb6accbb243e11b3c45e3798f38f2caryclark@google.com    window_manager_.reset(
134235f56a92f6eb6accbb243e11b3c45e3798f38f2caryclark@google.com        new DriWindowManager(gpu_platform_support_host_.get()));
135235f56a92f6eb6accbb243e11b3c45e3798f38f2caryclark@google.com    event_factory_ozone_.reset(new EventFactoryEvdev(window_manager_->cursor(),
136235f56a92f6eb6accbb243e11b3c45e3798f38f2caryclark@google.com                                                     device_manager_.get()));
137fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com  }
138235f56a92f6eb6accbb243e11b3c45e3798f38f2caryclark@google.com
13932546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com  virtual void InitializeGPU() OVERRIDE {
140fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com    dri_.reset(new DriWrapper(kDefaultGraphicsCardPath));
141fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com    dri_->Initialize();
14273ca6243b31e225e9fd5b75a96cbc82d62557de6caryclark@google.com    buffer_generator_.reset(new GbmBufferGenerator(dri_.get()));
14373ca6243b31e225e9fd5b75a96cbc82d62557de6caryclark@google.com    screen_manager_.reset(new ScreenManager(dri_.get(),
144fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com                                            buffer_generator_.get()));
14532546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com    gpu_window_delegate_manager_.reset(new DriWindowDelegateManager());
14673ca6243b31e225e9fd5b75a96cbc82d62557de6caryclark@google.com    if (!surface_factory_ozone_)
14773ca6243b31e225e9fd5b75a96cbc82d62557de6caryclark@google.com      surface_factory_ozone_.reset(new GbmSurfaceFactory(use_surfaceless_));
14873ca6243b31e225e9fd5b75a96cbc82d62557de6caryclark@google.com
14973ca6243b31e225e9fd5b75a96cbc82d62557de6caryclark@google.com    surface_factory_ozone_->InitializeGpu(dri_.get(),
15073ca6243b31e225e9fd5b75a96cbc82d62557de6caryclark@google.com                                          buffer_generator_->device(),
15173ca6243b31e225e9fd5b75a96cbc82d62557de6caryclark@google.com                                          screen_manager_.get(),
15273ca6243b31e225e9fd5b75a96cbc82d62557de6caryclark@google.com                                          gpu_window_delegate_manager_.get());
15332546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com    gpu_platform_support_.reset(
15473ca6243b31e225e9fd5b75a96cbc82d62557de6caryclark@google.com        new GpuPlatformSupportGbm(surface_factory_ozone_.get(),
15573ca6243b31e225e9fd5b75a96cbc82d62557de6caryclark@google.com                                  gpu_window_delegate_manager_.get(),
15673ca6243b31e225e9fd5b75a96cbc82d62557de6caryclark@google.com                                  screen_manager_.get()));
157fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com#if defined(OS_CHROMEOS)
15873ca6243b31e225e9fd5b75a96cbc82d62557de6caryclark@google.com    gpu_platform_support_->AddHandler(scoped_ptr<GpuPlatformSupport>(
159beda389e646d6be3cfef853584a78ca8ba39d0fccaryclark@google.com        new DisplayMessageHandler(
160fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com            scoped_ptr<NativeDisplayDelegateDri>(new NativeDisplayDelegateDri(
161fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com                dri_.get(),
162fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com                screen_manager_.get(),
163fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com                NULL)))));
16432546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com#endif
165fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com    if (surface_factory_ozone_->InitializeHardware() !=
166fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com        DriSurfaceFactory::INITIALIZED)
167fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com      LOG(FATAL) << "failed to initialize display hardware";
168fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com  }
169fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com
17032546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com private:
171fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com  bool use_surfaceless_;
172fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com  scoped_ptr<VirtualTerminalManager> vt_manager_;
173fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com  scoped_ptr<DriWrapper> dri_;
174fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com  scoped_ptr<GbmBufferGenerator> buffer_generator_;
175fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com  scoped_ptr<ScreenManager> screen_manager_;
17632546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com  scoped_ptr<DeviceManager> device_manager_;
177fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com
178fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com  scoped_ptr<GbmSurfaceFactory> surface_factory_ozone_;
179fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com  scoped_ptr<BitmapCursorFactoryOzone> cursor_factory_ozone_;
180e7bd5f4041701cbab87f6e779eb18fbb9fe74216caryclark@google.com  scoped_ptr<EventFactoryEvdev> event_factory_ozone_;
181e7bd5f4041701cbab87f6e779eb18fbb9fe74216caryclark@google.com
182e7bd5f4041701cbab87f6e779eb18fbb9fe74216caryclark@google.com  scoped_ptr<GpuPlatformSupportGbm> gpu_platform_support_;
183e7bd5f4041701cbab87f6e779eb18fbb9fe74216caryclark@google.com  scoped_ptr<GpuPlatformSupportHostGbm> gpu_platform_support_host_;
184e7bd5f4041701cbab87f6e779eb18fbb9fe74216caryclark@google.com
185e7bd5f4041701cbab87f6e779eb18fbb9fe74216caryclark@google.com  scoped_ptr<DriWindowDelegateManager> gpu_window_delegate_manager_;
186e7bd5f4041701cbab87f6e779eb18fbb9fe74216caryclark@google.com  // TODO(dnicoara) Once we have a mock channel for the software path the window
187e7bd5f4041701cbab87f6e779eb18fbb9fe74216caryclark@google.com  // can own the delegates on the browser side. Remove this then.
1888dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com  scoped_ptr<DriWindowDelegateManager> ui_window_delegate_manager_;
1898dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com
19032546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com  // Browser side object only.
1918dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com  scoped_ptr<DriWindowManager> window_manager_;
1928dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com
1938dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com  DISALLOW_COPY_AND_ASSIGN(OzonePlatformGbm);
1948dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com};
1958dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com
19632546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com}  // namespace
1978dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com
1988dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.comOzonePlatform* CreateOzonePlatformGbm() {
1998dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com  CommandLine* cmd = CommandLine::ForCurrentProcess();
2008dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com  return new OzonePlatformGbm(cmd->HasSwitch(switches::kOzoneUseSurfaceless));
2018dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com}
20232546db1494a6c6433a7919844133a6ff5b5c7b2caryclark@google.com
2038dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com}  // namespace ui
204fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com