From fba1c681b89502586a5ad467b729ed3878cacd3a Mon Sep 17 00:00:00 2001 From: Philip Langdale Date: Wed, 2 Oct 2019 11:13:21 -0700 Subject: vo_gpu: hwdec_vaapi: handle lack of object size with AMD drivers It turns out that the AMD driver doesn't bother to set the size field in the descriptor for an exported VA surface. I guess they assume the caller can always use lseek() and don't bother. So, we need to use lseek() in these situations. Modified-by: Niklas Haas Guarded this behind PL_API_VER >= 88 to prevent it from exploding on older libplacebo versions, where vaapi support does not yet work properly on AMD due to lack of DRM modifiers. --- video/out/hwdec/hwdec_vaapi_vk.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/video/out/hwdec/hwdec_vaapi_vk.c b/video/out/hwdec/hwdec_vaapi_vk.c index 7f09a7e895..1cee9e86b9 100644 --- a/video/out/hwdec/hwdec_vaapi_vk.c +++ b/video/out/hwdec/hwdec_vaapi_vk.c @@ -15,6 +15,9 @@ * License along with mpv. If not, see . */ +#include +#include + #include "config.h" #include "hwdec_vaapi.h" #include "video/out/placebo/ra_pl.h" @@ -41,6 +44,29 @@ static bool vaapi_vk_map(struct ra_hwdec_mapper *mapper) uint32_t size = p->desc.objects[id].size; uint32_t offset = p->desc.layers[n].offset[0]; +#if PL_API_VER >= 88 + // AMD drivers do not return the size in the surface description, so we + // need to query it manually. The reason we guard this logic behind + // PL_API_VER >= 88 is that the same drivers also require DRM format + // modifier support in order to not produce corrupted textures, so + // having this #ifdef merely exists to protect users from combining + // too-new mpv with too-old libplacebo. + if (size == 0) { + size = lseek(fd, 0, SEEK_END); + if (size == -1) { + MP_ERR(mapper, "Cannot obtain size of object with fd %d: %s\n", + fd, mp_strerror(errno)); + return false; + } + off_t err = lseek(fd, 0, SEEK_SET); + if (err == -1) { + MP_ERR(mapper, "Failed to reset offset for fd %d: %s\n", + fd, mp_strerror(errno)); + return false; + } + } +#endif + struct pl_tex_params tex_params = { .w = mp_image_plane_w(&p->layout, n), .h = mp_image_plane_h(&p->layout, n), -- cgit v1.2.3