[{"id":37181,"web_url":"https://patchwork.libcamera.org/comment/37181/","msgid":"<85ms3z4scy.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","date":"2025-12-03T13:17:33","subject":"Re: [PATCH v3 02/22] 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":"Bryan 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> Acked-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n> Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>\n\nReviewed-by: Milan Zamazal <mzamazal@redhat.com>\n\n> ---\n>  utils/gen-shader-header.py  | 37 +++++++++++++++++++++++++\n>  utils/gen-shader-headers.sh | 55 +++++++++++++++++++++++++++++++++++++\n>  2 files changed, 92 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 000000000..745852b4c\n> --- /dev/null\n> +++ b/utils/gen-shader-header.py\n> @@ -0,0 +1,37 @@\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 each of them\n> +# into a C header.\n> +#\n> +import sys\n> +\n> +try:\n> +    with open(sys.argv[2], \"rb\") 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 const\", name, \"[] = {\")\n> +        for ch in data:\n> +            print(f\"0x{ch:02x}, \", end=\"\")\n> +            j = (j + 1) % 16\n> +            if j == 0:\n> +                print()\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 000000000..81bf1584c\n> --- /dev/null\n> +++ b/utils/gen-shader-headers.sh\n> @@ -0,0 +1,55 @@\n> +#!/bin/sh\n> +\n> +set -e\n> +\n> +usage() {\n> +\techo \"Usage: $0 <src_dir> <build_dir> <output_header_name> <shader_file1> [shader_file2 ...]\"\n> +\techo\n> +\techo \"Generates a C header file containing hex-encoded shader data.\"\n> +\techo\n> +\techo \"Arguments:\"\n> +\techo \"  src_dir             Path to the base of the source directory\"\n> +\techo \"  build_dir           Directory where shader files are located and header will be written\"\n> +\techo \"  output_header_name  Name of the generated header file (relative to build_dir)\"\n> +\techo \"  shader_file(s)      One or more shader files to embed in the header\"\n> +\texit 1\n> +}\n> +\n> +if [ $# -lt 4 ]; then\n> +\techo \"Error: Invalid argument count.\"\n> +\tusage\n> +fi\n> +\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> +#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> +\tname=$(basename \"$build_dir/$file\" | tr '.' '_')\n> +\techo \"[SHADER-GEN] $name\"\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 6DB76BD80A\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed,  3 Dec 2025 13:17:42 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 55C6A60F1F;\n\tWed,  3 Dec 2025 14:17:41 +0100 (CET)","from us-smtp-delivery-124.mimecast.com\n\t(us-smtp-delivery-124.mimecast.com [170.10.129.124])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id BF45E609D8\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed,  3 Dec 2025 14:17:39 +0100 (CET)","from mail-wr1-f69.google.com (mail-wr1-f69.google.com\n\t[209.85.221.69]) by relay.mimecast.com with ESMTP with STARTTLS\n\t(version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n\tus-mta-587-dVbicA5pPv-rIVS919iLsA-1; Wed, 03 Dec 2025 08:17:37 -0500","by mail-wr1-f69.google.com with SMTP id\n\tffacd0b85a97d-42b2ffe9335so5269396f8f.1\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 03 Dec 2025 05:17:36 -0800 (PST)","from mzamazal-thinkpadp1gen7.tpbc.csb\n\t(ip-77-48-47-2.net.vodafone.cz. [77.48.47.2])\n\tby smtp.gmail.com with ESMTPSA id\n\tffacd0b85a97d-42e1c5d607csm39810529f8f.15.2025.12.03.05.17.34\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tWed, 03 Dec 2025 05:17:34 -0800 (PST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=redhat.com header.i=@redhat.com\n\theader.b=\"WxMWDQjX\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1764767858;\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=B4/+0eE2JA3iQX65D0H8G/u4JDDzVRSq2TRiiw0gSdw=;\n\tb=WxMWDQjXUGGqUY+3GD6WfXs/XlXYaab7F4r7g+IqhYlGPk5XyGN7vuSTeK3wQBYyEwew2C\n\tN1/0BUjirx3ZUBmy8fT8Z6r3RnZMa2cJjvMs2NddrUfweMIhg7otlEbzy47zF3iLyfaT8a\n\trMgSNAasd9F0hpY+fDQ8OJHoKGnBwRU=","X-MC-Unique":"dVbicA5pPv-rIVS919iLsA-1","X-Mimecast-MFC-AGG-ID":"dVbicA5pPv-rIVS919iLsA_1764767856","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1764767856; x=1765372656;\n\th=mime-version:user-agent:message-id:date:references:in-reply-to\n\t:subject:cc:to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject\n\t:date:message-id:reply-to;\n\tbh=B4/+0eE2JA3iQX65D0H8G/u4JDDzVRSq2TRiiw0gSdw=;\n\tb=Jn+79ReVGQsZ36AmfKT2WSKOKAIIHpO1uTiyIX7jMC0Y02zybemboAP425kMvAFnsv\n\t4nonxCmwae/k5b11Cc6E9W0wjR1rjTKnefZDzbcyRrPH04cet35MkSHdTctBdxD8oGCc\n\tqsUd3nHe+ODc10iKtQ88yy1evI6dE4Wu04SLW0T5PeYEU/a0ahVeolYQI1YRhtYP3IAX\n\tklkf+/QRHMJmhayhG8afE3APYDHoIIe1dgFa9THS+wkFVU66Iorvk2zWleet3F6DbHdz\n\tTqGVDcNUemV0YH4pI0sBw7AfLQbFkIvbyoJcX8P6HiHsmPvS/UXaJLeyp6HNiMD4TVOd\n\tReBQ==","X-Gm-Message-State":"AOJu0YzPO+lZcth36HJki1c+T1FsBuONe3+JMOBXhwDp9Vv/bs0Xz12H\n\tC54yc1CCPNE5i4Vk3NGMNVfSLr9JUqcu5TaWzO3ldByGr34LqSwFiNqiarYiKHnQvnlhyYOg0oq\n\tIT3vw4HV82IAuywaTcQJk81fv9xMkFop6InrSh8419Wr6nVecuooyBJOziqJWI4lnSG8WPNupHy\n\tY=","X-Gm-Gg":"ASbGncv5jsPXfoAwOaalVsuuC4duYqvLfL21YShER7O5xoH9ocQGMT5ZtrByD4L6d0d\n\t2dOeFYaKrk3uKlnhZ0T87rQ4XZiO02wsTeQzjCcSBvLcWmmr3B9gbh5Y35iLmYyCxXdAsInlcLP\n\tg33aEjA2RAw3NF+2O/Y04koaWqbk0Ddj8OrFBVtqE0GJ4LLD9N0XhiSQCjwmSC7FiaDdTjkkSmW\n\ttaPYdF+pFXQz4KmfJAp6aSFUK6Xvgp31Xu7ETVvHjTD4ZAfsuRVN9SsRGxzK6rMmb4ajm4WxZLN\n\tjkHEjaU9R3IqzhRM3oQr3BnaHhD9y1lPI0TxcCz2I+i0bWmR+hbapZUSfFEXWP+6pKvauHCR3Ub\n\tgdX7ONWxVbaKJDXYIki3ihiUua1vRT0FYy39GMXbZ3vgtPtpo45Lo8JKrGMg5WKI=","X-Received":["by 2002:a05:6000:1849:b0:42b:323b:f138 with SMTP id\n\tffacd0b85a97d-42f731c2b7dmr2404687f8f.41.1764767855894; \n\tWed, 03 Dec 2025 05:17:35 -0800 (PST)","by 2002:a05:6000:1849:b0:42b:323b:f138 with SMTP id\n\tffacd0b85a97d-42f731c2b7dmr2404649f8f.41.1764767855398; \n\tWed, 03 Dec 2025 05:17:35 -0800 (PST)"],"X-Google-Smtp-Source":"AGHT+IGeiYIt+0qiBbqRN/ptjZH6JnSsbNotjj9KNrUd94La/HWLbf/qKX3Vy4+OniH16xNOhuu+7w==","From":"Milan Zamazal <mzamazal@redhat.com>","To":"Bryan O'Donoghue <bryan.odonoghue@linaro.org>","Cc":"libcamera-devel@lists.libcamera.org,  pavel@ucw.cz,  Kieran Bingham\n\t<kieran.bingham@ideasonboard.com>","Subject":"Re: [PATCH v3 02/22] utils: gen-shader-headers: Add a utility to\n\tgenerate headers from shaders","In-Reply-To":"<20251202133157.661407-3-bryan.odonoghue@linaro.org> (Bryan\n\tO'Donoghue's message of \"Tue, 2 Dec 2025 13:31:33 +0000\")","References":"<20251202133157.661407-1-bryan.odonoghue@linaro.org>\n\t<20251202133157.661407-3-bryan.odonoghue@linaro.org>","Date":"Wed, 03 Dec 2025 14:17:33 +0100","Message-ID":"<85ms3z4scy.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":"c2ADnJNzn8MMUTWKdLL-7-fu3d5Gu8dDeT0OJEqJ9og_1764767856","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>"}}]