[mutter] drm-buffer: Add getters for more metadata



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]