OLD | NEW |
(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 |
OLD | NEW |