Commit afed48a0 authored by Anthony Koo's avatar Anthony Koo Committed by Alex Deucher

drm/amd/display: Fix color module crash when hotplug monitors.

Assume we have two monitors, and monitor 0 is unplugged.
This shifts the internal state of index 1 to index 0 by memcpy.
This means there are two copies of the gamma pointer previously
owned by state[1].

When hotplug occurs, this re-assigns the new display with state[1],
which has some garbage left over from before, including the
gamma pointer.

We should correctly clear unused states and re-initialize correctly.

Also, due to async nature of the hotplug and other events like commit,
we also need to safe guard against sink that has been removed.
Signed-off-by: default avatarAnthony Koo <anthony.koo@amd.com>
Reviewed-by: default avatarAric Cyr <Aric.Cyr@amd.com>
Reviewed-by: default avatarTony Cheng <Tony.Cheng@amd.com>
Acked-by: default avatarHarry Wentland <Harry.Wentland@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 5a7a1eeb
...@@ -643,10 +643,10 @@ static void initialize_fix_point_color_values( ...@@ -643,10 +643,10 @@ static void initialize_fix_point_color_values(
/* Given a specific dc_sink* this function finds its equivalent /* Given a specific dc_sink* this function finds its equivalent
* on the dc_sink array and returns the corresponding index * on the dc_sink array and returns the corresponding index
*/ */
static unsigned int sink_index_from_sink(struct core_color *core_color, static int sink_index_from_sink(struct core_color *core_color,
const struct dc_sink *sink) const struct dc_sink *sink)
{ {
unsigned int index = 0; int index = 0;
for (index = 0; index < core_color->num_sinks; index++) for (index = 0; index < core_color->num_sinks; index++)
if (core_color->caps[index].sink == sink) if (core_color->caps[index].sink == sink)
...@@ -654,7 +654,7 @@ static unsigned int sink_index_from_sink(struct core_color *core_color, ...@@ -654,7 +654,7 @@ static unsigned int sink_index_from_sink(struct core_color *core_color,
/* Could not find sink requested */ /* Could not find sink requested */
ASSERT(false); ASSERT(false);
return index; return -1;
} }
static void calculate_rgb_matrix_legacy(struct core_color *core_color, static void calculate_rgb_matrix_legacy(struct core_color *core_color,
...@@ -1427,6 +1427,65 @@ static bool update_color_gamut_data(struct color_gamut_data *input_data, ...@@ -1427,6 +1427,65 @@ static bool update_color_gamut_data(struct color_gamut_data *input_data,
return true; return true;
} }
void initialize_color_state(struct core_color *core_color, int index)
{
core_color->state[index].user_enable_color_temperature = true;
core_color->state[index].custom_color_temperature = 6500;
core_color->state[index].contrast.current = 100;
core_color->state[index].contrast.min = 0;
core_color->state[index].contrast.max = 200;
core_color->state[index].saturation.current = 100;
core_color->state[index].saturation.min = 0;
core_color->state[index].saturation.max = 200;
core_color->state[index].brightness.current = 0;
core_color->state[index].brightness.min = -100;
core_color->state[index].brightness.max = 100;
core_color->state[index].hue.current = 0;
core_color->state[index].hue.min = -30;
core_color->state[index].hue.max = 30;
core_color->state[index].gamma = NULL;
core_color->state[index].preferred_quantization_range =
QUANTIZATION_RANGE_FULL;
core_color->state[index].source_gamut.color_space =
color_space_srgb;
core_color->state[index].source_gamut.white_point =
color_white_point_type_6500k_noon;
core_color->state[index].source_gamut.gamut.blueX = 1500;
core_color->state[index].source_gamut.gamut.blueY = 600;
core_color->state[index].source_gamut.gamut.greenX = 3000;
core_color->state[index].source_gamut.gamut.greenY = 6000;
core_color->state[index].source_gamut.gamut.redX = 6400;
core_color->state[index].source_gamut.gamut.redY = 3300;
core_color->state[index].source_gamut.gamut.whiteX = 3127;
core_color->state[index].source_gamut.gamut.whiteY = 3290;
core_color->state[index].destination_gamut.color_space =
color_space_srgb;
core_color->state[index].destination_gamut.white_point =
color_white_point_type_6500k_noon;
core_color->state[index].destination_gamut.gamut.blueX = 1500;
core_color->state[index].destination_gamut.gamut.blueY = 600;
core_color->state[index].destination_gamut.gamut.greenX = 3000;
core_color->state[index].destination_gamut.gamut.greenY = 6000;
core_color->state[index].destination_gamut.gamut.redX = 6400;
core_color->state[index].destination_gamut.gamut.redY = 3300;
core_color->state[index].destination_gamut.gamut.whiteX = 3127;
core_color->state[index].destination_gamut.gamut.whiteY = 3290;
core_color->state[index].input_transfer_function =
transfer_func_srgb;
core_color->state[index].output_transfer_function =
transfer_func_srgb;
}
struct mod_color *mod_color_create(struct dc *dc) struct mod_color *mod_color_create(struct dc *dc)
{ {
int i = 0; int i = 0;
...@@ -1452,54 +1511,7 @@ struct mod_color *mod_color_create(struct dc *dc) ...@@ -1452,54 +1511,7 @@ struct mod_color *mod_color_create(struct dc *dc)
/*hardcoded to sRGB with 6500 color temperature*/ /*hardcoded to sRGB with 6500 color temperature*/
for (i = 0; i < MOD_COLOR_MAX_CONCURRENT_SINKS; i++) { for (i = 0; i < MOD_COLOR_MAX_CONCURRENT_SINKS; i++) {
core_color->state[i].source_gamut.color_space = initialize_color_state(core_color, i);
color_space_srgb;
core_color->state[i].source_gamut.white_point =
color_white_point_type_6500k_noon;
core_color->state[i].source_gamut.gamut.blueX = 1500;
core_color->state[i].source_gamut.gamut.blueY = 600;
core_color->state[i].source_gamut.gamut.greenX = 3000;
core_color->state[i].source_gamut.gamut.greenY = 6000;
core_color->state[i].source_gamut.gamut.redX = 6400;
core_color->state[i].source_gamut.gamut.redY = 3300;
core_color->state[i].source_gamut.gamut.whiteX = 3127;
core_color->state[i].source_gamut.gamut.whiteY = 3290;
core_color->state[i].destination_gamut.color_space =
color_space_srgb;
core_color->state[i].destination_gamut.white_point =
color_white_point_type_6500k_noon;
core_color->state[i].destination_gamut.gamut.blueX = 1500;
core_color->state[i].destination_gamut.gamut.blueY = 600;
core_color->state[i].destination_gamut.gamut.greenX = 3000;
core_color->state[i].destination_gamut.gamut.greenY = 6000;
core_color->state[i].destination_gamut.gamut.redX = 6400;
core_color->state[i].destination_gamut.gamut.redY = 3300;
core_color->state[i].destination_gamut.gamut.whiteX = 3127;
core_color->state[i].destination_gamut.gamut.whiteY = 3290;
core_color->state[i].input_transfer_function =
transfer_func_srgb;
core_color->state[i].output_transfer_function =
transfer_func_srgb;
core_color->state[i].custom_color_temperature = 6500;
core_color->state[i].contrast.current = 100;
core_color->state[i].contrast.min = 0;
core_color->state[i].contrast.max = 200;
core_color->state[i].saturation.current = 100;
core_color->state[i].saturation.min = 0;
core_color->state[i].saturation.max = 200;
core_color->state[i].brightness.current = 0;
core_color->state[i].brightness.min = -100;
core_color->state[i].brightness.max = 100;
core_color->state[i].hue.current = 0;
core_color->state[i].hue.min = -30;
core_color->state[i].hue.max = 30;
} }
if (core_color->state == NULL) if (core_color->state == NULL)
...@@ -1589,8 +1601,8 @@ bool mod_color_add_sink(struct mod_color *mod_color, const struct dc_sink *sink, ...@@ -1589,8 +1601,8 @@ bool mod_color_add_sink(struct mod_color *mod_color, const struct dc_sink *sink,
if (core_color->num_sinks < MOD_COLOR_MAX_CONCURRENT_SINKS) { if (core_color->num_sinks < MOD_COLOR_MAX_CONCURRENT_SINKS) {
dc_sink_retain(sink); dc_sink_retain(sink);
core_color->caps[core_color->num_sinks].sink = sink; core_color->caps[core_color->num_sinks].sink = sink;
core_color->state[core_color->num_sinks].
user_enable_color_temperature = true; initialize_color_state(core_color, core_color->num_sinks);
core_color->edid_caps[core_color->num_sinks].colorimetry_caps = core_color->edid_caps[core_color->num_sinks].colorimetry_caps =
edid_caps->colorimetry_caps; edid_caps->colorimetry_caps;
...@@ -1601,7 +1613,6 @@ bool mod_color_add_sink(struct mod_color *mod_color, const struct dc_sink *sink, ...@@ -1601,7 +1613,6 @@ bool mod_color_add_sink(struct mod_color *mod_color, const struct dc_sink *sink,
flag.save_per_edid = true; flag.save_per_edid = true;
flag.save_per_link = false; flag.save_per_link = false;
if (dm_read_persistent_data(core_dc->ctx, sink, if (dm_read_persistent_data(core_dc->ctx, sink,
COLOR_REGISTRY_NAME, COLOR_REGISTRY_NAME,
"enablecolortempadj", "enablecolortempadj",
...@@ -1610,9 +1621,6 @@ bool mod_color_add_sink(struct mod_color *mod_color, const struct dc_sink *sink, ...@@ -1610,9 +1621,6 @@ bool mod_color_add_sink(struct mod_color *mod_color, const struct dc_sink *sink,
core_color->state[core_color->num_sinks]. core_color->state[core_color->num_sinks].
user_enable_color_temperature = user_enable_color_temperature =
persistent_color_temp_enable; persistent_color_temp_enable;
else
core_color->state[core_color->num_sinks].
user_enable_color_temperature = true;
if (dm_read_persistent_data(core_dc->ctx, sink, if (dm_read_persistent_data(core_dc->ctx, sink,
COLOR_REGISTRY_NAME, COLOR_REGISTRY_NAME,
...@@ -1622,9 +1630,6 @@ bool mod_color_add_sink(struct mod_color *mod_color, const struct dc_sink *sink, ...@@ -1622,9 +1630,6 @@ bool mod_color_add_sink(struct mod_color *mod_color, const struct dc_sink *sink,
core_color->state[core_color->num_sinks]. core_color->state[core_color->num_sinks].
custom_color_temperature custom_color_temperature
= persistent_custom_color_temp; = persistent_custom_color_temp;
else
core_color->state[core_color->num_sinks].
custom_color_temperature = 6500;
if (dm_read_persistent_data(core_dc->ctx, sink, if (dm_read_persistent_data(core_dc->ctx, sink,
COLOR_REGISTRY_NAME, COLOR_REGISTRY_NAME,
...@@ -1635,23 +1640,6 @@ bool mod_color_add_sink(struct mod_color *mod_color, const struct dc_sink *sink, ...@@ -1635,23 +1640,6 @@ bool mod_color_add_sink(struct mod_color *mod_color, const struct dc_sink *sink,
memcpy(&core_color->state[core_color->num_sinks]. memcpy(&core_color->state[core_color->num_sinks].
source_gamut.gamut, &persistent_source_gamut, source_gamut.gamut, &persistent_source_gamut,
sizeof(struct color_space_coordinates)); sizeof(struct color_space_coordinates));
} else {
core_color->state[core_color->num_sinks].
source_gamut.gamut.blueX = 1500;
core_color->state[core_color->num_sinks].
source_gamut.gamut.blueY = 600;
core_color->state[core_color->num_sinks].
source_gamut.gamut.greenX = 3000;
core_color->state[core_color->num_sinks].
source_gamut.gamut.greenY = 6000;
core_color->state[core_color->num_sinks].
source_gamut.gamut.redX = 6400;
core_color->state[core_color->num_sinks].
source_gamut.gamut.redY = 3300;
core_color->state[core_color->num_sinks].
source_gamut.gamut.whiteX = 3127;
core_color->state[core_color->num_sinks].
source_gamut.gamut.whiteY = 3290;
} }
if (dm_read_persistent_data(core_dc->ctx, sink, COLOR_REGISTRY_NAME, if (dm_read_persistent_data(core_dc->ctx, sink, COLOR_REGISTRY_NAME,
...@@ -1663,23 +1651,6 @@ bool mod_color_add_sink(struct mod_color *mod_color, const struct dc_sink *sink, ...@@ -1663,23 +1651,6 @@ bool mod_color_add_sink(struct mod_color *mod_color, const struct dc_sink *sink,
destination_gamut.gamut, destination_gamut.gamut,
&persistent_destination_gamut, &persistent_destination_gamut,
sizeof(struct color_space_coordinates)); sizeof(struct color_space_coordinates));
} else {
core_color->state[core_color->num_sinks].
destination_gamut.gamut.blueX = 1500;
core_color->state[core_color->num_sinks].
destination_gamut.gamut.blueY = 600;
core_color->state[core_color->num_sinks].
destination_gamut.gamut.greenX = 3000;
core_color->state[core_color->num_sinks].
destination_gamut.gamut.greenY = 6000;
core_color->state[core_color->num_sinks].
destination_gamut.gamut.redX = 6400;
core_color->state[core_color->num_sinks].
destination_gamut.gamut.redY = 3300;
core_color->state[core_color->num_sinks].
destination_gamut.gamut.whiteX = 3127;
core_color->state[core_color->num_sinks].
destination_gamut.gamut.whiteY = 3290;
} }
if (dm_read_persistent_data(core_dc->ctx, sink, COLOR_REGISTRY_NAME, if (dm_read_persistent_data(core_dc->ctx, sink, COLOR_REGISTRY_NAME,
...@@ -1688,9 +1659,6 @@ bool mod_color_add_sink(struct mod_color *mod_color, const struct dc_sink *sink, ...@@ -1688,9 +1659,6 @@ bool mod_color_add_sink(struct mod_color *mod_color, const struct dc_sink *sink,
sizeof(int), &flag)) sizeof(int), &flag))
core_color->state[core_color->num_sinks]. core_color->state[core_color->num_sinks].
brightness.current = persistent_brightness; brightness.current = persistent_brightness;
else
core_color->state[core_color->num_sinks].
brightness.current = 0;
if (dm_read_persistent_data(core_dc->ctx, sink, COLOR_REGISTRY_NAME, if (dm_read_persistent_data(core_dc->ctx, sink, COLOR_REGISTRY_NAME,
"contrast", "contrast",
...@@ -1698,9 +1666,6 @@ bool mod_color_add_sink(struct mod_color *mod_color, const struct dc_sink *sink, ...@@ -1698,9 +1666,6 @@ bool mod_color_add_sink(struct mod_color *mod_color, const struct dc_sink *sink,
sizeof(int), &flag)) sizeof(int), &flag))
core_color->state[core_color->num_sinks]. core_color->state[core_color->num_sinks].
contrast.current = persistent_contrast; contrast.current = persistent_contrast;
else
core_color->state[core_color->num_sinks].
contrast.current = 100;
if (dm_read_persistent_data(core_dc->ctx, sink, COLOR_REGISTRY_NAME, if (dm_read_persistent_data(core_dc->ctx, sink, COLOR_REGISTRY_NAME,
"hue", "hue",
...@@ -1708,9 +1673,6 @@ bool mod_color_add_sink(struct mod_color *mod_color, const struct dc_sink *sink, ...@@ -1708,9 +1673,6 @@ bool mod_color_add_sink(struct mod_color *mod_color, const struct dc_sink *sink,
sizeof(int), &flag)) sizeof(int), &flag))
core_color->state[core_color->num_sinks]. core_color->state[core_color->num_sinks].
hue.current = persistent_hue; hue.current = persistent_hue;
else
core_color->state[core_color->num_sinks].
hue.current = 0;
if (dm_read_persistent_data(core_dc->ctx, sink, COLOR_REGISTRY_NAME, if (dm_read_persistent_data(core_dc->ctx, sink, COLOR_REGISTRY_NAME,
"saturation", "saturation",
...@@ -1718,9 +1680,6 @@ bool mod_color_add_sink(struct mod_color *mod_color, const struct dc_sink *sink, ...@@ -1718,9 +1680,6 @@ bool mod_color_add_sink(struct mod_color *mod_color, const struct dc_sink *sink,
sizeof(int), &flag)) sizeof(int), &flag))
core_color->state[core_color->num_sinks]. core_color->state[core_color->num_sinks].
saturation.current = persistent_saturation; saturation.current = persistent_saturation;
else
core_color->state[core_color->num_sinks].
saturation.current = 100;
if (dm_read_persistent_data(core_dc->ctx, sink, if (dm_read_persistent_data(core_dc->ctx, sink,
COLOR_REGISTRY_NAME, COLOR_REGISTRY_NAME,
...@@ -1730,9 +1689,6 @@ bool mod_color_add_sink(struct mod_color *mod_color, const struct dc_sink *sink, ...@@ -1730,9 +1689,6 @@ bool mod_color_add_sink(struct mod_color *mod_color, const struct dc_sink *sink,
core_color->state[core_color->num_sinks]. core_color->state[core_color->num_sinks].
preferred_quantization_range = preferred_quantization_range =
persistent_quantization_range; persistent_quantization_range;
else
core_color->state[core_color->num_sinks].
preferred_quantization_range = QUANTIZATION_RANGE_FULL;
core_color->num_sinks++; core_color->num_sinks++;
return true; return true;
...@@ -1751,6 +1707,10 @@ bool mod_color_remove_sink(struct mod_color *mod_color, ...@@ -1751,6 +1707,10 @@ bool mod_color_remove_sink(struct mod_color *mod_color,
if (core_color->state[i].gamma) { if (core_color->state[i].gamma) {
dc_gamma_release(&core_color->state[i].gamma); dc_gamma_release(&core_color->state[i].gamma);
} }
memset(&core_color->state[i], 0,
sizeof(struct color_state));
memset(&core_color->edid_caps[i], 0,
sizeof(struct color_edid_caps));
/* To remove this sink, shift everything after down */ /* To remove this sink, shift everything after down */
for (j = i; j < core_color->num_sinks - 1; j++) { for (j = i; j < core_color->num_sinks - 1; j++) {
...@@ -1766,6 +1726,11 @@ bool mod_color_remove_sink(struct mod_color *mod_color, ...@@ -1766,6 +1726,11 @@ bool mod_color_remove_sink(struct mod_color *mod_color,
sizeof(struct color_edid_caps)); sizeof(struct color_edid_caps));
} }
memset(&core_color->state[core_color->num_sinks - 1], 0,
sizeof(struct color_state));
memset(&core_color->edid_caps[core_color->num_sinks - 1], 0,
sizeof(struct color_edid_caps));
core_color->num_sinks--; core_color->num_sinks--;
dc_sink_release(sink); dc_sink_release(sink);
...@@ -1786,11 +1751,14 @@ bool mod_color_update_gamut_to_stream(struct mod_color *mod_color, ...@@ -1786,11 +1751,14 @@ bool mod_color_update_gamut_to_stream(struct mod_color *mod_color,
struct gamut_src_dst_matrix *matrix = struct gamut_src_dst_matrix *matrix =
dm_alloc(sizeof(struct gamut_src_dst_matrix)); dm_alloc(sizeof(struct gamut_src_dst_matrix));
unsigned int stream_index, sink_index, j; unsigned int stream_index, j;
int sink_index;
for (stream_index = 0; stream_index < num_streams; stream_index++) { for (stream_index = 0; stream_index < num_streams; stream_index++) {
sink_index = sink_index_from_sink(core_color, sink_index = sink_index_from_sink(core_color,
streams[stream_index]->sink); streams[stream_index]->sink);
if (sink_index == -1)
continue;
/* Write persistent data in registry*/ /* Write persistent data in registry*/
flag.save_per_edid = true; flag.save_per_edid = true;
...@@ -1880,11 +1848,14 @@ bool mod_color_adjust_source_gamut(struct mod_color *mod_color, ...@@ -1880,11 +1848,14 @@ bool mod_color_adjust_source_gamut(struct mod_color *mod_color,
{ {
struct core_color *core_color = MOD_COLOR_TO_CORE(mod_color); struct core_color *core_color = MOD_COLOR_TO_CORE(mod_color);
unsigned int stream_index, sink_index; unsigned int stream_index;
int sink_index;
for (stream_index = 0; stream_index < num_streams; stream_index++) { for (stream_index = 0; stream_index < num_streams; stream_index++) {
sink_index = sink_index_from_sink(core_color, sink_index = sink_index_from_sink(core_color,
streams[stream_index]->sink); streams[stream_index]->sink);
if (sink_index == -1)
continue;
update_color_gamut_data(input_gamut_data, update_color_gamut_data(input_gamut_data,
&core_color->state[sink_index].source_gamut); &core_color->state[sink_index].source_gamut);
...@@ -1903,11 +1874,14 @@ bool mod_color_adjust_source_gamut_and_tf(struct mod_color *mod_color, ...@@ -1903,11 +1874,14 @@ bool mod_color_adjust_source_gamut_and_tf(struct mod_color *mod_color,
{ {
struct core_color *core_color = MOD_COLOR_TO_CORE(mod_color); struct core_color *core_color = MOD_COLOR_TO_CORE(mod_color);
unsigned int stream_index, sink_index; unsigned int stream_index;
int sink_index;
for (stream_index = 0; stream_index < num_streams; stream_index++) { for (stream_index = 0; stream_index < num_streams; stream_index++) {
sink_index = sink_index_from_sink(core_color, sink_index = sink_index_from_sink(core_color,
streams[stream_index]->sink); streams[stream_index]->sink);
if (sink_index == -1)
continue;
update_color_gamut_data(input_gamut_data, update_color_gamut_data(input_gamut_data,
&core_color->state[sink_index].source_gamut); &core_color->state[sink_index].source_gamut);
core_color->state[sink_index].input_transfer_function = core_color->state[sink_index].input_transfer_function =
...@@ -1926,11 +1900,14 @@ bool mod_color_adjust_destination_gamut(struct mod_color *mod_color, ...@@ -1926,11 +1900,14 @@ bool mod_color_adjust_destination_gamut(struct mod_color *mod_color,
{ {
struct core_color *core_color = MOD_COLOR_TO_CORE(mod_color); struct core_color *core_color = MOD_COLOR_TO_CORE(mod_color);
unsigned int stream_index, sink_index; unsigned int stream_index;
int sink_index;
for (stream_index = 0; stream_index < num_streams; stream_index++) { for (stream_index = 0; stream_index < num_streams; stream_index++) {
sink_index = sink_index_from_sink(core_color, sink_index = sink_index_from_sink(core_color,
streams[stream_index]->sink); streams[stream_index]->sink);
if (sink_index == -1)
continue;
update_color_gamut_data(input_gamut_data, update_color_gamut_data(input_gamut_data,
&core_color->state[sink_index].destination_gamut); &core_color->state[sink_index].destination_gamut);
...@@ -1948,12 +1925,15 @@ bool mod_color_set_white_point(struct mod_color *mod_color, ...@@ -1948,12 +1925,15 @@ bool mod_color_set_white_point(struct mod_color *mod_color,
{ {
struct core_color *core_color = MOD_COLOR_TO_CORE(mod_color); struct core_color *core_color = MOD_COLOR_TO_CORE(mod_color);
unsigned int stream_index, sink_index; unsigned int stream_index;
int sink_index;
for (stream_index = 0; stream_index < num_streams; for (stream_index = 0; stream_index < num_streams;
stream_index++) { stream_index++) {
sink_index = sink_index_from_sink(core_color, sink_index = sink_index_from_sink(core_color,
streams[stream_index]->sink); streams[stream_index]->sink);
if (sink_index == -1)
continue;
core_color->state[sink_index].source_gamut.gamut.whiteX = core_color->state[sink_index].source_gamut.gamut.whiteX =
white_point->whiteX; white_point->whiteX;
core_color->state[sink_index].source_gamut.gamut.whiteY = core_color->state[sink_index].source_gamut.gamut.whiteY =
...@@ -1972,11 +1952,14 @@ bool mod_color_set_mastering_info(struct mod_color *mod_color, ...@@ -1972,11 +1952,14 @@ bool mod_color_set_mastering_info(struct mod_color *mod_color,
const struct dc_hdr_static_metadata *mastering_info) const struct dc_hdr_static_metadata *mastering_info)
{ {
struct core_color *core_color = MOD_COLOR_TO_CORE(mod_color); struct core_color *core_color = MOD_COLOR_TO_CORE(mod_color);
unsigned int stream_index, sink_index; unsigned int stream_index;
int sink_index;
for (stream_index = 0; stream_index < num_streams; stream_index++) { for (stream_index = 0; stream_index < num_streams; stream_index++) {
sink_index = sink_index_from_sink(core_color, sink_index = sink_index_from_sink(core_color,
streams[stream_index]->sink); streams[stream_index]->sink);
if (sink_index == -1)
continue;
memcpy(&core_color->state[sink_index].mastering_info, memcpy(&core_color->state[sink_index].mastering_info,
mastering_info, mastering_info,
sizeof(struct dc_hdr_static_metadata)); sizeof(struct dc_hdr_static_metadata));
...@@ -1991,7 +1974,10 @@ bool mod_color_get_mastering_info(struct mod_color *mod_color, ...@@ -1991,7 +1974,10 @@ bool mod_color_get_mastering_info(struct mod_color *mod_color,
struct core_color *core_color = struct core_color *core_color =
MOD_COLOR_TO_CORE(mod_color); MOD_COLOR_TO_CORE(mod_color);
unsigned int sink_index = sink_index_from_sink(core_color, sink); int sink_index = sink_index_from_sink(core_color, sink);
if (sink_index == -1)
return false;
memcpy(mastering_info, &core_color->state[sink_index].mastering_info, memcpy(mastering_info, &core_color->state[sink_index].mastering_info,
sizeof(struct dc_hdr_static_metadata)); sizeof(struct dc_hdr_static_metadata));
...@@ -2007,11 +1993,14 @@ bool mod_color_set_user_enable(struct mod_color *mod_color, ...@@ -2007,11 +1993,14 @@ bool mod_color_set_user_enable(struct mod_color *mod_color,
MOD_COLOR_TO_CORE(mod_color); MOD_COLOR_TO_CORE(mod_color);
struct core_dc *core_dc = DC_TO_CORE(core_color->dc); struct core_dc *core_dc = DC_TO_CORE(core_color->dc);
struct persistent_data_flag flag; struct persistent_data_flag flag;
unsigned int stream_index, sink_index; unsigned int stream_index;
int sink_index;
for (stream_index = 0; stream_index < num_streams; stream_index++) { for (stream_index = 0; stream_index < num_streams; stream_index++) {
sink_index = sink_index_from_sink(core_color, sink_index = sink_index_from_sink(core_color,
streams[stream_index]->sink); streams[stream_index]->sink);
if (sink_index == -1)
continue;
core_color->state[sink_index].user_enable_color_temperature core_color->state[sink_index].user_enable_color_temperature
= user_enable; = user_enable;
...@@ -2037,7 +2026,10 @@ bool mod_color_get_user_enable(struct mod_color *mod_color, ...@@ -2037,7 +2026,10 @@ bool mod_color_get_user_enable(struct mod_color *mod_color,
struct core_color *core_color = struct core_color *core_color =
MOD_COLOR_TO_CORE(mod_color); MOD_COLOR_TO_CORE(mod_color);
unsigned int sink_index = sink_index_from_sink(core_color, sink); int sink_index = sink_index_from_sink(core_color, sink);
if (sink_index == -1)
return false;
*user_enable = core_color->state[sink_index]. *user_enable = core_color->state[sink_index].
user_enable_color_temperature; user_enable_color_temperature;
...@@ -2052,7 +2044,10 @@ bool mod_color_get_custom_color_temperature(struct mod_color *mod_color, ...@@ -2052,7 +2044,10 @@ bool mod_color_get_custom_color_temperature(struct mod_color *mod_color,
struct core_color *core_color = struct core_color *core_color =
MOD_COLOR_TO_CORE(mod_color); MOD_COLOR_TO_CORE(mod_color);
unsigned int sink_index = sink_index_from_sink(core_color, sink); int sink_index = sink_index_from_sink(core_color, sink);
if (sink_index == -1)
return false;
*color_temperature = core_color->state[sink_index]. *color_temperature = core_color->state[sink_index].
custom_color_temperature; custom_color_temperature;
...@@ -2068,11 +2063,14 @@ bool mod_color_set_custom_color_temperature(struct mod_color *mod_color, ...@@ -2068,11 +2063,14 @@ bool mod_color_set_custom_color_temperature(struct mod_color *mod_color,
MOD_COLOR_TO_CORE(mod_color); MOD_COLOR_TO_CORE(mod_color);
struct core_dc *core_dc = DC_TO_CORE(core_color->dc); struct core_dc *core_dc = DC_TO_CORE(core_color->dc);
struct persistent_data_flag flag; struct persistent_data_flag flag;
unsigned int stream_index, sink_index; unsigned int stream_index;
int sink_index;
for (stream_index = 0; stream_index < num_streams; stream_index++) { for (stream_index = 0; stream_index < num_streams; stream_index++) {
sink_index = sink_index_from_sink(core_color, sink_index = sink_index_from_sink(core_color,
streams[stream_index]->sink); streams[stream_index]->sink);
if (sink_index == -1)
continue;
core_color->state[sink_index].custom_color_temperature core_color->state[sink_index].custom_color_temperature
= color_temperature; = color_temperature;
...@@ -2098,7 +2096,10 @@ bool mod_color_get_color_saturation(struct mod_color *mod_color, ...@@ -2098,7 +2096,10 @@ bool mod_color_get_color_saturation(struct mod_color *mod_color,
struct core_color *core_color = struct core_color *core_color =
MOD_COLOR_TO_CORE(mod_color); MOD_COLOR_TO_CORE(mod_color);
unsigned int sink_index = sink_index_from_sink(core_color, sink); int sink_index = sink_index_from_sink(core_color, sink);
if (sink_index == -1)
return false;
*color_saturation = core_color->state[sink_index].saturation; *color_saturation = core_color->state[sink_index].saturation;
...@@ -2112,7 +2113,10 @@ bool mod_color_get_color_contrast(struct mod_color *mod_color, ...@@ -2112,7 +2113,10 @@ bool mod_color_get_color_contrast(struct mod_color *mod_color,
struct core_color *core_color = struct core_color *core_color =
MOD_COLOR_TO_CORE(mod_color); MOD_COLOR_TO_CORE(mod_color);
unsigned int sink_index = sink_index_from_sink(core_color, sink); int sink_index = sink_index_from_sink(core_color, sink);
if (sink_index == -1)
return false;
*color_contrast = core_color->state[sink_index].contrast; *color_contrast = core_color->state[sink_index].contrast;
...@@ -2126,7 +2130,10 @@ bool mod_color_get_color_brightness(struct mod_color *mod_color, ...@@ -2126,7 +2130,10 @@ bool mod_color_get_color_brightness(struct mod_color *mod_color,
struct core_color *core_color = struct core_color *core_color =
MOD_COLOR_TO_CORE(mod_color); MOD_COLOR_TO_CORE(mod_color);
unsigned int sink_index = sink_index_from_sink(core_color, sink); int sink_index = sink_index_from_sink(core_color, sink);
if (sink_index == -1)
return false;
*color_brightness = core_color->state[sink_index].brightness; *color_brightness = core_color->state[sink_index].brightness;
...@@ -2140,7 +2147,10 @@ bool mod_color_get_color_hue(struct mod_color *mod_color, ...@@ -2140,7 +2147,10 @@ bool mod_color_get_color_hue(struct mod_color *mod_color,
struct core_color *core_color = struct core_color *core_color =
MOD_COLOR_TO_CORE(mod_color); MOD_COLOR_TO_CORE(mod_color);
unsigned int sink_index = sink_index_from_sink(core_color, sink); int sink_index = sink_index_from_sink(core_color, sink);
if (sink_index == -1)
return false;
*color_hue = core_color->state[sink_index].hue; *color_hue = core_color->state[sink_index].hue;
...@@ -2154,7 +2164,10 @@ bool mod_color_get_source_gamut(struct mod_color *mod_color, ...@@ -2154,7 +2164,10 @@ bool mod_color_get_source_gamut(struct mod_color *mod_color,
struct core_color *core_color = struct core_color *core_color =
MOD_COLOR_TO_CORE(mod_color); MOD_COLOR_TO_CORE(mod_color);
unsigned int sink_index = sink_index_from_sink(core_color, sink); int sink_index = sink_index_from_sink(core_color, sink);
if (sink_index == -1)
return false;
*source_gamut = core_color->state[sink_index].source_gamut.gamut; *source_gamut = core_color->state[sink_index].source_gamut.gamut;
...@@ -2169,11 +2182,14 @@ bool mod_color_notify_mode_change(struct mod_color *mod_color, ...@@ -2169,11 +2182,14 @@ bool mod_color_notify_mode_change(struct mod_color *mod_color,
struct gamut_src_dst_matrix *matrix = struct gamut_src_dst_matrix *matrix =
dm_alloc(sizeof(struct gamut_src_dst_matrix)); dm_alloc(sizeof(struct gamut_src_dst_matrix));
unsigned int stream_index, sink_index, j; unsigned int stream_index, j;
int sink_index;
for (stream_index = 0; stream_index < num_streams; stream_index++) { for (stream_index = 0; stream_index < num_streams; stream_index++) {
sink_index = sink_index_from_sink(core_color, sink_index = sink_index_from_sink(core_color,
streams[stream_index]->sink); streams[stream_index]->sink);
if (sink_index == -1)
continue;
if (!build_gamut_remap_matrix if (!build_gamut_remap_matrix
(core_color->state[sink_index].source_gamut.gamut, (core_color->state[sink_index].source_gamut.gamut,
...@@ -2247,11 +2263,14 @@ bool mod_color_set_brightness(struct mod_color *mod_color, ...@@ -2247,11 +2263,14 @@ bool mod_color_set_brightness(struct mod_color *mod_color,
struct core_color *core_color = MOD_COLOR_TO_CORE(mod_color); struct core_color *core_color = MOD_COLOR_TO_CORE(mod_color);
struct core_dc *core_dc = DC_TO_CORE(core_color->dc); struct core_dc *core_dc = DC_TO_CORE(core_color->dc);
struct persistent_data_flag flag; struct persistent_data_flag flag;
unsigned int stream_index, sink_index; unsigned int stream_index;
int sink_index;
for (stream_index = 0; stream_index < num_streams; stream_index++) { for (stream_index = 0; stream_index < num_streams; stream_index++) {
sink_index = sink_index_from_sink(core_color, sink_index = sink_index_from_sink(core_color,
streams[stream_index]->sink); streams[stream_index]->sink);
if (sink_index == -1)
continue;
struct core_stream *core_stream = struct core_stream *core_stream =
DC_STREAM_TO_CORE DC_STREAM_TO_CORE
...@@ -2291,11 +2310,14 @@ bool mod_color_set_contrast(struct mod_color *mod_color, ...@@ -2291,11 +2310,14 @@ bool mod_color_set_contrast(struct mod_color *mod_color,
struct core_color *core_color = MOD_COLOR_TO_CORE(mod_color); struct core_color *core_color = MOD_COLOR_TO_CORE(mod_color);
struct core_dc *core_dc = DC_TO_CORE(core_color->dc); struct core_dc *core_dc = DC_TO_CORE(core_color->dc);
struct persistent_data_flag flag; struct persistent_data_flag flag;
unsigned int stream_index, sink_index; unsigned int stream_index;
int sink_index;
for (stream_index = 0; stream_index < num_streams; stream_index++) { for (stream_index = 0; stream_index < num_streams; stream_index++) {
sink_index = sink_index_from_sink(core_color, sink_index = sink_index_from_sink(core_color,
streams[stream_index]->sink); streams[stream_index]->sink);
if (sink_index == -1)
continue;
struct core_stream *core_stream = struct core_stream *core_stream =
DC_STREAM_TO_CORE DC_STREAM_TO_CORE
...@@ -2335,11 +2357,14 @@ bool mod_color_set_hue(struct mod_color *mod_color, ...@@ -2335,11 +2357,14 @@ bool mod_color_set_hue(struct mod_color *mod_color,
struct core_color *core_color = MOD_COLOR_TO_CORE(mod_color); struct core_color *core_color = MOD_COLOR_TO_CORE(mod_color);
struct core_dc *core_dc = DC_TO_CORE(core_color->dc); struct core_dc *core_dc = DC_TO_CORE(core_color->dc);
struct persistent_data_flag flag; struct persistent_data_flag flag;
unsigned int stream_index, sink_index; unsigned int stream_index;
int sink_index;
for (stream_index = 0; stream_index < num_streams; stream_index++) { for (stream_index = 0; stream_index < num_streams; stream_index++) {
sink_index = sink_index_from_sink(core_color, sink_index = sink_index_from_sink(core_color,
streams[stream_index]->sink); streams[stream_index]->sink);
if (sink_index == -1)
continue;
struct core_stream *core_stream = struct core_stream *core_stream =
DC_STREAM_TO_CORE DC_STREAM_TO_CORE
...@@ -2378,11 +2403,14 @@ bool mod_color_set_saturation(struct mod_color *mod_color, ...@@ -2378,11 +2403,14 @@ bool mod_color_set_saturation(struct mod_color *mod_color,
struct core_color *core_color = MOD_COLOR_TO_CORE(mod_color); struct core_color *core_color = MOD_COLOR_TO_CORE(mod_color);
struct core_dc *core_dc = DC_TO_CORE(core_color->dc); struct core_dc *core_dc = DC_TO_CORE(core_color->dc);
struct persistent_data_flag flag; struct persistent_data_flag flag;
unsigned int stream_index, sink_index; unsigned int stream_index;
int sink_index;
for (stream_index = 0; stream_index < num_streams; stream_index++) { for (stream_index = 0; stream_index < num_streams; stream_index++) {
sink_index = sink_index_from_sink(core_color, sink_index = sink_index_from_sink(core_color,
streams[stream_index]->sink); streams[stream_index]->sink);
if (sink_index == -1)
continue;
struct core_stream *core_stream = struct core_stream *core_stream =
DC_STREAM_TO_CORE DC_STREAM_TO_CORE
...@@ -2420,11 +2448,14 @@ bool mod_color_set_input_gamma_correction(struct mod_color *mod_color, ...@@ -2420,11 +2448,14 @@ bool mod_color_set_input_gamma_correction(struct mod_color *mod_color,
struct dc_gamma *gamma) struct dc_gamma *gamma)
{ {
struct core_color *core_color = MOD_COLOR_TO_CORE(mod_color); struct core_color *core_color = MOD_COLOR_TO_CORE(mod_color);
unsigned int stream_index, sink_index; unsigned int stream_index;
int sink_index;
for (stream_index = 0; stream_index < num_streams; stream_index++) { for (stream_index = 0; stream_index < num_streams; stream_index++) {
sink_index = sink_index_from_sink(core_color, sink_index = sink_index_from_sink(core_color,
streams[stream_index]->sink); streams[stream_index]->sink);
if (sink_index == -1)
continue;
struct dc_surface *surface = struct dc_surface *surface =
dc_stream_to_surface_from_pipe_ctx(core_color, dc_stream_to_surface_from_pipe_ctx(core_color,
...@@ -2471,9 +2502,12 @@ bool mod_color_persist_user_preferred_quantization_range( ...@@ -2471,9 +2502,12 @@ bool mod_color_persist_user_preferred_quantization_range(
struct core_color *core_color = MOD_COLOR_TO_CORE(mod_color); struct core_color *core_color = MOD_COLOR_TO_CORE(mod_color);
struct core_dc *core_dc = DC_TO_CORE(core_color->dc); struct core_dc *core_dc = DC_TO_CORE(core_color->dc);
struct persistent_data_flag flag; struct persistent_data_flag flag;
unsigned int sink_index; int sink_index;
sink_index = sink_index_from_sink(core_color, sink); sink_index = sink_index_from_sink(core_color, sink);
if (sink_index == -1)
return false;
if (core_color->state[sink_index]. if (core_color->state[sink_index].
preferred_quantization_range != quantization_range) { preferred_quantization_range != quantization_range) {
core_color->state[sink_index].preferred_quantization_range = core_color->state[sink_index].preferred_quantization_range =
...@@ -2498,7 +2532,11 @@ bool mod_color_get_preferred_quantization_range(struct mod_color *mod_color, ...@@ -2498,7 +2532,11 @@ bool mod_color_get_preferred_quantization_range(struct mod_color *mod_color,
enum dc_quantization_range *quantization_range) enum dc_quantization_range *quantization_range)
{ {
struct core_color *core_color = MOD_COLOR_TO_CORE(mod_color); struct core_color *core_color = MOD_COLOR_TO_CORE(mod_color);
unsigned int sink_index = sink_index_from_sink(core_color, sink); int sink_index = sink_index_from_sink(core_color, sink);
if (sink_index == -1)
return false;
enum dc_quantization_range user_preferred_quantization_range = enum dc_quantization_range user_preferred_quantization_range =
core_color->state[sink_index]. core_color->state[sink_index].
preferred_quantization_range; preferred_quantization_range;
...@@ -2601,7 +2639,8 @@ bool mod_color_update_gamut_info(struct mod_color *mod_color, ...@@ -2601,7 +2639,8 @@ bool mod_color_update_gamut_info(struct mod_color *mod_color,
const struct dc_stream **streams, int num_streams) const struct dc_stream **streams, int num_streams)
{ {
struct core_color *core_color = MOD_COLOR_TO_CORE(mod_color); struct core_color *core_color = MOD_COLOR_TO_CORE(mod_color);
unsigned int stream_index, sink_index; unsigned int stream_index;
int sink_index;
bool should_defer = false; bool should_defer = false;
bool is_hdr = false; bool is_hdr = false;
enum color_color_space source_color_space; enum color_color_space source_color_space;
...@@ -2612,6 +2651,8 @@ bool mod_color_update_gamut_info(struct mod_color *mod_color, ...@@ -2612,6 +2651,8 @@ bool mod_color_update_gamut_info(struct mod_color *mod_color,
for (stream_index = 0; stream_index < num_streams; stream_index++) { for (stream_index = 0; stream_index < num_streams; stream_index++) {
sink_index = sink_index_from_sink(core_color, sink_index = sink_index_from_sink(core_color,
streams[stream_index]->sink); streams[stream_index]->sink);
if (sink_index == -1)
continue;
source_color_space = source_color_space =
core_color->state[sink_index].source_gamut.color_space; core_color->state[sink_index].source_gamut.color_space;
input_transfer_function = input_transfer_function =
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment