cogl/renderer: Add 'is_dma_buf_supported()' vfunc

Returns TRUE if the active renderer backend can allocate DMA buffers.
This is the case hardware accelerated GBM backends, but FALSE for
surfaceless (i.e. no render node) and EGLDevice (legacy NVIDIA paths).
While software based gbm devices can allocate DMA buffers, we don't want
to allocate them for offscreen rendering, as we really only use these
for inter process transfers, and as buffers allocated for scanout
doesn't use the relevant API, making it return FALSE for these solves
that.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1939>
This commit is contained in:
Jonas Ådahl 2021-11-25 17:15:54 +01:00 committed by Marge Bot
parent d838460fe9
commit 49ac60e346
4 changed files with 62 additions and 10 deletions

View File

@ -773,6 +773,17 @@ cogl_renderer_create_dma_buf (CoglRenderer *renderer,
return NULL; return NULL;
} }
gboolean
cogl_renderer_is_dma_buf_supported (CoglRenderer *renderer)
{
const CoglWinsysVtable *winsys = _cogl_renderer_get_winsys (renderer);
if (winsys->renderer_is_dma_buf_supported)
return winsys->renderer_is_dma_buf_supported (renderer);
else
return FALSE;
}
void void
cogl_renderer_bind_api (CoglRenderer *renderer) cogl_renderer_bind_api (CoglRenderer *renderer)
{ {

View File

@ -419,6 +419,16 @@ cogl_renderer_create_dma_buf (CoglRenderer *renderer,
int height, int height,
GError **error); GError **error);
/**
* cogl_renderer_is_dma_buf_supported: (skip)
* @renderer: A #CoglRenderer
*
* Returns: %TRUE if DMA buffers can be allocated
*/
COGL_EXPORT gboolean
cogl_renderer_is_dma_buf_supported (CoglRenderer *renderer);
/** /**
* cogl_renderer_bind_api: (skip) * cogl_renderer_bind_api: (skip)
*/ */

View File

@ -73,11 +73,12 @@ typedef struct _CoglWinsysVtable
GCallback GCallback
(*renderer_get_proc_address) (CoglRenderer *renderer, (*renderer_get_proc_address) (CoglRenderer *renderer,
const char *name, const char *name,
gboolean in_core); gboolean in_core);
gboolean gboolean
(*renderer_connect) (CoglRenderer *renderer, GError **error); (*renderer_connect) (CoglRenderer *renderer,
GError **error);
void void
(*renderer_disconnect) (CoglRenderer *renderer); (*renderer_disconnect) (CoglRenderer *renderer);
@ -86,7 +87,8 @@ typedef struct _CoglWinsysVtable
(*renderer_outputs_changed) (CoglRenderer *renderer); (*renderer_outputs_changed) (CoglRenderer *renderer);
gboolean gboolean
(*display_setup) (CoglDisplay *display, GError **error); (*display_setup) (CoglDisplay *display,
GError **error);
void void
(*display_destroy) (CoglDisplay *display); (*display_destroy) (CoglDisplay *display);
@ -97,11 +99,15 @@ typedef struct _CoglWinsysVtable
int height, int height,
GError **error); GError **error);
gboolean
(*renderer_is_dma_buf_supported) (CoglRenderer *renderer);
void void
(*renderer_bind_api) (CoglRenderer *renderer); (*renderer_bind_api) (CoglRenderer *renderer);
gboolean gboolean
(*context_init) (CoglContext *context, GError **error); (*context_init) (CoglContext *context,
GError **error);
void void
(*context_deinit) (CoglContext *context); (*context_deinit) (CoglContext *context);
@ -115,15 +121,15 @@ typedef struct _CoglWinsysVtable
(*texture_pixmap_x11_free) (CoglTexturePixmapX11 *tex_pixmap); (*texture_pixmap_x11_free) (CoglTexturePixmapX11 *tex_pixmap);
gboolean gboolean
(*texture_pixmap_x11_update) (CoglTexturePixmapX11 *tex_pixmap, (*texture_pixmap_x11_update) (CoglTexturePixmapX11 *tex_pixmap,
CoglTexturePixmapStereoMode stereo_mode, CoglTexturePixmapStereoMode stereo_mode,
gboolean needs_mipmap); gboolean needs_mipmap);
void void
(*texture_pixmap_x11_damage_notify) (CoglTexturePixmapX11 *tex_pixmap); (*texture_pixmap_x11_damage_notify) (CoglTexturePixmapX11 *tex_pixmap);
CoglTexture * CoglTexture *
(*texture_pixmap_x11_get_texture) (CoglTexturePixmapX11 *tex_pixmap, (*texture_pixmap_x11_get_texture) (CoglTexturePixmapX11 *tex_pixmap,
CoglTexturePixmapStereoMode stereo_mode); CoglTexturePixmapStereoMode stereo_mode);
#endif #endif
@ -131,10 +137,12 @@ typedef struct _CoglWinsysVtable
(*fence_add) (CoglContext *ctx); (*fence_add) (CoglContext *ctx);
gboolean gboolean
(*fence_is_complete) (CoglContext *ctx, void *fence); (*fence_is_complete) (CoglContext *ctx,
void *fence);
void void
(*fence_destroy) (CoglContext *ctx, void *fence); (*fence_destroy) (CoglContext *ctx,
void *fence);
} CoglWinsysVtable; } CoglWinsysVtable;

View File

@ -970,6 +970,27 @@ meta_renderer_native_create_dma_buf (CoglRenderer *cogl_renderer,
return NULL; return NULL;
} }
static gboolean
meta_renderer_native_is_dma_buf_supported (CoglRenderer *cogl_renderer)
{
CoglRendererEGL *cogl_renderer_egl = cogl_renderer->winsys;
MetaRendererNativeGpuData *renderer_gpu_data = cogl_renderer_egl->platform;
MetaRenderDevice *render_device = renderer_gpu_data->render_device;
switch (renderer_gpu_data->mode)
{
case META_RENDERER_NATIVE_MODE_GBM:
return meta_render_device_is_hardware_accelerated (render_device);
case META_RENDERER_NATIVE_MODE_SURFACELESS:
#ifdef HAVE_EGL_DEVICE
case META_RENDERER_NATIVE_MODE_EGL_DEVICE:
#endif
return FALSE;
}
g_assert_not_reached ();
}
static gboolean static gboolean
meta_renderer_native_init_egl_context (CoglContext *cogl_context, meta_renderer_native_init_egl_context (CoglContext *cogl_context,
GError **error) GError **error)
@ -1114,6 +1135,8 @@ get_native_cogl_winsys_vtable (CoglRenderer *cogl_renderer)
vtable.renderer_connect = meta_renderer_native_connect; vtable.renderer_connect = meta_renderer_native_connect;
vtable.renderer_disconnect = meta_renderer_native_disconnect; vtable.renderer_disconnect = meta_renderer_native_disconnect;
vtable.renderer_create_dma_buf = meta_renderer_native_create_dma_buf; vtable.renderer_create_dma_buf = meta_renderer_native_create_dma_buf;
vtable.renderer_is_dma_buf_supported =
meta_renderer_native_is_dma_buf_supported;
vtable_inited = TRUE; vtable_inited = TRUE;
} }