diff --git a/cogl/cogl/cogl-renderer.c b/cogl/cogl/cogl-renderer.c index ecb203fc9..ee1b0284d 100644 --- a/cogl/cogl/cogl-renderer.c +++ b/cogl/cogl/cogl-renderer.c @@ -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, diff --git a/cogl/cogl/cogl-renderer.h b/cogl/cogl/cogl-renderer.h index ab3e0afcb..a31d42f4b 100644 --- a/cogl/cogl/cogl-renderer.h +++ b/cogl/cogl/cogl-renderer.h @@ -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 diff --git a/cogl/cogl/winsys/cogl-winsys-private.h b/cogl/cogl/winsys/cogl-winsys-private.h index 0606243a7..65ab79cf1 100644 --- a/cogl/cogl/winsys/cogl-winsys-private.h +++ b/cogl/cogl/winsys/cogl-winsys-private.h @@ -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, diff --git a/src/backends/native/meta-renderer-native.c b/src/backends/native/meta-renderer-native.c index 3b040f74c..4654c16d4 100644 --- a/src/backends/native/meta-renderer-native.c +++ b/src/backends/native/meta-renderer-native.c @@ -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;