Commit 99de6861 authored by Melissa Wen's avatar Melissa Wen Committed by Alex Deucher
Browse files

drm/amd/display: add plane shaper TF support



Enable usage of predefined transfer func in addition to shaper 1D LUT.
That means we can save some complexity by just setting a predefined
curve, instead of programming a custom curve when preparing color space
for applying 3D LUT.

Reviewed-by: default avatarHarry Wentland <harry.wentland@amd.com>
Signed-off-by: default avatarMelissa Wen <mwen@igalia.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent aba8b76b
Loading
Loading
Loading
Loading
+11 −4
Original line number Diff line number Diff line
@@ -624,20 +624,23 @@ amdgpu_tf_to_dc_tf(enum amdgpu_transfer_function tf)
}

static int amdgpu_dm_atomic_shaper_lut(const struct drm_color_lut *shaper_lut,
				       bool has_rom,
				       enum dc_transfer_func_predefined tf,
				       uint32_t shaper_size,
				       struct dc_transfer_func *func_shaper)
{
	int ret = 0;

	if (shaper_size) {
	if (shaper_size || tf != TRANSFER_FUNCTION_LINEAR) {
		/*
		 * If user shaper LUT is set, we assume a linear color space
		 * (linearized by degamma 1D LUT or not).
		 */
		func_shaper->type = TF_TYPE_DISTRIBUTED_POINTS;
		func_shaper->tf = TRANSFER_FUNCTION_LINEAR;
		func_shaper->tf = tf;
		func_shaper->sdr_ref_white_level = SDR_WHITE_LEVEL_INIT_VALUE;

		ret = __set_output_tf(func_shaper, shaper_lut, shaper_size, false);
		ret = __set_output_tf(func_shaper, shaper_lut, shaper_size, has_rom);
	} else {
		func_shaper->type = TF_TYPE_BYPASS;
		func_shaper->tf = TRANSFER_FUNCTION_LINEAR;
@@ -972,6 +975,7 @@ amdgpu_dm_plane_set_color_properties(struct drm_plane_state *plane_state,
				     struct dc_plane_state *dc_plane_state)
{
	struct dm_plane_state *dm_plane_state = to_dm_plane_state(plane_state);
	enum amdgpu_transfer_function shaper_tf = AMDGPU_TRANSFER_FUNCTION_DEFAULT;
	const struct drm_color_lut *shaper_lut;
	uint32_t shaper_size;
	int ret;
@@ -980,8 +984,11 @@ amdgpu_dm_plane_set_color_properties(struct drm_plane_state *plane_state,

	shaper_lut = __extract_blob_lut(dm_plane_state->shaper_lut, &shaper_size);
	shaper_size = shaper_lut != NULL ? shaper_size : 0;
	shaper_tf = dm_plane_state->shaper_tf;

	ret = amdgpu_dm_atomic_shaper_lut(shaper_lut, shaper_size,
	ret = amdgpu_dm_atomic_shaper_lut(shaper_lut, false,
					  amdgpu_tf_to_dc_tf(shaper_tf),
					  shaper_size,
					  dc_plane_state->in_shaper_func);
	if (ret)
		drm_dbg_kms(plane_state->plane->dev,