diff options
Diffstat (limited to 'video/out/hwdec/hwdec_vaapi_vk.c')
-rw-r--r-- | video/out/hwdec/hwdec_vaapi_vk.c | 26 |
1 files changed, 26 insertions, 0 deletions
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 <http://www.gnu.org/licenses/>. */ +#include <errno.h> +#include <unistd.h> + #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), |