From 74381f3bc33d029aab3eb2fd764709211854ef1c Mon Sep 17 00:00:00 2001 From: Alexander Orzechowski Date: Wed, 5 Jan 2022 20:03:52 -0500 Subject: [PATCH] types/wlr_output: Handle subpixel hints through output commits --- include/wlr/interfaces/wlr_output.h | 3 ++- include/wlr/types/wlr_output.h | 2 ++ types/output/output.c | 21 +++++++++++++-------- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/include/wlr/interfaces/wlr_output.h b/include/wlr/interfaces/wlr_output.h index 79cc8ee0..c02a588f 100644 --- a/include/wlr/interfaces/wlr_output.h +++ b/include/wlr/interfaces/wlr_output.h @@ -22,7 +22,8 @@ WLR_OUTPUT_STATE_SCALE | \ WLR_OUTPUT_STATE_TRANSFORM | \ WLR_OUTPUT_STATE_RENDER_FORMAT | \ - WLR_OUTPUT_STATE_ADAPTIVE_SYNC_ENABLED) + WLR_OUTPUT_STATE_ADAPTIVE_SYNC_ENABLED | \ + WLR_OUTPUT_STATE_SUBPIXEL) /** * A backend implementation of wlr_output. diff --git a/include/wlr/types/wlr_output.h b/include/wlr/types/wlr_output.h index 791023d2..f3a02dee 100644 --- a/include/wlr/types/wlr_output.h +++ b/include/wlr/types/wlr_output.h @@ -62,6 +62,7 @@ enum wlr_output_state_field { WLR_OUTPUT_STATE_ADAPTIVE_SYNC_ENABLED = 1 << 6, WLR_OUTPUT_STATE_GAMMA_LUT = 1 << 7, WLR_OUTPUT_STATE_RENDER_FORMAT = 1 << 8, + WLR_OUTPUT_STATE_SUBPIXEL = 1 << 9, }; enum wlr_output_state_mode_type { @@ -80,6 +81,7 @@ struct wlr_output_state { enum wl_output_transform transform; bool adaptive_sync_enabled; uint32_t render_format; + enum wl_output_subpixel subpixel; // only valid if WLR_OUTPUT_STATE_BUFFER struct wlr_buffer *buffer; diff --git a/types/output/output.c b/types/output/output.c index 1c0241fe..e4d45043 100644 --- a/types/output/output.c +++ b/types/output/output.c @@ -328,16 +328,12 @@ void wlr_output_set_render_format(struct wlr_output *output, uint32_t format) { void wlr_output_set_subpixel(struct wlr_output *output, enum wl_output_subpixel subpixel) { if (output->subpixel == subpixel) { + output->pending.committed &= ~WLR_OUTPUT_STATE_SUBPIXEL; return; } - output->subpixel = subpixel; - - struct wl_resource *resource; - wl_resource_for_each(resource, &output->resources) { - send_geometry(resource); - } - wlr_output_schedule_done(output); + output->pending.committed |= WLR_OUTPUT_STATE_SUBPIXEL; + output->pending.subpixel = subpixel; } void wlr_output_set_name(struct wlr_output *output, const char *name) { @@ -634,6 +630,10 @@ static bool output_basic_test(struct wlr_output *output) { wlr_log(WLR_DEBUG, "Tried to set the gamma lut on a disabled output"); return false; } + if (!enabled && output->pending.committed & WLR_OUTPUT_STATE_SUBPIXEL) { + wlr_log(WLR_DEBUG, "Tried to set the subpixel layout on a disabled output"); + return false; + } return true; } @@ -716,6 +716,10 @@ bool wlr_output_commit(struct wlr_output *output) { output->render_format = output->pending.render_format; } + if (output->pending.committed & WLR_OUTPUT_STATE_SUBPIXEL) { + output->subpixel = output->pending.subpixel; + } + output->commit_seq++; bool scale_updated = output->pending.committed & WLR_OUTPUT_STATE_SCALE; @@ -729,7 +733,8 @@ bool wlr_output_commit(struct wlr_output *output) { } bool geometry_updated = output->pending.committed & - (WLR_OUTPUT_STATE_MODE | WLR_OUTPUT_STATE_TRANSFORM); + (WLR_OUTPUT_STATE_MODE | WLR_OUTPUT_STATE_TRANSFORM | + WLR_OUTPUT_STATE_SUBPIXEL); if (geometry_updated || scale_updated) { struct wl_resource *resource; wl_resource_for_each(resource, &output->resources) {