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