Report average damaged area per frame in performance ticker
parent
0be56b2100
commit
c53ab3bbf5
34
src/main.c
34
src/main.c
|
@ -92,6 +92,7 @@ struct wayvnc {
|
||||||
|
|
||||||
const char* kb_layout;
|
const char* kb_layout;
|
||||||
|
|
||||||
|
uint32_t damage_area_sum;
|
||||||
uint32_t n_frames_captured;
|
uint32_t n_frames_captured;
|
||||||
uint32_t n_frames_rendered;
|
uint32_t n_frames_rendered;
|
||||||
};
|
};
|
||||||
|
@ -520,14 +521,29 @@ void on_output_dimension_change(struct output* output)
|
||||||
wayvnc_start_capture_immediate(self);
|
wayvnc_start_capture_immediate(self);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static uint32_t calculate_region_area(struct pixman_region16* region)
|
||||||
|
{
|
||||||
|
uint32_t area = 0;
|
||||||
|
|
||||||
|
int n_rects = 0;
|
||||||
|
struct pixman_box16* rects = pixman_region_rectangles(region,
|
||||||
|
&n_rects);
|
||||||
|
|
||||||
|
for (int i = 0; i < n_rects; ++i) {
|
||||||
|
int width = rects[i].x2 - rects[i].x1;
|
||||||
|
int height = rects[i].y2 - rects[i].y1;
|
||||||
|
area += width * height;
|
||||||
|
}
|
||||||
|
|
||||||
|
return area;
|
||||||
|
}
|
||||||
|
|
||||||
void wayvnc_process_frame(struct wayvnc* self)
|
void wayvnc_process_frame(struct wayvnc* self)
|
||||||
{
|
{
|
||||||
uint32_t width = output_get_transformed_width(self->selected_output);
|
uint32_t width = output_get_transformed_width(self->selected_output);
|
||||||
uint32_t height = output_get_transformed_height(self->selected_output);
|
uint32_t height = output_get_transformed_height(self->selected_output);
|
||||||
uint32_t format = self->screencopy.back->format;
|
uint32_t format = self->screencopy.back->format;
|
||||||
|
|
||||||
self->n_frames_captured++;
|
|
||||||
|
|
||||||
if ((int)self->selected_output->width != self->screencopy.back->width
|
if ((int)self->selected_output->width != self->screencopy.back->width
|
||||||
|| (int)self->selected_output->height != self->screencopy.back->height) {
|
|| (int)self->selected_output->height != self->screencopy.back->height) {
|
||||||
log_debug("Frame dimensions don't match output. Recapturing frame...\n");
|
log_debug("Frame dimensions don't match output. Recapturing frame...\n");
|
||||||
|
@ -555,6 +571,10 @@ void wayvnc_process_frame(struct wayvnc* self)
|
||||||
self->screencopy.back->height);
|
self->screencopy.back->height);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
self->n_frames_captured++;
|
||||||
|
self->damage_area_sum +=
|
||||||
|
calculate_region_area(&self->screencopy.back->damage);
|
||||||
|
|
||||||
DTRACE_PROBE(wayvnc, refine_damage_start);
|
DTRACE_PROBE(wayvnc, refine_damage_start);
|
||||||
|
|
||||||
struct pixman_region16 txdamage, refined;
|
struct pixman_region16 txdamage, refined;
|
||||||
|
@ -659,11 +679,17 @@ static void on_perf_tick(void* obj)
|
||||||
{
|
{
|
||||||
struct wayvnc* self = aml_get_userdata(obj);
|
struct wayvnc* self = aml_get_userdata(obj);
|
||||||
|
|
||||||
printf("Frames captured: %"PRIu32", rendered: %"PRIu32"\n",
|
double total_area = self->selected_output->width * self->selected_output->height;
|
||||||
self->n_frames_captured, self->n_frames_rendered);
|
double area_avg = (double)self->damage_area_sum / (double)self->n_frames_captured;
|
||||||
|
double relative_area_avg = 100.0 * area_avg / total_area;
|
||||||
|
|
||||||
|
printf("Frames captured: %"PRIu32", rendered: %"PRIu32", average reported frame damage: %.1f %%\n",
|
||||||
|
self->n_frames_captured, self->n_frames_rendered,
|
||||||
|
relative_area_avg);
|
||||||
|
|
||||||
self->n_frames_captured = 0;
|
self->n_frames_captured = 0;
|
||||||
self->n_frames_rendered = 0;
|
self->n_frames_rendered = 0;
|
||||||
|
self->damage_area_sum = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void start_performance_ticker(struct wayvnc* self)
|
static void start_performance_ticker(struct wayvnc* self)
|
||||||
|
|
Loading…
Reference in New Issue