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 return skia::SharePtr(surface_->getCanvas()); |
84 } | 85 } |
85 virtual bool ResizeCanvas(const gfx::Size& viewport_size) OVERRIDE { | 86 virtual void ResizeCanvas(const gfx::Size& viewport_size) OVERRIDE { |
86 NOTIMPLEMENTED(); | 87 SkImageInfo info = SkImageInfo::MakeN32( |
87 return false; | 88 viewport_size.width(), viewport_size.height(), kOpaque_SkAlphaType); |
89 surface_ = skia::AdoptRef(SkSurface::NewRaster(info)); | |
88 } | 90 } |
89 virtual bool PresentCanvas() OVERRIDE { | 91 virtual void PresentCanvas(const gfx::Rect& damage) OVERRIDE { |
rjkroege
2014/04/23 22:29:32
shouldn't there be new lines after the } ?
| |
90 return dri_->SchedulePageFlip(widget_); | 92 SkCanvas* canvas = dri_->GetCanvasForWidget(widget_); |
93 | |
94 // The DriSurface is double buffered, so the current back buffer is | |
95 // missing the previous update. Expand damage region. | |
96 SkRect real_damage = RectToSkRect(UnionRects(damage, last_damage_)); | |
97 | |
98 // Copy damage region. | |
99 skia::RefPtr<SkImage> image = skia::AdoptRef(surface_->newImageSnapshot()); | |
100 image->draw(canvas, &real_damage, real_damage, NULL); | |
101 | |
102 last_damage_ = damage; | |
103 CHECK(dri_->SchedulePageFlip(widget_)); | |
91 } | 104 } |
92 virtual scoped_ptr<gfx::VSyncProvider> CreateVSyncProvider() OVERRIDE { | 105 virtual scoped_ptr<gfx::VSyncProvider> CreateVSyncProvider() OVERRIDE { |
93 return dri_->CreateVSyncProvider(widget_); | 106 return dri_->CreateVSyncProvider(widget_); |
94 } | 107 } |
95 | 108 |
96 private: | 109 private: |
110 skia::RefPtr<SkSurface> surface_; | |
111 gfx::Rect last_damage_; | |
112 | |
97 gfx::AcceleratedWidget widget_; | 113 gfx::AcceleratedWidget widget_; |
98 DriSurfaceFactory* dri_; | 114 DriSurfaceFactory* dri_; |
99 }; | 115 }; |
100 | 116 |
101 } // namespace | 117 } // namespace |
102 | 118 |
103 // static | 119 // static |
104 const gfx::AcceleratedWidget DriSurfaceFactory::kDefaultWidgetHandle = 1; | 120 const gfx::AcceleratedWidget DriSurfaceFactory::kDefaultWidgetHandle = 1; |
105 | 121 |
106 DriSurfaceFactory::DriSurfaceFactory() | 122 DriSurfaceFactory::DriSurfaceFactory() |
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
348 | 364 |
349 HardwareDisplayController* DriSurfaceFactory::GetControllerForWidget( | 365 HardwareDisplayController* DriSurfaceFactory::GetControllerForWidget( |
350 gfx::AcceleratedWidget w) { | 366 gfx::AcceleratedWidget w) { |
351 CHECK_GE(w, 1); | 367 CHECK_GE(w, 1); |
352 CHECK_LE(static_cast<size_t>(w), controllers_.size()); | 368 CHECK_LE(static_cast<size_t>(w), controllers_.size()); |
353 | 369 |
354 return controllers_[w - 1]; | 370 return controllers_[w - 1]; |
355 } | 371 } |
356 | 372 |
357 } // namespace ui | 373 } // namespace ui |
OLD | NEW |