From a1266e19f41b5b1ff91c64b0874189b6d27458f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Wed, 5 May 2021 11:19:13 +0200 Subject: [PATCH] drm-buffer: Add API to export buffer file descriptor Practically ends up in gbm_bo_get_fd(). For dumb buffer, an 'unsupported' error is returned. Part-of: --- src/backends/native/meta-drm-buffer-dumb.c | 10 ++++++++++ src/backends/native/meta-drm-buffer-gbm.c | 19 +++++++++++++++++++ src/backends/native/meta-drm-buffer-import.c | 11 +++++++++++ src/backends/native/meta-drm-buffer.c | 7 +++++++ src/backends/native/meta-drm-buffer.h | 3 +++ 5 files changed, 50 insertions(+) diff --git a/src/backends/native/meta-drm-buffer-dumb.c b/src/backends/native/meta-drm-buffer-dumb.c index 3e4988fcd..b0c713dec 100644 --- a/src/backends/native/meta-drm-buffer-dumb.c +++ b/src/backends/native/meta-drm-buffer-dumb.c @@ -50,6 +50,15 @@ struct _MetaDrmBufferDumb G_DEFINE_TYPE (MetaDrmBufferDumb, meta_drm_buffer_dumb, META_TYPE_DRM_BUFFER) +static int +meta_drm_buffer_dumb_export_fd (MetaDrmBuffer *buffer, + GError **error) +{ + g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + "Can't export fd for dumb buffer"); + return -1; +} + static int meta_drm_buffer_dumb_get_width (MetaDrmBuffer *buffer) { @@ -362,6 +371,7 @@ meta_drm_buffer_dumb_class_init (MetaDrmBufferDumbClass *klass) object_class->finalize = meta_drm_buffer_dumb_finalize; + buffer_class->export_fd = meta_drm_buffer_dumb_export_fd; buffer_class->get_width = meta_drm_buffer_dumb_get_width; buffer_class->get_height = meta_drm_buffer_dumb_get_height; buffer_class->get_stride = meta_drm_buffer_dumb_get_stride; diff --git a/src/backends/native/meta-drm-buffer-gbm.c b/src/backends/native/meta-drm-buffer-gbm.c index 9ad49be0d..7a3abaa6b 100644 --- a/src/backends/native/meta-drm-buffer-gbm.c +++ b/src/backends/native/meta-drm-buffer-gbm.c @@ -57,6 +57,24 @@ meta_drm_buffer_gbm_get_bo (MetaDrmBufferGbm *buffer_gbm) return buffer_gbm->bo; } +static int +meta_drm_buffer_gbm_export_fd (MetaDrmBuffer *buffer, + GError **error) +{ + MetaDrmBufferGbm *buffer_gbm = META_DRM_BUFFER_GBM (buffer); + int fd; + + fd = gbm_bo_get_fd (buffer_gbm->bo); + if (fd == -1) + { + g_set_error (error, G_IO_ERROR, g_io_error_from_errno (errno), + "Failed to export buffer fd: %s", g_strerror (errno)); + return -1; + } + + return fd; +} + static int meta_drm_buffer_gbm_get_width (MetaDrmBuffer *buffer) { @@ -491,6 +509,7 @@ meta_drm_buffer_gbm_class_init (MetaDrmBufferGbmClass *klass) object_class->finalize = meta_drm_buffer_gbm_finalize; + buffer_class->export_fd = meta_drm_buffer_gbm_export_fd; buffer_class->get_width = meta_drm_buffer_gbm_get_width; buffer_class->get_height = meta_drm_buffer_gbm_get_height; buffer_class->get_stride = meta_drm_buffer_gbm_get_stride; diff --git a/src/backends/native/meta-drm-buffer-import.c b/src/backends/native/meta-drm-buffer-import.c index b947bd1f9..4769e5326 100644 --- a/src/backends/native/meta-drm-buffer-import.c +++ b/src/backends/native/meta-drm-buffer-import.c @@ -44,6 +44,16 @@ struct _MetaDrmBufferImport G_DEFINE_TYPE (MetaDrmBufferImport, meta_drm_buffer_import, META_TYPE_DRM_BUFFER) +static int +meta_drm_buffer_import_export_fd (MetaDrmBuffer *buffer, + GError **error) +{ + MetaDrmBufferImport *buffer_import = META_DRM_BUFFER_IMPORT (buffer); + + return meta_drm_buffer_export_fd (META_DRM_BUFFER (buffer_import->importee), + error); +} + static int meta_drm_buffer_import_get_width (MetaDrmBuffer *buffer) { @@ -229,6 +239,7 @@ meta_drm_buffer_import_class_init (MetaDrmBufferImportClass *klass) object_class->finalize = meta_drm_buffer_import_finalize; + buffer_class->export_fd = meta_drm_buffer_import_export_fd; buffer_class->get_width = meta_drm_buffer_import_get_width; buffer_class->get_height = meta_drm_buffer_import_get_height; buffer_class->get_stride = meta_drm_buffer_import_get_stride; diff --git a/src/backends/native/meta-drm-buffer.c b/src/backends/native/meta-drm-buffer.c index 4ec9d820c..09e07b61d 100644 --- a/src/backends/native/meta-drm-buffer.c +++ b/src/backends/native/meta-drm-buffer.c @@ -158,6 +158,13 @@ meta_drm_buffer_release_fb_id (MetaDrmBuffer *buffer) priv->fb_id = 0; } +int +meta_drm_buffer_export_fd (MetaDrmBuffer *buffer, + GError **error) +{ + return META_DRM_BUFFER_GET_CLASS (buffer)->export_fd (buffer, error); +} + uint32_t meta_drm_buffer_get_fb_id (MetaDrmBuffer *buffer) { diff --git a/src/backends/native/meta-drm-buffer.h b/src/backends/native/meta-drm-buffer.h index ac4a83ef7..2a8035d8d 100644 --- a/src/backends/native/meta-drm-buffer.h +++ b/src/backends/native/meta-drm-buffer.h @@ -40,6 +40,9 @@ G_DECLARE_DERIVABLE_TYPE (MetaDrmBuffer, META, DRM_BUFFER, GObject) +int meta_drm_buffer_export_fd (MetaDrmBuffer *buffer, + GError **error); + uint32_t meta_drm_buffer_get_fb_id (MetaDrmBuffer *buffer); int meta_drm_buffer_get_width (MetaDrmBuffer *buffer);