Merge branch 'preferred-signal-format' into 'master'

Draft: backend: drm: Add output color format properties

See merge request wlroots/wlroots!4509
This commit is contained in:
Andri Yngvason 2024-01-24 13:33:55 +00:00
commit e1fc894430
6 changed files with 41 additions and 0 deletions

View file

@ -335,6 +335,10 @@ static bool atomic_crtc_commit(struct wlr_drm_connector *conn,
if (modeset && active && conn->props.max_bpc != 0 && conn->max_bpc_bounds[1] != 0) { if (modeset && active && conn->props.max_bpc != 0 && conn->max_bpc_bounds[1] != 0) {
atomic_add(&atom, conn->id, conn->props.max_bpc, pick_max_bpc(conn, state->primary_fb)); atomic_add(&atom, conn->id, conn->props.max_bpc, pick_max_bpc(conn, state->primary_fb));
} }
if (modeset && active && conn->props.force_color_format && state->base->color_format) {
uint32_t format = 1 << (state->base->color_format - 1);
atomic_add(&atom, conn->id, conn->props.force_color_format, format);
}
atomic_add(&atom, crtc->id, crtc->props.mode_id, mode_id); atomic_add(&atom, crtc->id, crtc->props.mode_id, mode_id);
atomic_add(&atom, crtc->id, crtc->props.active, active); atomic_add(&atom, crtc->id, crtc->props.active, active);
if (active) { if (active) {

View file

@ -26,6 +26,7 @@ static const struct prop_info connector_info[] = {
{ "EDID", INDEX(edid) }, { "EDID", INDEX(edid) },
{ "PATH", INDEX(path) }, { "PATH", INDEX(path) },
{ "content type", INDEX(content_type) }, { "content type", INDEX(content_type) },
{ "force color format", INDEX(force_color_format) },
{ "link-status", INDEX(link_status) }, { "link-status", INDEX(link_status) },
{ "max bpc", INDEX(max_bpc) }, { "max bpc", INDEX(max_bpc) },
{ "non-desktop", INDEX(non_desktop) }, { "non-desktop", INDEX(non_desktop) },

View file

@ -23,6 +23,7 @@ union wlr_drm_connector_props {
uint32_t panel_orientation; // not guaranteed to exist uint32_t panel_orientation; // not guaranteed to exist
uint32_t content_type; // not guaranteed to exist uint32_t content_type; // not guaranteed to exist
uint32_t max_bpc; // not guaranteed to exist uint32_t max_bpc; // not guaranteed to exist
uint32_t force_color_format; // not guaranteed to exist
// atomic-modesetting only // atomic-modesetting only

View file

@ -26,6 +26,14 @@ enum wlr_output_mode_aspect_ratio {
WLR_OUTPUT_MODE_ASPECT_RATIO_256_135, WLR_OUTPUT_MODE_ASPECT_RATIO_256_135,
}; };
enum wlr_output_color_format {
WLR_OUTPUT_COLOR_FORMAT_UNSPEC,
WLR_OUTPUT_COLOR_FORMAT_RGB,
WLR_OUTPUT_COLOR_FORMAT_YCBCR444,
WLR_OUTPUT_COLOR_FORMAT_YCBCR422,
WLR_OUTPUT_COLOR_FORMAT_YCBCR420,
};
struct wlr_output_mode { struct wlr_output_mode {
int32_t width, height; int32_t width, height;
int32_t refresh; // mHz int32_t refresh; // mHz
@ -108,6 +116,8 @@ struct wlr_output_state {
struct wlr_output_layer_state *layers; struct wlr_output_layer_state *layers;
size_t layers_len; size_t layers_len;
enum wlr_output_color_format color_format;
}; };
struct wlr_output_impl; struct wlr_output_impl;
@ -423,6 +433,14 @@ void wlr_output_set_damage(struct wlr_output *output,
*/ */
void wlr_output_set_layers(struct wlr_output *output, void wlr_output_set_layers(struct wlr_output *output,
struct wlr_output_layer_state *layers, size_t layers_len); struct wlr_output_layer_state *layers, size_t layers_len);
/**
* Set the output color format. This is the color encoding the signal that
* goes out to the wire.
*/
void wlr_output_set_color_format(struct wlr_output *output,
enum wlr_output_color_format value);
/** /**
* Test whether the pending output state would be accepted by the backend. If * Test whether the pending output state would be accepted by the backend. If
* this function returns true, wlr_output_commit() can only fail due to a * this function returns true, wlr_output_commit() can only fail due to a
@ -676,6 +694,13 @@ void wlr_output_state_set_damage(struct wlr_output_state *state,
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);
/**
* Set the output color format. This is the color encoding the signal that
* goes out to the wire.
*/
void wlr_output_state_set_color_format(struct wlr_output_state *state,
enum wlr_output_color_format value);
/** /**
* Copies the output state from src to dst. It is safe to then * Copies the output state from src to dst. It is safe to then
* wlr_output_state_finish() src and have dst still be valid. * wlr_output_state_finish() src and have dst still be valid.

View file

@ -544,6 +544,11 @@ void wlr_output_set_layers(struct wlr_output *output,
wlr_output_state_set_layers(&output->pending, layers, layers_len); wlr_output_state_set_layers(&output->pending, layers, layers_len);
} }
void wlr_output_set_color_format(struct wlr_output *output,
enum wlr_output_color_format value) {
wlr_output_state_set_color_format(&output->pending, value);
}
static void output_state_clear_gamma_lut(struct wlr_output_state *state) { static void output_state_clear_gamma_lut(struct wlr_output_state *state) {
free(state->gamma_lut); free(state->gamma_lut);
state->gamma_lut = NULL; state->gamma_lut = NULL;

View file

@ -114,6 +114,11 @@ void wlr_output_state_set_layers(struct wlr_output_state *state,
state->layers_len = layers_len; state->layers_len = layers_len;
} }
void wlr_output_state_set_color_format(struct wlr_output_state *state,
enum wlr_output_color_format value) {
state->color_format = value;
}
bool wlr_output_state_copy(struct wlr_output_state *dst, bool wlr_output_state_copy(struct wlr_output_state *dst,
const struct wlr_output_state *src) { const struct wlr_output_state *src) {
struct wlr_output_state copy = *src; struct wlr_output_state copy = *src;