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

Side by Side Diff: content/common/gpu/client/gpu_memory_buffer_impl_ozone_gbm_intel.cc

Issue 1071273002: NotForReview: Implement zero/one-copy texture for ozone freon using Intel DRM Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 8 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 "content/common/gpu/client/gpu_memory_buffer_impl_ozone_gbm_intel.h"
6
7 #include <libdrm/i915_drm.h>
8
9 #include "base/lazy_instance.h"
10 #include "base/threading/thread_local.h"
11 #include "base/trace_event/trace_event.h"
12 #include "ui/ozone/public/platform/drm_intel_buffer_manager.h"
13
14 namespace content {
15
16 namespace {
17
18 // --single-process launches a render thread instead of a render process.
19 base::LazyInstance<base::ThreadLocalPointer<ui::DrmIntelBufferManager>>::Leaky
20 g_buffer_manager = LAZY_INSTANCE_INITIALIZER;
21
22 } // namespace
23
24 GpuMemoryBufferImplOzoneGbmIntel::GpuMemoryBufferImplOzoneGbmIntel(
25 gfx::GpuMemoryBufferId id,
26 const gfx::Size& size,
27 Format format,
28 const DestructionCallback& callback)
29 : GpuMemoryBufferImplOzoneNativeBuffer(id, size, format, callback),
30 buffer_(nullptr),
31 stride_(0) {
32 }
33
34 GpuMemoryBufferImplOzoneGbmIntel::~GpuMemoryBufferImplOzoneGbmIntel() {
35 if (buffer_) {
36 drm_intel_bo_unreference(buffer_);
37 buffer_ = nullptr;
38 }
39 }
40
41 // static
42 scoped_ptr<GpuMemoryBufferImpl>
43 GpuMemoryBufferImplOzoneGbmIntel::CreateFromHandle(
44 const gfx::GpuMemoryBufferHandle& handle,
45 const gfx::Size& size,
46 Format format,
47 const DestructionCallback& callback) {
48 scoped_ptr<GpuMemoryBufferImplOzoneGbmIntel> buffer = make_scoped_ptr(
49 new GpuMemoryBufferImplOzoneGbmIntel(handle.id, size, format, callback));
50 if (!buffer->Initialize(handle))
51 return nullptr;
52 return buffer.Pass();
53 }
54
55 bool GpuMemoryBufferImplOzoneGbmIntel::Initialize(
56 const gfx::GpuMemoryBufferHandle& handle) {
57 // Render process must close |device_handle|.
58 DCHECK(handle.device_handle.auto_close);
59 if (!g_buffer_manager.Pointer()->Get()) {
60 g_buffer_manager.Pointer()->Set(new ui::DrmIntelBufferManager);
61 g_buffer_manager.Pointer()->Get()->Initialize(handle.device_handle);
62 } else {
63 // TODO(dshwang): dup this fd once per render process.
64 base::ScopedFD closing_fd(handle.device_handle.fd);
65 }
66 DCHECK(g_buffer_manager.Pointer()->Get()->buffer_manager());
67
68 stride_ = handle.stride;
69 int buffer_size = stride_ * size_.height();
70 buffer_ = drm_intel_bo_gem_create_from_prime(
71 g_buffer_manager.Pointer()->Get()->buffer_manager(), handle.handle.fd,
72 buffer_size);
73 if (!buffer_) {
74 DLOG(ERROR) << "drm_intel_bo_gem_create_from_prime failed.";
75 return false;
76 }
77 DCHECK(handle.handle.auto_close);
78 prime_fd_.reset(handle.handle.fd);
79 return true;
80 }
81
82 bool GpuMemoryBufferImplOzoneGbmIntel::Map(void** data) {
83 TRACE_EVENT0("gpu", "GpuMemoryBufferImplOzoneGbmIntel::Map");
84 DCHECK(!mapped_);
85 mapped_ = true;
86 int write_enable = 1;
87 DCHECK(buffer_);
88 int error = drm_intel_bo_map(buffer_, write_enable);
89 if (error) {
90 DLOG(ERROR) << "fail to map a drm buffer. error:" << error;
91 return false;
92 }
93 DCHECK(buffer_->virt);
94 *data = buffer_->virt;
95 return true;
96 }
97
98 void GpuMemoryBufferImplOzoneGbmIntel::Unmap() {
99 TRACE_EVENT0("gpu", "GpuMemoryBufferImplOzoneGbmIntel::Unmap");
100 DCHECK(mapped_);
101 int error = drm_intel_bo_unmap(buffer_);
102 DCHECK(!error) << error;
103 mapped_ = false;
104 }
105
106 void GpuMemoryBufferImplOzoneGbmIntel::GetStride(uint32* stride) const {
107 *stride = stride_;
108 }
109
110 gfx::GpuMemoryBufferHandle GpuMemoryBufferImplOzoneGbmIntel::GetHandle() const {
111 // Don't need to set |handle.handle| and |handle.device_handle| because gpu
112 // process can look up the right pixmap only by id.
113 // See ui::GpuMemoryBufferFactoryOzoneNativeBuffer
114 return GpuMemoryBufferImplOzoneNativeBuffer::GetHandle();
115 }
116
117 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698