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