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.h" | 5 #include "ui/gfx/ozone/dri/dri_surface.h" |
6 | 6 |
7 #include <errno.h> | 7 #include <errno.h> |
8 #include <sys/mman.h> | 8 #include <sys/mman.h> |
9 #include <sys/types.h> | 9 #include <sys/types.h> |
10 #include <xf86drm.h> | 10 #include <xf86drm.h> |
(...skipping 30 matching lines...) Expand all Loading... |
41 // DriSurface implementation | 41 // DriSurface implementation |
42 | 42 |
43 DriSurface::DriSurface( | 43 DriSurface::DriSurface( |
44 HardwareDisplayController* controller) | 44 HardwareDisplayController* controller) |
45 : controller_(controller), | 45 : controller_(controller), |
46 bitmaps_(), | 46 bitmaps_(), |
47 front_buffer_(0) { | 47 front_buffer_(0) { |
48 } | 48 } |
49 | 49 |
50 DriSurface::~DriSurface() { | 50 DriSurface::~DriSurface() { |
| 51 for (unsigned int i = 0; i < 2; ++i) { |
| 52 // If the surface fails to initialize, it may not have all the buffers |
| 53 // created. If we fail to register a framebuffer than there is no reason to |
| 54 // unregister it. |
| 55 if (bitmaps_[i] && bitmaps_[i]->get_framebuffer()) |
| 56 controller_->RemoveFramebuffer(bitmaps_[i]->get_framebuffer()); |
| 57 } |
51 } | 58 } |
52 | 59 |
53 bool DriSurface::Initialize() { | 60 bool DriSurface::Initialize() { |
54 for (int i = 0; i < 2; ++i) { | 61 for (int i = 0; i < 2; ++i) { |
55 bitmaps_[i].reset(CreateBuffer()); | 62 bitmaps_[i].reset(CreateBuffer()); |
56 // TODO(dnicoara) Should select the configuration based on what the | 63 // TODO(dnicoara) Should select the configuration based on what the |
57 // underlying system supports. | 64 // underlying system supports. |
58 bitmaps_[i]->setConfig(SkBitmap::kARGB_8888_Config, | 65 bitmaps_[i]->setConfig(SkBitmap::kARGB_8888_Config, |
59 controller_->get_mode().hdisplay, | 66 controller_->get_mode().hdisplay, |
60 controller_->get_mode().vdisplay); | 67 controller_->get_mode().vdisplay); |
61 | 68 |
62 if (!bitmaps_[i]->Initialize()) { | 69 if (!bitmaps_[i]->Initialize()) { |
63 return false; | 70 return false; |
64 } | 71 } |
| 72 |
| 73 uint32_t framebuffer = 0; |
| 74 if (!controller_->AddFramebuffer(bitmaps_[i]->GetColorDepth(), |
| 75 bitmaps_[i]->bytesPerPixel() << 3, |
| 76 bitmaps_[i]->rowBytes(), |
| 77 bitmaps_[i]->get_handle(), |
| 78 &framebuffer)) { |
| 79 return false; |
| 80 } |
| 81 bitmaps_[i]->set_framebuffer(framebuffer); |
65 } | 82 } |
66 | 83 |
67 skia_device_ = skia::AdoptRef( | 84 skia_device_ = skia::AdoptRef( |
68 new CustomSkBitmapDevice(*bitmaps_[front_buffer_ ^ 1].get())); | 85 new CustomSkBitmapDevice(*bitmaps_[front_buffer_ ^ 1].get())); |
69 skia_canvas_ = skia::AdoptRef(new SkCanvas(skia_device_.get())); | 86 skia_canvas_ = skia::AdoptRef(new SkCanvas(skia_device_.get())); |
70 | 87 |
71 return true; | 88 return true; |
72 } | 89 } |
73 | 90 |
74 uint32_t DriSurface::GetFramebufferId() const { | 91 uint32_t DriSurface::GetFramebufferId() const { |
(...skipping 29 matching lines...) Expand all Loading... |
104 | 121 |
105 SkCanvas* DriSurface::GetDrawableForWidget() { | 122 SkCanvas* DriSurface::GetDrawableForWidget() { |
106 return skia_canvas_.get(); | 123 return skia_canvas_.get(); |
107 } | 124 } |
108 | 125 |
109 DriSkBitmap* DriSurface::CreateBuffer() { | 126 DriSkBitmap* DriSurface::CreateBuffer() { |
110 return new DriSkBitmap(controller_->get_fd()); | 127 return new DriSkBitmap(controller_->get_fd()); |
111 } | 128 } |
112 | 129 |
113 } // namespace gfx | 130 } // namespace gfx |
OLD | NEW |