aboutsummaryrefslogtreecommitdiff
path: root/rootston
diff options
context:
space:
mode:
Diffstat (limited to 'rootston')
-rw-r--r--rootston/output.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/rootston/output.c b/rootston/output.c
index 13e78082..f8da9c77 100644
--- a/rootston/output.c
+++ b/rootston/output.c
@@ -31,6 +31,10 @@ static void rotate_child_position(double *sx, double *sy, double sw, double sh,
}
}
+/**
+ * Checks whether a surface at (lx, ly) intersects an output. Sets `box` to the
+ * surface box in the output, in output-local coordinates.
+ */
static bool surface_intersect_output(struct wlr_surface *surface,
struct wlr_output_layout *output_layout, struct wlr_output *wlr_output,
double lx, double ly, struct wlr_box *box) {
@@ -138,10 +142,8 @@ render_subsurfaces:;
struct wlr_surface_state *state = subsurface->surface->current;
double sx = state->subsurface_position.x;
double sy = state->subsurface_position.y;
- double sw = state->buffer_width / state->scale;
- double sh = state->buffer_height / state->scale;
- rotate_child_position(&sx, &sy, sw, sh, surface->current->width,
- surface->current->height, rotation);
+ rotate_child_position(&sx, &sy, state->width, state->height,
+ surface->current->width, surface->current->height, rotation);
render_surface(subsurface->surface, output, when, damage,
lx + sx, ly + sy, rotation);
@@ -297,6 +299,7 @@ static void render_output(struct roots_output *output) {
int buffer_age = -1;
wlr_output_make_current(wlr_output, &buffer_age);
+ // Check if we can use damage tracking
pixman_region32_t damage;
pixman_region32_init(&damage);
if (buffer_age <= 0 || buffer_age - 1 > ROOTS_OUTPUT_PREVIOUS_DAMAGE_LEN) {
@@ -306,8 +309,9 @@ static void render_output(struct roots_output *output) {
} else {
pixman_region32_copy(&damage, &output->damage);
+ // Accumulate damage from old buffers
size_t idx = output->previous_damage_idx;
- for (int i = 0; i < buffer_age - 1; i++) {
+ for (int i = 0; i < buffer_age - 1; ++i) {
int j = (idx + i) % ROOTS_OUTPUT_PREVIOUS_DAMAGE_LEN;
pixman_region32_union(&damage, &damage, &output->previous_damage[j]);
}
@@ -362,11 +366,13 @@ static void render_output(struct roots_output *output) {
goto renderer_end;
}
+ // Render all views
struct roots_view *view;
wl_list_for_each_reverse(view, &desktop->views, link) {
render_view(view, output, &now, &damage);
}
+ // Render drag icons
struct wlr_drag_icon *drag_icon = NULL;
struct roots_seat *seat = NULL;
wl_list_for_each(seat, &server->input->seats, link) {
@@ -398,6 +404,7 @@ renderer_end:
wlr_renderer_end(server->renderer);
wlr_output_swap_buffers(wlr_output, &now, &damage);
output->frame_pending = true;
+ // same as decrementing, but works on unsigned integers
output->previous_damage_idx += ROOTS_OUTPUT_PREVIOUS_DAMAGE_LEN - 1;
output->previous_damage_idx %= ROOTS_OUTPUT_PREVIOUS_DAMAGE_LEN;
pixman_region32_copy(&output->previous_damage[output->previous_damage_idx],
@@ -421,6 +428,7 @@ static void handle_idle_render(void *data) {
static void schedule_render(struct roots_output *output) {
if (!output->frame_pending) {
+ // TODO: ask the backend to send a frame event when appropriate instead
struct wl_event_loop *ev =
wl_display_get_event_loop(output->desktop->server->wl_display);
wl_event_loop_add_idle(ev, handle_idle_render, output);
@@ -480,6 +488,7 @@ static void output_damage_from_surface(struct roots_output *output,
return;
}
+ // TODO: output scale, output transform support
pixman_region32_t damage;
pixman_region32_init(&damage);
pixman_region32_copy(&damage, &surface->current->surface_damage);