[{"id":34486,"web_url":"https://patchwork.libcamera.org/comment/34486/","msgid":"<3406d111-1596-4f8c-a2bf-2e1a4b02d101@linaro.org>","date":"2025-06-16T19:04:19","subject":"Re: [PATCH 17/35] utils: gen-shader-headers: Add a utility to\n\tgenerate headers from shaders","submitter":{"id":175,"url":"https://patchwork.libcamera.org/api/people/175/","name":"Bryan O'Donoghue","email":"bryan.odonoghue@linaro.org"},"content":"On 11/06/2025 02:32, Bryan O'Donoghue wrote:\n> Two simple script to generate a header that contains GLSL shaders translated\n> to C arrays.\n\nscripts plural\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 B4368BDE6B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 16 Jun 2025 19:04:22 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 6F04E68DC7;\n\tMon, 16 Jun 2025 21:04:22 +0200 (CEST)","from mail-wm1-x32c.google.com (mail-wm1-x32c.google.com\n\t[IPv6:2a00:1450:4864:20::32c])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 4495868DC0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 16 Jun 2025 21:04:21 +0200 (CEST)","by mail-wm1-x32c.google.com with SMTP id\n\t5b1f17b1804b1-451d41e1ad1so42305865e9.1\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 16 Jun 2025 12:04:21 -0700 (PDT)","from [192.168.0.35] (188-141-3-146.dynamic.upc.ie. [188.141.3.146])\n\tby smtp.gmail.com with ESMTPSA id\n\tffacd0b85a97d-3a579808c24sm7097981f8f.43.2025.06.16.12.04.20\n\t(version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);\n\tMon, 16 Jun 2025 12:04:20 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=linaro.org header.i=@linaro.org\n\theader.b=\"Z8IdtJqw\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=linaro.org; s=google; t=1750100661; x=1750705461;\n\tdarn=lists.libcamera.org; \n\th=content-transfer-encoding:in-reply-to:from:content-language\n\t:references:to:subject:user-agent:mime-version:date:message-id:from\n\t:to:cc:subject:date:message-id:reply-to;\n\tbh=jL0TC0cAFCtB8mVzqJwBZzdk1uj3Asmz3iA7Jqjv05Q=;\n\tb=Z8IdtJqwvmhGGP+F8HetZNkXAXCA2Bw0jhEnbAZKCxW15VUV7N18dtHr+1TnxywGMR\n\ts4FR2NRe3kal5m9BnHQCZOrfU0f2L/CZRD3BY2rsb5bJRzZS8r5Hehw7lYalHEZ1y+EB\n\tBnctP941zVijQI6+iPM3FBQPm/zHio0x3DcF3lEQNX8mYd1tG548EbtO29SjS8E2urn2\n\tDdMpuv8Upf/QCyc0SLbbsOOPSubQc3r1MCzKJhY2NOe7ojQPHeS0GEGXANRGTU/Tycif\n\tkbli1z72I5CW2T65ug0OOc2NLsUVwP5+Qs2nI3Hv4HETcy5VfXIxzNQitQgwMPhaaU4s\n\t5sQQ==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1750100661; x=1750705461;\n\th=content-transfer-encoding:in-reply-to:from:content-language\n\t:references:to:subject:user-agent:mime-version:date:message-id\n\t:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to;\n\tbh=jL0TC0cAFCtB8mVzqJwBZzdk1uj3Asmz3iA7Jqjv05Q=;\n\tb=Rma75Bo80yLqZ3D8N9TJNeFD4in4MMinBOju5wLDW3EcKKKu4JS+Jawryv4Vc6Q6uo\n\tu2iB58BfKWEnxDZNLhSwobQNpU4TFezsEKCUKWqMtFq5vyjjp4+/NPPD+NsZKisKpnGD\n\t44QTFEVz/BkppUW1j42aLLw7nHi2Uz5eRC13wgdxS2/azsLvjL7oophs982F3+vyRrMv\n\tolWDY+UDUiQd0M2pCUAvDeAy+fY/d7Nf3quN/p1h4g3ugTRQfqeU/AxWpcIgOI5GTsKp\n\t9FrE0nEcAz98MjPiexyB1s9rU68uhBjDvu9OfYRIbDL8kjXaTsX77sLqsZE4VI8bbi6C\n\t2vSA==","X-Forwarded-Encrypted":"i=1;\n\tAJvYcCWAJcPxgATUZWZ1/zBaNV8ZYHWsV4+n/XAZKExUvY6nJW/MRA7kQ3+srl/uD9QdMWU9xFA6G7FClrDEy2cW/Q8=@lists.libcamera.org","X-Gm-Message-State":"AOJu0YyRhndPKEfHR/zILTqPQuisnlOPA0GhvuoJ6jmABtgrz26kwLRN\n\t2ToX6CZ5qBxD4XfpS4yyOy1aUf9cAXklfTQCUr9sdhillVdvE0KxYX5ikaGfXS8OvPL6CTtYQvh\n\tmH9F63Wo=","X-Gm-Gg":"ASbGncs7Pcvp73+LzDVqvX75+P4pytsI3eVhIhz+8Qls8PJL1IYGmhORwb9W/LpJoDI\n\tmu5VrmGDpRETKq7/VL/gCingacTz43kmAbtSSgZgYAGUuToiXCusRM/2JJgEV6t1CLzak4J0Jpk\n\tNwlsXXQiJEk3vlu0q7MdCzzniXrg0IijTvwJiJWU+A5UuzQ6ys+q+Slu+55+Y+5/trPG1sWQRMj\n\tGdYdas1urQQoyjiAgStF6EBpLRUlhaZl5Ixrx9xLP3idDijlHiIFHEZj61dxWLK0WkIJKcj3X8d\n\tDUkzorxeHvSzChGDf3cSRbD0V3O/TKq3Zri7YBygpED9HCb3a3jTGkRrLJEsexO0V0S54VFynut\n\tJgtXUc2dMeYpOWKcXHdkme7kTEdI=","X-Google-Smtp-Source":"AGHT+IGSyQrMY0xj5YCn4hR4cCr5eqSoxmch0cV4tosP35xAmhBqw5xTw1o6O5TNnuRRWwaZyBJd2Q==","X-Received":"by 2002:a05:600c:858b:b0:453:1058:f8c1 with SMTP id\n\t5b1f17b1804b1-4533d574d17mr71496295e9.3.1750100660799; \n\tMon, 16 Jun 2025 12:04:20 -0700 (PDT)","Message-ID":"<3406d111-1596-4f8c-a2bf-2e1a4b02d101@linaro.org>","Date":"Mon, 16 Jun 2025 20:04:19 +0100","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH 17/35] utils: gen-shader-headers: Add a utility to\n\tgenerate headers from shaders","To":"Bryan O'Donoghue <bryan.odonoghue@linaro.org>,\n\tlibcamera-devel@lists.libcamera.org","References":"<20250611013245.133785-1-bryan.odonoghue@linaro.org>\n\t<0-bfGayeC1Y8qmuZxnce4tvyMftQGUOATxC_YCMCERoV1AYVdEsIC2DZ5jwedyc1FSHWINH9U_xUbkfzKwJsOw==@protonmail.internalid>\n\t<20250611013245.133785-18-bryan.odonoghue@linaro.org>","Content-Language":"en-US","From":"Bryan O'Donoghue <bryan.odonoghue@linaro.org>","In-Reply-To":"<20250611013245.133785-18-bryan.odonoghue@linaro.org>","Content-Type":"text/plain; charset=UTF-8; format=flowed","Content-Transfer-Encoding":"7bit","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":34522,"web_url":"https://patchwork.libcamera.org/comment/34522/","msgid":"<85tt4ea6ml.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","date":"2025-06-17T12:34:58","subject":"Re: [PATCH 17/35] utils: gen-shader-headers: Add a utility to\n\tgenerate headers from shaders","submitter":{"id":177,"url":"https://patchwork.libcamera.org/api/people/177/","name":"Milan Zamazal","email":"mzamazal@redhat.com"},"content":"Hi Bryan,\n\nBryan O'Donoghue <bryan.odonoghue@linaro.org> writes:\n\n> Two simple script to generate a header that contains GLSL shaders translated\n> to C arrays.\n>\n> Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>\n> ---\n>  utils/gen-shader-header.py  | 38 ++++++++++++++++++++++++++++++++\n>  utils/gen-shader-headers.sh | 44 +++++++++++++++++++++++++++++++++++++\n>  2 files changed, 82 insertions(+)\n>  create mode 100755 utils/gen-shader-header.py\n>  create mode 100755 utils/gen-shader-headers.sh\n>\n> diff --git a/utils/gen-shader-header.py b/utils/gen-shader-header.py\n> new file mode 100755\n> index 00000000..6668e648\n> --- /dev/null\n> +++ b/utils/gen-shader-header.py\n> @@ -0,0 +1,38 @@\n> +#!/usr/bin/env python3\n> +# SPDX-License-Identifier: GPL-2.0-or-later\n> +# Copyright (C) 2025, Bryan O'Donoghue.\n> +#\n> +# Author: Bryan O'Donoghue <bryan.odonoghue@linaro.org>\n> +#\n> +# A python script which takes a list of shader files and converts into a C\n\ns/python/Python/\n\nAnd maybe a missing object (\"it\" or so) after \"convert\"; it sounds weird\nto my limited English knowledge.\n\n> +# header.\n\nAdding a single line usage information could be useful (and checking the\nnumber of arguments + printing the usage on mismatch would be bonus, but\nnot necessary for an internal build tool).\n\n> +#\n> +import sys\n> +\n> +try:\n> +    with open(sys.argv[2]) as file:\n> +        data = file.read()\n> +        data_len = len(data)\n> +\n> +        name = sys.argv[1].replace(\".\", \"_\")\n> +        name_len = name + \"_len\"\n> +\n> +        j = 0\n> +        print(\"unsigned char\", name, \"[] = {\")\n> +        for ch in data:\n> +            print(f\"0x{ord(ch):02x}, \", end=\"\")\n> +            j = j + 1\n> +            if j == 16:\n> +                print()\n> +                j = 0\n\nOr a bit simpler:\n\n  j = (j + 1) % 16\n  if j == 0:\n      print()\n\n> +        if j != 0:\n> +            print()\n> +        print(\"};\")\n> +\n> +        print()\n> +        print(f\"const unsigned int {name_len}={data_len};\")\n> +\n> +except FileNotFoundError:\n> +    print(f\"File {sys.argv[2]} not found\", file=sys.stderr)\n> +except IOError:\n> +    print(f\"Unable to read {sys.argv[2]}\", file=sys.stderr)\n> diff --git a/utils/gen-shader-headers.sh b/utils/gen-shader-headers.sh\n> new file mode 100755\n> index 00000000..ca4f19f0\n> --- /dev/null\n> +++ b/utils/gen-shader-headers.sh\n> @@ -0,0 +1,44 @@\n> +#!/bin/sh\n> +set -x\n> +\n> +if [ $# -lt 4 ]; then\n> +\techo \"Invalid arg count must be >= 5\"\n\nAnd the arguments should be?\n\n> +\texit 1\n> +fi\n> +src_dir=\"$1\"; shift\n> +build_dir=\"$1\"; shift\n> +build_path=$build_dir/\"$1\"; shift\n> +\n> +cat <<EOF > \"$build_path\"\n> +/* SPDX-License-Identifier: LGPL-2.1-or-later */\n> +/* This file is auto-generated, do not edit! */\n> +/*\n> + * Copyright (C) 2025, Linaro Ltd.\n\nI don't think this can be claimed on contents generated from arbitrary\nsources.\n\n> + *\n> + */\n> +\n> +#pragma once\n> +\n> +EOF\n> +\n> +cat <<EOF >> \"$build_path\"\n> +/*\n> + * List the names of the shaders at the top of\n> + * header for readability's sake\n> + *\n> +EOF\n> +\n> +for file in \"$@\"; do\n> +\techo \"file is $file\"\n> +\tname=$(basename \"$build_dir/$file\" | tr '.' '_')\n> +\techo \" * unsigned char $name;\" >> \"$build_path\"\n> +done\n> +\n> +echo \"*/\" >> \"$build_path\"\n> +\n> +echo \"/* Hex encoded shader data */\" >> \"$build_path\"\n> +for file in \"$@\"; do\n> +\tname=$(basename \"$build_dir/$file\")\n> +\t\"$src_dir/utils/gen-shader-header.py\" \"$name\" \"$build_dir/$file\" >> \"$build_path\"\n> +\techo >> \"$build_path\"\n> +done","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 04C3BBDE6B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 17 Jun 2025 12:35:07 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id E0C2D68DCE;\n\tTue, 17 Jun 2025 14:35:05 +0200 (CEST)","from us-smtp-delivery-124.mimecast.com\n\t(us-smtp-delivery-124.mimecast.com [170.10.133.124])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 75F8568DB1\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 17 Jun 2025 14:35:04 +0200 (CEST)","from mail-ed1-f71.google.com (mail-ed1-f71.google.com\n\t[209.85.208.71]) by relay.mimecast.com with ESMTP with STARTTLS\n\t(version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n\tus-mta-534-6v2eS-TCNd-pWEKH9lJdlA-1; Tue, 17 Jun 2025 08:35:02 -0400","by mail-ed1-f71.google.com with SMTP id\n\t4fb4d7f45d1cf-6090274dd37so3005606a12.0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 17 Jun 2025 05:35:01 -0700 (PDT)","from mzamazal-thinkpadp1gen7.tpbc.csb ([85.93.96.130])\n\tby smtp.gmail.com with ESMTPSA id\n\t4fb4d7f45d1cf-608f8e203cbsm5662415a12.39.2025.06.17.05.34.59\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tTue, 17 Jun 2025 05:34:59 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=redhat.com header.i=@redhat.com\n\theader.b=\"JZ/scsjf\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1750163703;\n\th=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n\tto:to:cc:cc:mime-version:mime-version:content-type:content-type:\n\tin-reply-to:in-reply-to:references:references;\n\tbh=zCVv+xaggJPqy6rXA2uwR+O4ALsM6X9pqHbltg70Mkg=;\n\tb=JZ/scsjfnXPW/brPnrzPUhq97ytpaooB6SVnILRJmxrmSFNQXclW1rizdiC6yte09NGbfN\n\tppsNpvL3A1O6ec3nkX54VSm0tTcKBDDElOCIlKhEa1YaPNk8uiDgss1RJwnG844TRNErjb\n\t8EwezoQK/dyfTQro2O/HSHqKz9dOluI=","X-MC-Unique":"6v2eS-TCNd-pWEKH9lJdlA-1","X-Mimecast-MFC-AGG-ID":"6v2eS-TCNd-pWEKH9lJdlA_1750163701","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1750163700; x=1750768500;\n\th=mime-version:user-agent:message-id:date:references:in-reply-to\n\t:subject:cc:to:from:x-gm-message-state:from:to:cc:subject:date\n\t:message-id:reply-to;\n\tbh=zCVv+xaggJPqy6rXA2uwR+O4ALsM6X9pqHbltg70Mkg=;\n\tb=Enjpzzhdz8DZimv9UCLmTQr4TaUYEsd7KXeH1iW/BwfyDnOK7yj758yiO/QE64gs+Q\n\tuVPc+yNlCkC5qmlw01VdeGC72/jw/QDbinyeJaTMPsGuopXaJuEnEvosiSoqB9hlcytL\n\tQSUvwWbBNpSzchjeQfrgKH1j/5duTahCyKiPyMaS0xMEwu/bvzm05yWAGmU968esIKQd\n\tUrDaJ0lDLMRkFVwbiCTw9FFghTSxqq3iX6Y1mukLXxzmb/xOANiamynyvNlPHor7l1H9\n\tYkrHWzLwPqu1oinjkE9Zg/8pSpRhjs/gvBocn7iTbdBzrkASDmX5OFCGqSzEh8F203nI\n\tHYSA==","X-Gm-Message-State":"AOJu0YxMxxQXqz+Ve2XJ1gaVZCDsy7rmwGo9Qx2aufyO6r8lgonttcgb\n\tob1i/r2OT5+iMvYlV535DIsEOe8lnWXwvpwVBfOFVp/OcnTSXwdjN93pBF/4hHcj6iZqV1VV0Vy\n\tFVZelQlR5uSMH/zVOLuuca3DaX6BKJxb/bjOGTQWHOkwmFqAXJ5jvHRotpQjCrZLrZ+kaLhU88m\n\t/+9tR8BR5A45pms9Tg8pwcoEaAaoVOcp2/ed0uFjgrVXABBg993kT0UDK7pIs=","X-Gm-Gg":"ASbGncuJgreCXlafYriJ03Ui0u8Lkm2H4vvtsacP6woeSdk71Ul7vNo8SqQurZ10zQs\n\tcsmAlwk599BMlfi+eehNgGd9tn33pHd6XBEXVv2W0MuqQK7JDCJqi/gmjfFkhPOPNzuxmB+n7We\n\ttsvX9t+VIXKSbkFkzVse0r36aNanI2IaK3AnHiLSOj2z0g1ruOBIADN9cGBaJdZSbKFxTzapxHa\n\t25SYHDlRDBshRpR948WkF4xEyyQeffnGIXADExhWGYbCedjNuex6s3T9EtAtlVxhBzmjV/qgdgp\n\tf73ms3sG9ASN0zTRXB5VtGA9Tl96d25XxJzJWyO0tCOQvYU=","X-Received":["by 2002:a05:6402:3553:b0:5e6:17e6:9510 with SMTP id\n\t4fb4d7f45d1cf-608d083447cmr12162476a12.6.1750163700463; \n\tTue, 17 Jun 2025 05:35:00 -0700 (PDT)","by 2002:a05:6402:3553:b0:5e6:17e6:9510 with SMTP id\n\t4fb4d7f45d1cf-608d083447cmr12162449a12.6.1750163699994; \n\tTue, 17 Jun 2025 05:34:59 -0700 (PDT)"],"X-Google-Smtp-Source":"AGHT+IF1TTK6wA3ylsRPSJlSNgwVJCK75cic1uHiecFIIlen/8llvchC1Dr42xxmOuibAAfLhIgMrg==","From":"Milan Zamazal <mzamazal@redhat.com>","To":"Bryan O'Donoghue <bryan.odonoghue@linaro.org>","Cc":"libcamera-devel@lists.libcamera.org","Subject":"Re: [PATCH 17/35] utils: gen-shader-headers: Add a utility to\n\tgenerate headers from shaders","In-Reply-To":"<20250611013245.133785-18-bryan.odonoghue@linaro.org> (Bryan\n\tO'Donoghue's message of \"Wed, 11 Jun 2025 02:32:27 +0100\")","References":"<20250611013245.133785-1-bryan.odonoghue@linaro.org>\n\t<20250611013245.133785-18-bryan.odonoghue@linaro.org>","Date":"Tue, 17 Jun 2025 14:34:58 +0200","Message-ID":"<85tt4ea6ml.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","User-Agent":"Gnus/5.13 (Gnus v5.13)","MIME-Version":"1.0","X-Mimecast-Spam-Score":"0","X-Mimecast-MFC-PROC-ID":"O6NB4lR3H0a702alVYrzcKS9WZeTJhWhfFK3of2gnw8_1750163701","X-Mimecast-Originator":"redhat.com","Content-Type":"text/plain","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>"}}]