1
0
mirror of https://github.com/mpv-player/mpv synced 2025-02-16 12:17:12 +00:00

vo_gpu: hwdec_vaegl: remove support for old-style interop

In vaapi 1.1.0 (which confusingly is libva release 2.1.0), they
introduced a new surface export API that is more efficient, and
we've been supporting that and the old API ever since (Feb 2018).

If we drop support for the old API, we can do some fairly nice cleanup
of the code.

Note that the pkgconfig entries are explicitly versioned by the API
version and not the library version. I confirmed the upstream pkgconfig
files.
This commit is contained in:
Philip Langdale 2019-12-11 17:40:19 -08:00 committed by Philip Langdale
parent eb852dc50c
commit 49cbc5017c
5 changed files with 9 additions and 134 deletions

View File

@ -166,30 +166,15 @@ static int init(struct ra_hwdec *hw)
static void mapper_unmap(struct ra_hwdec_mapper *mapper)
{
struct priv_owner *p_owner = mapper->owner->priv;
VADisplay *display = p_owner->display;
struct priv *p = mapper->priv;
VAStatus status;
p_owner->interop_unmap(mapper);
#if VA_CHECK_VERSION(1, 1, 0)
if (p->surface_acquired) {
for (int n = 0; n < p->desc.num_objects; n++)
close(p->desc.objects[n].fd);
p->surface_acquired = false;
}
#endif
if (p->buffer_acquired) {
status = vaReleaseBufferHandle(display, p->current_image.buf);
CHECK_VA_STATUS(mapper, "vaReleaseBufferHandle()");
p->buffer_acquired = false;
}
if (p->current_image.image_id != VA_INVALID_ID) {
status = vaDestroyImage(display, p->current_image.image_id);
CHECK_VA_STATUS(mapper, "vaDestroyImage()");
p->current_image.image_id = VA_INVALID_ID;
}
}
static void mapper_uninit(struct ra_hwdec_mapper *mapper)
@ -215,8 +200,6 @@ static int mapper_init(struct ra_hwdec_mapper *mapper)
struct priv_owner *p_owner = mapper->owner->priv;
struct priv *p = mapper->priv;
p->current_image.buf = p->current_image.image_id = VA_INVALID_ID;
mapper->dst_params = mapper->src_params;
mapper->dst_params.imgfmt = mapper->src_params.hw_subfmt;
mapper->dst_params.hw_subfmt = 0;
@ -250,10 +233,6 @@ static int mapper_map(struct ra_hwdec_mapper *mapper)
VAStatus status;
VADisplay *display = p_owner->display;
#if VA_CHECK_VERSION(1, 1, 0)
if (p->esh_not_implemented)
goto esh_failed;
status = vaExportSurfaceHandle(display, va_surface_id(mapper->src),
VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME_2,
VA_EXPORT_SURFACE_READ_ONLY |
@ -261,9 +240,7 @@ static int mapper_map(struct ra_hwdec_mapper *mapper)
&p->desc);
if (!CHECK_VA_STATUS_LEVEL(mapper, "vaExportSurfaceHandle()",
p_owner->probing_formats ? MSGL_V : MSGL_ERR)) {
if (status == VA_STATUS_ERROR_UNIMPLEMENTED)
p->esh_not_implemented = true;
goto esh_failed;
goto err;
}
vaSyncSurface(display, va_surface_id(mapper->src));
// No need to error out if sync fails, but good to know if it did.
@ -271,59 +248,16 @@ static int mapper_map(struct ra_hwdec_mapper *mapper)
p->surface_acquired = true;
if (!p_owner->interop_map(mapper))
goto esh_failed;
goto err;
if (p->desc.fourcc == VA_FOURCC_YV12)
MPSWAP(struct ra_tex*, mapper->tex[1], mapper->tex[2]);
return 0;
esh_failed:
if (p->surface_acquired) {
for (int n = 0; n < p->desc.num_objects; n++)
close(p->desc.objects[n].fd);
p->surface_acquired = false;
}
#endif // VA_CHECK_VERSION
if (p_owner->interop_map_legacy) {
VAImage *va_image = &p->current_image;
status = vaDeriveImage(display, va_surface_id(mapper->src), va_image);
if (!CHECK_VA_STATUS(mapper, "vaDeriveImage()"))
goto err;
VABufferInfo buffer_info = {.mem_type = VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME};
status = vaAcquireBufferHandle(display, va_image->buf, &buffer_info);
if (!CHECK_VA_STATUS(mapper, "vaAcquireBufferHandle()"))
goto err;
p->buffer_acquired = true;
int drm_fmts[8] = {
// 1 bytes per component, 1-4 components
MKTAG('R', '8', ' ', ' '), // DRM_FORMAT_R8
MKTAG('G', 'R', '8', '8'), // DRM_FORMAT_GR88
0, // untested (DRM_FORMAT_RGB888?)
0, // untested (DRM_FORMAT_RGBA8888?)
// 2 bytes per component, 1-4 components
MKTAG('R', '1', '6', ' '), // proposed DRM_FORMAT_R16
MKTAG('G', 'R', '3', '2'), // proposed DRM_FORMAT_GR32
0, // N/A
0, // N/A
};
if (!p_owner->interop_map_legacy(mapper, &buffer_info, drm_fmts))
goto err;
if (va_image->format.fourcc == VA_FOURCC_YV12)
MPSWAP(struct ra_tex*, mapper->tex[1], mapper->tex[2]);
return 0;
} else {
mapper_unmap(mapper);
goto err;
}
err:
mapper_unmap(mapper);
if (!p_owner->probing_formats)
MP_FATAL(mapper, "mapping VAAPI EGL image failed\n");
return -1;

View File

