summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2014-08-11 14:03:53 +0200
committerwm4 <wm4@nowhere>2014-08-11 14:03:53 +0200
commit33a8e2a9adc45b6a2cb80cf669624154bf0eeb7d (patch)
treeb8f179a07fb24e88cc620828a86ee4c3d57a952a
parentef9b399020742d7a29fc2265ef587d938d78e63a (diff)
downloadmpv-33a8e2a9adc45b6a2cb80cf669624154bf0eeb7d.tar.bz2
mpv-33a8e2a9adc45b6a2cb80cf669624154bf0eeb7d.tar.xz
vdpau: allocate surfaces by age
Whether this helps is probably questionable and depends on the GPU. But the vaapi code does it too.
-rw-r--r--video/vdpau.c10
-rw-r--r--video/vdpau.h2
2 files changed, 11 insertions, 1 deletions
diff --git a/video/vdpau.c b/video/vdpau.c
index e03d2b7817..754b6d300c 100644
--- a/video/vdpau.c
+++ b/video/vdpau.c
@@ -179,6 +179,7 @@ static struct mp_image *create_ref(struct mp_vdpau_ctx *ctx, int index)
struct surface_entry *e = &ctx->video_surfaces[index];
assert(!e->in_use);
e->in_use = true;
+ e->age = ctx->age_counter++;
struct surface_ref *ref = talloc_ptrtype(NULL, ref);
*ref = (struct surface_ref){ctx, index};
struct mp_image *res =
@@ -237,11 +238,18 @@ static struct mp_image *mp_vdpau_get_surface(struct mp_vdpau_ctx *ctx,
assert(e->chroma == chroma);
assert(e->rgb_format == rgb_format);
assert(e->rgb == rgb);
+ if (surface_index >= 0) {
+ struct surface_entry *other = &ctx->video_surfaces[surface_index];
+ if (other->age < e->age)
+ continue;
+ }
surface_index = n;
- goto done;
}
}
+ if (surface_index >= 0)
+ goto done;
+
// Allocate new surface
for (int n = 0; n < MAX_VIDEO_SURFACES; n++) {
struct surface_entry *e = &ctx->video_surfaces[n];
diff --git a/video/vdpau.h b/video/vdpau.h
index 7fdbbf47bf..6f60165ed1 100644
--- a/video/vdpau.h
+++ b/video/vdpau.h
@@ -56,6 +56,7 @@ struct mp_vdpau_ctx {
// Surface pool
pthread_mutex_t pool_lock;
+ int64_t age_counter;
struct surface_entry {
VdpVideoSurface surface;
VdpOutputSurface osurface;
@@ -65,6 +66,7 @@ struct mp_vdpau_ctx {
VdpChromaType chroma;
bool rgb;
bool in_use;
+ int64_t age;
} video_surfaces[MAX_VIDEO_SURFACES];
};