[{"id":39204,"web_url":"https://patchwork.libcamera.org/comment/39204/","msgid":"<aa903233-d66f-4ea6-a82d-94e7200d0dd7@nxsw.ie>","date":"2026-06-21T11:40:10","subject":"Re: [PATCH 7/7] shaders: bayer: Use native matrix multiplication","submitter":{"id":226,"url":"https://patchwork.libcamera.org/api/people/226/","name":"Bryan O'Donoghue","email":"bod.linux@nxsw.ie"},"content":"On 21/06/2026 00:00, Kieran Bingham wrote:\n> Remove the open coded matrix multiplication as glsl can perform this\n> directly. Adapt the uniform ccmUniformDataIn_ to ensure we correctly\n> upload the matrix in row major ordering.\n> \n> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n> ---\n>   src/libcamera/shaders/bayer_1x_packed.frag | 45 ++----------------------------\n>   src/libcamera/shaders/bayer_unpacked.frag  | 45 ++----------------------------\n>   src/libcamera/software_isp/debayer_egl.cpp | 13 +--------\n>   3 files changed, 5 insertions(+), 98 deletions(-)\n> \n> diff --git a/src/libcamera/shaders/bayer_1x_packed.frag b/src/libcamera/shaders/bayer_1x_packed.frag\n> index 6b3f7532c177f277e43c27e498dfadcb9cd4e26c..0b641a5f35c53a20811315c4e5def18f301cae69 100644\n> --- a/src/libcamera/shaders/bayer_1x_packed.frag\n> +++ b/src/libcamera/shaders/bayer_1x_packed.frag\n> @@ -235,49 +235,8 @@ void main(void)\n>   \t/* Apply AWB gains, and saturate each channel at sensor range */\n>   \trgb = clamp(rgb * awb, vec3(0.0), vec3(1.0));\n> \n> -\t/*\n> -\t *   CCM is a 3x3 in the format\n> -\t *\n> -\t *   +--------------+----------------+---------------+\n> -\t *   | RedRedGain   | RedGreenGain   | RedBlueGain   |\n> -\t *   +--------------+----------------+---------------+\n> -\t *   | GreenRedGain | GreenGreenGain | GreenBlueGain |\n> -\t *   +--------------+----------------+---------------+\n> -\t *   | BlueRedGain  |  BlueGreenGain | BlueBlueGain  |\n> -\t *   +--------------+----------------+---------------+\n> -\t *\n> -\t *   Rout = RedRedGain * Rin + RedGreenGain * Gin + RedBlueGain * Bin\n> -\t *   Gout = GreenRedGain * Rin + GreenGreenGain * Gin + GreenBlueGain * Bin\n> -\t *   Bout = BlueRedGain * Rin + BlueGreenGain * Gin + BlueBlueGain * Bin\n> -\t *\n> -\t *   We upload to the GPU without transposition glUniformMatrix3f(.., .., GL_FALSE, ccm);\n> -\t *\n> -\t *   CPU\n> -\t *   float ccm [] = {\n> -\t *             RedRedGain,   RedGreenGain,   RedBlueGain,\n> -\t *             GreenRedGain, GreenGreenGain, GreenBlueGain,\n> -\t *             BlueRedGain,  BlueGreenGain,  BlueBlueGain,\n> -\t *   };\n> -\t *\n> -\t *   GPU\n> -\t *   ccm = {\n> -\t *             RedRedGain,   GreenRedGain,   BlueRedGain,\n> -\t *             RedGreenGain, GreenGreenGain, BlueGreenGain,\n> -\t *             RedBlueGain,  GreenBlueGain,  BlueBlueGain,\n> -\t *   }\n> -\t *\n> -\t *   However the indexing for the mat data-type is column major hence\n> -\t *   ccm[0][0] = RedRedGain, ccm[0][1] = RedGreenGain, ccm[0][2] = RedBlueGain\n> -\t *\n> -\t */\n> -\tfloat rin, gin, bin;\n> -\trin = rgb.r;\n> -\tgin = rgb.g;\n> -\tbin = rgb.b;\n> -\n> -\trgb.r = (rin * ccm[0][0]) + (gin * ccm[0][1]) + (bin * ccm[0][2]);\n> -\trgb.g = (rin * ccm[1][0]) + (gin * ccm[1][1]) + (bin * ccm[1][2]);\n> -\trgb.b = (rin * ccm[2][0]) + (gin * ccm[2][1]) + (bin * ccm[2][2]);\n> +\t/* Colour Correction Matrix */\n> +\trgb = ccm * rgb;\n> \n>   \t/*\n>   \t * Contrast\n> diff --git a/src/libcamera/shaders/bayer_unpacked.frag b/src/libcamera/shaders/bayer_unpacked.frag\n> index 44535312125d0e7e5cca372f4e8e0f8ad9fce8b3..10c5e941b67c6409312d4091e54d87c1037fae32 100644\n> --- a/src/libcamera/shaders/bayer_unpacked.frag\n> +++ b/src/libcamera/shaders/bayer_unpacked.frag\n> @@ -138,49 +138,8 @@ void main(void) {\n>       /* Apply AWB gains, and saturate each channel at sensor range */\n>       rgb = clamp(rgb * awb, vec3(0.0), vec3(1.0));\n> \n> -    /*\n> -     *   CCM is a 3x3 in the format\n> -     *\n> -     *   +--------------+----------------+---------------+\n> -     *   | RedRedGain   | RedGreenGain   | RedBlueGain   |\n> -     *   +--------------+----------------+---------------+\n> -     *   | GreenRedGain | GreenGreenGain | GreenBlueGain |\n> -     *   +--------------+----------------+---------------+\n> -     *   | BlueRedGain  |  BlueGreenGain | BlueBlueGain  |\n> -     *   +--------------+----------------+---------------+\n> -     *\n> -     *   Rout = RedRedGain * Rin + RedGreenGain * Gin + RedBlueGain * Bin\n> -     *   Gout = GreenRedGain * Rin + GreenGreenGain * Gin + GreenBlueGain * Bin\n> -     *   Bout = BlueRedGain * Rin + BlueGreenGain * Gin + BlueBlueGain * Bin\n> -     *\n> -     *   We upload to the GPU without transposition glUniformMatrix3f(.., .., GL_FALSE, ccm);\n> -     *\n> -     *   CPU\n> -     *   float ccm [] = {\n> -     *             RedRedGain,   RedGreenGain,   RedBlueGain,\n> -     *             GreenRedGain, GreenGreenGain, GreenBlueGain,\n> -     *             BlueRedGain,  BlueGreenGain,  BlueBlueGain,\n> -     *   };\n> -     *\n> -     *   GPU\n> -     *   ccm = {\n> -     *             RedRedGain,   GreenRedGain,   BlueRedGain,\n> -     *             RedGreenGain, GreenGreenGain, BlueGreenGain,\n> -     *             RedBlueGain,  GreenBlueGain,  BlueBlueGain,\n> -     *   }\n> -     *\n> -     *   However the indexing for the mat data-type is column major hence\n> -     *   ccm[0][0] = RedRedGain, ccm[0][1] = RedGreenGain, ccm[0][2] = RedBlueGain\n> -     *\n> -     */\n> -    float rin, gin, bin;\n> -    rin = rgb.r;\n> -    gin = rgb.g;\n> -    bin = rgb.b;\n> -\n> -    rgb.r = (rin * ccm[0][0]) + (gin * ccm[0][1]) + (bin * ccm[0][2]);\n> -    rgb.g = (rin * ccm[1][0]) + (gin * ccm[1][1]) + (bin * ccm[1][2]);\n> -    rgb.b = (rin * ccm[2][0]) + (gin * ccm[2][1]) + (bin * ccm[2][2]);\n> +    /* Colour Correction Matrix */\n> +    rgb = ccm * rgb;\n> \n>       /*\n>        * Contrast\n> diff --git a/src/libcamera/software_isp/debayer_egl.cpp b/src/libcamera/software_isp/debayer_egl.cpp\n> index 6ba197966d85e1ab3bdc337b9e4ddeb20f1ec2fa..0ec2a98cfafbf87f4de8f160b7b779f61943d287 100644\n> --- a/src/libcamera/software_isp/debayer_egl.cpp\n> +++ b/src/libcamera/software_isp/debayer_egl.cpp\n> @@ -486,18 +486,7 @@ void DebayerEGL::setShaderVariableValues(const DebayerParams &params)\n>   \t\t\t    << \" textureUniformStrideFactor_ \" << Stride\n>   \t\t\t    << \" textureUniformProjMatrix_ \" << textureUniformProjMatrix_;\n> \n> -\tGLfloat ccm[9] = {\n> -\t\tparams.combinedMatrix[0][0],\n> -\t\tparams.combinedMatrix[0][1],\n> -\t\tparams.combinedMatrix[0][2],\n> -\t\tparams.combinedMatrix[1][0],\n> -\t\tparams.combinedMatrix[1][1],\n> -\t\tparams.combinedMatrix[1][2],\n> -\t\tparams.combinedMatrix[2][0],\n> -\t\tparams.combinedMatrix[2][1],\n> -\t\tparams.combinedMatrix[2][2],\n> -\t};\n> -\tglUniformMatrix3fv(ccmUniformDataIn_, 1, GL_FALSE, ccm);\n> +\tglUniformMatrix3fv(ccmUniformDataIn_, 1, GL_TRUE, params.combinedMatrix.data().data());\n>   \tLOG(Debayer, Debug) << \" ccmUniformDataIn_ \" << ccmUniformDataIn_ << \" data \" << params.combinedMatrix;\n> \n>   \t/*\n> \n> --\n> 2.53.0\n> \n\nTested-by: Bryan O'Donoghue <bod.linux@nxsw.ie>\nReviewed-by: Bryan O'Donoghue <bod.linux@nxsw.ie>\n\n---\nbod","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 4C0CBC328C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tSun, 21 Jun 2026 11:40:19 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 2E579656F7;\n\tSun, 21 Jun 2026 13:40:18 +0200 (CEST)","from mail-106117.protonmail.ch (mail-106117.protonmail.ch\n\t[79.135.106.117])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id B499A61F3F\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSun, 21 Jun 2026 13:40:15 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=nxsw.ie header.i=@nxsw.ie header.b=\"SxHHuQay\";\n\tdkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxsw.ie;\n\ts=protonmail; t=1782042014; x=1782301214;\n\tbh=A5OebQ/5sGrLyheJ+5LykEphBHTeJHZtr9Xvge7/wgg=;\n\th=Date:To:From:Subject:Message-ID:In-Reply-To:References:\n\tFeedback-ID:From:To:Cc:Date:Subject:Reply-To:Feedback-ID:\n\tMessage-ID:BIMI-Selector;\n\tb=SxHHuQay1TysRlyQ80ZX8/EFTcFpFDdQJHkPcNBSf9xrT8MuLX/2gsMzZ8qqnPMoM\n\tARmxOzE6ASHUW7bs7f23zdM60HYM5TQw7x2IQCGhcIwPEH3vyKwM4Zr9usTzkXe/wm\n\t1QOVpHYunRSFxynlYxK3UFL4Cszl7P4Qvp8MOelgbzEWORSLxmZZOjGNW2AdaXdnmq\n\tX+XujVkattRm8Pdkjkt4HSylwDprwKW3zSjRE0EFDwe5N5VTjcPKCO0BIQ9ni9JXlE\n\tpwI1k+ozPkKzB7CEA8p1qvQj7Re07x2Jp8O7LAlYZQjW+vQh7sLrHd+vaXgLElsWzp\n\tkqiCjtfEzNSGQ==","Date":"Sun, 21 Jun 2026 11:40:10 +0000","To":"Kieran Bingham <kieran.bingham@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","From":"Bryan O'Donoghue <bod.linux@nxsw.ie>","Subject":"Re: [PATCH 7/7] shaders: bayer: Use native matrix multiplication","Message-ID":"<aa903233-d66f-4ea6-a82d-94e7200d0dd7@nxsw.ie>","In-Reply-To":"<20260621-kbingham-awb-saturation-v1-7-b91ea59c6cfb@ideasonboard.com>","References":"<20260621-kbingham-awb-saturation-v1-0-b91ea59c6cfb@ideasonboard.com>\n\t<20260621-kbingham-awb-saturation-v1-7-b91ea59c6cfb@ideasonboard.com>","Feedback-ID":"136405006:user:proton","X-Pm-Message-ID":"0445948d38dceb84cd10582f93c4ddfd8bf70eac","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Transfer-Encoding":"quoted-printable","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":39217,"web_url":"https://patchwork.libcamera.org/comment/39217/","msgid":"<c386f764-0a1b-4cd7-be07-e966b59e13f8@ideasonboard.com>","date":"2026-06-22T08:14:54","subject":"Re: [PATCH 7/7] shaders: bayer: Use native matrix multiplication","submitter":{"id":216,"url":"https://patchwork.libcamera.org/api/people/216/","name":"Barnabás Pőcze","email":"barnabas.pocze@ideasonboard.com"},"content":"2026. 06. 21. 1:00 keltezéssel, Kieran Bingham írta:\n> Remove the open coded matrix multiplication as glsl can perform this\n> directly. Adapt the uniform ccmUniformDataIn_ to ensure we correctly\n> upload the matrix in row major ordering.\n> \n> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n> ---\n\nReviewed-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>\n\n\n>   src/libcamera/shaders/bayer_1x_packed.frag | 45 ++----------------------------\n>   src/libcamera/shaders/bayer_unpacked.frag  | 45 ++----------------------------\n>   src/libcamera/software_isp/debayer_egl.cpp | 13 +--------\n>   3 files changed, 5 insertions(+), 98 deletions(-)\n> \n> diff --git a/src/libcamera/shaders/bayer_1x_packed.frag b/src/libcamera/shaders/bayer_1x_packed.frag\n> index 6b3f7532c177f277e43c27e498dfadcb9cd4e26c..0b641a5f35c53a20811315c4e5def18f301cae69 100644\n> --- a/src/libcamera/shaders/bayer_1x_packed.frag\n> +++ b/src/libcamera/shaders/bayer_1x_packed.frag\n> @@ -235,49 +235,8 @@ void main(void)\n>   \t/* Apply AWB gains, and saturate each channel at sensor range */\n>   \trgb = clamp(rgb * awb, vec3(0.0), vec3(1.0));\n>   \n> -\t/*\n> -\t *   CCM is a 3x3 in the format\n> -\t *\n> -\t *   +--------------+----------------+---------------+\n> -\t *   | RedRedGain   | RedGreenGain   | RedBlueGain   |\n> -\t *   +--------------+----------------+---------------+\n> -\t *   | GreenRedGain | GreenGreenGain | GreenBlueGain |\n> -\t *   +--------------+----------------+---------------+\n> -\t *   | BlueRedGain  |  BlueGreenGain | BlueBlueGain  |\n> -\t *   +--------------+----------------+---------------+\n> -\t *\n> -\t *   Rout = RedRedGain * Rin + RedGreenGain * Gin + RedBlueGain * Bin\n> -\t *   Gout = GreenRedGain * Rin + GreenGreenGain * Gin + GreenBlueGain * Bin\n> -\t *   Bout = BlueRedGain * Rin + BlueGreenGain * Gin + BlueBlueGain * Bin\n> -\t *\n> -\t *   We upload to the GPU without transposition glUniformMatrix3f(.., .., GL_FALSE, ccm);\n> -\t *\n> -\t *   CPU\n> -\t *   float ccm [] = {\n> -\t *             RedRedGain,   RedGreenGain,   RedBlueGain,\n> -\t *             GreenRedGain, GreenGreenGain, GreenBlueGain,\n> -\t *             BlueRedGain,  BlueGreenGain,  BlueBlueGain,\n> -\t *   };\n> -\t *\n> -\t *   GPU\n> -\t *   ccm = {\n> -\t *             RedRedGain,   GreenRedGain,   BlueRedGain,\n> -\t *             RedGreenGain, GreenGreenGain, BlueGreenGain,\n> -\t *             RedBlueGain,  GreenBlueGain,  BlueBlueGain,\n> -\t *   }\n> -\t *\n> -\t *   However the indexing for the mat data-type is column major hence\n> -\t *   ccm[0][0] = RedRedGain, ccm[0][1] = RedGreenGain, ccm[0][2] = RedBlueGain\n> -\t *\n> -\t */\n> -\tfloat rin, gin, bin;\n> -\trin = rgb.r;\n> -\tgin = rgb.g;\n> -\tbin = rgb.b;\n> -\n> -\trgb.r = (rin * ccm[0][0]) + (gin * ccm[0][1]) + (bin * ccm[0][2]);\n> -\trgb.g = (rin * ccm[1][0]) + (gin * ccm[1][1]) + (bin * ccm[1][2]);\n> -\trgb.b = (rin * ccm[2][0]) + (gin * ccm[2][1]) + (bin * ccm[2][2]);\n> +\t/* Colour Correction Matrix */\n> +\trgb = ccm * rgb;\n>   \n>   \t/*\n>   \t * Contrast\n> diff --git a/src/libcamera/shaders/bayer_unpacked.frag b/src/libcamera/shaders/bayer_unpacked.frag\n> index 44535312125d0e7e5cca372f4e8e0f8ad9fce8b3..10c5e941b67c6409312d4091e54d87c1037fae32 100644\n> --- a/src/libcamera/shaders/bayer_unpacked.frag\n> +++ b/src/libcamera/shaders/bayer_unpacked.frag\n> @@ -138,49 +138,8 @@ void main(void) {\n>       /* Apply AWB gains, and saturate each channel at sensor range */\n>       rgb = clamp(rgb * awb, vec3(0.0), vec3(1.0));\n>   \n> -    /*\n> -     *   CCM is a 3x3 in the format\n> -     *\n> -     *   +--------------+----------------+---------------+\n> -     *   | RedRedGain   | RedGreenGain   | RedBlueGain   |\n> -     *   +--------------+----------------+---------------+\n> -     *   | GreenRedGain | GreenGreenGain | GreenBlueGain |\n> -     *   +--------------+----------------+---------------+\n> -     *   | BlueRedGain  |  BlueGreenGain | BlueBlueGain  |\n> -     *   +--------------+----------------+---------------+\n> -     *\n> -     *   Rout = RedRedGain * Rin + RedGreenGain * Gin + RedBlueGain * Bin\n> -     *   Gout = GreenRedGain * Rin + GreenGreenGain * Gin + GreenBlueGain * Bin\n> -     *   Bout = BlueRedGain * Rin + BlueGreenGain * Gin + BlueBlueGain * Bin\n> -     *\n> -     *   We upload to the GPU without transposition glUniformMatrix3f(.., .., GL_FALSE, ccm);\n> -     *\n> -     *   CPU\n> -     *   float ccm [] = {\n> -     *             RedRedGain,   RedGreenGain,   RedBlueGain,\n> -     *             GreenRedGain, GreenGreenGain, GreenBlueGain,\n> -     *             BlueRedGain,  BlueGreenGain,  BlueBlueGain,\n> -     *   };\n> -     *\n> -     *   GPU\n> -     *   ccm = {\n> -     *             RedRedGain,   GreenRedGain,   BlueRedGain,\n> -     *             RedGreenGain, GreenGreenGain, BlueGreenGain,\n> -     *             RedBlueGain,  GreenBlueGain,  BlueBlueGain,\n> -     *   }\n> -     *\n> -     *   However the indexing for the mat data-type is column major hence\n> -     *   ccm[0][0] = RedRedGain, ccm[0][1] = RedGreenGain, ccm[0][2] = RedBlueGain\n> -     *\n> -     */\n> -    float rin, gin, bin;\n> -    rin = rgb.r;\n> -    gin = rgb.g;\n> -    bin = rgb.b;\n> -\n> -    rgb.r = (rin * ccm[0][0]) + (gin * ccm[0][1]) + (bin * ccm[0][2]);\n> -    rgb.g = (rin * ccm[1][0]) + (gin * ccm[1][1]) + (bin * ccm[1][2]);\n> -    rgb.b = (rin * ccm[2][0]) + (gin * ccm[2][1]) + (bin * ccm[2][2]);\n> +    /* Colour Correction Matrix */\n> +    rgb = ccm * rgb;\n>   \n>       /*\n>        * Contrast\n> diff --git a/src/libcamera/software_isp/debayer_egl.cpp b/src/libcamera/software_isp/debayer_egl.cpp\n> index 6ba197966d85e1ab3bdc337b9e4ddeb20f1ec2fa..0ec2a98cfafbf87f4de8f160b7b779f61943d287 100644\n> --- a/src/libcamera/software_isp/debayer_egl.cpp\n> +++ b/src/libcamera/software_isp/debayer_egl.cpp\n> @@ -486,18 +486,7 @@ void DebayerEGL::setShaderVariableValues(const DebayerParams &params)\n>   \t\t\t    << \" textureUniformStrideFactor_ \" << Stride\n>   \t\t\t    << \" textureUniformProjMatrix_ \" << textureUniformProjMatrix_;\n>   \n> -\tGLfloat ccm[9] = {\n> -\t\tparams.combinedMatrix[0][0],\n> -\t\tparams.combinedMatrix[0][1],\n> -\t\tparams.combinedMatrix[0][2],\n> -\t\tparams.combinedMatrix[1][0],\n> -\t\tparams.combinedMatrix[1][1],\n> -\t\tparams.combinedMatrix[1][2],\n> -\t\tparams.combinedMatrix[2][0],\n> -\t\tparams.combinedMatrix[2][1],\n> -\t\tparams.combinedMatrix[2][2],\n> -\t};\n> -\tglUniformMatrix3fv(ccmUniformDataIn_, 1, GL_FALSE, ccm);\n> +\tglUniformMatrix3fv(ccmUniformDataIn_, 1, GL_TRUE, params.combinedMatrix.data().data());\n>   \tLOG(Debayer, Debug) << \" ccmUniformDataIn_ \" << ccmUniformDataIn_ << \" data \" << params.combinedMatrix;\n>   \n>   \t/*\n>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 86012C3303\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 22 Jun 2026 08:14:59 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 31FD365712;\n\tMon, 22 Jun 2026 10:14:59 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 48729623CC\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 22 Jun 2026 10:14:58 +0200 (CEST)","from [192.168.33.39] (185.221.141.133.nat.pool.zt.hu\n\t[185.221.141.133])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 64EBC227;\n\tMon, 22 Jun 2026 10:14:20 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"fk2ucHIw\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1782116060;\n\tbh=oSodyfQpxk/Gie8JomePzmQ18ROb439/kMfRQmXiu1Q=;\n\th=Date:Subject:To:References:From:In-Reply-To:From;\n\tb=fk2ucHIwpLMkZKUOdrdB55+rnnA9g48qYDTDYxK9dpydYZM4JYEE0ikwOEN9ZmMfe\n\tXyr4ynOQpdaURgBp+7F6yEMTn8mPknTuEUEa2ra+d6US6uinX7ZcyVgk2gcyW7cB/n\n\tL03apLBhXNccZ9pQk8UYpSKVDOaTVqkzE13pDeGM=","Message-ID":"<c386f764-0a1b-4cd7-be07-e966b59e13f8@ideasonboard.com>","Date":"Mon, 22 Jun 2026 10:14:54 +0200","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH 7/7] shaders: bayer: Use native matrix multiplication","To":"Kieran Bingham <kieran.bingham@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","References":"<20260621-kbingham-awb-saturation-v1-0-b91ea59c6cfb@ideasonboard.com>\n\t<20260621-kbingham-awb-saturation-v1-7-b91ea59c6cfb@ideasonboard.com>","From":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>","Content-Language":"en-US, hu-HU","In-Reply-To":"<20260621-kbingham-awb-saturation-v1-7-b91ea59c6cfb@ideasonboard.com>","Content-Type":"text/plain; charset=UTF-8; format=flowed","Content-Transfer-Encoding":"8bit","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]