@ -34,9 +34,6 @@ struct priv_owner {
void (*interop_uninit)(const struct ra_hwdec_mapper *mapper);
bool (*interop_map)(struct ra_hwdec_mapper *mapper);
bool (*interop_map_legacy)(struct ra_hwdec_mapper *mapper,
const VABufferInfo *buffer_info,
const int *drm_fmts);
void (*interop_unmap)(struct ra_hwdec_mapper *mapper);
};
@ -45,14 +42,8 @@ struct priv {
struct mp_image layout;
struct ra_tex *tex[4];
VAImage current_image;
bool buffer_acquired;
#if VA_CHECK_VERSION(1, 1, 0)
bool esh_not_implemented;
VADRMPRIMESurfaceDescriptor desc;
bool surface_acquired;
#endif
void *interop_mapper_priv;
};

View File

@ -139,7 +139,6 @@ static void vaapi_gl_mapper_uninit(const struct ra_hwdec_mapper *mapper)
static bool vaapi_gl_map(struct ra_hwdec_mapper *mapper)
{
#if VA_CHECK_VERSION(1, 1, 0)
struct priv *p_mapper = mapper->priv;
struct vaapi_gl_mapper_priv *p = p_mapper->interop_mapper_priv;
@ -172,52 +171,6 @@ static bool vaapi_gl_map(struct ra_hwdec_mapper *mapper)
mapper->tex[n] = p_mapper->tex[n];
}
gl->BindTexture(GL_TEXTURE_2D, 0);
#endif
return true;
}
static bool vaapi_gl_map_legacy(struct ra_hwdec_mapper *mapper,
const VABufferInfo *buffer_info,
const int *drm_fmts) {
struct priv *p_mapper = mapper->priv;
struct vaapi_gl_mapper_priv *p = p_mapper->interop_mapper_priv;
GL *gl = ra_gl_get(mapper->ra);
VAImage *va_image = &p_mapper->current_image;
for (int n = 0; n < p_mapper->num_planes; n++) {
int attribs[20] = {EGL_NONE};
int num_attribs = 0;
const struct ra_format *fmt = p_mapper->tex[n]->params.format;
int n_comp = fmt->num_components;
int comp_s = fmt->component_size[n] / 8;
if (n_comp < 1 || n_comp > 3 || comp_s < 1 || comp_s > 2)
return false;
int drm_fmt = drm_fmts[n_comp - 1 + (comp_s - 1) * 4];
if (!drm_fmt)
return false;
ADD_ATTRIB(EGL_LINUX_DRM_FOURCC_EXT, drm_fmt);
ADD_ATTRIB(EGL_WIDTH, p_mapper->tex[n]->params.w);
ADD_ATTRIB(EGL_HEIGHT, p_mapper->tex[n]->params.h);
ADD_ATTRIB(EGL_DMA_BUF_PLANE0_FD_EXT, buffer_info->handle);
ADD_ATTRIB(EGL_DMA_BUF_PLANE0_OFFSET_EXT, va_image->offsets[n]);
ADD_ATTRIB(EGL_DMA_BUF_PLANE0_PITCH_EXT, va_image->pitches[n]);
p->images[n] = p->CreateImageKHR(eglGetCurrentDisplay(),
EGL_NO_CONTEXT, EGL_LINUX_DMA_BUF_EXT, NULL, attribs);
if (!p->images[n])
return false;
gl->BindTexture(GL_TEXTURE_2D, p->gl_textures[n]);
p->EGLImageTargetTexture2DOES(GL_TEXTURE_2D, p->images[n]);
mapper->tex[n] = p_mapper->tex[n];
}
gl->BindTexture(GL_TEXTURE_2D, 0);
return true;
}
@ -262,8 +215,7 @@ bool vaapi_gl_init(const struct ra_hwdec *hw)
p->interop_init = vaapi_gl_mapper_init;
p->interop_uninit = vaapi_gl_mapper_uninit;
p->interop_map = vaapi_gl_map;
p->interop_map_legacy = vaapi_gl_map_legacy;
p->interop_unmap = vaapi_gl_unmap;
return true;
}
}

View File

@ -109,10 +109,8 @@ struct mp_vaapi_ctx *va_initialize(VADisplay *display, struct mp_log *plog,
hwctx->free = free_device_ref;
hwctx->user_opaque = res;
#if VA_CHECK_VERSION(1, 0, 0)
vaSetErrorCallback(display, va_error_callback, res);
vaSetInfoCallback(display, va_info_callback, res);
#endif
int major, minor;
int status = vaInitialize(display, &major, &minor);

View File

@ -726,22 +726,22 @@ video_output_features = [
'name': '--vaapi',
'desc': 'VAAPI acceleration',
'deps': 'libdl && (x11 || wayland || egl-drm)',
'func': check_pkg_config('libva', '>= 0.36.0'),
'func': check_pkg_config('libva', '>= 1.1.0'),
}, {
'name': '--vaapi-x11',
'desc': 'VAAPI (X11 support)',
'deps': 'vaapi && x11',
'func': check_pkg_config('libva-x11', '>= 0.36.0'),
'func': check_pkg_config('libva-x11', '>= 1.1.0'),
}, {
'name': '--vaapi-wayland',
'desc': 'VAAPI (Wayland support)',
'deps': 'vaapi && gl-wayland',
'func': check_pkg_config('libva-wayland', '>= 0.36.0'),
'func': check_pkg_config('libva-wayland', '>= 1.1.0'),
}, {
'name': '--vaapi-drm',
'desc': 'VAAPI (DRM/EGL support)',
'deps': 'vaapi && egl-drm',
'func': check_pkg_config('libva-drm', '>= 0.36.0'),
'func': check_pkg_config('libva-drm', '>= 1.1.0'),
}, {
'name': '--vaapi-x-egl',
'desc': 'VAAPI EGL on X11',