wlroots/glgen.sh

98 lines
1.8 KiB
Bash
Raw Normal View History

2017-10-08 00:19:25 +00:00
#!/bin/sh
# Generates a simple GL/EGL extension function loader.
#
# The input is a .txt file, with each function to load on its own line.
# If a line starts with a -, it is optional, and will not cause the loader
# to fail if it can't load the function. You'll need to check if that function
# is NULL before using it.
if [ $# -ne 2 ]; then
2017-10-08 00:19:25 +00:00
exit 1
fi
SPEC=$1
OUTDIR=$2
2017-10-08 00:19:25 +00:00
BASE=$(basename "$SPEC" .txt)
INCLUDE_GUARD=$(printf %s_%s_H "$OUTDIR" "$BASE" | tr -c [:alnum:] _ | tr [:lower:] [:upper:])
2017-10-08 00:19:25 +00:00
DECL=""
DEFN=""
LOADER=""
DECL_FMT='extern %s %s;'
DEFN_FMT='%s %s;'
LOADER_FMT='%s = (%s)eglGetProcAddress("%s");'
CHECK_FMT='if (!%s) {
2018-07-09 21:49:54 +00:00
wlr_log(WLR_ERROR, "Unable to load %s");
2017-10-08 00:19:25 +00:00
return false;
}'
while read -r COMMAND; do
2017-10-08 23:02:41 +00:00
OPTIONAL=0
FUNC_PTR_FMT='PFN%sPROC'
2017-10-08 00:19:25 +00:00
2017-10-08 23:02:41 +00:00
case $COMMAND in
-*)
OPTIONAL=1
;;
esac
case $COMMAND in
*WL)
2017-10-08 00:19:25 +00:00
FUNC_PTR_FMT='PFN%s'
2017-10-08 23:02:41 +00:00
;;
esac
2017-10-08 00:19:25 +00:00
2017-10-08 23:02:41 +00:00
COMMAND=${COMMAND#-}
2017-10-08 00:19:25 +00:00
FUNC_PTR=$(printf "$FUNC_PTR_FMT" "$COMMAND" | tr [:lower:] [:upper:])
DECL="$DECL$(printf "\n$DECL_FMT" "$FUNC_PTR" "$COMMAND")"
DEFN="$DEFN$(printf "\n$DEFN_FMT" "$FUNC_PTR" "$COMMAND")"
LOADER="$LOADER$(printf "\n$LOADER_FMT" "$COMMAND" "$FUNC_PTR" "$COMMAND")"
2017-10-08 23:02:41 +00:00
if [ $OPTIONAL -eq 0 ]; then
2017-10-08 00:19:25 +00:00
LOADER="$LOADER$(printf "\n$CHECK_FMT" "$COMMAND" "$COMMAND")"
fi
done < "$SPEC"
2017-10-08 00:19:25 +00:00
cat > "$OUTDIR/$BASE.h" << EOF
2017-11-22 01:04:29 +00:00
#ifndef $INCLUDE_GUARD
#define $INCLUDE_GUARD
2017-10-08 23:02:41 +00:00
2017-11-22 01:04:29 +00:00
#include <stdbool.h>
#include <wlr/config.h>
#if !WLR_HAS_X11_BACKEND && !WLR_HAS_XWAYLAND && !defined MESA_EGL_NO_X11_HEADERS
#define MESA_EGL_NO_X11_HEADERS
#endif
2017-10-08 00:19:25 +00:00
2017-11-22 01:04:29 +00:00
#include <EGL/egl.h>
#include <EGL/eglext.h>
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
2017-10-08 00:19:25 +00:00
2017-11-22 01:04:29 +00:00
bool load_$BASE(void);
$DECL
2017-10-08 00:19:25 +00:00
2017-11-22 01:04:29 +00:00
#endif
2017-10-08 00:19:25 +00:00
EOF
2017-11-22 01:04:29 +00:00
cat > "$OUTDIR/$BASE.c" << EOF
2017-11-22 01:04:29 +00:00
#include <wlr/util/log.h>
#include "$BASE.h"
2017-11-22 01:04:29 +00:00
$DEFN
bool load_$BASE(void) {
static bool done = false;
if (done) {
return true;
}
$LOADER
done = true;
return true;
}
2017-10-08 00:19:25 +00:00
EOF