From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from fanzine2.igalia.com (fanzine2.igalia.com [213.97.179.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3E4013C09F2 for ; Wed, 19 Aug 2026 16:11:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=213.97.179.56 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787155906; cv=none; b=EZabZiOTZZ4lZREO+ufXpyisI7A+sAwq70mGLdf++SCKtV948I3ZtBUoQ9l01h84QvS6aUN4qIqdvfHqY9wXbI6Lu8m2Nz4qFnIPEPVD70DoyB7q0UMQwACVy8rgGXpK/nC1jhYCSH++mwMbzsReEHi8OrkvlWwrQ+7vYcI+A/c= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787155906; c=relaxed/simple; bh=y41e4df0tJjM0Jf6BAH/3i2iIbuJIPy7GBKijeaVDwQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=M0PyCFDY95hsGrzEfVr2KsEWxA/UZEa7UYxTZJxj8nj/eEfvqBRVZp1XPcH745CZ14VMmVKshKQi+cQ5Qhbytgl4BhLt4x3Z13MAPhDsZZitybX1UwigYYSY5+OO+SMIMkOuwnlAsiUXp1qVZZFvPJbXdlhWu63kb1y1eL66vSs= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=igalia.com; spf=pass smtp.mailfrom=igalia.com; dkim=pass (2048-bit key) header.d=igalia.com header.i=@igalia.com header.b=TL4LFsTf; arc=none smtp.client-ip=213.97.179.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=igalia.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=igalia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=igalia.com header.i=@igalia.com header.b="TL4LFsTf" DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=igalia.com; s=20170329; h=Content-Transfer-Encoding:MIME-Version:Message-ID:Date:Subject: Cc:To:From:From:Reply-To; bh=pQEZdjEYvZ37z1IjNVUcYzMWagugWm8OJbaapWEXwwE=; b= TL4LFsTfZ9KimHfggKSdaj3MpFUx8byTtcsMNPW5cWIP5ZvBNg3H2HyBdUQXzRIXOHbtTh59EE3ET dCk8s+RbaJpQmI6eLByot/7tUFu/bRqJSy8Tvax3LImLWV6yBsfKAz+vTzh9Rdfdu3F51TE8lZmFf GxW1dCsp3v1CjSmo6RNVklJwavHWvViWw98b0z+QrxokESCj8TY5mg8gNgT9JEKE2kjLSD081PIjN x9aacl0N64f951F9Z+ll5GegVDFi+tkl3+55A6Gvd3eiSICPfkEzbXGIkp9Jvxv5cO6g5piRbSlGf xGvgqWjvXvtSFSN90C6X5mGLqe3++hFw+w==; Received: from 154.red-79-147-121.dynamicip.rima-tde.net ([79.147.121.154] helo=killbill.home) by fanzine2.igalia.com with esmtpsa (Cipher TLS1.3:ECDHE_X25519__RSA_PSS_RSAE_SHA256__AES_256_GCM:256) (Exim) id 1wwisn-006BRc-8z; Wed, 19 Aug 2026 18:11:17 +0200 From: Melissa Wen To: airlied@gmail.com, alexander.deucher@amd.com, christian.koenig@amd.com, harry.wentland@amd.com, mwen@igalia.com, simona@ffwll.ch, siqueira@igalia.com, sunpeng.li@amd.com Cc: Krunoslav Kovac , "'Dr . David Alan Gilbert'" , Bhawanpreet Lakha , Alex Hung , Aurabindo Pillai , Matthew Schwartz , pekka.paalanen@collabora.com, robert.mader@posteo.de, amd-gfx@lists.freedesktop.org, kernel-dev@igalia.com, linux-kernel@vger.kernel.org Subject: [PATCH 1/2] drm/amd/display: use halving distribution for all encode-to-linear curves Date: Wed, 19 Aug 2026 18:00:16 +0200 Message-ID: <20260819161106.27702-2-mwen@igalia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260819161106.27702-1-mwen@igalia.com> References: <20260819161106.27702-1-mwen@igalia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit In encode-to-linear conversions, LUT entries should be uniformly distributed across the input range: non-linear encodings are already approximately perceptually uniform, so every input code carries the same weight. A fixed count per region does the opposite, concentrating entries on the darker values and leaving few for the bright end, whereas halving distribution spaces all 256 entries uniformly. This holds for any encoded input, so remove the PQ/sRGB condition from de17c6bb7072 and apply halving to all encode-to-linear operations (pre-defined TF or user LUTs). It fixes the following IGT kms_colorop subtests: - plane-XR30-XR30-srgb_inv_eotf_lut-srgb_eotf_lut - plane-XR30-XR30-gamma_2_2-gamma_2_2_inv-gamma_2_2 Fixes: de17c6bb7072 ("drm/amd/display: use halving distribution for PQ/sRGB linearizing LUT") Reviewed-by: Harry Wentland Signed-off-by: Melissa Wen --- .../amd/display/dc/dcn30/dcn30_cm_common.c | 34 ++++++------------- 1 file changed, 10 insertions(+), 24 deletions(-) diff --git a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_cm_common.c b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_cm_common.c index 66fe7f313ea3..62ca235cd649 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_cm_common.c +++ b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_cm_common.c @@ -320,6 +320,8 @@ static struct fixed31_32 interp_tf_pts(const struct fixed31_32 *output_tf_channe return value; } +#define NUM_DEGAMMA_REGIONS 9 + bool cm3_helper_translate_curve_to_degamma_hw_format( const struct dc_transfer_func *output_tf, struct pwl_params *lut_params) @@ -343,31 +345,15 @@ bool cm3_helper_translate_curve_to_degamma_hw_format( memset(lut_params, 0, sizeof(struct pwl_params)); memset(seg_distr, 0, sizeof(seg_distr)); - if (output_tf->tf == TRANSFER_FUNCTION_PQ || - output_tf->tf == TRANSFER_FUNCTION_SRGB) { - /* 9 segments - * segments are from 2^-9 to 0 - */ - const uint8_t SEG_COUNT = 9; - seg_distr[0] = 0; // Since we only have one point in darkest region - for (k = 1; k < SEG_COUNT; k++) - seg_distr[k] = k - 1; // 2^(k-1) points per region; halves as k decreases + /* 9 segments + * segments are from 2^-9 to 2^0 + */ + seg_distr[0] = 0; // Since we only have one point in darkest region + for (k = 1; k < NUM_DEGAMMA_REGIONS; k++) + seg_distr[k] = k - 1; // 2^(k-1) points per region; halves as k decreases - region_start = -SEG_COUNT; - region_end = 0; - } else { - /* 12 segments - * segments are from 2^-12 to 2^0 - * There are less than 256 points, for optimization - */ - const uint8_t SEG_COUNT = 12; - - for (i = 0; i < SEG_COUNT; i++) - seg_distr[i] = 4; - - region_start = -SEG_COUNT; - region_end = 0; - } + region_start = -NUM_DEGAMMA_REGIONS; + region_end = 0; for (i = region_end - region_start; i < MAX_REGIONS_NUMBER ; i++) seg_distr[i] = -1; -- 2.53.0