summaryrefslogtreecommitdiffstats
path: root/video
diff options
context:
space:
mode:
Diffstat (limited to 'video')
-rw-r--r--video/out/opengl/utils.c28
-rw-r--r--video/out/opengl/utils.h1
-rw-r--r--video/out/vo.h9
3 files changed, 17 insertions, 21 deletions
diff --git a/video/out/opengl/utils.c b/video/out/opengl/utils.c
index cdd8903bc5..13f183f7a0 100644
--- a/video/out/opengl/utils.c
+++ b/video/out/opengl/utils.c
@@ -211,11 +211,11 @@ struct timer_pool {
ra_timer *timer;
bool running; // detect invalid usage
- uint64_t samples[PERF_SAMPLE_COUNT];
+ uint64_t samples[VO_PERF_SAMPLE_COUNT];
int sample_idx;
int sample_count;
- uint64_t avg_sum;
+ uint64_t sum;
uint64_t peak;
};
@@ -269,12 +269,10 @@ void timer_pool_stop(struct timer_pool *pool)
if (res) {
// Input res into the buffer and grab the previous value
uint64_t old = pool->samples[pool->sample_idx];
+ pool->sample_count = MPMIN(pool->sample_count + 1, VO_PERF_SAMPLE_COUNT);
pool->samples[pool->sample_idx++] = res;
- pool->sample_idx %= PERF_SAMPLE_COUNT;
-
- // Update average and sum
- pool->avg_sum = pool->avg_sum + res - old;
- pool->sample_count = MPMIN(pool->sample_count + 1, PERF_SAMPLE_COUNT);
+ pool->sample_idx %= VO_PERF_SAMPLE_COUNT;
+ pool->sum = pool->sum + res - old;
// Update peak if necessary
if (res >= pool->peak) {
@@ -283,7 +281,7 @@ void timer_pool_stop(struct timer_pool *pool)
// It's possible that the last peak was the value we just removed,
// if so we need to scan for the new peak
uint64_t peak = res;
- for (int i = 0; i < PERF_SAMPLE_COUNT; i++)
+ for (int i = 0; i < VO_PERF_SAMPLE_COUNT; i++)
peak = MPMAX(peak, pool->samples[i]);
pool->peak = peak;
}
@@ -296,16 +294,16 @@ struct mp_pass_perf timer_pool_measure(struct timer_pool *pool)
return (struct mp_pass_perf){0};
struct mp_pass_perf res = {
- .count = pool->sample_count,
- .index = (pool->sample_idx - pool->sample_count) % PERF_SAMPLE_COUNT,
+ .last = pool->samples[(pool->sample_idx - 1) % VO_PERF_SAMPLE_COUNT],
+ .avg = pool->sample_count > 0 ? pool->sum / pool->sample_count : 0,
.peak = pool->peak,
- .samples = pool->samples,
+ .count = pool->sample_count,
};
- res.last = pool->samples[(pool->sample_idx - 1) % PERF_SAMPLE_COUNT];
-
- if (pool->sample_count > 0) {
- res.avg = pool->avg_sum / pool->sample_count;
+ int idx = (pool->sample_idx - pool->sample_count);
+ for (int i = 0; i < res.count; i++) {
+ idx %= VO_PERF_SAMPLE_COUNT;
+ res.samples[i] = pool->samples[idx++];
}
return res;
diff --git a/video/out/opengl/utils.h b/video/out/opengl/utils.h
index 8c52680f14..34e459f34c 100644
--- a/video/out/opengl/utils.h
+++ b/video/out/opengl/utils.h
@@ -3,6 +3,7 @@
#include <stdbool.h>
#include <math.h>
+#include "video/out/vo.h"
#include "ra.h"
// A 3x2 matrix, with the translation part separate.
diff --git a/video/out/vo.h b/video/out/vo.h
index c6751c7524..36591cb00d 100644
--- a/video/out/vo.h
+++ b/video/out/vo.h
@@ -143,16 +143,13 @@ struct voctrl_playback_state {
};
// VOCTRL_PERFORMANCE_DATA
-#define PERF_SAMPLE_COUNT 256u
+#define VO_PERF_SAMPLE_COUNT 256u
struct mp_pass_perf {
// times are all in nanoseconds
uint64_t last, avg, peak;
- // this is a ring buffer, indices are relative to index and modulo
- // PERF_SAMPLE_COUNT
- uint64_t *samples;
- int count;
- int index;
+ uint64_t samples[VO_PERF_SAMPLE_COUNT];
+ uint64_t count;
};
#define VO_PASS_PERF_MAX 128