[{"id":38521,"web_url":"https://patchwork.libcamera.org/comment/38521/","msgid":"<20260407235014.GL1268443@killaraus.ideasonboard.com>","date":"2026-04-07T23:50:14","subject":"Re: [PATCH 01/13] libcamera: shaders: unpacked: Fix indentations","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"On Tue, Apr 07, 2026 at 11:01:04PM +0100, Kieran Bingham wrote:\n> Reflow the unpacked bayer shader to use tabs for indentation and\n> match the style of the bayer_packed fragment shader.\n\nDoes anyone know of a formatter for GLSL ? clang-format does a\nrelatively decent job, it could make sense to start with that.\n\n> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n> ---\n>  src/libcamera/shaders/bayer_unpacked.frag | 264 +++++++++++++++---------------\n>  1 file changed, 132 insertions(+), 132 deletions(-)\n> \n> diff --git a/src/libcamera/shaders/bayer_unpacked.frag b/src/libcamera/shaders/bayer_unpacked.frag\n> index 1b85196ae16130670eb3d1c077ab4884119ae63c..76ffc47a8a29f242c1fba88f32bd8db731edeee0 100644\n> --- a/src/libcamera/shaders/bayer_unpacked.frag\n> +++ b/src/libcamera/shaders/bayer_unpacked.frag\n> @@ -31,163 +31,163 @@ uniform float           contrastExp;\n>  \n>  float apply_contrast(float value)\n>  {\n> -    // Apply simple S-curve\n> -    if (value < 0.5)\n> -        return 0.5 * pow(value / 0.5, contrastExp);\n> -    else\n> -        return 1.0 - 0.5 * pow((1.0 - value) / 0.5, contrastExp);\n> +\t// Apply simple S-curve\n\nIt could make sense to standardize on one style for comments.\n\n> +\tif (value < 0.5)\n> +\t\treturn 0.5 * pow(value / 0.5, contrastExp);\n> +\telse\n> +\t\treturn 1.0 - 0.5 * pow((1.0 - value) / 0.5, contrastExp);\n>  }\n>  \n>  void main(void) {\n\nStyle mismatch in curly brace placement between apply_contrast() and\nmain(). I'd write\n\nvoid main(void)\n{\n\n> -    vec3 rgb;\n> +\tvec3 rgb;\n>  \n> -    #if defined(RAW10P)\n> -    #define pixel(p) p.r / 4.0 + p.g * 64.0\n> -    #define fetch(x, y) pixel(texture2D(tex_y, vec2(x, y)))\n> -    #elif defined(RAW12P)\n> -    #define pixel(p) p.r / 16.0 + p.g * 16.0\n> -    #define fetch(x, y) pixel(texture2D(tex_y, vec2(x, y)))\n> -    #else\n> -    #define fetch(x, y) texture2D(tex_y, vec2(x, y)).r\n> -    #endif\n> +\t#if defined(RAW10P)\n> +\t#define pixel(p) p.r / 4.0 + p.g * 64.0\n> +\t#define fetch(x, y) pixel(texture2D(tex_y, vec2(x, y)))\n> +\t#elif defined(RAW12P)\n> +\t#define pixel(p) p.r / 16.0 + p.g * 16.0\n> +\t#define fetch(x, y) pixel(texture2D(tex_y, vec2(x, y)))\n> +\t#else\n> +\t#define fetch(x, y) texture2D(tex_y, vec2(x, y)).r\n> +\t#endif\n\nI'd have removed the indentation for macros, as some macros are already\naligned on the left-most column.\n\nFeel free to pick which comments you deem worth addressing.\n\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\n>  \n> -    float C = fetch(center.x, center.y); // ( 0, 0)\n> -    const vec4 kC = vec4( 4.0,  6.0,  5.0,  5.0) / 8.0;\n> +\tfloat C = fetch(center.x, center.y); // ( 0, 0)\n> +\tconst vec4 kC = vec4( 4.0,  6.0,  5.0,  5.0) / 8.0;\n>  \n> -    // Determine which of four types of pixels we are on.\n> -    vec2 alternate = mod(floor(center.zw), 2.0);\n> +\t// Determine which of four types of pixels we are on.\n> +\tvec2 alternate = mod(floor(center.zw), 2.0);\n>  \n> -    vec4 Dvec = vec4(\n> -        fetch(xCoord[1], yCoord[1]),  // (-1,-1)\n> -        fetch(xCoord[1], yCoord[2]),  // (-1, 1)\n> -        fetch(xCoord[2], yCoord[1]),  // ( 1,-1)\n> -        fetch(xCoord[2], yCoord[2])); // ( 1, 1)\n> +\tvec4 Dvec = vec4(\n> +\t\tfetch(xCoord[1], yCoord[1]),  // (-1,-1)\n> +\t\tfetch(xCoord[1], yCoord[2]),  // (-1, 1)\n> +\t\tfetch(xCoord[2], yCoord[1]),  // ( 1,-1)\n> +\t\tfetch(xCoord[2], yCoord[2])); // ( 1, 1)\n>  \n> -    vec4 PATTERN = (kC.xyz * C).xyzz;\n> +\tvec4 PATTERN = (kC.xyz * C).xyzz;\n>  \n> -    // Can also be a dot product with (1,1,1,1) on hardware where that is\n> -    // specially optimized.\n> -    // Equivalent to: D = Dvec[0] + Dvec[1] + Dvec[2] + Dvec[3];\n> -    Dvec.xy += Dvec.zw;\n> -    Dvec.x  += Dvec.y;\n> +\t// Can also be a dot product with (1,1,1,1) on hardware where that is\n> +\t// specially optimized.\n> +\t// Equivalent to: D = Dvec[0] + Dvec[1] + Dvec[2] + Dvec[3];\n> +\tDvec.xy += Dvec.zw;\n> +\tDvec.x  += Dvec.y;\n>  \n> -    vec4 value = vec4(\n> -        fetch(center.x, yCoord[0]),   // ( 0,-2)\n> -        fetch(center.x, yCoord[1]),   // ( 0,-1)\n> -        fetch(xCoord[0], center.y),   // (-2, 0)\n> -        fetch(xCoord[1], center.y));  // (-1, 0)\n> +\tvec4 value = vec4(\n> +\t\tfetch(center.x, yCoord[0]),   // ( 0,-2)\n> +\t\tfetch(center.x, yCoord[1]),   // ( 0,-1)\n> +\t\tfetch(xCoord[0], center.y),   // (-2, 0)\n> +\t\tfetch(xCoord[1], center.y));  // (-1, 0)\n>  \n> -    vec4 temp = vec4(\n> -        fetch(center.x, yCoord[3]),   // ( 0, 2)\n> -        fetch(center.x, yCoord[2]),   // ( 0, 1)\n> -        fetch(xCoord[3], center.y),   // ( 2, 0)\n> -        fetch(xCoord[2], center.y));  // ( 1, 0)\n> +\tvec4 temp = vec4(\n> +\t\tfetch(center.x, yCoord[3]),   // ( 0, 2)\n> +\t\tfetch(center.x, yCoord[2]),   // ( 0, 1)\n> +\t\tfetch(xCoord[3], center.y),   // ( 2, 0)\n> +\t\tfetch(xCoord[2], center.y));  // ( 1, 0)\n>  \n> -    // Even the simplest compilers should be able to constant-fold these to\n> -    // avoid the division.\n> -    // Note that on scalar processors these constants force computation of some\n> -    // identical products twice.\n> -    const vec4 kA = vec4(-1.0, -1.5,  0.5, -1.0) / 8.0;\n> -    const vec4 kB = vec4( 2.0,  0.0,  0.0,  4.0) / 8.0;\n> -    const vec4 kD = vec4( 0.0,  2.0, -1.0, -1.0) / 8.0;\n> +\t// Even the simplest compilers should be able to constant-fold these to\n> +\t// avoid the division.\n> +\t// Note that on scalar processors these constants force computation of some\n> +\t// identical products twice.\n> +\tconst vec4 kA = vec4(-1.0, -1.5,  0.5, -1.0) / 8.0;\n> +\tconst vec4 kB = vec4( 2.0,  0.0,  0.0,  4.0) / 8.0;\n> +\tconst vec4 kD = vec4( 0.0,  2.0, -1.0, -1.0) / 8.0;\n>  \n> -    // Conserve constant registers and take advantage of free swizzle on load\n> -    #define kE (kA.xywz)\n> -    #define kF (kB.xywz)\n> +\t// Conserve constant registers and take advantage of free swizzle on load\n> +\t#define kE (kA.xywz)\n> +\t#define kF (kB.xywz)\n>  \n> -    value += temp;\n> +\tvalue += temp;\n>  \n> -    // There are five filter patterns (identity, cross, checker,\n> -    // theta, phi).  Precompute the terms from all of them and then\n> -    // use swizzles to assign to color channels.\n> -    //\n> -    // Channel   Matches\n> -    //   x       cross   (e.g., EE G)\n> -    //   y       checker (e.g., EE B)\n> -    //   z       theta   (e.g., EO R)\n> -    //   w       phi     (e.g., EO R)\n> -    #define A (value[0])\n> -    #define B (value[1])\n> -    #define D (Dvec.x)\n> -    #define E (value[2])\n> -    #define F (value[3])\n> +\t// There are five filter patterns (identity, cross, checker,\n> +\t// theta, phi).  Precompute the terms from all of them and then\n> +\t// use swizzles to assign to color channels.\n> +\t//\n> +\t// Channel   Matches\n> +\t//   x       cross   (e.g., EE G)\n> +\t//   y       checker (e.g., EE B)\n> +\t//   z       theta   (e.g., EO R)\n> +\t//   w       phi     (e.g., EO R)\n> +\t#define A (value[0])\n> +\t#define B (value[1])\n> +\t#define D (Dvec.x)\n> +\t#define E (value[2])\n> +\t#define F (value[3])\n>  \n> -    // Avoid zero elements. On a scalar processor this saves two MADDs\n> -    // and it has no effect on a vector processor.\n> -    PATTERN.yzw += (kD.yz * D).xyy;\n> +\t// Avoid zero elements. On a scalar processor this saves two MADDs\n> +\t// and it has no effect on a vector processor.\n> +\tPATTERN.yzw += (kD.yz * D).xyy;\n>  \n> -    PATTERN += (kA.xyz * A).xyzx + (kE.xyw * E).xyxz;\n> -    PATTERN.xw  += kB.xw * B;\n> -    PATTERN.xz  += kF.xz * F;\n> +\tPATTERN += (kA.xyz * A).xyzx + (kE.xyw * E).xyxz;\n> +\tPATTERN.xw  += kB.xw * B;\n> +\tPATTERN.xz  += kF.xz * F;\n>  \n> -    rgb =  (alternate.y == 0.0) ?\n> -        ((alternate.x == 0.0) ?\n> -            vec3(C, PATTERN.xy) :\n> -            vec3(PATTERN.z, C, PATTERN.w)) :\n> -        ((alternate.x == 0.0) ?\n> -            vec3(PATTERN.w, C, PATTERN.z) :\n> -            vec3(PATTERN.yx, C));\n> +\trgb =  (alternate.y == 0.0) ?\n> +\t\t((alternate.x == 0.0) ?\n> +\t\t\tvec3(C, PATTERN.xy) :\n> +\t\t\tvec3(PATTERN.z, C, PATTERN.w)) :\n> +\t\t((alternate.x == 0.0) ?\n> +\t\t\tvec3(PATTERN.w, C, PATTERN.z) :\n> +\t\t\tvec3(PATTERN.yx, C));\n>  \n> -    rgb = rgb - blacklevel;\n> +\trgb = rgb - blacklevel;\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> +\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> -    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> +\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>  \n> -    /*\n> -     * Contrast\n> -     */\n> -    rgb = clamp(rgb, 0.0, 1.0);\n> -    rgb.r = apply_contrast(rgb.r);\n> -    rgb.g = apply_contrast(rgb.g);\n> -    rgb.b = apply_contrast(rgb.b);\n> +\t/*\n> +\t * Contrast\n> +\t */\n> +\trgb = clamp(rgb, 0.0, 1.0);\n> +\trgb.r = apply_contrast(rgb.r);\n> +\trgb.g = apply_contrast(rgb.g);\n> +\trgb.b = apply_contrast(rgb.b);\n>  \n> -    /* Apply gamma after colour correction */\n> -    rgb = pow(rgb, vec3(gamma));\n> +\t/* Apply gamma after colour correction */\n> +\trgb = pow(rgb, vec3(gamma));\n>  \n>  #if defined (SWAP_BLUE)\n> -    gl_FragColor = vec4(rgb.bgr, 1.0);\n> +\tgl_FragColor = vec4(rgb.bgr, 1.0);\n>  #else\n> -    gl_FragColor = vec4(rgb, 1.0);\n> +\tgl_FragColor = vec4(rgb, 1.0);\n>  #endif\n>  }\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 47BFBBEFBE\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue,  7 Apr 2026 23:50:19 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 41F9E62DB3;\n\tWed,  8 Apr 2026 01:50:18 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 6106562CEB\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed,  8 Apr 2026 01:50:16 +0200 (CEST)","from killaraus.ideasonboard.com\n\t(2001-14ba-703d-e500--2a1.rev.dnainternet.fi\n\t[IPv6:2001:14ba:703d:e500::2a1])\n\tby perceval.ideasonboard.com (Postfix) with UTF8SMTPSA id 6A54F1121; \n\tWed,  8 Apr 2026 01:48:48 +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=\"ShY/xsLy\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1775605728;\n\tbh=GjmVAFWmqmBvK6wbRhzBZBs6zKpKIUj7zOGT8RcWKtg=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=ShY/xsLyINJX0BN0by6YYCZq/56VRsz0Urqywc51jigFapmeBJsDC9ZkU86sZzywl\n\t1ZhbVUIP9r4bn/M0H21g0gl03luRq3KgYGRkqTDGvQ0rtKANe1wxpR4DWC3tAkvUJv\n\tbYlOD1SurWA7Wpmfpz3AJ5jHRO69E1/l8V2hTYZo=","Date":"Wed, 8 Apr 2026 02:50:14 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Subject":"Re: [PATCH 01/13] libcamera: shaders: unpacked: Fix indentations","Message-ID":"<20260407235014.GL1268443@killaraus.ideasonboard.com>","References":"<20260407-kbingham-awb-split-v1-0-a39af3f4dc20@ideasonboard.com>\n\t<20260407-kbingham-awb-split-v1-1-a39af3f4dc20@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20260407-kbingham-awb-split-v1-1-a39af3f4dc20@ideasonboard.com>","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":38770,"web_url":"https://patchwork.libcamera.org/comment/38770/","msgid":"<16b98928-c04f-4c32-a087-f1e1a27f3219@oss.qualcomm.com>","date":"2026-05-07T12:42:46","subject":"Re: [PATCH 01/13] libcamera: shaders: unpacked: Fix indentations","submitter":{"id":242,"url":"https://patchwork.libcamera.org/api/people/242/","name":"Hans de Goede","email":"johannes.goede@oss.qualcomm.com"},"content":"Hi,\n\nOn 8-Apr-26 00:01, Kieran Bingham wrote:\n> Reflow the unpacked bayer shader to use tabs for indentation and\n> match the style of the bayer_packed fragment shader.\n> \n> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n\nThanks, patch looks good to me:\n\nReviewed-by: Hans de Goede <johannes.goede@oss.qualcomm.com>\n\nRegards,\n\nHans\n\n\n\n> ---\n>  src/libcamera/shaders/bayer_unpacked.frag | 264 +++++++++++++++---------------\n>  1 file changed, 132 insertions(+), 132 deletions(-)\n> \n> diff --git a/src/libcamera/shaders/bayer_unpacked.frag b/src/libcamera/shaders/bayer_unpacked.frag\n> index 1b85196ae16130670eb3d1c077ab4884119ae63c..76ffc47a8a29f242c1fba88f32bd8db731edeee0 100644\n> --- a/src/libcamera/shaders/bayer_unpacked.frag\n> +++ b/src/libcamera/shaders/bayer_unpacked.frag\n> @@ -31,163 +31,163 @@ uniform float           contrastExp;\n>  \n>  float apply_contrast(float value)\n>  {\n> -    // Apply simple S-curve\n> -    if (value < 0.5)\n> -        return 0.5 * pow(value / 0.5, contrastExp);\n> -    else\n> -        return 1.0 - 0.5 * pow((1.0 - value) / 0.5, contrastExp);\n> +\t// Apply simple S-curve\n> +\tif (value < 0.5)\n> +\t\treturn 0.5 * pow(value / 0.5, contrastExp);\n> +\telse\n> +\t\treturn 1.0 - 0.5 * pow((1.0 - value) / 0.5, contrastExp);\n>  }\n>  \n>  void main(void) {\n> -    vec3 rgb;\n> +\tvec3 rgb;\n>  \n> -    #if defined(RAW10P)\n> -    #define pixel(p) p.r / 4.0 + p.g * 64.0\n> -    #define fetch(x, y) pixel(texture2D(tex_y, vec2(x, y)))\n> -    #elif defined(RAW12P)\n> -    #define pixel(p) p.r / 16.0 + p.g * 16.0\n> -    #define fetch(x, y) pixel(texture2D(tex_y, vec2(x, y)))\n> -    #else\n> -    #define fetch(x, y) texture2D(tex_y, vec2(x, y)).r\n> -    #endif\n> +\t#if defined(RAW10P)\n> +\t#define pixel(p) p.r / 4.0 + p.g * 64.0\n> +\t#define fetch(x, y) pixel(texture2D(tex_y, vec2(x, y)))\n> +\t#elif defined(RAW12P)\n> +\t#define pixel(p) p.r / 16.0 + p.g * 16.0\n> +\t#define fetch(x, y) pixel(texture2D(tex_y, vec2(x, y)))\n> +\t#else\n> +\t#define fetch(x, y) texture2D(tex_y, vec2(x, y)).r\n> +\t#endif\n>  \n> -    float C = fetch(center.x, center.y); // ( 0, 0)\n> -    const vec4 kC = vec4( 4.0,  6.0,  5.0,  5.0) / 8.0;\n> +\tfloat C = fetch(center.x, center.y); // ( 0, 0)\n> +\tconst vec4 kC = vec4( 4.0,  6.0,  5.0,  5.0) / 8.0;\n>  \n> -    // Determine which of four types of pixels we are on.\n> -    vec2 alternate = mod(floor(center.zw), 2.0);\n> +\t// Determine which of four types of pixels we are on.\n> +\tvec2 alternate = mod(floor(center.zw), 2.0);\n>  \n> -    vec4 Dvec = vec4(\n> -        fetch(xCoord[1], yCoord[1]),  // (-1,-1)\n> -        fetch(xCoord[1], yCoord[2]),  // (-1, 1)\n> -        fetch(xCoord[2], yCoord[1]),  // ( 1,-1)\n> -        fetch(xCoord[2], yCoord[2])); // ( 1, 1)\n> +\tvec4 Dvec = vec4(\n> +\t\tfetch(xCoord[1], yCoord[1]),  // (-1,-1)\n> +\t\tfetch(xCoord[1], yCoord[2]),  // (-1, 1)\n> +\t\tfetch(xCoord[2], yCoord[1]),  // ( 1,-1)\n> +\t\tfetch(xCoord[2], yCoord[2])); // ( 1, 1)\n>  \n> -    vec4 PATTERN = (kC.xyz * C).xyzz;\n> +\tvec4 PATTERN = (kC.xyz * C).xyzz;\n>  \n> -    // Can also be a dot product with (1,1,1,1) on hardware where that is\n> -    // specially optimized.\n> -    // Equivalent to: D = Dvec[0] + Dvec[1] + Dvec[2] + Dvec[3];\n> -    Dvec.xy += Dvec.zw;\n> -    Dvec.x  += Dvec.y;\n> +\t// Can also be a dot product with (1,1,1,1) on hardware where that is\n> +\t// specially optimized.\n> +\t// Equivalent to: D = Dvec[0] + Dvec[1] + Dvec[2] + Dvec[3];\n> +\tDvec.xy += Dvec.zw;\n> +\tDvec.x  += Dvec.y;\n>  \n> -    vec4 value = vec4(\n> -        fetch(center.x, yCoord[0]),   // ( 0,-2)\n> -        fetch(center.x, yCoord[1]),   // ( 0,-1)\n> -        fetch(xCoord[0], center.y),   // (-2, 0)\n> -        fetch(xCoord[1], center.y));  // (-1, 0)\n> +\tvec4 value = vec4(\n> +\t\tfetch(center.x, yCoord[0]),   // ( 0,-2)\n> +\t\tfetch(center.x, yCoord[1]),   // ( 0,-1)\n> +\t\tfetch(xCoord[0], center.y),   // (-2, 0)\n> +\t\tfetch(xCoord[1], center.y));  // (-1, 0)\n>  \n> -    vec4 temp = vec4(\n> -        fetch(center.x, yCoord[3]),   // ( 0, 2)\n> -        fetch(center.x, yCoord[2]),   // ( 0, 1)\n> -        fetch(xCoord[3], center.y),   // ( 2, 0)\n> -        fetch(xCoord[2], center.y));  // ( 1, 0)\n> +\tvec4 temp = vec4(\n> +\t\tfetch(center.x, yCoord[3]),   // ( 0, 2)\n> +\t\tfetch(center.x, yCoord[2]),   // ( 0, 1)\n> +\t\tfetch(xCoord[3], center.y),   // ( 2, 0)\n> +\t\tfetch(xCoord[2], center.y));  // ( 1, 0)\n>  \n> -    // Even the simplest compilers should be able to constant-fold these to\n> -    // avoid the division.\n> -    // Note that on scalar processors these constants force computation of some\n> -    // identical products twice.\n> -    const vec4 kA = vec4(-1.0, -1.5,  0.5, -1.0) / 8.0;\n> -    const vec4 kB = vec4( 2.0,  0.0,  0.0,  4.0) / 8.0;\n> -    const vec4 kD = vec4( 0.0,  2.0, -1.0, -1.0) / 8.0;\n> +\t// Even the simplest compilers should be able to constant-fold these to\n> +\t// avoid the division.\n> +\t// Note that on scalar processors these constants force computation of some\n> +\t// identical products twice.\n> +\tconst vec4 kA = vec4(-1.0, -1.5,  0.5, -1.0) / 8.0;\n> +\tconst vec4 kB = vec4( 2.0,  0.0,  0.0,  4.0) / 8.0;\n> +\tconst vec4 kD = vec4( 0.0,  2.0, -1.0, -1.0) / 8.0;\n>  \n> -    // Conserve constant registers and take advantage of free swizzle on load\n> -    #define kE (kA.xywz)\n> -    #define kF (kB.xywz)\n> +\t// Conserve constant registers and take advantage of free swizzle on load\n> +\t#define kE (kA.xywz)\n> +\t#define kF (kB.xywz)\n>  \n> -    value += temp;\n> +\tvalue += temp;\n>  \n> -    // There are five filter patterns (identity, cross, checker,\n> -    // theta, phi).  Precompute the terms from all of them and then\n> -    // use swizzles to assign to color channels.\n> -    //\n> -    // Channel   Matches\n> -    //   x       cross   (e.g., EE G)\n> -    //   y       checker (e.g., EE B)\n> -    //   z       theta   (e.g., EO R)\n> -    //   w       phi     (e.g., EO R)\n> -    #define A (value[0])\n> -    #define B (value[1])\n> -    #define D (Dvec.x)\n> -    #define E (value[2])\n> -    #define F (value[3])\n> +\t// There are five filter patterns (identity, cross, checker,\n> +\t// theta, phi).  Precompute the terms from all of them and then\n> +\t// use swizzles to assign to color channels.\n> +\t//\n> +\t// Channel   Matches\n> +\t//   x       cross   (e.g., EE G)\n> +\t//   y       checker (e.g., EE B)\n> +\t//   z       theta   (e.g., EO R)\n> +\t//   w       phi     (e.g., EO R)\n> +\t#define A (value[0])\n> +\t#define B (value[1])\n> +\t#define D (Dvec.x)\n> +\t#define E (value[2])\n> +\t#define F (value[3])\n>  \n> -    // Avoid zero elements. On a scalar processor this saves two MADDs\n> -    // and it has no effect on a vector processor.\n> -    PATTERN.yzw += (kD.yz * D).xyy;\n> +\t// Avoid zero elements. On a scalar processor this saves two MADDs\n> +\t// and it has no effect on a vector processor.\n> +\tPATTERN.yzw += (kD.yz * D).xyy;\n>  \n> -    PATTERN += (kA.xyz * A).xyzx + (kE.xyw * E).xyxz;\n> -    PATTERN.xw  += kB.xw * B;\n> -    PATTERN.xz  += kF.xz * F;\n> +\tPATTERN += (kA.xyz * A).xyzx + (kE.xyw * E).xyxz;\n> +\tPATTERN.xw  += kB.xw * B;\n> +\tPATTERN.xz  += kF.xz * F;\n>  \n> -    rgb =  (alternate.y == 0.0) ?\n> -        ((alternate.x == 0.0) ?\n> -            vec3(C, PATTERN.xy) :\n> -            vec3(PATTERN.z, C, PATTERN.w)) :\n> -        ((alternate.x == 0.0) ?\n> -            vec3(PATTERN.w, C, PATTERN.z) :\n> -            vec3(PATTERN.yx, C));\n> +\trgb =  (alternate.y == 0.0) ?\n> +\t\t((alternate.x == 0.0) ?\n> +\t\t\tvec3(C, PATTERN.xy) :\n> +\t\t\tvec3(PATTERN.z, C, PATTERN.w)) :\n> +\t\t((alternate.x == 0.0) ?\n> +\t\t\tvec3(PATTERN.w, C, PATTERN.z) :\n> +\t\t\tvec3(PATTERN.yx, C));\n>  \n> -    rgb = rgb - blacklevel;\n> +\trgb = rgb - blacklevel;\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> +\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> -    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> +\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>  \n> -    /*\n> -     * Contrast\n> -     */\n> -    rgb = clamp(rgb, 0.0, 1.0);\n> -    rgb.r = apply_contrast(rgb.r);\n> -    rgb.g = apply_contrast(rgb.g);\n> -    rgb.b = apply_contrast(rgb.b);\n> +\t/*\n> +\t * Contrast\n> +\t */\n> +\trgb = clamp(rgb, 0.0, 1.0);\n> +\trgb.r = apply_contrast(rgb.r);\n> +\trgb.g = apply_contrast(rgb.g);\n> +\trgb.b = apply_contrast(rgb.b);\n>  \n> -    /* Apply gamma after colour correction */\n> -    rgb = pow(rgb, vec3(gamma));\n> +\t/* Apply gamma after colour correction */\n> +\trgb = pow(rgb, vec3(gamma));\n>  \n>  #if defined (SWAP_BLUE)\n> -    gl_FragColor = vec4(rgb.bgr, 1.0);\n> +\tgl_FragColor = vec4(rgb.bgr, 1.0);\n>  #else\n> -    gl_FragColor = vec4(rgb, 1.0);\n> +\tgl_FragColor = vec4(rgb, 1.0);\n>  #endif\n>  }\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 48AAFBE173\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu,  7 May 2026 12:42:54 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id EDE416301E;\n\tThu,  7 May 2026 14:42:52 +0200 (CEST)","from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com\n\t[205.220.180.131])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 64AA162010\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu,  7 May 2026 14:42:51 +0200 (CEST)","from pps.filterd (m0279869.ppops.net [127.0.0.1])\n\tby mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id\n\t647BEgQ73157318 for <libcamera-devel@lists.libcamera.org>;\n\tThu, 7 May 2026 12:42:50 GMT","from mail-ua1-f71.google.com (mail-ua1-f71.google.com\n\t[209.85.222.71])\n\tby mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4e0mhf1jmm-1\n\t(version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT)\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 07 May 2026 12:42:50 +0000 (GMT)","by mail-ua1-f71.google.com with SMTP id\n\ta1e0cc1a2514c-950c363a552so184461241.3\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 07 May 2026 05:42:49 -0700 (PDT)","from ?IPV6:2001:1c00:c32:7800:5bfa:a036:83f0:f9ec?\n\t(2001-1c00-0c32-7800-5bfa-a036-83f0-f9ec.cable.dynamic.v6.ziggo.nl.\n\t[2001:1c00:c32:7800:5bfa:a036:83f0:f9ec])\n\tby smtp.gmail.com with ESMTPSA id\n\ta640c23a62f3a-bc81d5eb440sm78611366b.25.2026.05.07.05.42.47\n\t(version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);\n\tThu, 07 May 2026 05:42:47 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=qualcomm.com header.i=@qualcomm.com\n\theader.b=\"Jx2Wc6DQ\"; dkim=pass (2048-bit key;\n\tunprotected) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com\n\theader.b=\"DrNSJlpf\"; dkim-atps=neutral","DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h=\n\tcontent-transfer-encoding:content-type:date:from:in-reply-to\n\t:message-id:mime-version:references:subject:to; s=qcppdkim1; bh=\n\tQaBuVydEN59pzbymTivJuOC4BzYMUo2JqHXI7DQhmlc=; b=Jx2Wc6DQc9q3v0+F\n\tHmm4VTi/uyWFDoBOxt7kG3fgPrSwUW9wMx9uHvO4GFUa7FNvH6QKOiqf42AFYimr\n\t43NVDhVX3bc8E1eZYwChvQ9z1Cw2yfnUT8J8vDndJ39oJgcbDRexuYinuGI5bgCq\n\tti2kYKq6SM7Xxx4uM5Pdr/U8jtxZU8dZjNGeqQqDlOKPXq/I/ZptyLz8tfVUkpfL\n\tr/HIDE820SPuXzC2tZdQlOkLfl8Fpb3nl2Wg75fVBCEr4iOvwIdnMdvymjx5n4f0\n\tPxuAJFbWsYkDrQynKhN3zJaugZBBYK/b+8nYFySW7rOd+0uk2kNxmoJSO4mk72Up\n\t6u2Adw==","v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=oss.qualcomm.com; s=google; t=1778157769; x=1778762569;\n\tdarn=lists.libcamera.org; \n\th=content-transfer-encoding:in-reply-to:content-language:references\n\t:to:subject:from:user-agent:mime-version:date:message-id:from:to:cc\n\t:subject:date:message-id:reply-to;\n\tbh=QaBuVydEN59pzbymTivJuOC4BzYMUo2JqHXI7DQhmlc=;\n\tb=DrNSJlpf2oxLPCOA4Ij+iaHo7d00dr/eeP6jFYrmF9MzEWRNNxWLvIKnjA40DVnR5Y\n\t3eNzZe1dTVwvsXhn1dZh7SEUkxEq5bYEd/W3lxFMXUNjKmj2V3ZQfiKuTG0rNU2cp08V\n\tOl3oxm9gbNxTjPXwkIceVxWWXjR8k+K8L/iKrPqK23+v8uaPO/zPG39Cimz9qJe5tFV2\n\t8tUxU/na6vBZW165QHpK/2qPt9HS6BONn/xDdgmoFe2YYKxSmxpLlf8pjoaQ//iKvzIJ\n\t+3vS6kl3G+Jv68SFK1J7+ZxsOTHHVUZsOzY09an1HnjS3EkWzojPM6ONn6ilP3urIj0e\n\teSmw=="],"X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20251104; t=1778157769; x=1778762569;\n\th=content-transfer-encoding:in-reply-to:content-language:references\n\t:to:subject:from:user-agent:mime-version:date:message-id:x-gm-gg\n\t:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to;\n\tbh=QaBuVydEN59pzbymTivJuOC4BzYMUo2JqHXI7DQhmlc=;\n\tb=R+xJMs0ti7MtHvK1Pp+Z0My+Fro4TZ21SNBSpccYijtSCPcbZuLnQ4MXL8u3ItDd+d\n\tOXvb5g1QyD3VEvQuEIhlya73ZDNoW2mfD7eHciCkAhkhCC4JVF+CW7HBEPQ82ABobU3h\n\tBaPKJ7PfFk/CW0gCeqGxYLYEXllUQ4aarMDqImX4wVONE1vh0dlR0XTbdhJtO9kuAX2H\n\tFzADO2tCkGJDkeWSYRvdzx2uVNcmKph6EBE5Q4TEfpbG7ttMqf1c/tGtXyqixR93jUZZ\n\tziX/AzzXWJLPWWNzcEaztr0Vkx+4/wAVhgFWSxQb2rAq3h5UMegNbmJ10la3poooIvgv\n\tq4nQ==","X-Forwarded-Encrypted":"i=1;\n\tAFNElJ89cQfFxCXievnuazS8E70t6mwoW6o4gZ/V/1qij2GyQ+OUpXT0IdGt9jR0w6OCxpxGT4ayKU1KNOj50LEoeCM=@lists.libcamera.org","X-Gm-Message-State":"AOJu0YwJQ11uty5l7nTZkOUZtT4CBLHY5lpEO+IHK//3+VqqfVPeFeho\n\t3L/3onI9vLnyOLthKFyy7HRbnyEPdjxUXE2V+J7Nf5PhQGvU19+JiWGhaXrjxrL8HqOyk9sWQmK\n\tp5HHULjMScSSA7jb2Bin12X23O308oAaWtT4SrC3f3RWJbBymSGk7pxiMQ1UVgOOjtQmBuuW9B3\n\tMtjAOJXtMpq/Y=","X-Gm-Gg":"AeBDietM0vCfiwIXHK0B9EJ7qizESHP2qrdEZllRxfPR9w8UnXuxF3kP5qKUc2TNcGk\n\taKjekcxIow8DXXU59NVjaBBKjGifmbRmi6QWbJFavVLy6CrSo4BKYEqNchXkCUnVI+Y9pS3sJ+R\n\tyCMT5hYoj+epSSTNnnOEZeXdbWmAydI1bCeabI4WgoYgsapwmH9xbaprkGNQziEaEtWSFxR728s\n\tomfNrqZxPiDo2/KJ2ydRSwSQHV/UxSzdc+4NmQ/5EEfn2uOZcsFMGivBNGl4gYakVkSZR9FKNpx\n\tcyYiqkwx7qttXU31sgEYAIz5UakOwiGIVB4WyQticfWllbIzN2gLKkq6b0K629D57IlyJTyluiR\n\tY/hbd1dEgnzAFE8ir4wKBPbrnDEzfEV6m4KVM1QlowrNuo2T5uxZ53O8sEiHFi04qn48u7n2rmT\n\tmUYxz1X/VUSDE7wGjZtV9+s6tTMYtUeNY4358oH1f7U1QDb4dXEC7DNOrlCQaBIXb34oIaUC3c+\n\tklJmjc7/nDnsIQbvoz+ajbBmAE=","X-Received":["by 2002:a05:6102:41a1:b0:607:a151:819 with SMTP id\n\tada2fe7eead31-630f8e75221mr3942124137.5.1778157769002; \n\tThu, 07 May 2026 05:42:49 -0700 (PDT)","by 2002:a05:6102:41a1:b0:607:a151:819 with SMTP id\n\tada2fe7eead31-630f8e75221mr3942115137.5.1778157768469; \n\tThu, 07 May 2026 05:42:48 -0700 (PDT)"],"Message-ID":"<16b98928-c04f-4c32-a087-f1e1a27f3219@oss.qualcomm.com>","Date":"Thu, 7 May 2026 14:42:46 +0200","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","From":"johannes.goede@oss.qualcomm.com","Subject":"Re: [PATCH 01/13] libcamera: shaders: unpacked: Fix indentations","To":"Kieran Bingham <kieran.bingham@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","References":"<20260407-kbingham-awb-split-v1-0-a39af3f4dc20@ideasonboard.com>\n\t<20260407-kbingham-awb-split-v1-1-a39af3f4dc20@ideasonboard.com>","Content-Language":"en-US, nl","In-Reply-To":"<20260407-kbingham-awb-split-v1-1-a39af3f4dc20@ideasonboard.com>","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"7bit","X-Proofpoint-Spam-Details-Enc":"AW1haW4tMjYwNTA3MDEyNiBTYWx0ZWRfX8tm0tpAJBA79\n\ti4TAkEEsCvgajE9hrYXi7w4LzXVSEv3UGty0wCK9E8MjJd7vHNh6LgOIO4zmndsSJtxeC0G2utU\n\tOIBPWOfNPS8+HYJFnYANcLQvNeLGfb+++6n6oWMfyWw2tiJ6gu+qVJnO1yNKiscxdftwkmeCReo\n\tYI9NkVRnxsFRNgDtaO9xmQyMTIjw0bQbJnbjY7pRJB0wUhNkuUx4NfFal9RlfNGDeh8kv7VB3IA\n\t/Eap7nUhIKYiDTzBFyuIHalxPpbq8PnE/zBVq9usvYIcVvak4qtVx4b8ABRAzwZpzwCGusp+5n1\n\tTmtgcLPhU0EKSCjBZi/am+UcvvDbfEpWlBt6TKbaQWI98FMlldXkHu6SZcWo1uE4PWH5b90xUic\n\tTRR9ZX+OT0WJvcWwDmyRdYrOl8qZLvj9q4nj82W26KfFVVvh6mpF1qDcY3dU3xwDnUJDbLrIeDw\n\tlEm++CX8qKuOjL+ZzFA==","X-Proofpoint-ORIG-GUID":"iM633QweSHLV6l6uPQC9bIiw7IHc1Zym","X-Authority-Analysis":"v=2.4 cv=SuagLvO0 c=1 sm=1 tr=0 ts=69fc88ca cx=c_pps\n\ta=KB4UBwrhAZV1kjiGHFQexw==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10\n\ta=NGcC8JguVDcA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22\n\ta=u7WPNUs3qKkmUXheDGA7:22 a=_glEPmIy2e8OvE2BGh3C:22 a=P1BnusSwAAAA:8\n\ta=EUspDBNiAAAA:8 a=IR5nokmfAAAA:8 a=iacmHcReAAAA:8\n\ta=PNuA56ZDiyHAyo5lPL0A:9\n\ta=QEXdDO2ut3YA:10 a=o1xkdb1NAhiiM49bd1HK:22 a=D0XLA9XvdZm18NrgonBM:22\n\ta=Db1aT4fIIyOm9XcfP-EU:22 a=bMNoII6kndmpfTkWcZY3:22","X-Proofpoint-GUID":"iM633QweSHLV6l6uPQC9bIiw7IHc1Zym","X-Proofpoint-Virus-Version":"vendor=baseguard\n\tengine=ICAP:2.0.293, Aquarius:18.0.1143, Hydra:6.1.51,\n\tFMLib:17.12.100.49\n\tdefinitions=2026-05-07_01,2026-05-06_01,2025-10-01_01","X-Proofpoint-Spam-Details":"rule=outbound_notspam policy=outbound score=0\n\tclxscore=1015 malwarescore=0 suspectscore=0 bulkscore=0\n\tlowpriorityscore=0\n\timpostorscore=0 spamscore=0 adultscore=0 phishscore=0\n\tpriorityscore=1501\n\tclassifier=typeunknown authscore=0 authtc= authcc= route=outbound\n\tadjust=0\n\treason=mlx scancount=1 engine=8.22.0-2604200000\n\tdefinitions=main-2605070126","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":38841,"web_url":"https://patchwork.libcamera.org/comment/38841/","msgid":"<177843726059.2475891.10595074778441525087@ping.linuxembedded.co.uk>","date":"2026-05-10T18:21:00","subject":"Re: [PATCH 01/13] libcamera: shaders: unpacked: Fix indentations","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Quoting Laurent Pinchart (2026-04-08 00:50:14)\n> On Tue, Apr 07, 2026 at 11:01:04PM +0100, Kieran Bingham wrote:\n> > Reflow the unpacked bayer shader to use tabs for indentation and\n> > match the style of the bayer_packed fragment shader.\n> \n> Does anyone know of a formatter for GLSL ? clang-format does a\n> relatively decent job, it could make sense to start with that.\n> \n> > Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n> > ---\n> >  src/libcamera/shaders/bayer_unpacked.frag | 264 +++++++++++++++---------------\n> >  1 file changed, 132 insertions(+), 132 deletions(-)\n> > \n> > diff --git a/src/libcamera/shaders/bayer_unpacked.frag b/src/libcamera/shaders/bayer_unpacked.frag\n> > index 1b85196ae16130670eb3d1c077ab4884119ae63c..76ffc47a8a29f242c1fba88f32bd8db731edeee0 100644\n> > --- a/src/libcamera/shaders/bayer_unpacked.frag\n> > +++ b/src/libcamera/shaders/bayer_unpacked.frag\n> > @@ -31,163 +31,163 @@ uniform float           contrastExp;\n> >  \n> >  float apply_contrast(float value)\n> >  {\n> > -    // Apply simple S-curve\n> > -    if (value < 0.5)\n> > -        return 0.5 * pow(value / 0.5, contrastExp);\n> > -    else\n> > -        return 1.0 - 0.5 * pow((1.0 - value) / 0.5, contrastExp);\n> > +     // Apply simple S-curve\n> \n> It could make sense to standardize on one style for comments.\n> \n> > +     if (value < 0.5)\n> > +             return 0.5 * pow(value / 0.5, contrastExp);\n> > +     else\n> > +             return 1.0 - 0.5 * pow((1.0 - value) / 0.5, contrastExp);\n> >  }\n> >  \n> >  void main(void) {\n> \n> Style mismatch in curly brace placement between apply_contrast() and\n> main(). I'd write\n> \n> void main(void)\n> {\n> \n> > -    vec3 rgb;\n> > +     vec3 rgb;\n> >  \n> > -    #if defined(RAW10P)\n> > -    #define pixel(p) p.r / 4.0 + p.g * 64.0\n> > -    #define fetch(x, y) pixel(texture2D(tex_y, vec2(x, y)))\n> > -    #elif defined(RAW12P)\n> > -    #define pixel(p) p.r / 16.0 + p.g * 16.0\n> > -    #define fetch(x, y) pixel(texture2D(tex_y, vec2(x, y)))\n> > -    #else\n> > -    #define fetch(x, y) texture2D(tex_y, vec2(x, y)).r\n> > -    #endif\n> > +     #if defined(RAW10P)\n> > +     #define pixel(p) p.r / 4.0 + p.g * 64.0\n> > +     #define fetch(x, y) pixel(texture2D(tex_y, vec2(x, y)))\n> > +     #elif defined(RAW12P)\n> > +     #define pixel(p) p.r / 16.0 + p.g * 16.0\n> > +     #define fetch(x, y) pixel(texture2D(tex_y, vec2(x, y)))\n> > +     #else\n> > +     #define fetch(x, y) texture2D(tex_y, vec2(x, y)).r\n> > +     #endif\n> \n> I'd have removed the indentation for macros, as some macros are already\n> aligned on the left-most column.\n> \n> Feel free to pick which comments you deem worth addressing.\n\nI don't want to make lots of changes here, as I anticipate the debayer\nshaders being unified with Bryan's work.\n\nI'll keep this patch as only fixing the tabs/space indentation\ndifferences so that I can keep track of the changes that I presently\nneed to make to both locations, and work towards supporting Bryan\nrefactoring these to a single file.\n\n> \n> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> \n> >  \n> > -    float C = fetch(center.x, center.y); // ( 0, 0)\n> > -    const vec4 kC = vec4( 4.0,  6.0,  5.0,  5.0) / 8.0;\n> > +     float C = fetch(center.x, center.y); // ( 0, 0)\n> > +     const vec4 kC = vec4( 4.0,  6.0,  5.0,  5.0) / 8.0;\n> >  \n> > -    // Determine which of four types of pixels we are on.\n> > -    vec2 alternate = mod(floor(center.zw), 2.0);\n> > +     // Determine which of four types of pixels we are on.\n> > +     vec2 alternate = mod(floor(center.zw), 2.0);\n> >  \n> > -    vec4 Dvec = vec4(\n> > -        fetch(xCoord[1], yCoord[1]),  // (-1,-1)\n> > -        fetch(xCoord[1], yCoord[2]),  // (-1, 1)\n> > -        fetch(xCoord[2], yCoord[1]),  // ( 1,-1)\n> > -        fetch(xCoord[2], yCoord[2])); // ( 1, 1)\n> > +     vec4 Dvec = vec4(\n> > +             fetch(xCoord[1], yCoord[1]),  // (-1,-1)\n> > +             fetch(xCoord[1], yCoord[2]),  // (-1, 1)\n> > +             fetch(xCoord[2], yCoord[1]),  // ( 1,-1)\n> > +             fetch(xCoord[2], yCoord[2])); // ( 1, 1)\n> >  \n> > -    vec4 PATTERN = (kC.xyz * C).xyzz;\n> > +     vec4 PATTERN = (kC.xyz * C).xyzz;\n> >  \n> > -    // Can also be a dot product with (1,1,1,1) on hardware where that is\n> > -    // specially optimized.\n> > -    // Equivalent to: D = Dvec[0] + Dvec[1] + Dvec[2] + Dvec[3];\n> > -    Dvec.xy += Dvec.zw;\n> > -    Dvec.x  += Dvec.y;\n> > +     // Can also be a dot product with (1,1,1,1) on hardware where that is\n> > +     // specially optimized.\n> > +     // Equivalent to: D = Dvec[0] + Dvec[1] + Dvec[2] + Dvec[3];\n> > +     Dvec.xy += Dvec.zw;\n> > +     Dvec.x  += Dvec.y;\n> >  \n> > -    vec4 value = vec4(\n> > -        fetch(center.x, yCoord[0]),   // ( 0,-2)\n> > -        fetch(center.x, yCoord[1]),   // ( 0,-1)\n> > -        fetch(xCoord[0], center.y),   // (-2, 0)\n> > -        fetch(xCoord[1], center.y));  // (-1, 0)\n> > +     vec4 value = vec4(\n> > +             fetch(center.x, yCoord[0]),   // ( 0,-2)\n> > +             fetch(center.x, yCoord[1]),   // ( 0,-1)\n> > +             fetch(xCoord[0], center.y),   // (-2, 0)\n> > +             fetch(xCoord[1], center.y));  // (-1, 0)\n> >  \n> > -    vec4 temp = vec4(\n> > -        fetch(center.x, yCoord[3]),   // ( 0, 2)\n> > -        fetch(center.x, yCoord[2]),   // ( 0, 1)\n> > -        fetch(xCoord[3], center.y),   // ( 2, 0)\n> > -        fetch(xCoord[2], center.y));  // ( 1, 0)\n> > +     vec4 temp = vec4(\n> > +             fetch(center.x, yCoord[3]),   // ( 0, 2)\n> > +             fetch(center.x, yCoord[2]),   // ( 0, 1)\n> > +             fetch(xCoord[3], center.y),   // ( 2, 0)\n> > +             fetch(xCoord[2], center.y));  // ( 1, 0)\n> >  \n> > -    // Even the simplest compilers should be able to constant-fold these to\n> > -    // avoid the division.\n> > -    // Note that on scalar processors these constants force computation of some\n> > -    // identical products twice.\n> > -    const vec4 kA = vec4(-1.0, -1.5,  0.5, -1.0) / 8.0;\n> > -    const vec4 kB = vec4( 2.0,  0.0,  0.0,  4.0) / 8.0;\n> > -    const vec4 kD = vec4( 0.0,  2.0, -1.0, -1.0) / 8.0;\n> > +     // Even the simplest compilers should be able to constant-fold these to\n> > +     // avoid the division.\n> > +     // Note that on scalar processors these constants force computation of some\n> > +     // identical products twice.\n> > +     const vec4 kA = vec4(-1.0, -1.5,  0.5, -1.0) / 8.0;\n> > +     const vec4 kB = vec4( 2.0,  0.0,  0.0,  4.0) / 8.0;\n> > +     const vec4 kD = vec4( 0.0,  2.0, -1.0, -1.0) / 8.0;\n> >  \n> > -    // Conserve constant registers and take advantage of free swizzle on load\n> > -    #define kE (kA.xywz)\n> > -    #define kF (kB.xywz)\n> > +     // Conserve constant registers and take advantage of free swizzle on load\n> > +     #define kE (kA.xywz)\n> > +     #define kF (kB.xywz)\n> >  \n> > -    value += temp;\n> > +     value += temp;\n> >  \n> > -    // There are five filter patterns (identity, cross, checker,\n> > -    // theta, phi).  Precompute the terms from all of them and then\n> > -    // use swizzles to assign to color channels.\n> > -    //\n> > -    // Channel   Matches\n> > -    //   x       cross   (e.g., EE G)\n> > -    //   y       checker (e.g., EE B)\n> > -    //   z       theta   (e.g., EO R)\n> > -    //   w       phi     (e.g., EO R)\n> > -    #define A (value[0])\n> > -    #define B (value[1])\n> > -    #define D (Dvec.x)\n> > -    #define E (value[2])\n> > -    #define F (value[3])\n> > +     // There are five filter patterns (identity, cross, checker,\n> > +     // theta, phi).  Precompute the terms from all of them and then\n> > +     // use swizzles to assign to color channels.\n> > +     //\n> > +     // Channel   Matches\n> > +     //   x       cross   (e.g., EE G)\n> > +     //   y       checker (e.g., EE B)\n> > +     //   z       theta   (e.g., EO R)\n> > +     //   w       phi     (e.g., EO R)\n> > +     #define A (value[0])\n> > +     #define B (value[1])\n> > +     #define D (Dvec.x)\n> > +     #define E (value[2])\n> > +     #define F (value[3])\n> >  \n> > -    // Avoid zero elements. On a scalar processor this saves two MADDs\n> > -    // and it has no effect on a vector processor.\n> > -    PATTERN.yzw += (kD.yz * D).xyy;\n> > +     // Avoid zero elements. On a scalar processor this saves two MADDs\n> > +     // and it has no effect on a vector processor.\n> > +     PATTERN.yzw += (kD.yz * D).xyy;\n> >  \n> > -    PATTERN += (kA.xyz * A).xyzx + (kE.xyw * E).xyxz;\n> > -    PATTERN.xw  += kB.xw * B;\n> > -    PATTERN.xz  += kF.xz * F;\n> > +     PATTERN += (kA.xyz * A).xyzx + (kE.xyw * E).xyxz;\n> > +     PATTERN.xw  += kB.xw * B;\n> > +     PATTERN.xz  += kF.xz * F;\n> >  \n> > -    rgb =  (alternate.y == 0.0) ?\n> > -        ((alternate.x == 0.0) ?\n> > -            vec3(C, PATTERN.xy) :\n> > -            vec3(PATTERN.z, C, PATTERN.w)) :\n> > -        ((alternate.x == 0.0) ?\n> > -            vec3(PATTERN.w, C, PATTERN.z) :\n> > -            vec3(PATTERN.yx, C));\n> > +     rgb =  (alternate.y == 0.0) ?\n> > +             ((alternate.x == 0.0) ?\n> > +                     vec3(C, PATTERN.xy) :\n> > +                     vec3(PATTERN.z, C, PATTERN.w)) :\n> > +             ((alternate.x == 0.0) ?\n> > +                     vec3(PATTERN.w, C, PATTERN.z) :\n> > +                     vec3(PATTERN.yx, C));\n> >  \n> > -    rgb = rgb - blacklevel;\n> > +     rgb = rgb - blacklevel;\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> > +      *   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> > +     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> >  \n> > -    /*\n> > -     * Contrast\n> > -     */\n> > -    rgb = clamp(rgb, 0.0, 1.0);\n> > -    rgb.r = apply_contrast(rgb.r);\n> > -    rgb.g = apply_contrast(rgb.g);\n> > -    rgb.b = apply_contrast(rgb.b);\n> > +     /*\n> > +      * Contrast\n> > +      */\n> > +     rgb = clamp(rgb, 0.0, 1.0);\n> > +     rgb.r = apply_contrast(rgb.r);\n> > +     rgb.g = apply_contrast(rgb.g);\n> > +     rgb.b = apply_contrast(rgb.b);\n> >  \n> > -    /* Apply gamma after colour correction */\n> > -    rgb = pow(rgb, vec3(gamma));\n> > +     /* Apply gamma after colour correction */\n> > +     rgb = pow(rgb, vec3(gamma));\n> >  \n> >  #if defined (SWAP_BLUE)\n> > -    gl_FragColor = vec4(rgb.bgr, 1.0);\n> > +     gl_FragColor = vec4(rgb.bgr, 1.0);\n> >  #else\n> > -    gl_FragColor = vec4(rgb, 1.0);\n> > +     gl_FragColor = vec4(rgb, 1.0);\n> >  #endif\n> >  }\n> > \n> \n> -- \n> Regards,\n> \n> Laurent Pinchart","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 2DF49BDB1C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tSun, 10 May 2026 18:21:07 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 301EC63025;\n\tSun, 10 May 2026 20:21:06 +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 B2C6662E6A\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSun, 10 May 2026 20:21:03 +0200 (CEST)","from monstersaurus.ideasonboard.com\n\t(cpc89244-aztw30-2-0-cust6594.18-1.cable.virginm.net [86.31.185.195])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 296E918BC;\n\tSun, 10 May 2026 20:20:57 +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=\"HvjwHc0R\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1778437257;\n\tbh=vXV8PBzt27m+UDDKsmX25sD2qpqnOzK+htk1M7XL/rM=;\n\th=In-Reply-To:References:Subject:From:Cc:To:Date:From;\n\tb=HvjwHc0RtsKEzbESBdft4B3bIXUP40i5sFmdtdIwbmUhUCeFyHG4MMYCEgDZwvD0K\n\tjeoKYlNGkQXTlykFsKDqN36MkXwlkaaE/Zey10s1gJcy9IfH/dHJjGe/dTXSOxDiUU\n\tOs3Bkk+JwLZHZ6ODyDB/J7lgs7YQHyLsAEwOS4uQ=","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<20260407235014.GL1268443@killaraus.ideasonboard.com>","References":"<20260407-kbingham-awb-split-v1-0-a39af3f4dc20@ideasonboard.com>\n\t<20260407-kbingham-awb-split-v1-1-a39af3f4dc20@ideasonboard.com>\n\t<20260407235014.GL1268443@killaraus.ideasonboard.com>","Subject":"Re: [PATCH 01/13] libcamera: shaders: unpacked: Fix indentations","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Date":"Sun, 10 May 2026 19:21:00 +0100","Message-ID":"<177843726059.2475891.10595074778441525087@ping.linuxembedded.co.uk>","User-Agent":"alot/0.9.1","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>"}}]