Jente Hidskes 2019-05-03 20:53:19 +02:00 committed by Jente Hidskes
parent 9354781f32
commit f23257d170

View file

@ -152,7 +152,7 @@ render_surface(struct wlr_surface *surface, int sx, int sy, void *data)
pixman_region32_union_rect(&damage, &damage, box.x, box.y, box.width, box.height); pixman_region32_union_rect(&damage, &damage, box.x, box.y, box.width, box.height);
pixman_region32_intersect(&damage, &damage, rdata->damage); pixman_region32_intersect(&damage, &damage, rdata->damage);
if (!pixman_region32_not_empty(&damage)) { if (!pixman_region32_not_empty(&damage)) {
goto damage_finish; goto buffer_damage_finish;
} }
float matrix[9]; float matrix[9];
@ -166,7 +166,7 @@ render_surface(struct wlr_surface *surface, int sx, int sy, void *data)
wlr_render_texture_with_matrix(surface->renderer, texture, matrix, 1); wlr_render_texture_with_matrix(surface->renderer, texture, matrix, 1);
} }
damage_finish: buffer_damage_finish:
pixman_region32_fini(&damage); pixman_region32_fini(&damage);
} }
@ -199,21 +199,21 @@ handle_output_damage_frame(struct wl_listener *listener, void *data)
clock_gettime(CLOCK_MONOTONIC, &now); clock_gettime(CLOCK_MONOTONIC, &now);
bool needs_frame; bool needs_frame;
pixman_region32_t damage; pixman_region32_t buffer_damage;
pixman_region32_init(&damage); pixman_region32_init(&buffer_damage);
if (!wlr_output_damage_attach_render(output->damage, &needs_frame, &damage)) { if (!wlr_output_damage_attach_render(output->damage, &needs_frame, &buffer_damage)) {
wlr_log(WLR_ERROR, "Cannot make damage output current"); wlr_log(WLR_ERROR, "Cannot make damage output current");
goto damage_finish; goto buffer_damage_finish;
} }
if (!needs_frame) { if (!needs_frame) {
wlr_log(WLR_DEBUG, "Output doesn't need frame and isn't damaged"); wlr_log(WLR_DEBUG, "Output doesn't need frame and isn't damaged");
goto damage_finish; goto buffer_damage_finish;
} }
wlr_renderer_begin(renderer, output->wlr_output->width, output->wlr_output->height); wlr_renderer_begin(renderer, output->wlr_output->width, output->wlr_output->height);
if (!pixman_region32_not_empty(&damage)) { if (!pixman_region32_not_empty(&buffer_damage)) {
wlr_log(WLR_DEBUG, "Output isn't damaged but needs a buffer frame"); wlr_log(WLR_DEBUG, "Output isn't damaged but needs a buffer frame");
goto renderer_end; goto renderer_end;
} }
@ -226,7 +226,7 @@ handle_output_damage_frame(struct wl_listener *listener, void *data)
float color[4] = {0.3, 0.3, 0.3, 1.0}; float color[4] = {0.3, 0.3, 0.3, 1.0};
int nrects; int nrects;
pixman_box32_t *rects = pixman_region32_rectangles(&damage, &nrects); pixman_box32_t *rects = pixman_region32_rectangles(&buffer_damage, &nrects);
for (int i = 0; i < nrects; i++) { for (int i = 0; i < nrects; i++) {
scissor_output(output->wlr_output, &rects[i]); scissor_output(output->wlr_output, &rects[i]);
wlr_renderer_clear(renderer, color); wlr_renderer_clear(renderer, color);
@ -236,7 +236,7 @@ handle_output_damage_frame(struct wl_listener *listener, void *data)
.output_layout = output->server->output_layout, .output_layout = output->server->output_layout,
.output = output->wlr_output, .output = output->wlr_output,
.when = &now, .when = &now,
.damage = &damage, .damage = &buffer_damage,
}; };
struct cg_view *view; struct cg_view *view;
@ -251,29 +251,35 @@ handle_output_damage_frame(struct wl_listener *listener, void *data)
renderer_end: renderer_end:
/* Draw software cursor in case hardware cursors aren't /* Draw software cursor in case hardware cursors aren't
available. This is a no-op when they are. */ available. This is a no-op when they are. */
wlr_output_render_software_cursors(output->wlr_output, &damage); wlr_output_render_software_cursors(output->wlr_output, &buffer_damage);
wlr_renderer_scissor(renderer, NULL); wlr_renderer_scissor(renderer, NULL);
wlr_renderer_end(renderer); wlr_renderer_end(renderer);
int output_width, output_height; int output_width, output_height;
wlr_output_transformed_resolution(output->wlr_output, &output_width, &output_height); wlr_output_transformed_resolution(output->wlr_output, &output_width, &output_height);
pixman_region32_t output_damage;
pixman_region32_init(&output_damage);
#ifdef DEBUG #ifdef DEBUG
if (output->server->debug_damage_tracking) { if (output->server->debug_damage_tracking) {
pixman_region32_union_rect(&damage, &damage, 0, 0, output_width, output_height); pixman_region32_union_rect(&output_damage, &output_damage, 0, 0, output_width, output_height);
} }
#endif #endif
enum wl_output_transform transform = wlr_output_transform_invert(output->wlr_output->transform); enum wl_output_transform transform = wlr_output_transform_invert(output->wlr_output->transform);
wlr_region_transform(&damage, &damage, transform, output_width, output_height); wlr_region_transform(&output_damage, &output->damage->current, transform, output_width, output_height);
wlr_output_set_damage(output->wlr_output, &output_damage);
pixman_region32_fini(&output_damage);
wlr_output_set_damage(output->wlr_output, &damage);
if (!wlr_output_commit(output->wlr_output)) { if (!wlr_output_commit(output->wlr_output)) {
wlr_log(WLR_ERROR, "Could not commit output"); wlr_log(WLR_ERROR, "Could not commit output");
goto buffer_damage_finish;
} }
damage_finish: buffer_damage_finish:
pixman_region32_fini(&damage); pixman_region32_fini(&buffer_damage);
wl_list_for_each_reverse(view, &output->server->views, link) { wl_list_for_each_reverse(view, &output->server->views, link) {
view_for_each_surface(view, send_frame_done, &now); view_for_each_surface(view, send_frame_done, &now);