cogl/renderer: Add API to query DRM format modifiers

Will be used to do explicit modifier buffer allocation via the Cogl API.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3900>
This commit is contained in:
Jonas Ådahl 2022-12-16 17:33:11 +01:00 committed by Marge Bot
parent 78cfbb57eb
commit e3f743facc
4 changed files with 69 additions and 0 deletions

View File

@ -594,6 +594,28 @@ cogl_renderer_get_driver (CoglRenderer *renderer)
return renderer->driver;
}
GArray *
cogl_renderer_query_drm_modifiers (CoglRenderer *renderer,
CoglPixelFormat format,
CoglDrmModifierFilter filter,
GError **error)
{
const CoglWinsysVtable *winsys = _cogl_renderer_get_winsys (renderer);
if (winsys->renderer_query_drm_modifiers)
{
return winsys->renderer_query_drm_modifiers (renderer,
format,
filter,
error);
}
g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
"CoglRenderer doesn't support querying drm modifiers");
return NULL;
}
CoglDmaBufHandle *
cogl_renderer_create_dma_buf (CoglRenderer *renderer,
CoglPixelFormat format,

View File

@ -225,6 +225,18 @@ COGL_EXPORT CoglDriver
cogl_renderer_get_driver (CoglRenderer *renderer);
/**
* cogl_renderer_query_drm_modifiers: (skip)
* @renderer: A #CoglRenderer
* @format: The #CoglPixelFormat
* @error: (nullable): return location for a #GError
*/
COGL_EXPORT GArray *
cogl_renderer_query_drm_modifiers (CoglRenderer *renderer,
CoglPixelFormat format,
CoglDrmModifierFilter filter,
GError **error);
/**
* cogl_renderer_create_dma_buf: (skip)
* @renderer: A #CoglRenderer

View File

@ -107,6 +107,12 @@ typedef struct _CoglWinsysVtable
void
(*display_destroy) (CoglDisplay *display);
GArray *
(* renderer_query_drm_modifiers) (CoglRenderer *renderer,
CoglPixelFormat format,
CoglDrmModifierFilter filter,
GError **error);
CoglDmaBufHandle *
(*renderer_create_dma_buf) (CoglRenderer *renderer,
CoglPixelFormat format,

View File

@ -954,6 +954,34 @@ meta_renderer_native_queue_mode_set_update (MetaRendererNative *renderer_native,
meta_kms_update_free (new_kms_update);
}
static GArray *
meta_renderer_native_query_drm_modifiers (CoglRenderer *cogl_renderer,
CoglPixelFormat format,
CoglDrmModifierFilter filter,
GError **error)
{
CoglRendererEGL *cogl_renderer_egl = cogl_renderer->winsys;
MetaRendererNativeGpuData *renderer_gpu_data = cogl_renderer_egl->platform;
const MetaFormatInfo *format_info;
uint32_t drm_format;
MetaRenderDevice *render_device;
format_info = meta_format_info_from_cogl_format (format);
if (!format_info)
{
g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND,
"Format %s not supported",
cogl_pixel_format_to_string (format));
return NULL;
}
drm_format = format_info->drm_format;
render_device = renderer_gpu_data->render_device;
return meta_render_device_query_drm_modifiers (render_device, drm_format,
filter, error);
}
static void
close_fds (int *fds,
int n_fds)
@ -1304,6 +1332,7 @@ get_native_cogl_winsys_vtable (CoglRenderer *cogl_renderer)
vtable.renderer_connect = meta_renderer_native_connect;
vtable.renderer_disconnect = meta_renderer_native_disconnect;
vtable.renderer_query_drm_modifiers = meta_renderer_native_query_drm_modifiers;
vtable.renderer_create_dma_buf = meta_renderer_native_create_dma_buf;
vtable.renderer_is_dma_buf_supported =
meta_renderer_native_is_dma_buf_supported;