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>
This commit is contained in:
Jonas Ådahl 2021-05-05 10:06:20 +02:00
parent bece36b4ad
commit e078718180
6 changed files with 175 additions and 0 deletions

View File

@ -25,6 +25,7 @@
#include "backends/native/meta-drm-buffer-dumb.h" #include "backends/native/meta-drm-buffer-dumb.h"
#include <drm_fourcc.h>
#include <gio/gio.h> #include <gio/gio.h>
#include <xf86drm.h> #include <xf86drm.h>
#include <fcntl.h> #include <fcntl.h>
@ -44,6 +45,7 @@ struct _MetaDrmBufferDumb
int stride_bytes; int stride_bytes;
uint32_t drm_format; uint32_t drm_format;
int dmabuf_fd; int dmabuf_fd;
int offset;
}; };
G_DEFINE_TYPE (MetaDrmBufferDumb, meta_drm_buffer_dumb, META_TYPE_DRM_BUFFER) 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; 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 static int
handle_to_dmabuf_fd (MetaDrmBufferDumb *buffer_dumb, handle_to_dmabuf_fd (MetaDrmBufferDumb *buffer_dumb,
GError **error) GError **error)
@ -196,6 +276,7 @@ init_dumb_buffer (MetaDrmBufferDumb *buffer_dumb,
buffer_dumb->height = height; buffer_dumb->height = height;
buffer_dumb->stride_bytes = create_arg.pitch; buffer_dumb->stride_bytes = create_arg.pitch;
buffer_dumb->drm_format = format; buffer_dumb->drm_format = format;
buffer_dumb->offset = map_arg.offset;
return TRUE; 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_width = meta_drm_buffer_dumb_get_width;
buffer_class->get_height = meta_drm_buffer_dumb_get_height; buffer_class->get_height = meta_drm_buffer_dumb_get_height;
buffer_class->get_stride = meta_drm_buffer_dumb_get_stride; 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_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;
} }

View File

@ -81,6 +81,14 @@ meta_drm_buffer_gbm_get_stride (MetaDrmBuffer *buffer)
return gbm_bo_get_stride (buffer_gbm->bo); 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 static uint32_t
meta_drm_buffer_gbm_get_format (MetaDrmBuffer *buffer) 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); 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 static gboolean
init_fb_id (MetaDrmBufferGbm *buffer_gbm, init_fb_id (MetaDrmBufferGbm *buffer_gbm,
struct gbm_bo *bo, 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_width = meta_drm_buffer_gbm_get_width;
buffer_class->get_height = meta_drm_buffer_gbm_get_height; buffer_class->get_height = meta_drm_buffer_gbm_get_height;
buffer_class->get_stride = meta_drm_buffer_gbm_get_stride; 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_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; buffer_class->fill_timings = meta_drm_buffer_gbm_fill_timings;
} }

View File

@ -68,6 +68,14 @@ meta_drm_buffer_import_get_stride (MetaDrmBuffer *buffer)
return meta_drm_buffer_get_stride (META_DRM_BUFFER (buffer_import->importee)); 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 static uint32_t
meta_drm_buffer_import_get_format (MetaDrmBuffer *buffer) 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)); 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 * static struct gbm_bo *
dmabuf_to_gbm_bo (struct gbm_device *importer, dmabuf_to_gbm_bo (struct gbm_device *importer,
int dmabuf_fd, 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_width = meta_drm_buffer_import_get_width;
buffer_class->get_height = meta_drm_buffer_import_get_height; buffer_class->get_height = meta_drm_buffer_import_get_height;
buffer_class->get_stride = meta_drm_buffer_import_get_stride; 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_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;
} }

View File

@ -39,10 +39,17 @@ struct _MetaDrmBufferClass
{ {
GObjectClass parent_class; GObjectClass parent_class;
int (* export_fd) (MetaDrmBuffer *buffer,
GError **error);
int (* get_width) (MetaDrmBuffer *buffer); int (* get_width) (MetaDrmBuffer *buffer);
int (* get_height) (MetaDrmBuffer *buffer); int (* get_height) (MetaDrmBuffer *buffer);
int (* get_stride) (MetaDrmBuffer *buffer); int (* get_stride) (MetaDrmBuffer *buffer);
int (* get_bpp) (MetaDrmBuffer *buffer);
uint32_t (* get_format) (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, gboolean (* fill_timings) (MetaDrmBuffer *buffer,
CoglFrameInfo *info, CoglFrameInfo *info,

View File

@ -179,12 +179,31 @@ meta_drm_buffer_get_stride (MetaDrmBuffer *buffer)
return META_DRM_BUFFER_GET_CLASS (buffer)->get_stride (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 uint32_t
meta_drm_buffer_get_format (MetaDrmBuffer *buffer) meta_drm_buffer_get_format (MetaDrmBuffer *buffer)
{ {
return META_DRM_BUFFER_GET_CLASS (buffer)->get_format (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 gboolean
meta_drm_buffer_supports_fill_timings (MetaDrmBuffer *buffer) meta_drm_buffer_supports_fill_timings (MetaDrmBuffer *buffer)
{ {

View File

@ -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_stride (MetaDrmBuffer *buffer);
int meta_drm_buffer_get_bpp (MetaDrmBuffer *buffer);
uint32_t meta_drm_buffer_get_format (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_supports_fill_timings (MetaDrmBuffer *buffer);
gboolean meta_drm_buffer_fill_timings (MetaDrmBuffer *buffer, gboolean meta_drm_buffer_fill_timings (MetaDrmBuffer *buffer,