Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(136)

Side by Side Diff: ui/ozone/platform/dri/dri_buffer.cc

Issue 276753003: [Ozone-DRI] Move framebuffer initialization into the buffer (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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_buffer.h" 5 #include "ui/ozone/platform/dri/dri_buffer.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>
11 11
12 #include "base/logging.h" 12 #include "base/logging.h"
13 #include "third_party/skia/include/core/SkCanvas.h" 13 #include "third_party/skia/include/core/SkCanvas.h"
14 #include "ui/ozone/platform/dri/dri_wrapper.h" 14 #include "ui/ozone/platform/dri/dri_wrapper.h"
15 15
16 namespace ui { 16 namespace ui {
17 17
18 namespace { 18 namespace {
19 19
20 // Modesetting cannot happen from a buffer with transparencies. Return the size
21 // of a pixel without alpha.
22 uint8_t GetColorDepth(SkColorType type) {
23 switch (type) {
24 case kUnknown_SkColorType:
25 case kAlpha_8_SkColorType:
26 return 0;
27 case kIndex_8_SkColorType:
28 return 8;
29 case kRGB_565_SkColorType:
30 return 16;
31 case kARGB_4444_SkColorType:
32 return 12;
33 case kPMColor_SkColorType:
34 return 24;
35 default:
36 NOTREACHED();
37 return 0;
38 }
39 }
40
20 void DestroyDumbBuffer(int fd, uint32_t handle) { 41 void DestroyDumbBuffer(int fd, uint32_t handle) {
21 struct drm_mode_destroy_dumb destroy_request; 42 struct drm_mode_destroy_dumb destroy_request;
22 destroy_request.handle = handle; 43 destroy_request.handle = handle;
23 drmIoctl(fd, DRM_IOCTL_MODE_DESTROY_DUMB, &destroy_request); 44 drmIoctl(fd, DRM_IOCTL_MODE_DESTROY_DUMB, &destroy_request);
24 } 45 }
25 46
26 bool CreateDumbBuffer(DriWrapper* dri, 47 bool CreateDumbBuffer(DriWrapper* dri,
27 const SkImageInfo& info, 48 const SkImageInfo& info,
28 uint32_t* handle, 49 uint32_t* handle,
29 uint32_t* stride, 50 uint32_t* stride,
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
70 91
71 } // namespace 92 } // namespace
72 93
73 DriBuffer::DriBuffer(DriWrapper* dri) 94 DriBuffer::DriBuffer(DriWrapper* dri)
74 : dri_(dri), handle_(0), framebuffer_(0) {} 95 : dri_(dri), handle_(0), framebuffer_(0) {}
75 96
76 DriBuffer::~DriBuffer() { 97 DriBuffer::~DriBuffer() {
77 if (!surface_) 98 if (!surface_)
78 return; 99 return;
79 100
101 if (framebuffer_)
102 dri_->RemoveFramebuffer(framebuffer_);
103
80 SkImageInfo info; 104 SkImageInfo info;
81 void* pixels = const_cast<void*>(surface_->peekPixels(&info, NULL)); 105 void* pixels = const_cast<void*>(surface_->peekPixels(&info, NULL));
82 if (!pixels) 106 if (!pixels)
83 return; 107 return;
84 108
85 munmap(pixels, info.getSafeSize(stride_)); 109 munmap(pixels, info.getSafeSize(stride_));
86 DestroyDumbBuffer(dri_->get_fd(), handle_); 110 DestroyDumbBuffer(dri_->get_fd(), handle_);
87 } 111 }
88 112
89 bool DriBuffer::Initialize(const SkImageInfo& info) { 113 bool DriBuffer::Initialize(const SkImageInfo& info) {
90 void* pixels = NULL; 114 void* pixels = NULL;
91 if (!CreateDumbBuffer(dri_, info, &handle_, &stride_, &pixels)) { 115 if (!CreateDumbBuffer(dri_, info, &handle_, &stride_, &pixels)) {
92 DLOG(ERROR) << "Cannot allocate drm dumb buffer"; 116 DLOG(ERROR) << "Cannot allocate drm dumb buffer";
93 return false; 117 return false;
94 } 118 }
95 119
120 if (!dri_->AddFramebuffer(info.width(),
121 info.height(),
122 GetColorDepth(info.colorType()),
123 info.bytesPerPixel() << 3,
124 stride_,
125 handle_,
126 &framebuffer_)) {
127 DLOG(ERROR) << "Failed to register framebuffer: " << strerror(errno);
128 return false;
129 }
130
96 surface_ = skia::AdoptRef(SkSurface::NewRasterDirect(info, pixels, stride_)); 131 surface_ = skia::AdoptRef(SkSurface::NewRasterDirect(info, pixels, stride_));
97 if (!surface_) { 132 if (!surface_) {
98 DLOG(ERROR) << "Cannot install Skia pixels for drm buffer"; 133 DLOG(ERROR) << "Cannot install Skia pixels for drm buffer";
99 return false; 134 return false;
100 } 135 }
101 136
102 return true; 137 return true;
103 } 138 }
104 139
105 uint8_t DriBuffer::GetColorDepth() const {
106 switch (surface_->getCanvas()->imageInfo().colorType()) {
107 case kUnknown_SkColorType:
108 case kAlpha_8_SkColorType:
109 return 0;
110 case kIndex_8_SkColorType:
111 return 8;
112 case kRGB_565_SkColorType:
113 return 16;
114 case kARGB_4444_SkColorType:
115 return 12;
116 case kPMColor_SkColorType:
117 return 24;
118 default:
119 NOTREACHED();
120 return 0;
121 }
122 }
123
124 } // namespace ui 140 } // namespace ui
OLDNEW
« no previous file with comments | « ui/ozone/platform/dri/dri_buffer.h ('k') | ui/ozone/platform/dri/dri_surface_factory_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698