| Index: ui/ozone/platform/drm/gpu/gbm_surface_factory.cc
|
| diff --git a/ui/ozone/platform/drm/gpu/gbm_surface_factory.cc b/ui/ozone/platform/drm/gpu/gbm_surface_factory.cc
|
| index 2c0563df8fd6d9b7672168e0ed71498a4665e72f..8b00f3fa22847a350775c769437929dcac4e3092 100644
|
| --- a/ui/ozone/platform/drm/gpu/gbm_surface_factory.cc
|
| +++ b/ui/ozone/platform/drm/gpu/gbm_surface_factory.cc
|
| @@ -7,6 +7,7 @@
|
| #include <gbm.h>
|
|
|
| #include "base/files/file_path.h"
|
| +#include "base/posix/eintr_wrapper.h"
|
| #include "third_party/khronos/EGL/egl.h"
|
| #include "ui/ozone/common/egl_util.h"
|
| #include "ui/ozone/platform/drm/gpu/drm_device_manager.h"
|
| @@ -23,8 +24,26 @@
|
|
|
| namespace ui {
|
|
|
| +namespace {
|
| +
|
| +bool ShareToRenderProcess(int fd, base::FileDescriptor* new_handle) {
|
| + int duped_handle = HANDLE_EINTR(dup(fd));
|
| + if (duped_handle < 0) {
|
| + DPLOG(ERROR) << "dup() failed.";
|
| + *new_handle = base::FileDescriptor();
|
| + return false;
|
| + }
|
| +
|
| + *new_handle = base::FileDescriptor(duped_handle, true);
|
| + return true;
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| GbmSurfaceFactory::GbmSurfaceFactory(bool allow_surfaceless)
|
| - : DrmSurfaceFactory(NULL), allow_surfaceless_(allow_surfaceless) {
|
| + : DrmSurfaceFactory(NULL),
|
| + allow_surfaceless_(allow_surfaceless),
|
| + drm_device_manager_(nullptr) {
|
| }
|
|
|
| GbmSurfaceFactory::~GbmSurfaceFactory() {
|
| @@ -108,14 +127,11 @@ scoped_refptr<ui::NativePixmap> GbmSurfaceFactory::CreateNativePixmap(
|
| gfx::Size size,
|
| BufferFormat format,
|
| BufferUsage usage) {
|
| - if (usage == MAP)
|
| - return nullptr;
|
| -
|
| scoped_refptr<GbmDevice> gbm = GetGbmDevice(widget);
|
| DCHECK(gbm);
|
|
|
| scoped_refptr<GbmBuffer> buffer =
|
| - GbmBuffer::CreateBuffer(gbm, format, size, true);
|
| + GbmBuffer::CreateBuffer(gbm, format, size, usage == SCANOUT);
|
| if (!buffer.get())
|
| return nullptr;
|
|
|
| @@ -126,6 +142,22 @@ scoped_refptr<ui::NativePixmap> GbmSurfaceFactory::CreateNativePixmap(
|
| return pixmap;
|
| }
|
|
|
| +base::FileDescriptor GbmSurfaceFactory::ExportDmaBuf(
|
| + gfx::AcceleratedWidget widget,
|
| + scoped_refptr<NativePixmap> pixmap) {
|
| + scoped_refptr<GbmDevice> gbm = GetGbmDevice(widget);
|
| + DCHECK(gbm);
|
| + DCHECK(pixmap->GetBufferUsage() == NativePixmap::MAP);
|
| +
|
| + base::FileDescriptor dma_buf;
|
| + if (!ShareToRenderProcess(pixmap->GetDmaBufFd(), &dma_buf)) {
|
| + DLOG(ERROR) << "Fail to duplicate a DMA-BUF file descriptor";
|
| + return base::FileDescriptor();
|
| + }
|
| +
|
| + return dma_buf;
|
| +}
|
| +
|
| bool GbmSurfaceFactory::CanShowPrimaryPlaneAsOverlay() {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| return allow_surfaceless_;
|
|
|