ozone_platform_gbm.cc revision 6d86b77056ed63eb6871182f42a9fd5f07550f90
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" 12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/events/ozone/device/device_manager.h" 13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/events/ozone/evdev/event_factory_evdev.h" 14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/ozone/ozone_platform.h" 15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/ozone/platform/dri/dri_wrapper.h" 16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/ozone/platform/dri/gbm_surface.h" 17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/ozone/platform/dri/gbm_surface_factory.h" 18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/ozone/platform/dri/scanout_surface.h" 19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/ozone/platform/dri/screen_manager.h" 20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "ui/ozone/platform/dri/virtual_terminal_manager.h" 216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "ui/ozone/public/cursor_factory_ozone.h" 22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(OS_CHROMEOS) 24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/ozone/common/chromeos/native_display_delegate_ozone.h" 25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/ozone/common/chromeos/touchscreen_device_manager_ozone.h" 26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif 27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace ui { 29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace { 31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kDefaultGraphicsCardPath[] = "/dev/dri/card0"; 33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class GbmSurfaceGenerator : public ScanoutSurfaceGenerator { 35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public: 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GbmSurfaceGenerator(DriWrapper* dri) 37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) : dri_(dri), 3846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) glapi_lib_(dlopen("libglapi.so.0", RTLD_LAZY | RTLD_GLOBAL)), 39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) device_(gbm_create_device(dri_->get_fd())) {} 40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual ~GbmSurfaceGenerator() { 41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) gbm_device_destroy(device_); 4246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (glapi_lib_) 4346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) dlclose(glapi_lib_); 44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) gbm_device* device() const { return device_; } 47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual ScanoutSurface* Create(const gfx::Size& size) OVERRIDE { 49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return new GbmSurface(device_, dri_, size); 50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private: 53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DriWrapper* dri_; // Not owned. 54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 5546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // HACK: gbm drivers have broken linkage 5646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void *glapi_lib_; 5746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) gbm_device* device_; 59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(GbmSurfaceGenerator); 61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class OzonePlatformGbm : public OzonePlatform { 64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public: 65f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) OzonePlatformGbm() { 66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::AtExitManager::RegisterTask( 67f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Bind(&base::DeletePointer<OzonePlatformGbm>, this)); 68f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual ~OzonePlatformGbm() {} 70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // OzonePlatform: 726d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) virtual ui::SurfaceFactoryOzone* GetSurfaceFactoryOzone() OVERRIDE { 73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return surface_factory_ozone_.get(); 74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual EventFactoryOzone* GetEventFactoryOzone() OVERRIDE { 76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return event_factory_ozone_.get(); 77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual CursorFactoryOzone* GetCursorFactoryOzone() OVERRIDE { 79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return cursor_factory_ozone_.get(); 80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 816d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) virtual GpuPlatformSupport* GetGpuPlatformSupport() OVERRIDE { 826d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return gpu_platform_support_.get() 836d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } 846d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) virtual GpuPlatformSupportHost* GetGpuPlatformSupportHost() OVERRIDE { 856d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return gpu_platform_support_host_.get(); 866d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } 87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(OS_CHROMEOS) 88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual scoped_ptr<NativeDisplayDelegate> CreateNativeDisplayDelegate() 89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) OVERRIDE { 90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return scoped_ptr<NativeDisplayDelegate>(new NativeDisplayDelegateOzone()); 91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual scoped_ptr<TouchscreenDeviceManager> 93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CreateTouchscreenDeviceManager() OVERRIDE { 94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return scoped_ptr<TouchscreenDeviceManager>( 95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new TouchscreenDeviceManagerOzone()); 96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif 98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void InitializeUI() OVERRIDE { 99f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) vt_manager_.reset(new VirtualTerminalManager()); 100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Needed since the browser process creates the accelerated widgets and that 101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // happens through SFO. 102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) surface_factory_ozone_.reset(new GbmSurfaceFactory(NULL, NULL, NULL)); 103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) device_manager_ = CreateDeviceManager(); 105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) cursor_factory_ozone_.reset(new CursorFactoryOzone()); 106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) event_factory_ozone_.reset(new EventFactoryEvdev( 107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NULL, device_manager_.get())); 1086d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1096d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) gpu_platform_support_host_.reset(CreateStubGpuPlatformSupportHost()); 110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void InitializeGPU() OVERRIDE { 113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) dri_.reset(new DriWrapper(kDefaultGraphicsCardPath)); 114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) surface_generator_.reset(new GbmSurfaceGenerator(dri_.get())); 115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) screen_manager_.reset(new ScreenManager(dri_.get(), 116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) surface_generator_.get())); 117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) surface_factory_ozone_.reset( 118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new GbmSurfaceFactory(dri_.get(), 119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) surface_generator_->device(), 120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) screen_manager_.get())); 1216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) gpu_platform_support_.reset(CreateStubGpuPlatformSupport()); 123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private: 126f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<VirtualTerminalManager> vt_manager_; 127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<DriWrapper> dri_; 128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<GbmSurfaceGenerator> surface_generator_; 129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<ScreenManager> screen_manager_; 130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<DeviceManager> device_manager_; 131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<GbmSurfaceFactory> surface_factory_ozone_; 133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<CursorFactoryOzone> cursor_factory_ozone_; 134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<EventFactoryEvdev> event_factory_ozone_; 135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1366d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) scoped_ptr<GpuPlatformSupport> gpu_platform_support_; 1376d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) scoped_ptr<GpuPlatformSupportHost> gpu_platform_support_host_; 1386d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(OzonePlatformGbm); 140cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} // namespace 143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 144cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)OzonePlatform* CreateOzonePlatformGbm() { return new OzonePlatformGbm; } 145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} // namespace ui 147