src/output-state.c: add a FPS debug option

Logs the FPS per output every $timeout ms via wlr_log() if enabled.

By default this patch does nothing unless the FPS_TIMEOUT define has
been set, for example via `meson configure build -DFPS_TIMEOUT=5000`.
This commit is contained in:
Consolatis 2024-07-15 04:30:05 +02:00
parent 3be8fe25f3
commit 7a35b1e67c
3 changed files with 33 additions and 0 deletions

View file

@ -371,6 +371,7 @@ struct output {
struct server *server;
struct wlr_output *wlr_output;
struct wlr_output_state pending;
struct wl_event_source *fps_timer;
struct wlr_scene_output *scene_output;
struct wlr_scene_tree *layer_tree[LAB_NR_LAYERS];
struct wlr_scene_tree *layer_popup_tree;
@ -389,6 +390,7 @@ struct output {
bool leased;
bool gamma_lut_changed;
uint32_t frames;
};
#undef LAB_NR_LAYERS

View file

@ -2,9 +2,25 @@
#include <wlr/types/wlr_output.h>
#include <wlr/types/wlr_output_management_v1.h>
#include <wlr/util/log.h>
#include "labwc.h"
#include "output-state.h"
//#define FPS_TIMEOUT (2 * 1000)
#ifdef FPS_TIMEOUT
static int
handle_fps_timer(void *data)
{
struct output *output = data;
wlr_log(WLR_DEBUG, "%s commit: avg %.2f fps",
output->wlr_output->name, (double)output->frames / (FPS_TIMEOUT / 1000));
wl_event_source_timer_update(output->fps_timer, FPS_TIMEOUT);
output->frames = 0;
return 0;
}
#endif
void
output_state_init(struct output *output)
{
@ -37,8 +53,18 @@ bool
wlr_output_commit(struct wlr_output *wlr_output)
{
struct output *output = wlr_output->data;
#ifdef FPS_TIMEOUT
if (!output->fps_timer) {
output->fps_timer = wl_event_loop_add_timer(
output->server->wl_event_loop, handle_fps_timer, output);
wl_event_source_timer_update(output->fps_timer, FPS_TIMEOUT);
}
#endif
bool committed = wlr_output_commit_state(wlr_output, &output->pending);
if (committed) {
#ifdef FPS_TIMEOUT
output->frames++;
#endif
wlr_output_state_finish(&output->pending);
wlr_output_state_init(&output->pending);
} else {

View file

@ -168,6 +168,11 @@ output_destroy_notify(struct wl_listener *listener, void *data)
*/
output->wlr_output->data = NULL;
if (output->fps_timer) {
wl_event_source_remove(output->fps_timer);
output->fps_timer = NULL;
}
/*
* output->scene_output (if still around at this point) is
* destroyed automatically when the wlr_output is destroyed