dri-devel.lists.freedesktop.org archive mirror
 help / color / mirror / Atom feed
From: Melissa Wen <mwen@igalia.com>
To: amd-gfx@lists.freedesktop.org,
	Harry Wentland <harry.wentland@amd.com>,
	Rodrigo Siqueira <Rodrigo.Siqueira@amd.com>,
	sunpeng.li@amd.com, Alex Deucher <alexander.deucher@amd.com>,
	dri-devel@lists.freedesktop.org, christian.koenig@amd.com,
	Xinhui.Pan@amd.com, airlied@gmail.com, daniel@ffwll.ch
Cc: Sebastian Wick <sebastian.wick@redhat.com>,
	Shashank Sharma <Shashank.Sharma@amd.com>,
	Alex Hung <alex.hung@amd.com>, Xaver Hugl <xaver.hugl@gmail.com>,
	linux-kernel@vger.kernel.org, Melissa Wen <mwen@igalia.com>,
	Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>,
	Joshua Ashton <joshua@froggi.es>,
	sungjoon.kim@amd.com
Subject: [RFC PATCH 26/40] drm/amd/display: add CRTC shaper LUT support to amd color pipeline
Date: Sun, 23 Apr 2023 13:10:38 -0100	[thread overview]
Message-ID: <20230423141051.702990-27-mwen@igalia.com> (raw)
In-Reply-To: <20230423141051.702990-1-mwen@igalia.com>

Now, we can use DRM CRTC shaper LUT to delinearize and/or normalize the
color space for a more efficient 3D LUT support (so far, only for DRM
atomic color mgmt). If a degamma 1D LUT is passed to linearize the color
space, a custom shaper 1D LUT can be used before applying 3D LUT.

NOTE: although DRM CRTC shaper and 3D LUTs are optional properties, from
our tests, AMD HW doesn't allow 3D LUT when shaper LUT is set to BYPASS
(without user shaper LUT)

Signed-off-by: Melissa Wen <mwen@igalia.com>
---
 .../amd/display/amdgpu_dm/amdgpu_dm_color.c   | 81 +++++++++----------
 1 file changed, 38 insertions(+), 43 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_color.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_color.c
index 672ca5e9e59c..ff29be3929af 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_color.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_color.c
@@ -443,46 +443,26 @@ static void amdgpu_dm_atomic_lut3d(const struct drm_color_lut *drm_lut,
 	}
 }
 
