swayfx-mosaic/tooling/probes/step20c-commit-present-input/surface-ordering.patch

44 lines
2.1 KiB
Diff

--- a/sway/desktop/xdg_shell.c
+++ b/sway/desktop/xdg_shell.c
@@ -1,6 +1,8 @@
#include <float.h>
+#include <inttypes.h>
#include <stdbool.h>
#include <stdlib.h>
+#include <time.h>
#include <wayland-server-core.h>
#include <wlr/types/wlr_xdg_shell.h>
#include <wlr/types/wlr_xdg_toplevel_tag_v1.h>
@@ -293,6 +295,32 @@
wl_container_of(listener, xdg_shell_view, commit);
struct sway_view *view = &xdg_shell_view->view;
struct wlr_xdg_surface *xdg_surface = view->wlr_xdg_toplevel->base;
+ // CONTRACT: opt-out permits a same-workload trace-overhead comparison;
+ // the switch changes only this log site, not the backend scheduler.
+ if (getenv("CPI_SURFACE_TRACE") == NULL ||
+ getenv("CPI_SURFACE_TRACE")[0] != '0') {
+ struct wlr_surface *surface = xdg_surface->surface;
+ struct timespec ordering_now;
+ clock_gettime(CLOCK_MONOTONIC, &ordering_now);
+ // WHY: this callback observes the applied Wayland input state, independently
+ // of output submission and presentation. Surface IDs expire at destruction.
+ // CONTRACT: record state only; never alter scheduling or current.input.
+ // INVARIANT: an input-only commit may change hit without a new client buffer.
+ const pixman_box32_t *input_bounds = pixman_region32_extents(&surface->input_region);
+ sway_log(SWAY_INFO, "ORDER_SURFACE_COMMIT ns=%" PRIu64
+ " surface=%p resource=%u seq=%" PRIu32 " committed=%" PRIu32
+ " input_changed=%d buffer_changed=%d input_rects=%d"
+ " input_bounds=%d,%d,%d,%d width=%d height=%d sample_accepts=%d",
+ (uint64_t)ordering_now.tv_sec * UINT64_C(1000000000) + ordering_now.tv_nsec,
+ (void *)surface, wl_resource_get_id(surface->resource), surface->current.seq,
+ surface->current.committed,
+ !!(surface->current.committed & WLR_SURFACE_STATE_INPUT_REGION),
+ !!(surface->current.committed & WLR_SURFACE_STATE_BUFFER),
+ pixman_region32_n_rects(&surface->input_region),
+ input_bounds->x1, input_bounds->y1, input_bounds->x2, input_bounds->y2,
+ surface->current.width, surface->current.height,
+ wlr_surface_point_accepts_input(surface, 100, 150));
+ }
if (xdg_surface->initial_commit) {
if (view->xdg_decoration != NULL) {