From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751122AbdAaPjk (ORCPT ); Tue, 31 Jan 2017 10:39:40 -0500 Received: from foss.arm.com ([217.140.101.70]:40904 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751014AbdAaPjc (ORCPT ); Tue, 31 Jan 2017 10:39:32 -0500 Date: Tue, 31 Jan 2017 15:39:29 +0000 From: Brian Starkey To: Ville =?iso-8859-1?Q?Syrj=E4l=E4?= Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Jani Nikula , Sean Paul , Lionel Landwerlin , Daniel Vetter Subject: Re: [PATCH v2] drm/color: Document CTM eqations Message-ID: <20170131153928.GB11506@e106950-lin.cambridge.arm.com> References: <1485859714-26619-1-git-send-email-brian.starkey@arm.com> <20170131151828.GU31595@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20170131151828.GU31595@intel.com> User-Agent: Mutt/1.5.21 (2010-09-15) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Ville, On Tue, Jan 31, 2017 at 05:18:28PM +0200, Ville Syrjälä wrote: >On Tue, Jan 31, 2017 at 10:48:34AM +0000, Brian Starkey wrote: >> Explicitly state the expected CTM equations in the kerneldoc for the CTM >> property, and the form of the matrix on struct drm_color_ctm. >> >> Cc: Ville Syrjälä >> Cc: Lionel Landwerlin >> Cc: Daniel Vetter >> Signed-off-by: Brian Starkey >> --- >> drivers/gpu/drm/drm_color_mgmt.c | 13 +++++++++++++ >> include/uapi/drm/drm_mode.h | 8 +++++++- >> 2 files changed, 20 insertions(+), 1 deletion(-) >> >> diff --git a/drivers/gpu/drm/drm_color_mgmt.c b/drivers/gpu/drm/drm_color_mgmt.c >> index 789b4c65cd69..7573ca4b6ea6 100644 >> --- a/drivers/gpu/drm/drm_color_mgmt.c >> +++ b/drivers/gpu/drm/drm_color_mgmt.c >> @@ -62,6 +62,19 @@ >> * unit/pass-thru matrix should be used. This is generally the driver >> * boot-up state too. >> * >> + * The output vector is related to the input vector as below: >> + * >> + * | ``out[0] = matrix[0] * in[0] + matrix[1] * in[1] + matrix[2] * in[2];`` >> + * | ``out[1] = matrix[3] * in[0] + matrix[4] * in[1] + matrix[5] * in[2];`` >> + * | ``out[2] = matrix[6] * in[0] + matrix[7] * in[1] + matrix[8] * in[2];`` >> + * >> + * The component order in the input/output vectors is assumed to be >> + * { R, G, B }. >> + * >> + * The color-space of the input vector must not be confused with the >> + * color-space implied by a framebuffer pixel format, which may be the same >> + * or different. >> + * >> * “GAMMA_LUT”: >> * Blob property to set the gamma lookup table (LUT) mapping pixel data >> * after the transformation matrix to data sent to the connector. The >> diff --git a/include/uapi/drm/drm_mode.h b/include/uapi/drm/drm_mode.h >> index ce7efe2e8a5e..3401637caf8e 100644 >> --- a/include/uapi/drm/drm_mode.h >> +++ b/include/uapi/drm/drm_mode.h >> @@ -525,7 +525,13 @@ struct drm_mode_crtc_lut { >> }; >> >> struct drm_color_ctm { >> - /* Conversion matrix in S31.32 format. */ >> + /* >> + * Conversion matrix in S31.32 format, in row-major form: > >s32.32 is how I'd state that (to match the regular s32 and whatnot >types). > Can you explain a bit more what exactly you mean by s32.32? e.g. what would be the bitfield representing the most negative number? I understand the S31.32 here as a sign + magnitude format (which makes it rather odd to store it in a signed variable, but never mind). This also appears to be what igt does in set_ctm() in kms_pipe_color.c: for (i = 0; i < ARRAY_SIZE(ctm.matrix); i++) { if (coefficients[i] < 0) { ctm.matrix[i] = (int64_t) (-coefficients[i] * ((int64_t) 1L << 32)); ctm.matrix[i] |= 1ULL << 63; } else ctm.matrix[i] = (int64_t) (coefficients[i] * ((int64_t) 1L << 32)); } If that's what you meant as well, then I don't think s32.32 is a good way to describe it, because the integer part has only 31 bits available. If you meant a regular two's-complement fixed-point number, where the most negative number would be 0x10000000.00000000, then yeah that's what I thought it meant too originally. Clarifying the docs here sounds like a great plan. I guess the igt implementation means that it's a sign + magnitude number, and the fact that it's stored in an s64 is a bizarre quirk that we just live with. Cheers, Brian >> + * >> + * | matrix[0] matrix[1] matrix[2] | >> + * | matrix[3] matrix[4] matrix[5] | >> + * | matrix[6] matrix[7] matrix[8] | >> + */ >> __s64 matrix[9]; >> }; >> >> -- >> 1.7.9.5 > >-- >Ville Syrjälä >Intel OTC