Commit e43a432c authored by Anthony Koo's avatar Anthony Koo Committed by Alex Deucher
Browse files

drm/amd/display: Have DC manage its own allocation of gamma



Creating plane will also allocate gamma and input TF
Creating stream will also allocate outputTF

Fix issue with gamma not applied
OS may call SetGamma before surface committed, so need to store
in target and apply later.

Signed-off-by: default avatarAnthony Koo <Anthony.Koo@amd.com>
Reviewed-by: default avatarAric Cyr <Aric.Cyr@amd.com>
Acked-by: default avatarHarry Wentland <harry.wentland@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 754e3673
Loading
Loading
Loading
Loading
+2 −4
Original line number Diff line number Diff line
@@ -2200,7 +2200,6 @@ fill_stream_properties_from_drm_display_mode(struct dc_stream_state *stream,
					     const struct drm_connector *connector)
{
	struct dc_crtc_timing *timing_out = &stream->timing;
	struct dc_transfer_func *tf = dc_create_transfer_func();

	memset(timing_out, 0, sizeof(struct dc_crtc_timing));

@@ -2244,9 +2243,8 @@ fill_stream_properties_from_drm_display_mode(struct dc_stream_state *stream,

	stream->output_color_space = get_output_color_space(timing_out);

	tf->type = TF_TYPE_PREDEFINED;
	tf->tf = TRANSFER_FUNCTION_SRGB;
	stream->out_transfer_func = tf;
	stream->out_transfer_func->type = TF_TYPE_PREDEFINED;
	stream->out_transfer_func->tf = TRANSFER_FUNCTION_SRGB;
}

static void fill_audio_info(struct audio_info *audio_info,
+4 −2
Original line number Diff line number Diff line
@@ -101,14 +101,16 @@ static void construct(struct dc_stream_state *stream,
	stream->status.link = stream->sink->link;

	update_stream_signal(stream);

	stream->out_transfer_func = dc_create_transfer_func();
	stream->out_transfer_func->type = TF_TYPE_BYPASS;
}

static void destruct(struct dc_stream_state *stream)
{
	dc_sink_release(stream->sink);
	if (stream->out_transfer_func != NULL) {
		dc_transfer_func_release(
				stream->out_transfer_func);
		dc_transfer_func_release(stream->out_transfer_func);
		stream->out_transfer_func = NULL;
	}
}
+7 −1
Original line number Diff line number Diff line
@@ -38,6 +38,12 @@
static void construct(struct dc_context *ctx, struct dc_plane_state *plane_state)
{
	plane_state->ctx = ctx;

	plane_state->gamma_correction = dc_create_gamma();
	plane_state->gamma_correction->is_identity = true;

	plane_state->in_transfer_func = dc_create_transfer_func();
	plane_state->in_transfer_func->type = TF_TYPE_BYPASS;
}

static void destruct(struct dc_plane_state *plane_state)
@@ -175,7 +181,7 @@ void dc_transfer_func_release(struct dc_transfer_func *tf)
	kref_put(&tf->refcount, dc_transfer_func_free);
}

struct dc_transfer_func *dc_create_transfer_func(void)
struct dc_transfer_func *dc_create_transfer_func()
{
	struct dc_transfer_func *tf = kzalloc(sizeof(*tf), GFP_KERNEL);

+2 −3
Original line number Diff line number Diff line
@@ -956,9 +956,8 @@ static bool dcn10_set_input_transfer_func(struct pipe_ctx *pipe_ctx,
		tf = plane_state->in_transfer_func;

	if (plane_state->gamma_correction &&
		plane_state->gamma_correction->is_identity)
		dpp_base->funcs->dpp_set_degamma(dpp_base, IPP_DEGAMMA_MODE_BYPASS);
	else if (plane_state->gamma_correction && dce_use_lut(plane_state->format))
		!plane_state->gamma_correction->is_identity
			&& dce_use_lut(plane_state->format))
		dpp_base->funcs->dpp_program_input_lut(dpp_base, plane_state->gamma_correction);

	if (tf == NULL)