diff options
author | Niklas Haas <git@haasn.dev> | 2022-02-27 11:28:21 +0100 |
---|---|---|
committer | Niklas Haas <github-daiK1o@haasn.dev> | 2022-03-03 13:06:05 +0100 |
commit | bb434a60ed801723c8e3becae019352935539e50 (patch) | |
tree | eb7ac7755d24675a27d7c5c4c16f020545a8ea86 /video | |
parent | e2c02a4ce3af792251839307c42c85aa34bdd125 (diff) | |
download | mpv-bb434a60ed801723c8e3becae019352935539e50.tar.bz2 mpv-bb434a60ed801723c8e3becae019352935539e50.tar.xz |
hwdec: release images as soon as possible after mapping
We don't need to hold on to buffers longer than necessary. Doesn't
matter for vo_gpu but greatly matters for vo_gpu_next, since it persists
hwdec mapped textures for longer periods.
Unfortunately, only provides benefits for hwdecs which do explicit
copies in their decode path, which currently just means cuda and
d3d11va.
Diffstat (limited to 'video')
-rw-r--r-- | video/out/d3d11/hwdec_d3d11va.c | 3 | ||||
-rw-r--r-- | video/out/gpu/hwdec.c | 2 | ||||
-rw-r--r-- | video/out/hwdec/hwdec_cuda.c | 14 |
3 files changed, 15 insertions, 4 deletions
diff --git a/video/out/d3d11/hwdec_d3d11va.c b/video/out/d3d11/hwdec_d3d11va.c index 02f796e003..3006e5c7d0 100644 --- a/video/out/d3d11/hwdec_d3d11va.c +++ b/video/out/d3d11/hwdec_d3d11va.c @@ -206,6 +206,9 @@ static int mapper_map(struct ra_hwdec_mapper *mapper) .bottom = mapper->dst_params.h, .back = 1, }), D3D11_COPY_DISCARD); + + // We no longer need the original texture after copying it. + mp_image_unrefp(&mapper->src); } else { D3D11_TEXTURE2D_DESC desc2d; ID3D11Texture2D_GetDesc(tex, &desc2d); diff --git a/video/out/gpu/hwdec.c b/video/out/gpu/hwdec.c index 4fb6240651..dd2809f41e 100644 --- a/video/out/gpu/hwdec.c +++ b/video/out/gpu/hwdec.c @@ -186,6 +186,8 @@ void ra_hwdec_mapper_unmap(struct ra_hwdec_mapper *mapper) { if (mapper->driver->unmap) mapper->driver->unmap(mapper); + + // Clean up after the image if the mapper didn't already mp_image_unrefp(&mapper->src); } diff --git a/video/out/hwdec/hwdec_cuda.c b/video/out/hwdec/hwdec_cuda.c index 895fb07d61..0fe0f7bda8 100644 --- a/video/out/hwdec/hwdec_cuda.c +++ b/video/out/hwdec/hwdec_cuda.c @@ -253,12 +253,18 @@ static int mapper_map(struct ra_hwdec_mapper *mapper) if (p_owner->do_full_sync) CHECK_CU(cu->cuStreamSynchronize(0)); + // fall through error: - eret = CHECK_CU(cu->cuCtxPopCurrent(&dummy)); - if (eret < 0) - return eret; - return ret; + // Regardless of success or failure, we no longer need the source image, + // because this hwdec makes an explicit memcpy into the mapper textures + mp_image_unrefp(&mapper->src); + + eret = CHECK_CU(cu->cuCtxPopCurrent(&dummy)); + if (eret < 0) + return eret; + + return ret; } const struct ra_hwdec_driver ra_hwdec_cuda = { |