-/**
- * __set_input_tf - calculates the input transfer function based on expected
- * input space.
- * @func: transfer function
- * @lut: lookup table that defines the color space
- * @lut_size: size of respective lut.
- *
- * Returns:
- * 0 in case of success. -ENOMEM if fails.
- */
-static int __set_input_tf(struct dc_transfer_func *func,
-			  const struct drm_color_lut *lut, uint32_t lut_size)
+static int amdgpu_dm_atomic_shaper_lut(const struct drm_color_lut *shaper_lut,
+				       uint32_t shaper_size,
+				       struct dc_transfer_func *func_shaper)
 {
-	struct dc_gamma *gamma = NULL;
-	bool res;
-
-	gamma = dc_create_gamma();
-	if (!gamma)
-		return -ENOMEM;
-
-	gamma->type = GAMMA_CUSTOM;
-	gamma->num_entries = lut_size;
-
-	__drm_lut_to_dc_gamma(lut, gamma, false);
-
-	res = mod_color_calculate_degamma_params(NULL, func, gamma, true);
-	dc_gamma_release(&gamma);
+	int ret = 0;
 
-	return res ? 0 : -ENOMEM;
-}
+	if (shaper_size) {
+		/* If DRM shaper LUT is set, we assume a linear color space
+		 * (linearized by DRM degamma 1D LUT or not)
+		 */
+		func_shaper->type = TF_TYPE_DISTRIBUTED_POINTS;
+		func_shaper->tf = TRANSFER_FUNCTION_LINEAR;
 
-static int amdgpu_dm_atomic_shaper_lut(struct dc_transfer_func *func_shaper)
-{
-	/* We don't get DRM shaper LUT yet. We assume the input color space is already
-	 * delinearized, so we don't need a shaper LUT and we can just BYPASS
-	 */
-	func_shaper->type = TF_TYPE_BYPASS;
-	func_shaper->tf = TRANSFER_FUNCTION_LINEAR;
+		ret = __set_output_tf(func_shaper, shaper_lut, shaper_size, false);
+	} else {
+		func_shaper->type = TF_TYPE_BYPASS;
+		func_shaper->tf = TRANSFER_FUNCTION_LINEAR;
+	}
 
-	return 0;
+	return ret;
 }
 
 /* amdgpu_dm_atomic_shaper_lut3d - set DRM CRTC shaper LUT and 3D LUT to DC
@@ -530,7 +510,8 @@ static int amdgpu_dm_atomic_shaper_lut3d(struct dc *dc,
 
 	amdgpu_dm_atomic_lut3d(drm_lut3d, drm_lut3d_size, lut3d_func);
 
-	return amdgpu_dm_atomic_shaper_lut(func_shaper);
+	return amdgpu_dm_atomic_shaper_lut(drm_shaper_lut,
+					   drm_shaper_size, func_shaper);
 }
 
 /**
@@ -562,12 +543,22 @@ static uint32_t amdgpu_dm_get_lut3d_size(struct amdgpu_device *adev,
 int amdgpu_dm_verify_lut3d_size(struct amdgpu_device *adev,
 				const struct drm_crtc_state *crtc_state)
 {
-	const struct drm_color_lut *lut3d = NULL;
 	struct dm_crtc_state *acrtc_state = to_dm_crtc_state(crtc_state);
+	const struct drm_color_lut *shaper = NULL, *lut3d = NULL;
 	uint32_t exp_size, size;
 
-	exp_size = amdgpu_dm_get_lut3d_size(adev, MAX_COLOR_3DLUT_ENTRIES);
+	/* shaper LUT is only available if 3D LUT color caps*/
+	exp_size = amdgpu_dm_get_lut3d_size(adev, MAX_COLOR_LUT_ENTRIES);
+	shaper = __extract_blob_lut(acrtc_state->shaper_lut, &size);
 
