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

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

Issue 2533163002: ozone: Create GbmBuffers from fourcc formats and gbm flags. (Closed)
Patch Set: Address dnicoara's comments. Created 4 years 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
1 // Copyright 2015 The Chromium Authors. All rights reserved. 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 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/drm/gpu/drm_thread.h" 5 #include "ui/ozone/platform/drm/gpu/drm_thread.h"
6 6
7 #include <gbm.h>
7 #include <utility> 8 #include <utility>
8 9
9 #include "base/command_line.h" 10 #include "base/command_line.h"
10 #include "base/macros.h" 11 #include "base/macros.h"
11 #include "base/memory/ptr_util.h" 12 #include "base/memory/ptr_util.h"
12 #include "base/threading/thread_task_runner_handle.h" 13 #include "base/threading/thread_task_runner_handle.h"
13 #include "services/service_manager/public/cpp/connection.h" 14 #include "services/service_manager/public/cpp/connection.h"
15 #include "ui/ozone/platform/drm/common/drm_util.h"
14 #include "ui/ozone/platform/drm/gpu/drm_buffer.h" 16 #include "ui/ozone/platform/drm/gpu/drm_buffer.h"
15 #include "ui/ozone/platform/drm/gpu/drm_device_generator.h" 17 #include "ui/ozone/platform/drm/gpu/drm_device_generator.h"
16 #include "ui/ozone/platform/drm/gpu/drm_device_manager.h" 18 #include "ui/ozone/platform/drm/gpu/drm_device_manager.h"
17 #include "ui/ozone/platform/drm/gpu/drm_gpu_display_manager.h" 19 #include "ui/ozone/platform/drm/gpu/drm_gpu_display_manager.h"
18 #include "ui/ozone/platform/drm/gpu/drm_window.h" 20 #include "ui/ozone/platform/drm/gpu/drm_window.h"
19 #include "ui/ozone/platform/drm/gpu/drm_window_proxy.h" 21 #include "ui/ozone/platform/drm/gpu/drm_window_proxy.h"
20 #include "ui/ozone/platform/drm/gpu/gbm_buffer.h" 22 #include "ui/ozone/platform/drm/gpu/gbm_buffer.h"
21 #include "ui/ozone/platform/drm/gpu/gbm_device.h" 23 #include "ui/ozone/platform/drm/gpu/gbm_device.h"
22 #include "ui/ozone/platform/drm/gpu/gbm_surface_factory.h" 24 #include "ui/ozone/platform/drm/gpu/gbm_surface_factory.h"
23 #include "ui/ozone/platform/drm/gpu/proxy_helpers.h" 25 #include "ui/ozone/platform/drm/gpu/proxy_helpers.h"
24 #include "ui/ozone/platform/drm/gpu/screen_manager.h" 26 #include "ui/ozone/platform/drm/gpu/screen_manager.h"
25 #include "ui/ozone/public/ozone_switches.h" 27 #include "ui/ozone/public/ozone_switches.h"
26 28
27 namespace ui { 29 namespace ui {
28 30
29 namespace { 31 namespace {
30 32
31 class GbmBufferGenerator : public ScanoutBufferGenerator { 33 class GbmBufferGenerator : public ScanoutBufferGenerator {
32 public: 34 public:
33 GbmBufferGenerator() {} 35 GbmBufferGenerator() {}
34 ~GbmBufferGenerator() override {} 36 ~GbmBufferGenerator() override {}
35 37
36 // ScanoutBufferGenerator: 38 // ScanoutBufferGenerator:
37 scoped_refptr<ScanoutBuffer> Create(const scoped_refptr<DrmDevice>& drm, 39 scoped_refptr<ScanoutBuffer> Create(const scoped_refptr<DrmDevice>& drm,
38 gfx::BufferFormat format, 40 uint32_t format,
39 const gfx::Size& size) override { 41 const gfx::Size& size) override {
40 scoped_refptr<GbmDevice> gbm(static_cast<GbmDevice*>(drm.get())); 42 scoped_refptr<GbmDevice> gbm(static_cast<GbmDevice*>(drm.get()));
41 return GbmBuffer::CreateBuffer(gbm, format, size, 43 return GbmBuffer::CreateBuffer(gbm, format, size,
42 gfx::BufferUsage::SCANOUT); 44 GBM_BO_USE_SCANOUT | GBM_BO_USE_LINEAR);
tfiga 2016/12/06 06:16:32 Why GBM_BO_USE_SCANOUT | GBM_BO_USE_LINEAR? First
Daniele Castagna 2016/12/06 06:31:01 The GPU is not writing to this buffer. We're mappi
tfiga 2016/12/06 06:50:57 Acknowledged.
marcheu1 2016/12/13 00:07:06 This is still wrong. You can't allocate a gem BO a
Daniele Castagna 2016/12/13 02:28:59 As discussed offline, let's start landing crrev.co
43 } 45 }
44 46
45 protected: 47 protected:
46 DISALLOW_COPY_AND_ASSIGN(GbmBufferGenerator); 48 DISALLOW_COPY_AND_ASSIGN(GbmBufferGenerator);
47 }; 49 };
48 50
49 class GbmDeviceGenerator : public DrmDeviceGenerator { 51 class GbmDeviceGenerator : public DrmDeviceGenerator {
50 public: 52 public:
51 GbmDeviceGenerator(bool use_atomic) : use_atomic_(use_atomic) {} 53 GbmDeviceGenerator(bool use_atomic) : use_atomic_(use_atomic) {}
52 ~GbmDeviceGenerator() override {} 54 ~GbmDeviceGenerator() override {}
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
101 } 103 }
102 104
103 void DrmThread::CreateBuffer(gfx::AcceleratedWidget widget, 105 void DrmThread::CreateBuffer(gfx::AcceleratedWidget widget,
104 const gfx::Size& size, 106 const gfx::Size& size,
105 gfx::BufferFormat format, 107 gfx::BufferFormat format,
106 gfx::BufferUsage usage, 108 gfx::BufferUsage usage,
107 scoped_refptr<GbmBuffer>* buffer) { 109 scoped_refptr<GbmBuffer>* buffer) {
108 scoped_refptr<GbmDevice> gbm = 110 scoped_refptr<GbmDevice> gbm =
109 static_cast<GbmDevice*>(device_manager_->GetDrmDevice(widget).get()); 111 static_cast<GbmDevice*>(device_manager_->GetDrmDevice(widget).get());
110 DCHECK(gbm); 112 DCHECK(gbm);
111 *buffer = GbmBuffer::CreateBuffer(gbm, format, size, usage); 113
114 uint32_t flags = 0;
115 switch (usage) {
116 case gfx::BufferUsage::GPU_READ:
117 break;
118 case gfx::BufferUsage::SCANOUT:
119 flags = GBM_BO_USE_SCANOUT | GBM_BO_USE_RENDERING;
120 break;
121 case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE:
122 case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE_PERSISTENT:
123 flags = GBM_BO_USE_LINEAR;
124 break;
125 }
126
127 *buffer = GbmBuffer::CreateBuffer(
128 gbm, ui::GetFourCCFormatFromBufferFormat(format), size, flags);
112 } 129 }
113 130
114 void DrmThread::CreateBufferFromFds( 131 void DrmThread::CreateBufferFromFds(
115 gfx::AcceleratedWidget widget, 132 gfx::AcceleratedWidget widget,
116 const gfx::Size& size, 133 const gfx::Size& size,
117 gfx::BufferFormat format, 134 gfx::BufferFormat format,
118 std::vector<base::ScopedFD>&& fds, 135 std::vector<base::ScopedFD>&& fds,
119 const std::vector<gfx::NativePixmapPlane>& planes, 136 const std::vector<gfx::NativePixmapPlane>& planes,
120 scoped_refptr<GbmBuffer>* buffer) { 137 scoped_refptr<GbmBuffer>* buffer) {
121 scoped_refptr<GbmDevice> gbm = 138 scoped_refptr<GbmDevice> gbm =
122 static_cast<GbmDevice*>(device_manager_->GetDrmDevice(widget).get()); 139 static_cast<GbmDevice*>(device_manager_->GetDrmDevice(widget).get());
123 DCHECK(gbm); 140 DCHECK(gbm);
124 *buffer = 141 *buffer = GbmBuffer::CreateBufferFromFds(
125 GbmBuffer::CreateBufferFromFds(gbm, format, size, std::move(fds), planes); 142 gbm, ui::GetFourCCFormatFromBufferFormat(format), size, std::move(fds),
143 planes);
126 } 144 }
127 145
128 void DrmThread::GetScanoutFormats( 146 void DrmThread::GetScanoutFormats(
129 gfx::AcceleratedWidget widget, 147 gfx::AcceleratedWidget widget,
130 std::vector<gfx::BufferFormat>* scanout_formats) { 148 std::vector<gfx::BufferFormat>* scanout_formats) {
131 display_manager_->GetScanoutFormats(widget, scanout_formats); 149 display_manager_->GetScanoutFormats(widget, scanout_formats);
132 } 150 }
133 151
134 void DrmThread::SchedulePageFlip(gfx::AcceleratedWidget widget, 152 void DrmThread::SchedulePageFlip(gfx::AcceleratedWidget widget,
135 const std::vector<OverlayPlane>& planes, 153 const std::vector<OverlayPlane>& planes,
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
255 correction_matrix); 273 correction_matrix);
256 } 274 }
257 275
258 // DrmThread requires a BindingSet instead of a simple Binding because it will 276 // DrmThread requires a BindingSet instead of a simple Binding because it will
259 // be used from multiple threads in multiple processes. 277 // be used from multiple threads in multiple processes.
260 void DrmThread::AddBinding(ozone::mojom::DeviceCursorRequest request) { 278 void DrmThread::AddBinding(ozone::mojom::DeviceCursorRequest request) {
261 bindings_.AddBinding(this, std::move(request)); 279 bindings_.AddBinding(this, std::move(request));
262 } 280 }
263 281
264 } // namespace ui 282 } // namespace ui
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698