[mutter] drm-buffer: Add getters for more metadata
- From: Marge Bot <marge-bot src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] drm-buffer: Add getters for more metadata
- Date: Mon, 18 Oct 2021 16:45:45 +0000 (UTC)
commit e078718180c0cbd65d406336473a4657e2e7414f
Author: Jonas Ã…dahl <jadahl gmail com>
Date: Wed May 5 10:06:20 2021 +0200
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: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1854>
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 d2fcad2f03..91daeb6d40 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 <drm_fourcc.h>
#include <gio/gio.h>
#include <xf86drm.h>
#include <fcntl.h>
@@ -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 f011afaca1..d417700ff0 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 77cd138d20..40d11a79ca 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 a54ce7c31e..4961912392 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 1da6220372..5e60f9a5ed 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 d321355911..c5b152bb8e 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,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]