aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/wlr/interfaces/wlr_output.h3
-rw-r--r--include/wlr/types/wlr_output.h2
-rw-r--r--types/output/output.c21
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) {