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

Side by Side Diff: ui/ozone/platform/drm/gpu/client_native_pixmap_vgem.cc

Issue 1134993003: ozone: Implement zero/one-copy texture for Ozone GBM. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: open VGEM device in renderer in ad-hoc manner Created 5 years, 4 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
OLDNEW
(Empty)
1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "ui/ozone/platform/drm/gpu/client_native_pixmap_vgem.h"
6
7 #include <fcntl.h>
8 #include <sys/mman.h>
9 #include <xf86drm.h>
10
11 #include "base/trace_event/trace_event.h"
12
13 #if defined(OZONE_USE_VGEM_MAP)
14 #include <vgem_drm.h>
15 #endif
16
17 namespace ui {
18
19 namespace {
20
21 // TODO(dshwang): stride depends on driver, so plumb it from gpu process.
22 int StrideInBytes(size_t width, gfx::BufferFormat format) {
23 switch (format) {
24 case gfx::BufferFormat::BGRA_8888:
25 case gfx::BufferFormat::RGBX_8888:
26 return width * 4;
27 case gfx::BufferFormat::ATC:
28 case gfx::BufferFormat::ATCIA:
29 case gfx::BufferFormat::DXT1:
30 case gfx::BufferFormat::DXT5:
31 case gfx::BufferFormat::ETC1:
32 case gfx::BufferFormat::R_8:
33 case gfx::BufferFormat::RGBA_4444:
34 case gfx::BufferFormat::RGBA_8888:
35 case gfx::BufferFormat::YUV_420:
36 NOTREACHED();
37 break;
38 }
39 return 0;
40 }
41
42 } // namespace
43
44 ClientNativePixmapVgem::ClientNativePixmapVgem(base::FileDescriptor handle,
45 base::FileDescriptor vgem_handle,
46 gfx::Size size,
47 gfx::BufferFormat format,
48 gfx::BufferUsage usage)
49 : vgem_bo_handle_(0),
50 dma_buf_(handle.fd),
51 vgem_fd_(vgem_handle),
52 size_(size),
53 format_(format),
54 stride_(StrideInBytes(size_.width(), format_)),
55 mmap_ptr_(nullptr) {
56 DCHECK(usage == gfx::BufferUsage::MAP);
57 DCHECK(vgem_fd_.fd >= 0);
58 DCHECK(dma_buf_.get() >= 0);
59 }
60
61 bool ClientNativePixmapVgem::Initialize() {
62 DCHECK(vgem_fd_.fd);
63 int ret = drmPrimeFDToHandle(vgem_fd_.fd, dma_buf_.get(), &vgem_bo_handle_);
64 if (ret) {
65 LOG(ERROR) << "drmPrimeFDToHandle failed, handle:" << vgem_bo_handle_;
66 return false;
67 }
68 return true;
69 }
70
71 ClientNativePixmapVgem::~ClientNativePixmapVgem() {
72 if (vgem_bo_handle_) {
73 struct drm_gem_close close;
74 memset(&close, 0, sizeof(close));
75 close.handle = vgem_bo_handle_;
76 int ret = drmIoctl(vgem_fd_.fd, DRM_IOCTL_GEM_CLOSE, &close);
77 if (ret)
78 LOG(ERROR) << "fail to free a vgem buffer. error:" << ret;
79 vgem_bo_handle_ = 0;
80 }
81 }
82
83 bool ClientNativePixmapVgem::Map(void** data) {
84 #if defined(OZONE_USE_VGEM_MAP)
85 TRACE_EVENT0("gpu", "ClientNativePixmapVgem::Map");
86 DCHECK(!mmap_ptr_);
87 DCHECK(vgem_bo_handle_);
88
89 struct drm_mode_map_dumb mmap_arg;
90 memset(&mmap_arg, 0, sizeof(mmap_arg));
91 mmap_arg.handle = vgem_bo_handle_;
92
93 int ret = drmIoctl(vgem_fd_.fd, DRM_IOCTL_VGEM_MODE_MAP_DUMB, &mmap_arg);
94 if (ret) {
95 LOG(ERROR) << "fail to map a vgem buffer. error:" << ret;
96 return false;
97 }
98 DCHECK(mmap_arg.offset);
99
100 size_t size = stride_ * size_.height();
101 mmap_ptr_ = mmap(nullptr, size, (PROT_READ | PROT_WRITE), MAP_SHARED,
102 vgem_fd_.fd, mmap_arg.offset);
103 DCHECK(mmap_ptr_ != MAP_FAILED);
104 *data = mmap_ptr_;
105 return true;
106 #else
107 NOTREACHED();
108 return false;
109 #endif
110 }
111
112 void ClientNativePixmapVgem::Unmap() {
113 #if defined(OZONE_USE_VGEM_MAP)
114 TRACE_EVENT0("gpu", "ClientNativePixmapVgem::Unmap");
115 DCHECK(mmap_ptr_);
116 DCHECK(vgem_bo_handle_);
117
118 size_t size = stride_ * size_.height();
119 int ret = munmap(mmap_ptr_, size);
120 DCHECK(!ret);
121 mmap_ptr_ = nullptr;
122 #else
123 NOTREACHED();
124 #endif
125 }
126 void ClientNativePixmapVgem::GetStride(int* stride) const {
127 *stride = stride_;
128 }
129
130 } // namespace ui
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698