mirror of
https://github.com/gnif/LookingGlass.git
synced 2024-12-22 05:42:58 +00:00
[client] add gl-check script to check GL function calls
This prevents us from exceeding the minimum GL/EGL versions that we are targetting or forced to use indirection for due to lack of guarantee in the ABI.
This commit is contained in:
parent
6370350006
commit
e0c1394c33
1 changed files with 152 additions and 0 deletions
152
gl-check
Executable file
152
gl-check
Executable file
|
@ -0,0 +1,152 @@
|
||||||
|
#!/bin/bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
SCRIPT_DIR="$(cd -- "$(dirname "${BASH_SOURCE[0]}")" &> /dev/null && pwd)"
|
||||||
|
WAYLAND_SHELL="${WAYLAND_SHELL:-xdg-shell}"
|
||||||
|
CLANG_QUERY="${CLANG_QUERY:-clang-query}"
|
||||||
|
BUILD_DIR="${BUILD_DIR:-$SCRIPT_DIR/client/build}"
|
||||||
|
|
||||||
|
case "$WAYLAND_SHELL" in
|
||||||
|
xdg-shell) shell_ignore=shell_libdecor.c ;;
|
||||||
|
libdecor) shell_ignore=shell_xdg.c ;;
|
||||||
|
*)
|
||||||
|
echo "Unknown Wayland shell: $WAYLAND_SHELL"
|
||||||
|
exit 1
|
||||||
|
esac
|
||||||
|
|
||||||
|
if ! command -v "$CLANG_QUERY" &> /dev/null; then
|
||||||
|
echo "clang-query is not installed"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -f "$BUILD_DIR/compile_commands.json" ]; then
|
||||||
|
echo "compile_commands.json not found in $BUILD_DIR"
|
||||||
|
echo 'Run cmake with -DCMAKE_EXPORT_COMPILE_COMMANDS=ON to enable'
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
tempdir="$(mktemp -d)"
|
||||||
|
cleanup() {
|
||||||
|
rm -rf "$tempdir"
|
||||||
|
}
|
||||||
|
trap cleanup EXIT
|
||||||
|
|
||||||
|
sed '/EGL_VERSION_1_5/,$d' /usr/include/EGL/egl.h > "$tempdir/egl1.4.h"
|
||||||
|
|
||||||
|
getCalls() {
|
||||||
|
query="$1"
|
||||||
|
dir="$2"
|
||||||
|
|
||||||
|
command=(find "$dir" -name '*.c')
|
||||||
|
if [ $# -gt 2 ]; then
|
||||||
|
command+=(-not)
|
||||||
|
shift 2
|
||||||
|
for exclude in "$@"; do
|
||||||
|
command+=(-name "$exclude")
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
cat > "$tempdir/query" <<EOF
|
||||||
|
set output print
|
||||||
|
set bind-root false
|
||||||
|
m callExpr(callee(functionDecl(matchesName("::$query")).bind("func")))
|
||||||
|
EOF
|
||||||
|
|
||||||
|
"${command[@]}" -exec "$CLANG_QUERY" -p "$BUILD_DIR/compile_commands.json" -f "$tempdir/query" {} + | \
|
||||||
|
grep -Po "(?<= )\b$query(?=\()" | sort -u
|
||||||
|
}
|
||||||
|
|
||||||
|
checkCalls() {
|
||||||
|
name="$1"
|
||||||
|
file="$2"
|
||||||
|
standard="$3"
|
||||||
|
while read -r func; do
|
||||||
|
if ! grep -q "$func" "$file"; then
|
||||||
|
echo "Found $func in $name, which is not in $standard"
|
||||||
|
fails=$((fails+1))
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
getGLCalls() {
|
||||||
|
getCalls 'gl[A-WYZ]\w*' "$@"
|
||||||
|
}
|
||||||
|
|
||||||
|
getEGLCalls() {
|
||||||
|
getCalls 'egl[A-Z]\w*' "$@"
|
||||||
|
}
|
||||||
|
|
||||||
|
getGLXCalls() {
|
||||||
|
getCalls 'glX\w+' "$@"
|
||||||
|
}
|
||||||
|
|
||||||
|
checkGLESCalls() {
|
||||||
|
name="$1"
|
||||||
|
shift
|
||||||
|
checkCalls "$name" /usr/include/GLES3/gl3.h 'OpenGL ES 3.0' < <(getGLCalls "$@")
|
||||||
|
}
|
||||||
|
|
||||||
|
checkEGLCalls() {
|
||||||
|
name="$1"
|
||||||
|
shift
|
||||||
|
checkCalls "$name" "$tempdir/egl1.4.h" 'EGL 1.4' < <(getEGLCalls "$@")
|
||||||
|
}
|
||||||
|
|
||||||
|
checkGLCalls() {
|
||||||
|
name="$1"
|
||||||
|
shift
|
||||||
|
checkCalls "$name" /usr/include/GL/gl.h 'OpenGL 1.3' < <(getGLCalls "$@")
|
||||||
|
}
|
||||||
|
|
||||||
|
checkGLXCalls() {
|
||||||
|
name="$1"
|
||||||
|
shift
|
||||||
|
checkCalls "$name" /usr/include/GL/glx.h 'GLX 1.3' < <(getGLXCalls "$@")
|
||||||
|
}
|
||||||
|
|
||||||
|
forbidCalls() {
|
||||||
|
name="$1"
|
||||||
|
while read -r func; do
|
||||||
|
echo "Found $func in $name, which is forbidden"
|
||||||
|
fails=$((fails+1))
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
forbidEGLCalls() {
|
||||||
|
name="$1"
|
||||||
|
shift
|
||||||
|
forbidCalls "$name" < <(getEGLCalls "$@")
|
||||||
|
}
|
||||||
|
|
||||||
|
forbidGLXCalls() {
|
||||||
|
name="$1"
|
||||||
|
shift
|
||||||
|
forbidCalls "$name" < <(getGLXCalls "$@")
|
||||||
|
}
|
||||||
|
|
||||||
|
forbidGLCalls() {
|
||||||
|
name="$1"
|
||||||
|
shift
|
||||||
|
forbidCalls "$name" < <(getGLCalls "$@")
|
||||||
|
}
|
||||||
|
|
||||||
|
fails=0
|
||||||
|
|
||||||
|
checkGLESCalls 'EGL backend' client/renderers/EGL
|
||||||
|
checkEGLCalls 'EGL backend' client/renderers/EGL
|
||||||
|
forbidGLXCalls 'EGL backend' client/renderers/EGL
|
||||||
|
checkGLCalls 'OpenGL backend' client/renderers/OpenGL
|
||||||
|
forbidGLXCalls 'OpenGL backend' client/renderers/OpenGL
|
||||||
|
|
||||||
|
checkGLXCalls 'X11 display server' client/displayservers/X11
|
||||||
|
forbidGLCalls 'X11 display server' client/displayservers/X11
|
||||||
|
checkEGLCalls 'Wayland display server' client/displayservers/Wayland "$shell_ignore"
|
||||||
|
forbidGLCalls 'Wayland display server' client/displayservers/Wayland "$shell_ignore"
|
||||||
|
forbidGLXCalls 'Wayland display server' client/displayservers/Wayland "$shell_ignore"
|
||||||
|
|
||||||
|
if [ "$fails" -eq 0 ]; then
|
||||||
|
echo 'All GL function calls look fine.'
|
||||||
|
else
|
||||||
|
echo 'Use indirection for the listed GL function calls.'
|
||||||
|
exit 1
|
||||||
|
fi
|
Loading…
Reference in a new issue