From e9e50595895f3b467f36de2babdfdd8f3ba85452 Mon Sep 17 00:00:00 2001 From: Philip Langdale Date: Sun, 31 Jul 2022 12:14:44 -0700 Subject: hwdec/dmabuf_interop: refactor out hwdec_vaapi dependencies With the files renamed, we can now disentangle the shared private struct between the interops and hwdec_vaapi. We need this separation to allow the future drmprime hwdec to use the interops. --- video/out/hwdec/dmabuf_interop.h | 20 ++++++++++---------- video/out/hwdec/dmabuf_interop_gl.c | 30 ++++++++++++++++-------------- video/out/hwdec/dmabuf_interop_pl.c | 16 +++++++++------- video/out/hwdec/hwdec_vaapi.c | 26 ++++++++++++++++++-------- 4 files changed, 53 insertions(+), 39 deletions(-) diff --git a/video/out/hwdec/dmabuf_interop.h b/video/out/hwdec/dmabuf_interop.h index a45a69e5af..65c7845e31 100644 --- a/video/out/hwdec/dmabuf_interop.h +++ b/video/out/hwdec/dmabuf_interop.h @@ -20,21 +20,18 @@ #include #include "config.h" -#include "video/vaapi.h" #include "video/out/gpu/hwdec.h" -struct priv_owner { - struct mp_vaapi_ctx *ctx; - VADisplay *display; - int *formats; - bool probing_formats; // temporary during init +struct dmabuf_interop { bool use_modifiers; bool (*interop_init)(struct ra_hwdec_mapper *mapper, const struct ra_imgfmt_desc *desc); void (*interop_uninit)(const struct ra_hwdec_mapper *mapper); - bool (*interop_map)(struct ra_hwdec_mapper *mapper, bool probing); + bool (*interop_map)(struct ra_hwdec_mapper *mapper, + struct dmabuf_interop *dmabuf_interop, + bool probing); void (*interop_unmap)(struct ra_hwdec_mapper *mapper); }; @@ -49,7 +46,10 @@ struct priv { void *interop_mapper_priv; }; -typedef bool (*dmabuf_interop_init)(const struct ra_hwdec *hw); +typedef bool (*dmabuf_interop_init)(const struct ra_hwdec *hw, + struct dmabuf_interop *dmabuf_interop); -bool dmabuf_interop_gl_init(const struct ra_hwdec *hw); -bool dmabuf_interop_pl_init(const struct ra_hwdec *hw); +bool dmabuf_interop_gl_init(const struct ra_hwdec *hw, + struct dmabuf_interop *dmabuf_interop); +bool dmabuf_interop_pl_init(const struct ra_hwdec *hw, + struct dmabuf_interop *dmabuf_interop); diff --git a/video/out/hwdec/dmabuf_interop_gl.c b/video/out/hwdec/dmabuf_interop_gl.c index 0edd43d370..6ada2a7258 100644 --- a/video/out/hwdec/dmabuf_interop_gl.c +++ b/video/out/hwdec/dmabuf_interop_gl.c @@ -150,17 +150,18 @@ static void vaapi_gl_mapper_uninit(const struct ra_hwdec_mapper *mapper) ADD_ATTRIB(EGL_DMA_BUF_PLANE ## plane ## _OFFSET_EXT, \ p_mapper->desc.layers[n].offset[plane]); \ ADD_ATTRIB(EGL_DMA_BUF_PLANE ## plane ## _PITCH_EXT, \ - p_mapper->desc.layers[n].pitch[plane]); \ - if (p_owner->use_modifiers && drm_format_modifier != DRM_FORMAT_MOD_INVALID) { \ + p_mapper->desc.layers[n].planes[plane].pitch); \ + if (dmabuf_interop->use_modifiers && drm_format_modifier != DRM_FORMAT_MOD_INVALID) { \ ADD_ATTRIB(EGL_DMA_BUF_PLANE ## plane ## _MODIFIER_LO_EXT, drm_format_modifier & 0xfffffffful); \ ADD_ATTRIB(EGL_DMA_BUF_PLANE ## plane ## _MODIFIER_HI_EXT, drm_format_modifier >> 32); \ } \ } while (0) -static bool vaapi_gl_map(struct ra_hwdec_mapper *mapper, bool probing) +static bool vaapi_gl_map(struct ra_hwdec_mapper *mapper, + struct dmabuf_interop *dmabuf_interop, + bool probing) { struct priv *p_mapper = mapper->priv; - struct priv_owner *p_owner = mapper->owner->priv; struct vaapi_gl_mapper_priv *p = p_mapper->interop_mapper_priv; GL *gl = ra_gl_get(mapper->ra); @@ -168,7 +169,7 @@ static bool vaapi_gl_map(struct ra_hwdec_mapper *mapper, bool probing) for (int n = 0; n < p_mapper->num_planes; n++) { if (p_mapper->desc.layers[n].num_planes > 1) { // Should never happen because we request separate layers - MP_ERR(mapper, "Multi-plane VA surfaces are not supported\n"); + MP_ERR(mapper, "Multi-plane surfaces are not supported\n"); return false; } @@ -190,7 +191,7 @@ static bool vaapi_gl_map(struct ra_hwdec_mapper *mapper, bool probing) p->images[n] = p->CreateImageKHR(eglGetCurrentDisplay(), EGL_NO_CONTEXT, EGL_LINUX_DMA_BUF_EXT, NULL, attribs); if (!p->images[n]) { - mp_msg(mapper->log, p_owner->probing_formats ? MSGL_DEBUG : MSGL_ERR, + mp_msg(mapper->log, probing ? MSGL_DEBUG : MSGL_ERR, "Failed to import surface in EGL: %u\n", eglGetError()); return false; } @@ -218,9 +219,9 @@ static void vaapi_gl_unmap(struct ra_hwdec_mapper *mapper) } } -bool dmabuf_interop_gl_init(const struct ra_hwdec *hw) +bool dmabuf_interop_gl_init(const struct ra_hwdec *hw, + struct dmabuf_interop *dmabuf_interop) { - struct priv_owner *p = hw->priv; if (!ra_is_gl(hw->ra)) { // This is not an OpenGL RA. return false; @@ -240,14 +241,15 @@ bool dmabuf_interop_gl_init(const struct ra_hwdec *hw) !(gl->mpgl_caps & MPGL_CAP_TEX_RG)) return false; - p->use_modifiers = gl_check_extension(exts, "EGL_EXT_image_dma_buf_import_modifiers"); + dmabuf_interop->use_modifiers = + gl_check_extension(exts, "EGL_EXT_image_dma_buf_import_modifiers"); - MP_VERBOSE(hw, "using VAAPI EGL interop\n"); + MP_VERBOSE(hw, "using EGL dmabuf interop\n"); - p->interop_init = vaapi_gl_mapper_init; - p->interop_uninit = vaapi_gl_mapper_uninit; - p->interop_map = vaapi_gl_map; - p->interop_unmap = vaapi_gl_unmap; + dmabuf_interop->interop_init = vaapi_gl_mapper_init; + dmabuf_interop->interop_uninit = vaapi_gl_mapper_uninit; + dmabuf_interop->interop_map = vaapi_gl_map; + dmabuf_interop->interop_unmap = vaapi_gl_unmap; return true; } diff --git a/video/out/hwdec/dmabuf_interop_pl.c b/video/out/hwdec/dmabuf_interop_pl.c index 98a749c296..1178975e58 100644 --- a/video/out/hwdec/dmabuf_interop_pl.c +++ b/video/out/hwdec/dmabuf_interop_pl.c @@ -23,7 +23,9 @@ #include "video/out/placebo/ra_pl.h" #include "video/out/placebo/utils.h" -static bool vaapi_pl_map(struct ra_hwdec_mapper *mapper, bool probing) +static bool vaapi_pl_map(struct ra_hwdec_mapper *mapper, + struct dmabuf_interop *dmabuf_interop, + bool probing) { struct priv *p = mapper->priv; pl_gpu gpu = ra_pl_get(mapper->ra); @@ -113,9 +115,9 @@ static void vaapi_pl_unmap(struct ra_hwdec_mapper *mapper) ra_tex_free(mapper->ra, &mapper->tex[n]); } -bool dmabuf_interop_pl_init(const struct ra_hwdec *hw) +bool dmabuf_interop_pl_init(const struct ra_hwdec *hw, + struct dmabuf_interop *dmabuf_interop) { - struct priv_owner *p = hw->priv; pl_gpu gpu = ra_pl_get(hw->ra); if (!gpu) { // This is not a libplacebo RA; @@ -123,15 +125,15 @@ bool dmabuf_interop_pl_init(const struct ra_hwdec *hw) } if (!(gpu->import_caps.tex & PL_HANDLE_DMA_BUF)) { - MP_VERBOSE(hw, "VAAPI libplacebo interop requires support for " + MP_VERBOSE(hw, "libplacebo dmabuf interop requires support for " "PL_HANDLE_DMA_BUF import.\n"); return false; } - MP_VERBOSE(hw, "using VAAPI libplacebo interop\n"); + MP_VERBOSE(hw, "using libplacebo dmabuf interop\n"); - p->interop_map = vaapi_pl_map; - p->interop_unmap = vaapi_pl_unmap; + dmabuf_interop->interop_map = vaapi_pl_map; + dmabuf_interop->interop_unmap = vaapi_pl_unmap; return true; } diff --git a/video/out/hwdec/hwdec_vaapi.c b/video/out/hwdec/hwdec_vaapi.c index b62c68ccc4..f6f7ddaa5d 100644 --- a/video/out/hwdec/hwdec_vaapi.c +++ b/video/out/hwdec/hwdec_vaapi.c @@ -99,6 +99,15 @@ static VADisplay *create_native_va_display(struct ra *ra, struct mp_log *log) static void determine_working_formats(struct ra_hwdec *hw); +struct priv_owner { + struct mp_vaapi_ctx *ctx; + VADisplay *display; + int *formats; + bool probing_formats; // temporary during init + + struct dmabuf_interop dmabuf_interop; +}; + static void uninit(struct ra_hwdec *hw) { struct priv_owner *p = hw->priv; @@ -122,12 +131,12 @@ static int init(struct ra_hwdec *hw) struct priv_owner *p = hw->priv; for (int i = 0; interop_inits[i]; i++) { - if (interop_inits[i](hw)) { + if (interop_inits[i](hw, &p->dmabuf_interop)) { break; } } - if (!p->interop_map || !p->interop_unmap) { + if (!p->dmabuf_interop.interop_map || !p->dmabuf_interop.interop_unmap) { MP_VERBOSE(hw, "VAAPI hwdec only works with OpenGL or Vulkan backends.\n"); return -1; } @@ -169,7 +178,7 @@ static void mapper_unmap(struct ra_hwdec_mapper *mapper) struct priv_owner *p_owner = mapper->owner->priv; struct priv *p = mapper->priv; - p_owner->interop_unmap(mapper); + p_owner->dmabuf_interop.interop_unmap(mapper); if (p->surface_acquired) { for (int n = 0; n < p->desc.num_objects; n++) @@ -181,8 +190,8 @@ static void mapper_unmap(struct ra_hwdec_mapper *mapper) static void mapper_uninit(struct ra_hwdec_mapper *mapper) { struct priv_owner *p_owner = mapper->owner->priv; - if (p_owner->interop_uninit) { - p_owner->interop_uninit(mapper); + if (p_owner->dmabuf_interop.interop_uninit) { + p_owner->dmabuf_interop.interop_uninit(mapper); } } @@ -213,8 +222,8 @@ static int mapper_init(struct ra_hwdec_mapper *mapper) p->num_planes = desc.num_planes; mp_image_set_params(&p->layout, &mapper->dst_params); - if (p_owner->interop_init) - if (!p_owner->interop_init(mapper, &desc)) + if (p_owner->dmabuf_interop.interop_init) + if (!p_owner->dmabuf_interop.interop_init(mapper, &desc)) return -1; if (!p_owner->probing_formats && !check_fmt(mapper, mapper->dst_params.imgfmt)) @@ -267,7 +276,8 @@ static int mapper_map(struct ra_hwdec_mapper *mapper) goto err; } - if (!p_owner->interop_map(mapper, p_owner->probing_formats)) + if (!p_owner->dmabuf_interop.interop_map(mapper, &p_owner->dmabuf_interop, + p_owner->probing_formats)) goto err; if (p->desc.fourcc == VA_FOURCC_YV12) -- cgit v1.2.3