| OLD | NEW |
| 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); |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |