summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPhilip Langdale <philipl@overt.org>2019-12-11 17:40:19 -0800
committerPhilip Langdale <github.philipl@overt.org>2019-12-28 14:31:34 -0800
commit49cbc5017cf78b2813560e631cf568f52ca4fc4c (patch)
tree3c31589db90301a34fed9f45e7d18b11638da6a1
parenteb852dc50c42ccc68a4a56d03baefc34dc20ebd8 (diff)
downloadmpv-49cbc5017cf78b2813560e631cf568f52ca4fc4c.tar.bz2
mpv-49cbc5017cf78b2813560e631cf568f52ca4fc4c.tar.xz
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.
-rw-r--r--video/out/hwdec/hwdec_vaapi.c74
-rw-r--r--video/out/hwdec/hwdec_vaapi.h9
-rw-r--r--video/out/hwdec/hwdec_vaapi_gl.c50
-rw-r--r--video/vaapi.c2
-rw-r--r--wscript8
5 files changed, 9 insertions, 134 deletions
diff --git a/video/out/hwdec/hwdec_vaapi.c b/video/out/hwdec/hwdec_vaapi.c
index 8eaf0df4e6..62c66e5b29 100644
--- a/video/out/hwdec/hwdec_vaapi.c
+++ b/video/out/hwdec/hwdec_vaapi.c
@@ -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;
diff --git a/video/out/hwdec/hwdec_vaapi.h b/video/out/hwdec/hwdec_vaapi.h
index 05dab02629..471283a0ca 100644
--- a/video/out/hwdec/hwdec_vaapi.h
+++ b/video/out/hwdec/hwdec_vaapi.h
@@ -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;
};
diff --git a/video/out/hwdec/hwdec_vaapi_gl.c b/video/out/hwdec/hwdec_vaapi_gl.c
index 3e3edbed0a..1617167464 100644
--- a/video/out/hwdec/hwdec_vaapi_gl.c
+++ b/video/out/hwdec/hwdec_vaapi_gl.c
@@ -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;
-} \ No newline at end of file
+}
diff --git a/video/vaapi.c b/video/vaapi.c
index accbe573d4..2c6ef337b7 100644
--- a/video/vaapi.c
+++ b/video/vaapi.c
@@ -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);
diff --git a/wscript b/wscript
index def7f77738..a0f6583de5 100644
--- a/wscript
+++ b/wscript
@@ -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',