aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--types/wlr_output.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/types/wlr_output.c b/types/wlr_output.c
index 941d3ce8..2eace7cf 100644
--- a/types/wlr_output.c
+++ b/types/wlr_output.c
@@ -398,11 +398,23 @@ struct wlr_output_mode *wlr_output_preferred_mode(struct wlr_output *output) {
return mode;
}
+static void output_state_clear_buffer(struct wlr_output_state *state) {
+ if (!(state->committed & WLR_OUTPUT_STATE_BUFFER)) {
+ return;
+ }
+
+ wlr_buffer_unref(state->buffer);
+ state->buffer = NULL;
+
+ state->committed &= ~WLR_OUTPUT_STATE_BUFFER;
+}
+
bool wlr_output_attach_render(struct wlr_output *output, int *buffer_age) {
if (!output->impl->attach_render(output, buffer_age)) {
return false;
}
+ output_state_clear_buffer(&output->pending);
output->pending.committed |= WLR_OUTPUT_STATE_BUFFER;
output->pending.buffer_type = WLR_OUTPUT_STATE_BUFFER_RENDER;
return true;
@@ -430,8 +442,9 @@ void wlr_output_set_damage(struct wlr_output *output,
}
static void output_state_clear(struct wlr_output_state *state) {
- state->committed = 0;
+ output_state_clear_buffer(state);
pixman_region32_clear(&state->damage);
+ state->committed = 0;
}
bool wlr_output_commit(struct wlr_output *output) {
@@ -488,8 +501,10 @@ bool wlr_output_attach_buffer(struct wlr_output *output,
return false;
}
+ output_state_clear_buffer(&output->pending);
output->pending.committed |= WLR_OUTPUT_STATE_BUFFER;
output->pending.buffer_type = WLR_OUTPUT_STATE_BUFFER_SCANOUT;
+ output->pending.buffer = wlr_buffer_ref(buffer);
return true;
}