OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/ozone/platform/dri/dri_surface_factory.h" | 5 #include "ui/ozone/platform/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/debug/trace_event.h" | 11 #include "base/debug/trace_event.h" |
12 #include "base/message_loop/message_loop.h" | 12 #include "base/message_loop/message_loop.h" |
13 #include "third_party/skia/include/core/SkBitmap.h" | 13 #include "third_party/skia/include/core/SkBitmap.h" |
14 #include "third_party/skia/include/core/SkDevice.h" | 14 #include "third_party/skia/include/core/SkDevice.h" |
| 15 #include "third_party/skia/include/core/SkSurface.h" |
15 #include "ui/gfx/native_widget_types.h" | 16 #include "ui/gfx/native_widget_types.h" |
16 #include "ui/gfx/ozone/surface_ozone_canvas.h" | 17 #include "ui/gfx/ozone/surface_ozone_canvas.h" |
17 #include "ui/ozone/platform/dri/dri_surface.h" | 18 #include "ui/ozone/platform/dri/dri_surface.h" |
18 #include "ui/ozone/platform/dri/dri_util.h" | 19 #include "ui/ozone/platform/dri/dri_util.h" |
19 #include "ui/ozone/platform/dri/dri_vsync_provider.h" | 20 #include "ui/ozone/platform/dri/dri_vsync_provider.h" |
20 #include "ui/ozone/platform/dri/dri_wrapper.h" | 21 #include "ui/ozone/platform/dri/dri_wrapper.h" |
21 #include "ui/ozone/platform/dri/hardware_display_controller.h" | 22 #include "ui/ozone/platform/dri/hardware_display_controller.h" |
22 | 23 |
23 namespace ui { | 24 namespace ui { |
24 | 25 |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
71 // For DRI the hadware surface & canvas are owned by the platform, so | 72 // For DRI the hadware surface & canvas are owned by the platform, so |
72 // the compositor merely owns this proxy object. | 73 // the compositor merely owns this proxy object. |
73 // | 74 // |
74 // TODO(spang): Should the compositor own any bits of the DriSurface? | 75 // TODO(spang): Should the compositor own any bits of the DriSurface? |
75 class DriSurfaceAdapter : public gfx::SurfaceOzoneCanvas { | 76 class DriSurfaceAdapter : public gfx::SurfaceOzoneCanvas { |
76 public: | 77 public: |
77 DriSurfaceAdapter(gfx::AcceleratedWidget w, DriSurfaceFactory* dri) | 78 DriSurfaceAdapter(gfx::AcceleratedWidget w, DriSurfaceFactory* dri) |
78 : widget_(w), dri_(dri) {} | 79 : widget_(w), dri_(dri) {} |
79 virtual ~DriSurfaceAdapter() {} | 80 virtual ~DriSurfaceAdapter() {} |
80 | 81 |
81 // gfx::SurfaceOzoneCanvas overrides: | 82 // SurfaceOzoneCanvas: |
82 virtual skia::RefPtr<SkCanvas> GetCanvas() OVERRIDE { | 83 virtual skia::RefPtr<SkCanvas> GetCanvas() OVERRIDE; |
83 return skia::SharePtr(dri_->GetCanvasForWidget(widget_)); | 84 virtual void ResizeCanvas(const gfx::Size& viewport_size) OVERRIDE; |
84 } | 85 virtual void PresentCanvas(const gfx::Rect& damage) OVERRIDE; |
85 virtual bool ResizeCanvas(const gfx::Size& viewport_size) OVERRIDE { | 86 virtual scoped_ptr<gfx::VSyncProvider> CreateVSyncProvider() OVERRIDE; |
86 NOTIMPLEMENTED(); | |
87 return false; | |
88 } | |
89 virtual bool PresentCanvas() OVERRIDE { | |
90 return dri_->SchedulePageFlip(widget_); | |
91 } | |
92 virtual scoped_ptr<gfx::VSyncProvider> CreateVSyncProvider() OVERRIDE { | |
93 return dri_->CreateVSyncProvider(widget_); | |
94 } | |
95 | 87 |
96 private: | 88 private: |
| 89 skia::RefPtr<SkSurface> surface_; |
| 90 gfx::Rect last_damage_; |
| 91 |
97 gfx::AcceleratedWidget widget_; | 92 gfx::AcceleratedWidget widget_; |
98 DriSurfaceFactory* dri_; | 93 DriSurfaceFactory* dri_; |
99 }; | 94 }; |
100 | 95 |
| 96 skia::RefPtr<SkCanvas> DriSurfaceAdapter::GetCanvas() { |
| 97 return skia::SharePtr(surface_->getCanvas()); |
| 98 } |
| 99 |
| 100 void DriSurfaceAdapter::ResizeCanvas(const gfx::Size& viewport_size) { |
| 101 SkImageInfo info = SkImageInfo::MakeN32( |
| 102 viewport_size.width(), viewport_size.height(), kOpaque_SkAlphaType); |
| 103 surface_ = skia::AdoptRef(SkSurface::NewRaster(info)); |
| 104 } |
| 105 |
| 106 void DriSurfaceAdapter::PresentCanvas(const gfx::Rect& damage) { |
| 107 SkCanvas* canvas = dri_->GetCanvasForWidget(widget_); |
| 108 |
| 109 // The DriSurface is double buffered, so the current back buffer is |
| 110 // missing the previous update. Expand damage region. |
| 111 SkRect real_damage = RectToSkRect(UnionRects(damage, last_damage_)); |
| 112 |
| 113 // Copy damage region. |
| 114 skia::RefPtr<SkImage> image = skia::AdoptRef(surface_->newImageSnapshot()); |
| 115 image->draw(canvas, &real_damage, real_damage, NULL); |
| 116 |
| 117 last_damage_ = damage; |
| 118 CHECK(dri_->SchedulePageFlip(widget_)); |
| 119 } |
| 120 |
| 121 scoped_ptr<gfx::VSyncProvider> DriSurfaceAdapter::CreateVSyncProvider() { |
| 122 return dri_->CreateVSyncProvider(widget_); |
| 123 } |
| 124 |
101 } // namespace | 125 } // namespace |
102 | 126 |
103 // static | 127 // static |
104 const gfx::AcceleratedWidget DriSurfaceFactory::kDefaultWidgetHandle = 1; | 128 const gfx::AcceleratedWidget DriSurfaceFactory::kDefaultWidgetHandle = 1; |
105 | 129 |
106 DriSurfaceFactory::DriSurfaceFactory() | 130 DriSurfaceFactory::DriSurfaceFactory() |
107 : drm_(), | 131 : drm_(), |
108 state_(UNINITIALIZED), | 132 state_(UNINITIALIZED), |
109 controllers_(), | 133 controllers_(), |
110 allocated_widgets_(0) { | 134 allocated_widgets_(0) { |
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
348 | 372 |
349 HardwareDisplayController* DriSurfaceFactory::GetControllerForWidget( | 373 HardwareDisplayController* DriSurfaceFactory::GetControllerForWidget( |
350 gfx::AcceleratedWidget w) { | 374 gfx::AcceleratedWidget w) { |
351 CHECK_GE(w, 1); | 375 CHECK_GE(w, 1); |
352 CHECK_LE(static_cast<size_t>(w), controllers_.size()); | 376 CHECK_LE(static_cast<size_t>(w), controllers_.size()); |
353 | 377 |
354 return controllers_[w - 1]; | 378 return controllers_[w - 1]; |
355 } | 379 } |
356 | 380 |
357 } // namespace ui | 381 } // namespace ui |
OLD | NEW |