[PATCH 25/27] utils: gen-shader-headers: Add a utility to generate headers from shaders
Bryan O'Donoghue
bryan.odonoghue at linaro.org
Tue Apr 22 23:59:18 CEST 2025
Two simple script to generate a header that contains GLSL shaders translated
to C arrays.
Signed-off-by: Bryan O'Donoghue <bryan.odonoghue at linaro.org>
---
utils/gen-shader-header.py | 38 ++++++++++++++++++++++++++++++++++
utils/gen-shader-headers.sh | 41 +++++++++++++++++++++++++++++++++++++
2 files changed, 79 insertions(+)
create mode 100755 utils/gen-shader-header.py
create mode 100755 utils/gen-shader-headers.sh
diff --git a/utils/gen-shader-header.py b/utils/gen-shader-header.py
new file mode 100755
index 00000000..a6799857
--- /dev/null
+++ b/utils/gen-shader-header.py
@@ -0,0 +1,38 @@
+#!/usr/bin/env python3
+# SPDX-License-Identifier: GPL-2.0-or-later
+# Copyright (C) 2025, Bryan O'Donoghue.
+#
+# Author: Bryan O'Donoghue <bryan.odonoghue at linaro.org>
+#
+# A python script which takes a list of shader files and converts into a C
+# header.
+#
+import sys
+
+try:
+ with open(sys.argv[2]) as file:
+ data = file.read()
+ data_len = len(data)
+
+ name = sys.argv[1].replace(".", "_")
+ name_len = name + "_len"
+
+ j = 0
+ print ("unsigned char", name, "[] = {")
+ for ch in data:
+ print(f"0x{ord(ch):02x}, ", end="")
+ j = j + 1
+ if j == 16:
+ print()
+ j = 0
+ if j != 0:
+ print()
+ print ("};")
+
+ print()
+ print(f"const unsigned int {name_len}={data_len};")
+
+except FileNotFoundError:
+ print(f"File {sys.argv[2]} not found", file=sys.stderr)
+except IOError:
+ print(f"Unable to read {sys.argv[2]}", file=sys.stderr)
diff --git a/utils/gen-shader-headers.sh b/utils/gen-shader-headers.sh
new file mode 100755
index 00000000..e1742165
--- /dev/null
+++ b/utils/gen-shader-headers.sh
@@ -0,0 +1,41 @@
+#!/bin/sh
+
+if [ $# -lt 4 ]; then
+ echo "Invalid arg count must be >= 5"
+ exit 1
+fi
+src_dir="$1"; shift
+dst_dir="$1"; shift
+dst_path=$dst_dir/"$1"; shift
+
+cat <<EOF > "$dst_path"
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/* This file is auto-generated, do not edit! */
+/*
+ * Copyright (C) 2024, Linaro Ltd.
+ *
+ */
+
+#pragma once
+
+EOF
+
+cat <<EOF >> "$dst_path"
+/*
+ * List the names of the shaders at the top of
+ * header for readability's sake
+ *
+EOF
+for file in $@; do
+ name=`basename $src_dir/src/$file | tr '.' '_'`
+ echo " * unsigned char $name;" >> $dst_path
+done
+
+echo "*/" >> $dst_path
+
+echo "/* Hex encoded shader data */" >> $dst_path
+for file in $@; do
+ name=`basename $src_dir/src/$file`
+ $src_dir/utils/gen-shader-header.py $name $src_dir/src/$file >> $dst_path
+ echo >> $dst_path
+done
--
2.49.0
More information about the libcamera-devel
mailing list