From e078718180c0cbd65d406336473a4657e2e7414f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Wed, 5 May 2021 10:06:20 +0200 Subject: [PATCH] drm-buffer: Add getters for more metadata Mostly calls into gbm_bo_* API, or something somewhat similar when on dumb buffers. Added API are: * get offset for plane * get bpp (bits per pixel) * get modifier This will allow users of MetaDrmBuffer to avoid having to "extract" the gbm_bo to get these metadata. Part-of: --- src/backends/native/meta-drm-buffer-dumb.c | 84 +++++++++++++++++++ src/backends/native/meta-drm-buffer-gbm.c | 28 +++++++ src/backends/native/meta-drm-buffer-import.c | 30 +++++++ src/backends/native/meta-drm-buffer-private.h | 7 ++ src/backends/native/meta-drm-buffer.c | 19 +++++ src/backends/native/meta-drm-buffer.h | 7 ++ 6 files changed, 175 insertions(+) diff --git a/src/backends/native/meta-drm-buffer-dumb.c b/src/backends/native/meta-drm-buffer-dumb.c index d2fcad2f0..91daeb6d4 100644 --- a/src/backends/native/meta-drm-buffer-dumb.c +++ b/src/backends/native/meta-drm-buffer-dumb.c @@ -25,6 +25,7 @@ #include "backends/native/meta-drm-buffer-dumb.h" +#include #include #include #include @@ -44,6 +45,7 @@ struct _MetaDrmBufferDumb int stride_bytes; uint32_t drm_format; int dmabuf_fd; + int offset; }; G_DEFINE_TYPE (MetaDrmBufferDumb, meta_drm_buffer_dumb, META_TYPE_DRM_BUFFER) @@ -80,6 +82,84 @@ meta_drm_buffer_dumb_get_format (MetaDrmBuffer *buffer) return buffer_dumb->drm_format; } +static int +meta_drm_buffer_dumb_get_bpp (MetaDrmBuffer *buffer) +{ + MetaDrmBufferDumb *buffer_dumb = META_DRM_BUFFER_DUMB (buffer); + + switch (buffer_dumb->drm_format) + { + case DRM_FORMAT_C8: + case DRM_FORMAT_R8: + case DRM_FORMAT_RGB332: + case DRM_FORMAT_BGR233: + return 8; + case DRM_FORMAT_GR88: + case DRM_FORMAT_XRGB4444: + case DRM_FORMAT_XBGR4444: + case DRM_FORMAT_RGBX4444: + case DRM_FORMAT_BGRX4444: + case DRM_FORMAT_ARGB4444: + case DRM_FORMAT_ABGR4444: + case DRM_FORMAT_RGBA4444: + case DRM_FORMAT_BGRA4444: + case DRM_FORMAT_XRGB1555: + case DRM_FORMAT_XBGR1555: + case DRM_FORMAT_RGBX5551: + case DRM_FORMAT_BGRX5551: + case DRM_FORMAT_ARGB1555: + case DRM_FORMAT_ABGR1555: + case DRM_FORMAT_RGBA5551: + case DRM_FORMAT_BGRA5551: + case DRM_FORMAT_RGB565: + case DRM_FORMAT_BGR565: + return 16; + case DRM_FORMAT_RGB888: + case DRM_FORMAT_BGR888: + return 24; + case DRM_FORMAT_XRGB8888: + case DRM_FORMAT_XBGR8888: + case DRM_FORMAT_RGBX8888: + case DRM_FORMAT_BGRX8888: + case DRM_FORMAT_ARGB8888: + case DRM_FORMAT_ABGR8888: + case DRM_FORMAT_RGBA8888: + case DRM_FORMAT_BGRA8888: + case DRM_FORMAT_XRGB2101010: + case DRM_FORMAT_XBGR2101010: + case DRM_FORMAT_RGBX1010102: + case DRM_FORMAT_BGRX1010102: + case DRM_FORMAT_ARGB2101010: + case DRM_FORMAT_ABGR2101010: + case DRM_FORMAT_RGBA1010102: + case DRM_FORMAT_BGRA1010102: + return 32; + case DRM_FORMAT_XBGR16161616F: + case DRM_FORMAT_ABGR16161616F: + return 64; + default: + g_warn_if_reached (); + return 0; + } +} + +static int +meta_drm_buffer_dumb_get_offset (MetaDrmBuffer *buffer, + int plane) +{ + MetaDrmBufferDumb *buffer_dumb = META_DRM_BUFFER_DUMB (buffer); + + g_warn_if_fail (plane == 0); + + return buffer_dumb->offset; +} + +static uint32_t +meta_drm_buffer_dumb_get_modifier (MetaDrmBuffer *buffer) +{ + return DRM_FORMAT_MOD_LINEAR; +} + static int handle_to_dmabuf_fd (MetaDrmBufferDumb *buffer_dumb, GError **error) @@ -196,6 +276,7 @@ init_dumb_buffer (MetaDrmBufferDumb *buffer_dumb, buffer_dumb->height = height; buffer_dumb->stride_bytes = create_arg.pitch; buffer_dumb->drm_format = format; + buffer_dumb->offset = map_arg.offset; return TRUE; @@ -283,5 +364,8 @@ meta_drm_buffer_dumb_class_init (MetaDrmBufferDumbClass *klass) 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; + buffer_class->get_bpp = meta_drm_buffer_dumb_get_bpp; buffer_class->get_format = meta_drm_buffer_dumb_get_format; + buffer_class->get_offset = meta_drm_buffer_dumb_get_offset; + buffer_class->get_modifier = meta_drm_buffer_dumb_get_modifier; } diff --git a/src/backends/native/meta-drm-buffer-gbm.c b/src/backends/native/meta-drm-buffer-gbm.c index f011afaca..d417700ff 100644 --- a/src/backends/native/meta-drm-buffer-gbm.c +++ b/src/backends/native/meta-drm-buffer-gbm.c @@ -81,6 +81,14 @@ meta_drm_buffer_gbm_get_stride (MetaDrmBuffer *buffer) return gbm_bo_get_stride (buffer_gbm->bo); } +static int +meta_drm_buffer_gbm_get_bpp (MetaDrmBuffer *buffer) +{ + MetaDrmBufferGbm *buffer_gbm = META_DRM_BUFFER_GBM (buffer); + + return gbm_bo_get_bpp (buffer_gbm->bo); +} + static uint32_t meta_drm_buffer_gbm_get_format (MetaDrmBuffer *buffer) { @@ -89,6 +97,23 @@ meta_drm_buffer_gbm_get_format (MetaDrmBuffer *buffer) return gbm_bo_get_format (buffer_gbm->bo); } +static int +meta_drm_buffer_gbm_get_offset (MetaDrmBuffer *buffer, + int plane) +{ + MetaDrmBufferGbm *buffer_gbm = META_DRM_BUFFER_GBM (buffer); + + return gbm_bo_get_offset (buffer_gbm->bo, plane); +} + +static uint32_t +meta_drm_buffer_gbm_get_modifier (MetaDrmBuffer *buffer) +{ + MetaDrmBufferGbm *buffer_gbm = META_DRM_BUFFER_GBM (buffer); + + return gbm_bo_get_modifier (buffer_gbm->bo); +} + static gboolean init_fb_id (MetaDrmBufferGbm *buffer_gbm, struct gbm_bo *bo, @@ -469,6 +494,9 @@ meta_drm_buffer_gbm_class_init (MetaDrmBufferGbmClass *klass) 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; + buffer_class->get_bpp = meta_drm_buffer_gbm_get_bpp; buffer_class->get_format = meta_drm_buffer_gbm_get_format; + buffer_class->get_offset = meta_drm_buffer_gbm_get_offset; + buffer_class->get_modifier = meta_drm_buffer_gbm_get_modifier; buffer_class->fill_timings = meta_drm_buffer_gbm_fill_timings; } diff --git a/src/backends/native/meta-drm-buffer-import.c b/src/backends/native/meta-drm-buffer-import.c index 77cd138d2..40d11a79c 100644 --- a/src/backends/native/meta-drm-buffer-import.c +++ b/src/backends/native/meta-drm-buffer-import.c @@ -68,6 +68,14 @@ meta_drm_buffer_import_get_stride (MetaDrmBuffer *buffer) return meta_drm_buffer_get_stride (META_DRM_BUFFER (buffer_import->importee)); } +static int +meta_drm_buffer_import_get_bpp (MetaDrmBuffer *buffer) +{ + MetaDrmBufferImport *buffer_import = META_DRM_BUFFER_IMPORT (buffer); + + return meta_drm_buffer_get_bpp (META_DRM_BUFFER (buffer_import->importee)); +} + static uint32_t meta_drm_buffer_import_get_format (MetaDrmBuffer *buffer) { @@ -76,6 +84,25 @@ meta_drm_buffer_import_get_format (MetaDrmBuffer *buffer) return meta_drm_buffer_get_format (META_DRM_BUFFER (buffer_import->importee)); } +static int +meta_drm_buffer_import_get_offset (MetaDrmBuffer *buffer, + int offset) +{ + MetaDrmBufferImport *buffer_import = META_DRM_BUFFER_IMPORT (buffer); + MetaDrmBuffer *importee = META_DRM_BUFFER (buffer_import->importee); + + return meta_drm_buffer_get_offset (importee, offset); +} + +static uint32_t +meta_drm_buffer_import_get_modifier (MetaDrmBuffer *buffer) +{ + MetaDrmBufferImport *buffer_import = META_DRM_BUFFER_IMPORT (buffer); + MetaDrmBuffer *importee = META_DRM_BUFFER (buffer_import->importee); + + return meta_drm_buffer_get_modifier (importee); +} + static struct gbm_bo * dmabuf_to_gbm_bo (struct gbm_device *importer, int dmabuf_fd, @@ -205,5 +232,8 @@ meta_drm_buffer_import_class_init (MetaDrmBufferImportClass *klass) 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; + buffer_class->get_bpp = meta_drm_buffer_import_get_bpp; buffer_class->get_format = meta_drm_buffer_import_get_format; + buffer_class->get_offset = meta_drm_buffer_import_get_offset; + buffer_class->get_modifier = meta_drm_buffer_import_get_modifier; } diff --git a/src/backends/native/meta-drm-buffer-private.h b/src/backends/native/meta-drm-buffer-private.h index a54ce7c31..496191239 100644 --- a/src/backends/native/meta-drm-buffer-private.h +++ b/src/backends/native/meta-drm-buffer-private.h @@ -39,10 +39,17 @@ struct _MetaDrmBufferClass { GObjectClass parent_class; + int (* export_fd) (MetaDrmBuffer *buffer, + GError **error); + int (* get_width) (MetaDrmBuffer *buffer); int (* get_height) (MetaDrmBuffer *buffer); int (* get_stride) (MetaDrmBuffer *buffer); + int (* get_bpp) (MetaDrmBuffer *buffer); uint32_t (* get_format) (MetaDrmBuffer *buffer); + int (* get_offset) (MetaDrmBuffer *buffer, + int plane); + uint32_t (* get_modifier) (MetaDrmBuffer *buffer); gboolean (* fill_timings) (MetaDrmBuffer *buffer, CoglFrameInfo *info, diff --git a/src/backends/native/meta-drm-buffer.c b/src/backends/native/meta-drm-buffer.c index 1da622037..5e60f9a5e 100644 --- a/src/backends/native/meta-drm-buffer.c +++ b/src/backends/native/meta-drm-buffer.c @@ -179,12 +179,31 @@ meta_drm_buffer_get_stride (MetaDrmBuffer *buffer) return META_DRM_BUFFER_GET_CLASS (buffer)->get_stride (buffer); } +int +meta_drm_buffer_get_bpp (MetaDrmBuffer *buffer) +{ + return META_DRM_BUFFER_GET_CLASS (buffer)->get_bpp (buffer); +} + uint32_t meta_drm_buffer_get_format (MetaDrmBuffer *buffer) { return META_DRM_BUFFER_GET_CLASS (buffer)->get_format (buffer); } +int +meta_drm_buffer_get_offset (MetaDrmBuffer *buffer, + int plane) +{ + return META_DRM_BUFFER_GET_CLASS (buffer)->get_offset (buffer, plane); +} + +uint32_t +meta_drm_buffer_get_modifier (MetaDrmBuffer *buffer) +{ + return META_DRM_BUFFER_GET_CLASS (buffer)->get_modifier (buffer); +} + gboolean meta_drm_buffer_supports_fill_timings (MetaDrmBuffer *buffer) { diff --git a/src/backends/native/meta-drm-buffer.h b/src/backends/native/meta-drm-buffer.h index d32135591..c5b152bb8 100644 --- a/src/backends/native/meta-drm-buffer.h +++ b/src/backends/native/meta-drm-buffer.h @@ -42,8 +42,15 @@ int meta_drm_buffer_get_height (MetaDrmBuffer *buffer); int meta_drm_buffer_get_stride (MetaDrmBuffer *buffer); +int meta_drm_buffer_get_bpp (MetaDrmBuffer *buffer); + uint32_t meta_drm_buffer_get_format (MetaDrmBuffer *buffer); +int meta_drm_buffer_get_offset (MetaDrmBuffer *buffer, + int plane); + +uint32_t meta_drm_buffer_get_modifier (MetaDrmBuffer *buffer); + gboolean meta_drm_buffer_supports_fill_timings (MetaDrmBuffer *buffer); gboolean meta_drm_buffer_fill_timings (MetaDrmBuffer *buffer,