+	if (shaper && size != exp_size) {
+		DRM_DEBUG_DRIVER(
+			"Invalid Shaper LUT size. Should be %u but got %u.\n",
+			exp_size, size);
+		return -EINVAL;
+	}
+
+	exp_size = amdgpu_dm_get_lut3d_size(adev, MAX_COLOR_3DLUT_ENTRIES);
 	lut3d = __extract_blob_lut(acrtc_state->lut3d, &size);
 
 	if (lut3d && size != exp_size) {
@@ -652,14 +643,15 @@ int amdgpu_dm_update_crtc_color_mgmt(struct dm_crtc_state *crtc,
 	bool is_legacy;
 	int r;
 #ifdef CONFIG_STEAM_DECK
-	const struct drm_color_lut *lut3d;
-	uint32_t lut3d_size;
+	const struct drm_color_lut *shaper_lut, *lut3d;
+	uint32_t shaper_size, lut3d_size;
 
 	r =  amdgpu_dm_verify_lut3d_size(adev, &crtc->base);
 	if (r)
 		return r;
 
 	lut3d = __extract_blob_lut(crtc->lut3d, &lut3d_size);
+	shaper_lut = __extract_blob_lut(crtc->shaper_lut, &shaper_size);
 #endif
 
 	r = amdgpu_dm_verify_lut_sizes(&crtc->base);
@@ -711,11 +703,14 @@ int amdgpu_dm_update_crtc_color_mgmt(struct dm_crtc_state *crtc,
 	} else {
 #ifdef CONFIG_STEAM_DECK
 		lut3d_size = lut3d != NULL ? lut3d_size : 0;
+		shaper_size = shaper_lut != NULL ? shaper_size : 0;
 		r = amdgpu_dm_atomic_shaper_lut3d(adev->dm.dc, ctx, stream,
-						  NULL, 0,
+						  shaper_lut, shaper_size,
 						  lut3d, lut3d_size);
-		if (r)
+		if (r) {
+			DRM_DEBUG_DRIVER("Failed on shaper/3D LUTs setup\n");
 			return r;
+		}
 #endif
 		/* Note: OGAM is disabled if 3D LUT is successfully programmed.
 		 * See params and set_output_gamma in
-- 
2.39.2


  parent reply	other threads:[~2023-04-23 14:13 UTC|newest]

Thread overview: 62+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-04-23 14:10 [RFC PATCH 00/40] drm/amd/display: add AMD driver-specific properties for color mgmt Melissa Wen
2023-04-23 14:10 ` [RFC PATCH 01/40] drm/amd/display: fix segment distribution for linear LUTs Melissa Wen
2023-04-23 14:10 ` [RFC PATCH 02/40] drm/amd/display: fix the delta clamping for shaper LUT Melissa Wen
2023-04-23 14:10 ` [RFC PATCH 03/40] drm/amd/display: introduce Steam Deck color features to AMD display driver Melissa Wen
2023-05-08 21:24   ` Harry Wentland
2023-05-09 16:23     ` Melissa Wen
2023-05-09 16:52       ` Joshua Ashton
2023-05-09 17:19         ` Harry Wentland
2023-05-09 17:20       ` Harry Wentland
2023-04-23 14:10 ` [RFC PATCH 04/40] drm/drm_mode_object: increase max objects to accommodate new color props Melissa Wen
2023-04-23 14:10 ` [RFC PATCH 05/40] drm/amd/display: add shaper LUT driver-private props Melissa Wen
2023-05-08 21:24   ` Harry Wentland
2023-05-09 16:30     ` Melissa Wen
2023-04-23 14:10 ` [RFC PATCH 06/40] drm/amd/display: add 3D " Melissa Wen
2023-04-23 14:10 ` [RFC PATCH 07/40] drm/amd/display: add CRTC gamma TF to " Melissa Wen
2023-05-08 21:24   ` Harry Wentland
2023-05-09 16:34     ` Melissa Wen
2023-05-09 16:55       ` Joshua Ashton
2023-04-23 14:10 ` [RFC PATCH 08/40] drm/drm_plane: track color mgmt changes per plane Melissa Wen
2023-04-23 14:10 ` [RFC PATCH 09/40] drm/amd/display: move replace blob func to dm plane Melissa Wen
2023-05-08 21:24   ` Harry Wentland
2023-05-09 16:35     ` Melissa Wen
2023-04-23 14:10 ` [RFC PATCH 10/40] drm/amd/display: add plane degamma LUT driver-private props Melissa Wen
2023-04-23 14:10 ` [RFC PATCH 11/40] drm/amd/display: add plane degamma TF driver-private property Melissa Wen
2023-04-23 14:10 ` [RFC PATCH 12/40] drm/amd/display: add plane HDR multiplier " Melissa Wen
2023-05-08 21:24   ` Harry Wentland
2023-05-09 16:37     ` Melissa Wen
2023-05-09 16:54       ` Joshua Ashton
2023-05-09 20:00         ` Harry Wentland
2023-05-09 20:35           ` Joshua Ashton
2023-05-09 22:55             ` Harry Wentland
2023-04-23 14:10 ` [RFC PATCH 13/40] drm/amd/display: add plane 3D LUT driver-private properties Melissa Wen
2023-04-23 14:10 ` [RFC PATCH 14/40] drm/amd/display: add plane shaper " Melissa Wen
2023-04-23 14:10 ` [RFC PATCH 15/40] drm/amd/display: add plane shaper TF driver-private property Melissa Wen
2023-04-23 14:10 ` [RFC PATCH 16/40] drm/amd/display: add plane blend LUT and TF driver-private properties Melissa Wen
2023-04-23 14:10 ` [RFC PATCH 17/40] drm/amd/display: add comments to describe DM crtc color mgmt behavior Melissa Wen
2023-04-23 14:10 ` [RFC PATCH 18/40] drm/amd/display: encapsulate atomic regamma operation Melissa Wen
2023-04-23 14:10 ` [RFC PATCH 19/40] drm/amd/display: update lut3d and shaper lut to stream Melissa Wen
2023-04-23 14:10 ` [RFC PATCH 20/40] drm/amd/display: copy 3D LUT settings from crtc state to stream_update Melissa Wen
2023-04-23 14:10 ` [RFC PATCH 21/40] drm/amd/display: allow BYPASS 3D LUT but keep shaper LUT settings Melissa Wen
2023-04-23 14:10 ` [RFC PATCH 22/40] drm/amd/display: handle MPC 3D LUT resources for a given context Melissa Wen
2023-04-23 14:10 ` [RFC PATCH 23/40] drm/amd/display: dynamically acquire 3DLUT resources for color changes Melissa Wen
2023-04-23 14:10 ` [RFC PATCH 24/40] drm/amd/display: add CRTC 3D LUT support to amd color pipeline Melissa Wen
2023-04-23 14:10 ` [RFC PATCH 25/40] drm/amd/display: decouple steps to reuse in CRTC shaper LUT support Melissa Wen
2023-04-23 14:10 ` Melissa Wen [this message]
2023-04-23 14:10 ` [RFC PATCH 27/40] drm/amd/display: add CRTC regamma TF support Melissa Wen
2023-04-23 14:10 ` [RFC PATCH 28/40] drm/amd/display: set sdr_ref_white_level to 80 for out_transfer_func Melissa Wen
2023-04-23 14:10 ` [RFC PATCH 29/40] drm/amd/display: add CRTC shaper TF support Melissa Wen
2023-04-23 14:10 ` [RFC PATCH 30/40] drm/amd/display: mark plane as needing reset if plane color mgmt changes Melissa Wen
2023-04-23 14:10 ` [RFC PATCH 31/40] drm/amd/display: decouple steps for mapping CRTC degamma to DC plane Melissa Wen
2023-04-23 14:10 ` [RFC PATCH 32/40] drm/amd/display: add support for plane degamma TF and LUT properties Melissa Wen
2023-04-23 14:10 ` [RFC PATCH 33/40] drm/amd/display: reject atomic commit if setting both plane and CRTC degamma Melissa Wen
2023-04-23 14:10 ` [RFC PATCH 34/40] drm/amd/display: add dc_fixpt_from_s3132 helper Melissa Wen
2023-04-23 14:10 ` [RFC PATCH 35/40] drm/adm/display: add HDR multiplier support Melissa Wen
2023-04-23 14:10 ` [RFC PATCH 36/40] drm/amd/display: add plane shaper/3D LUT and shaper TF support Melissa Wen
2023-04-23 14:10 ` [RFC PATCH 37/40] drm/amd/display: handle empty LUTs in __set_input_tf Melissa Wen
2023-04-23 14:10 ` [RFC PATCH 38/40] drm/amd/display: add DRM plane blend LUT and TF support Melissa Wen
2023-04-23 14:10 ` [RFC PATCH 39/40] drm/amd/display: copy dc_plane color settings to surface_updates Melissa Wen
2023-04-23 14:10 ` [RFC PATCH 40/40] drm/amd/display: allow newer DC hardware to use degamma ROM for PQ/HLG Melissa Wen
2023-05-08 21:24 ` [RFC PATCH 00/40] drm/amd/display: add AMD driver-specific properties for color mgmt Harry Wentland
2023-05-09 16:52   ` Melissa Wen
2023-05-09 17:25     ` Harry Wentland

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230423141051.702990-27-mwen@igalia.com \
    --to=mwen@igalia.com \
    --cc=Rodrigo.Siqueira@amd.com \
    --cc=Shashank.Sharma@amd.com \
    --cc=Xinhui.Pan@amd.com \
    --cc=airlied@gmail.com \
    --cc=alex.hung@amd.com \
    --cc=alexander.deucher@amd.com \
    --cc=amd-gfx@lists.freedesktop.org \
    --cc=christian.koenig@amd.com \
    --cc=daniel@ffwll.ch \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=harry.wentland@amd.com \
    --cc=joshua@froggi.es \
    --cc=linux-kernel@vger.kernel.org \
    --cc=nicholas.kazlauskas@amd.com \
    --cc=sebastian.wick@redhat.com \
    --cc=sungjoon.kim@amd.com \
    --cc=sunpeng.li@amd.com \
    --cc=xaver.hugl@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).