[v2,02/22] utils: gen-shader-headers: Add a utility to generate headers from shaders
diff mbox series

Message ID 20251127022256.178929-3-bryan.odonoghue@linaro.org
State New
Headers show
Series
  • GPUISP precursor series
Related show

Commit Message

Bryan O'Donoghue Nov. 27, 2025, 2:22 a.m. UTC
Two simple script to generate a header that contains GLSL shaders translated
to C arrays.

Acked-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
---
 utils/gen-shader-header.py  | 37 +++++++++++++++++++++++++
 utils/gen-shader-headers.sh | 55 +++++++++++++++++++++++++++++++++++++
 2 files changed, 92 insertions(+)
 create mode 100755 utils/gen-shader-header.py
 create mode 100755 utils/gen-shader-headers.sh

Patch
diff mbox series

diff --git a/utils/gen-shader-header.py b/utils/gen-shader-header.py
new file mode 100755
index 000000000..731a63b41
--- /dev/null
+++ b/utils/gen-shader-header.py
@@ -0,0 +1,37 @@ 
+#!/usr/bin/env python3
+# SPDX-License-Identifier: GPL-2.0-or-later
+# Copyright (C) 2025, Bryan O'Donoghue.
+#
+# Author: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
+#
+# A Python script which takes a list of shader files and converts each of them
+# 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) % 16
+            if j == 0:
+                print()
+        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 000000000..81bf1584c
--- /dev/null
+++ b/utils/gen-shader-headers.sh
@@ -0,0 +1,55 @@ 
+#!/bin/sh
+
+set -e
+
+usage() {
+	echo "Usage: $0 <src_dir> <build_dir> <output_header_name> <shader_file1> [shader_file2 ...]"
+	echo
+	echo "Generates a C header file containing hex-encoded shader data."
+	echo
+	echo "Arguments:"
+	echo "  src_dir             Path to the base of the source directory"
+	echo "  build_dir           Directory where shader files are located and header will be written"
+	echo "  output_header_name  Name of the generated header file (relative to build_dir)"
+	echo "  shader_file(s)      One or more shader files to embed in the header"
+	exit 1
+}
+
+if [ $# -lt 4 ]; then
+	echo "Error: Invalid argument count."
+	usage
+fi
+
+src_dir="$1"; shift
+build_dir="$1"; shift
+build_path=$build_dir/"$1"; shift
+
+cat <<EOF > "$build_path"
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/* This file is auto-generated, do not edit! */
+
+#pragma once
+
+EOF
+
+cat <<EOF >> "$build_path"
+/*
+ * List the names of the shaders at the top of
+ * header for readability's sake
+ *
+EOF
+
+for file in "$@"; do
+	name=$(basename "$build_dir/$file" | tr '.' '_')
+	echo "[SHADER-GEN] $name"
+	echo " * unsigned char $name;" >> "$build_path"
+done
+
+echo "*/" >> "$build_path"
+
+echo "/* Hex encoded shader data */" >> "$build_path"
+for file in "$@"; do
+	name=$(basename "$build_dir/$file")
+	"$src_dir/utils/gen-shader-header.py" "$name" "$build_dir/$file" >> "$build_path"
+	echo >> "$build_path"
+done