Merge branch 'kms-plane-color-pipeline' into 'master'

Draft: backend/drm: add support for plane color pipelines

See merge request wlroots/wlroots!5220
This commit is contained in:
Simon Ser 2026-06-13 15:12:52 +00:00
commit e3a6813e38
11 changed files with 549 additions and 36 deletions

View file

@ -252,12 +252,21 @@ static void output_apply_state(struct wlr_output *output,
}
}
if (state->committed & WLR_OUTPUT_STATE_COLOR_TRANSFORM) {
wlr_color_transform_unref(output->color_transform);
if (state->color_transform != NULL) {
output->color_transform = wlr_color_transform_ref(state->color_transform);
if (state->committed & WLR_OUTPUT_STATE_PRE_COLOR_TRANSFORM) {
wlr_color_transform_unref(output->pre_color_transform);
if (state->pre_color_transform != NULL) {
output->pre_color_transform = wlr_color_transform_ref(state->pre_color_transform);
} else {
output->color_transform = NULL;
output->pre_color_transform = NULL;
}
}
if (state->committed & WLR_OUTPUT_STATE_POST_COLOR_TRANSFORM) {
wlr_color_transform_unref(output->post_color_transform);
if (state->post_color_transform != NULL) {
output->post_color_transform = wlr_color_transform_ref(state->post_color_transform);
} else {
output->post_color_transform = NULL;
}
}
@ -426,7 +435,8 @@ void wlr_output_finish(struct wlr_output *output) {
wlr_swapchain_destroy(output->cursor_swapchain);
wlr_buffer_unlock(output->cursor_front_buffer);
wlr_color_transform_unref(output->color_transform);
wlr_color_transform_unref(output->pre_color_transform);
wlr_color_transform_unref(output->post_color_transform);
wlr_swapchain_destroy(output->swapchain);
@ -581,9 +591,13 @@ static uint32_t output_compare_state(struct wlr_output *output,
output->subpixel == state->subpixel) {
fields |= WLR_OUTPUT_STATE_SUBPIXEL;
}
if ((state->committed & WLR_OUTPUT_STATE_COLOR_TRANSFORM) &&
output->color_transform == state->color_transform) {
fields |= WLR_OUTPUT_STATE_COLOR_TRANSFORM;
if ((state->committed & WLR_OUTPUT_STATE_PRE_COLOR_TRANSFORM) &&
output->pre_color_transform == state->pre_color_transform) {
fields |= WLR_OUTPUT_STATE_PRE_COLOR_TRANSFORM;
}
if ((state->committed & WLR_OUTPUT_STATE_POST_COLOR_TRANSFORM) &&
output->post_color_transform == state->post_color_transform) {
fields |= WLR_OUTPUT_STATE_POST_COLOR_TRANSFORM;
}
if ((state->committed & WLR_OUTPUT_STATE_COLOR_REPRESENTATION) &&
output->color_encoding == state->color_encoding &&
@ -685,7 +699,8 @@ static bool output_basic_test(struct wlr_output *output,
{ WLR_OUTPUT_STATE_ADAPTIVE_SYNC_ENABLED, "adaptive sync" },
{ WLR_OUTPUT_STATE_RENDER_FORMAT, "render format" },
{ WLR_OUTPUT_STATE_SUBPIXEL, "subpixel" },
{ WLR_OUTPUT_STATE_COLOR_TRANSFORM, "color transform" },
{ WLR_OUTPUT_STATE_PRE_COLOR_TRANSFORM, "pre color transform" },
{ WLR_OUTPUT_STATE_POST_COLOR_TRANSFORM, "post color transform" },
{ WLR_OUTPUT_STATE_IMAGE_DESCRIPTION, "image description" },
};
if (!enabled) {

View file

@ -19,7 +19,8 @@ void wlr_output_state_finish(struct wlr_output_state *state) {
pixman_region32_fini(&state->damage);
wlr_drm_syncobj_timeline_unref(state->wait_timeline);
wlr_drm_syncobj_timeline_unref(state->signal_timeline);
wlr_color_transform_unref(state->color_transform);
wlr_color_transform_unref(state->pre_color_transform);
wlr_color_transform_unref(state->post_color_transform);
free(state->image_description);
}
@ -113,14 +114,25 @@ void wlr_output_state_set_signal_timeline(struct wlr_output_state *state,
state->signal_point = dst_point;
}
void wlr_output_state_set_color_transform(struct wlr_output_state *state,
void wlr_output_state_set_pre_color_transform(struct wlr_output_state *state,
struct wlr_color_transform *tr) {
state->committed |= WLR_OUTPUT_STATE_COLOR_TRANSFORM;
wlr_color_transform_unref(state->color_transform);
state->committed |= WLR_OUTPUT_STATE_PRE_COLOR_TRANSFORM;
wlr_color_transform_unref(state->pre_color_transform);
if (tr) {
state->color_transform = wlr_color_transform_ref(tr);
state->pre_color_transform = wlr_color_transform_ref(tr);
} else {
state->color_transform = NULL;
state->pre_color_transform = NULL;
}
}
void wlr_output_state_set_post_color_transform(struct wlr_output_state *state,
struct wlr_color_transform *tr) {
state->committed |= WLR_OUTPUT_STATE_POST_COLOR_TRANSFORM;
wlr_color_transform_unref(state->post_color_transform);
if (tr) {
state->post_color_transform = wlr_color_transform_ref(tr);
} else {
state->post_color_transform = NULL;
}
}
@ -156,7 +168,7 @@ bool wlr_output_state_copy(struct wlr_output_state *dst,
WLR_OUTPUT_STATE_DAMAGE |
WLR_OUTPUT_STATE_WAIT_TIMELINE |
WLR_OUTPUT_STATE_SIGNAL_TIMELINE |
WLR_OUTPUT_STATE_COLOR_TRANSFORM |
WLR_OUTPUT_STATE_POST_COLOR_TRANSFORM |
WLR_OUTPUT_STATE_IMAGE_DESCRIPTION);
copy.buffer = NULL;
copy.buffer_src_box = (struct wlr_fbox){0};
@ -164,7 +176,8 @@ bool wlr_output_state_copy(struct wlr_output_state *dst,
pixman_region32_init(&copy.damage);
copy.wait_timeline = NULL;
copy.signal_timeline = NULL;
copy.color_transform = NULL;
copy.pre_color_transform = NULL;
copy.post_color_transform = NULL;
copy.image_description = NULL;
if (src->committed & WLR_OUTPUT_STATE_BUFFER) {
@ -186,8 +199,11 @@ bool wlr_output_state_copy(struct wlr_output_state *dst,
src->signal_point);
}
if (src->committed & WLR_OUTPUT_STATE_COLOR_TRANSFORM) {
wlr_output_state_set_color_transform(&copy, src->color_transform);
if (src->committed & WLR_OUTPUT_STATE_PRE_COLOR_TRANSFORM) {
wlr_output_state_set_pre_color_transform(&copy, src->pre_color_transform);
}
if (src->committed & WLR_OUTPUT_STATE_POST_COLOR_TRANSFORM) {
wlr_output_state_set_post_color_transform(&copy, src->post_color_transform);
}
if (src->committed & WLR_OUTPUT_STATE_IMAGE_DESCRIPTION) {
if (!wlr_output_state_set_image_description(&copy, src->image_description)) {

View file

@ -2180,7 +2180,7 @@ static void scene_output_state_attempt_gamma(struct wlr_scene_output *scene_outp
return;
}
wlr_output_state_set_color_transform(&gamma_pending, scene_output->gamma_lut_color_transform);
wlr_output_state_set_post_color_transform(&gamma_pending, scene_output->gamma_lut_color_transform);
scene_output->gamma_lut_changed = false;
if (!wlr_output_test_state(scene_output->output, &gamma_pending)) {

View file

@ -288,7 +288,7 @@ bool wlr_gamma_control_v1_apply(struct wlr_gamma_control_v1 *gamma_control,
}
}
wlr_output_state_set_color_transform(output_state, tr);
wlr_output_state_set_post_color_transform(output_state, tr);
return true;
}