OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ui/gfx/ozone/dri/dri_surface_factory.h" | 5 #include "ui/gfx/ozone/dri/dri_surface_factory.h" |
6 | 6 |
7 #include <drm.h> | 7 #include <drm.h> |
8 #include <errno.h> | 8 #include <errno.h> |
9 #include <xf86drm.h> | 9 #include <xf86drm.h> |
10 | 10 |
11 #include "base/message_loop/message_loop.h" | 11 #include "base/message_loop/message_loop.h" |
12 #include "third_party/skia/include/core/SkBitmap.h" | 12 #include "third_party/skia/include/core/SkBitmap.h" |
13 #include "third_party/skia/include/core/SkDevice.h" | 13 #include "third_party/skia/include/core/SkDevice.h" |
14 #include "ui/gfx/native_widget_types.h" | 14 #include "ui/gfx/native_widget_types.h" |
15 #include "ui/gfx/ozone/dri/dri_skbitmap.h" | 15 #include "ui/gfx/ozone/dri/dri_skbitmap.h" |
16 #include "ui/gfx/ozone/dri/dri_surface.h" | 16 #include "ui/gfx/ozone/dri/dri_surface.h" |
17 #include "ui/gfx/ozone/dri/dri_vsync_provider.h" | 17 #include "ui/gfx/ozone/dri/dri_vsync_provider.h" |
18 #include "ui/gfx/ozone/dri/dri_wrapper.h" | 18 #include "ui/gfx/ozone/dri/dri_wrapper.h" |
19 #include "ui/gfx/ozone/dri/hardware_display_controller.h" | 19 #include "ui/gfx/ozone/dri/hardware_display_controller.h" |
20 #include "ui/gfx/ozone/surface_ozone.h" | 20 #include "ui/gfx/ozone/surface_ozone.h" |
21 | 21 |
22 namespace gfx { | 22 namespace gfx { |
23 | 23 |
24 namespace { | 24 namespace { |
25 | 25 |
26 const char kDefaultGraphicsCardPath[] = "/dev/dri/card0"; | 26 const char kDefaultGraphicsCardPath[] = "/dev/dri/card0"; |
27 const char kDPMSProperty[] = "DPMS"; | 27 const char kDPMSProperty[] = "DPMS"; |
28 | 28 |
29 const gfx::AcceleratedWidget kDefaultWidgetHandle = 1; | 29 const gfx::AcceleratedWidget kDefaultWidgetHandle = |
| 30 kDefaultAcceleratedWidgetForSingleWindow; |
30 | 31 |
31 // TODO(dnicoara) Read the cursor plane size from the hardware. | 32 // TODO(dnicoara) Read the cursor plane size from the hardware. |
32 const gfx::Size kCursorSize(64, 64); | 33 const gfx::Size kCursorSize(64, 64); |
33 | 34 |
34 // DRM callback on page flip events. This callback is triggered after the | 35 // DRM callback on page flip events. This callback is triggered after the |
35 // page flip has happened and the backbuffer is now the new frontbuffer | 36 // page flip has happened and the backbuffer is now the new frontbuffer |
36 // The old frontbuffer is no longer used by the hardware and can be used for | 37 // The old frontbuffer is no longer used by the hardware and can be used for |
37 // future draw operations. | 38 // future draw operations. |
38 // | 39 // |
39 // |device| will contain a reference to the |DriSurface| object which | 40 // |device| will contain a reference to the |DriSurface| object which |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
171 return state_; | 172 return state_; |
172 } | 173 } |
173 | 174 |
174 cursor_surface_.reset(CreateSurface(kCursorSize)); | 175 cursor_surface_.reset(CreateSurface(kCursorSize)); |
175 if (!cursor_surface_->Initialize()) { | 176 if (!cursor_surface_->Initialize()) { |
176 LOG(ERROR) << "Failed to initialize cursor surface"; | 177 LOG(ERROR) << "Failed to initialize cursor surface"; |
177 state_ = FAILED; | 178 state_ = FAILED; |
178 return state_; | 179 return state_; |
179 } | 180 } |
180 | 181 |
| 182 // TODO(dnicoara) When there's more information on which display we want, |
| 183 // then we can return the widget associated with the display. |
| 184 // For now just assume we have 1 display device and return it. |
| 185 if (!controller_.get()) |
| 186 controller_.reset(new HardwareDisplayController()); |
| 187 |
181 state_ = INITIALIZED; | 188 state_ = INITIALIZED; |
182 return state_; | 189 return state_; |
183 } | 190 } |
184 | 191 |
185 void DriSurfaceFactory::ShutdownHardware() { | 192 void DriSurfaceFactory::ShutdownHardware() { |
186 CHECK(state_ == INITIALIZED); | 193 CHECK(state_ == INITIALIZED); |
187 | 194 |
188 controller_.reset(); | 195 controller_.reset(); |
189 drm_.reset(); | 196 drm_.reset(); |
190 | 197 |
191 state_ = UNINITIALIZED; | 198 state_ = UNINITIALIZED; |
192 } | 199 } |
193 | 200 |
194 gfx::AcceleratedWidget DriSurfaceFactory::GetAcceleratedWidget() { | 201 gfx::AcceleratedWidget DriSurfaceFactory::GetAcceleratedWidget() { |
195 CHECK(state_ != FAILED); | 202 CHECK(state_ != FAILED); |
196 | 203 |
197 // TODO(dnicoara) When there's more information on which display we want, | |
198 // then we can return the widget associated with the display. | |
199 // For now just assume we have 1 display device and return it. | |
200 if (!controller_.get()) | |
201 controller_.reset(new HardwareDisplayController()); | |
202 | |
203 // TODO(dnicoara) We only have 1 display for now, so only 1 AcceleratedWidget. | 204 // TODO(dnicoara) We only have 1 display for now, so only 1 AcceleratedWidget. |
204 // When we'll support multiple displays this needs to be changed to return a | 205 // When we'll support multiple displays this needs to be changed to return a |
205 // different handle for every display. | 206 // different handle for every display. |
206 return kDefaultWidgetHandle; | 207 return kDefaultWidgetHandle; |
207 } | 208 } |
208 | 209 |
209 scoped_ptr<SurfaceOzone> DriSurfaceFactory::CreateSurfaceForWidget( | 210 scoped_ptr<SurfaceOzone> DriSurfaceFactory::CreateSurfaceForWidget( |
210 gfx::AcceleratedWidget w) { | 211 gfx::AcceleratedWidget w) { |
211 CHECK(state_ == INITIALIZED); | 212 CHECK(state_ == INITIALIZED); |
212 // TODO(dnicoara) Once we can handle multiple displays this needs to be | 213 // TODO(dnicoara) Once we can handle multiple displays this needs to be |
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
386 drmEventContext drm_event; | 387 drmEventContext drm_event; |
387 drm_event.version = DRM_EVENT_CONTEXT_VERSION; | 388 drm_event.version = DRM_EVENT_CONTEXT_VERSION; |
388 drm_event.page_flip_handler = HandlePageFlipEvent; | 389 drm_event.page_flip_handler = HandlePageFlipEvent; |
389 drm_event.vblank_handler = NULL; | 390 drm_event.vblank_handler = NULL; |
390 | 391 |
391 // Wait for the page-flip to complete. | 392 // Wait for the page-flip to complete. |
392 drmHandleEvent(fd, &drm_event); | 393 drmHandleEvent(fd, &drm_event); |
393 } | 394 } |
394 | 395 |
395 } // namespace gfx | 396 } // namespace gfx |
OLD | NEW |