output: Introduce wlr_output_state_copy()

This commit is contained in:
Alexander Orzechowski 2023-06-16 10:15:51 -04:00 committed by Simon Ser
parent 38d451bcb5
commit 4b7c526578
2 changed files with 49 additions and 1 deletions

View file

@ -690,12 +690,24 @@ void wlr_output_state_set_damage(struct wlr_output_state *state,
* advantage of backend features that may reduce the amount of things that * advantage of backend features that may reduce the amount of things that
* need to be composited. * need to be composited.
* *
* The array must be kept valid by the caller until wlr_output_state_finish(). * The array must be kept valid by the caller until wlr_output_state_finish()
* and all copies of the state have been finished as well.
* This state will be applied once wlr_output_commit_state() is called. * This state will be applied once wlr_output_commit_state() is called.
*/ */
void wlr_output_state_set_layers(struct wlr_output_state *state, void wlr_output_state_set_layers(struct wlr_output_state *state,
struct wlr_output_layer_state *layers, size_t layers_len); struct wlr_output_layer_state *layers, size_t layers_len);
/**
* Copies the output state from src to dst. It is safe to then
* wlr_output_state_finish() src and have dst still be valid.
*
* Note: The lifetime of the output layers inside the state are not managed. It
* is the responsibility of the constructor of the output layers to make sure
* they remain valid for the output state and all copies made.
*/
bool wlr_output_state_copy(struct wlr_output_state *dst,
const struct wlr_output_state *src);
/** /**
* Re-configure the swapchain as required for the output's primary buffer. * Re-configure the swapchain as required for the output's primary buffer.

View file

@ -129,3 +129,39 @@ void wlr_output_state_set_layers(struct wlr_output_state *state,
state->layers = layers; state->layers = layers;
state->layers_len = layers_len; state->layers_len = layers_len;
} }
bool wlr_output_state_copy(struct wlr_output_state *dst,
const struct wlr_output_state *src) {
struct wlr_output_state copy = *src;
copy.committed &= ~(WLR_OUTPUT_STATE_BUFFER |
WLR_OUTPUT_STATE_DAMAGE |
WLR_OUTPUT_STATE_GAMMA_LUT);
if (src->committed & WLR_OUTPUT_STATE_BUFFER) {
wlr_output_state_set_buffer(&copy, src->buffer);
}
if (src->committed & WLR_OUTPUT_STATE_DAMAGE) {
wlr_output_state_set_damage(&copy, &src->damage);
}
if (src->committed & WLR_OUTPUT_STATE_GAMMA_LUT) {
size_t gamma_buffer_size = 3 * src->gamma_lut_size * sizeof(uint16_t);
copy.gamma_lut = malloc(gamma_buffer_size);
if (!copy.gamma_lut) {
wlr_log_errno(WLR_ERROR, "Allocation failed");
goto err;
}
copy.committed |= WLR_OUTPUT_STATE_GAMMA_LUT;
memcpy(copy.gamma_lut, src->gamma_lut, gamma_buffer_size);
copy.gamma_lut_size = src->gamma_lut_size;
}
wlr_output_state_finish(dst);
*dst = copy;
return true;
err:
wlr_output_state_finish(&copy);
return false;
}