diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0072-drm-amd-display-Refactor-to-move-gamma-correction-to.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0072-drm-amd-display-Refactor-to-move-gamma-correction-to.patch | 155 |
1 files changed, 155 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0072-drm-amd-display-Refactor-to-move-gamma-correction-to.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0072-drm-amd-display-Refactor-to-move-gamma-correction-to.patch new file mode 100644 index 00000000..86c94b91 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0072-drm-amd-display-Refactor-to-move-gamma-correction-to.patch @@ -0,0 +1,155 @@ +From d2e6be5c4c3414043a20cd5b1820a78c37e3dedd Mon Sep 17 00:00:00 2001 +From: Anthony Koo <Anthony.Koo@amd.com> +Date: Fri, 16 Dec 2016 10:43:21 -0500 +Subject: [PATCH 0072/4131] drm/amd/display: Refactor to move gamma correction + to module + +Refactor part 4 - Moving input gamma correction programming into color module + +DM will translate to dc_gamma structure, but programming will be moved into +the color module. Later, this will allow gamma correction to be added on top of +in/out transfer function curves. + +Signed-off-by: Anthony Koo <anthony.koo@amd.com> +Reviewed-by: Anthony Koo <Anthony.Koo@amd.com> +Acked-by: Harry Wentland <Harry.Wentland@amd.com> +Signed-off-by: Alex Deucher <alexander.deucher@amd.com> +--- + drivers/gpu/drm/amd/display/modules/color/color.c | 77 ++++++++++++++++++++++ + .../gpu/drm/amd/display/modules/inc/mod_color.h | 4 ++ + 2 files changed, 81 insertions(+) + +diff --git a/drivers/gpu/drm/amd/display/modules/color/color.c b/drivers/gpu/drm/amd/display/modules/color/color.c +index 0610b82..6613ff9 100644 +--- a/drivers/gpu/drm/amd/display/modules/color/color.c ++++ b/drivers/gpu/drm/amd/display/modules/color/color.c +@@ -69,6 +69,7 @@ struct color_state { + struct color_range saturation; + struct color_range brightness; + struct color_range hue; ++ struct dc_gamma *gamma; + enum dc_quantization_range preferred_quantization_range; + }; + +@@ -1265,6 +1266,26 @@ static void calculate_csc_matrix(struct core_color *core_color, + } + } + ++static struct dc_surface *dc_stream_to_surface_from_pipe_ctx( ++ struct core_color *core_color, ++ const struct dc_stream *stream) ++{ ++ int i; ++ struct core_dc *core_dc = DC_TO_CORE(core_color->dc); ++ struct core_stream *core_stream = DC_STREAM_TO_CORE(stream); ++ struct dc_surface *out_surface = NULL; ++ ++ for (i = 0; i < MAX_PIPES; i++) { ++ if (core_dc->current_context->res_ctx.pipe_ctx[i].stream ++ == core_stream) { ++ out_surface = &core_dc->current_context->res_ctx. ++ pipe_ctx[i].surface->public; ++ break; ++ } ++ } ++ return out_surface; ++} ++ + struct mod_color *mod_color_create(struct dc *dc) + { + int i = 0; +@@ -1369,6 +1390,10 @@ void mod_color_destroy(struct mod_color *mod_color) + struct core_color *core_color = + MOD_COLOR_TO_CORE(mod_color); + ++ for (i = 0; i < core_color->num_sinks; i++) ++ if (core_color->state[i].gamma) ++ dc_gamma_release(core_color->state[i].gamma); ++ + dm_free(core_color->state); + + for (i = 0; i < core_color->num_sinks; i++) +@@ -1552,6 +1577,9 @@ bool mod_color_remove_sink(struct mod_color *mod_color, + + for (i = 0; i < core_color->num_sinks; i++) { + if (core_color->caps[i].sink == sink) { ++ if (core_color->state[i].gamma) ++ dc_gamma_release(core_color->state[i].gamma); ++ + /* To remove this sink, shift everything after down */ + for (j = i; j < core_color->num_sinks - 1; j++) { + core_color->caps[j].sink = +@@ -2184,6 +2212,55 @@ bool mod_color_set_saturation(struct mod_color *mod_color, + return true; + } + ++bool mod_color_set_input_gamma_correction(struct mod_color *mod_color, ++ const struct dc_stream **streams, int num_streams, ++ struct dc_gamma *gamma) ++{ ++ struct core_color *core_color = MOD_COLOR_TO_CORE(mod_color); ++ unsigned int stream_index, sink_index; ++ ++ for (stream_index = 0; stream_index < num_streams; stream_index++) { ++ sink_index = sink_index_from_sink(core_color, ++ streams[stream_index]->sink); ++ ++ struct dc_surface *surface = ++ dc_stream_to_surface_from_pipe_ctx(core_color, ++ streams[stream_index]); ++ ++ if (surface != NULL) { ++ struct dc_transfer_func *input_tf = ++ dc_create_transfer_func(core_color->dc); ++ struct dc_surface_update updates = {0}; ++ ++ if (input_tf != NULL) { ++ input_tf->type = TF_TYPE_PREDEFINED; ++ input_tf->tf = TRANSFER_FUNCTION_SRGB; ++ } ++ ++ if (core_color->state[sink_index].gamma != gamma) { ++ if (core_color->state[sink_index].gamma) ++ dc_gamma_release( ++ core_color->state[sink_index]. ++ gamma); ++ ++ dc_gamma_retain(gamma); ++ core_color->state[sink_index].gamma = gamma; ++ } ++ ++ updates.surface = surface; ++ updates.gamma = gamma; ++ updates.in_transfer_func = input_tf; ++ dc_update_surfaces_for_target(core_color->dc, &updates, ++ 1, NULL); ++ ++ if (input_tf != NULL) ++ dc_transfer_func_release(input_tf); ++ } ++ } ++ ++ return true; ++} ++ + bool mod_color_persist_user_preferred_quantization_range( + struct mod_color *mod_color, + const struct dc_sink *sink, +diff --git a/drivers/gpu/drm/amd/display/modules/inc/mod_color.h b/drivers/gpu/drm/amd/display/modules/inc/mod_color.h +index 787c2c0..fbf9081 100644 +--- a/drivers/gpu/drm/amd/display/modules/inc/mod_color.h ++++ b/drivers/gpu/drm/amd/display/modules/inc/mod_color.h +@@ -168,6 +168,10 @@ bool mod_color_set_saturation(struct mod_color *mod_color, + const struct dc_stream **streams, int num_streams, + int saturation_value); + ++bool mod_color_set_input_gamma_correction(struct mod_color *mod_color, ++ const struct dc_stream **streams, int num_streams, ++ struct dc_gamma *gamma); ++ + bool mod_color_persist_user_preferred_quantization_range( + struct mod_color *mod_color, + const struct dc_sink *sink, +-- +2.7.4 + |