mirror of
https://gitlab.freedesktop.org/wlroots/wlroots.git
synced 2025-11-24 06:59:45 -05:00
output: make wlr_output_set_gamma atomic
wlr_output_set_gamma is now double-buffered and applies the gamma LUT on the next output commit.
This commit is contained in:
parent
7693fdb8a7
commit
347bdb6d9a
9 changed files with 100 additions and 105 deletions
|
|
@ -105,13 +105,16 @@ static void gamma_control_handle_set_gamma(struct wl_client *client,
|
|||
uint16_t *g = table + ramp_size;
|
||||
uint16_t *b = table + 2 * ramp_size;
|
||||
|
||||
bool ok = wlr_output_set_gamma(gamma_control->output, ramp_size, r, g, b);
|
||||
if (!ok) {
|
||||
wlr_output_set_gamma(gamma_control->output, ramp_size, r, g, b);
|
||||
if (!wlr_output_test(gamma_control->output)) {
|
||||
gamma_control_send_failed(gamma_control);
|
||||
goto error_table;
|
||||
}
|
||||
free(table);
|
||||
|
||||
// Gamma LUT will be applied on next output commit
|
||||
wlr_output_schedule_frame(gamma_control->output);
|
||||
|
||||
return;
|
||||
|
||||
error_table:
|
||||
|
|
@ -175,7 +178,8 @@ static void gamma_control_manager_get_gamma_control(struct wl_client *client,
|
|||
|
||||
wl_list_init(&gamma_control->link);
|
||||
|
||||
if (!output->impl->set_gamma) {
|
||||
size_t gamma_size = wlr_output_get_gamma_size(output);
|
||||
if (gamma_size == 0) {
|
||||
zwlr_gamma_control_v1_send_failed(gamma_control->resource);
|
||||
gamma_control_destroy(gamma_control);
|
||||
return;
|
||||
|
|
@ -192,8 +196,7 @@ static void gamma_control_manager_get_gamma_control(struct wl_client *client,
|
|||
|
||||
wl_list_remove(&gamma_control->link);
|
||||
wl_list_insert(&manager->controls, &gamma_control->link);
|
||||
zwlr_gamma_control_v1_send_gamma_size(gamma_control->resource,
|
||||
wlr_output_get_gamma_size(output));
|
||||
zwlr_gamma_control_v1_send_gamma_size(gamma_control->resource, gamma_size);
|
||||
}
|
||||
|
||||
static void gamma_control_manager_destroy(struct wl_client *client,
|
||||
|
|
|
|||
|
|
@ -467,8 +467,15 @@ void wlr_output_set_damage(struct wlr_output *output,
|
|||
output->pending.committed |= WLR_OUTPUT_STATE_DAMAGE;
|
||||
}
|
||||
|
||||
static void output_state_clear_gamma_lut(struct wlr_output_state *state) {
|
||||
free(state->gamma_lut);
|
||||
state->gamma_lut = NULL;
|
||||
state->committed &= ~WLR_OUTPUT_STATE_GAMMA_LUT;
|
||||
}
|
||||
|
||||
static void output_state_clear(struct wlr_output_state *state) {
|
||||
output_state_clear_buffer(state);
|
||||
output_state_clear_gamma_lut(state);
|
||||
pixman_region32_clear(&state->damage);
|
||||
state->committed = 0;
|
||||
}
|
||||
|
|
@ -701,12 +708,21 @@ void wlr_output_send_present(struct wlr_output *output,
|
|||
wlr_signal_emit_safe(&output->events.present, event);
|
||||
}
|
||||
|
||||
bool wlr_output_set_gamma(struct wlr_output *output, size_t size,
|
||||
void wlr_output_set_gamma(struct wlr_output *output, size_t size,
|
||||
const uint16_t *r, const uint16_t *g, const uint16_t *b) {
|
||||
if (!output->impl->set_gamma) {
|
||||
return false;
|
||||
output_state_clear_gamma_lut(&output->pending);
|
||||
|
||||
output->pending.gamma_lut_size = size;
|
||||
output->pending.gamma_lut = malloc(3 * size * sizeof(uint16_t));
|
||||
if (output->pending.gamma_lut == NULL) {
|
||||
wlr_log_errno(WLR_ERROR, "Allocation failed");
|
||||
return;
|
||||
}
|
||||
return output->impl->set_gamma(output, size, r, g, b);
|
||||
memcpy(output->pending.gamma_lut, r, size * sizeof(uint16_t));
|
||||
memcpy(output->pending.gamma_lut + size, g, size * sizeof(uint16_t));
|
||||
memcpy(output->pending.gamma_lut + 2 * size, b, size * sizeof(uint16_t));
|
||||
|
||||
output->pending.committed |= WLR_OUTPUT_STATE_GAMMA_LUT;
|
||||
}
|
||||
|
||||
size_t wlr_output_get_gamma_size(struct wlr_output *output) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue