From 64133e4d23f6199070b64d8b7b0ae453a39ca30a Mon Sep 17 00:00:00 2001 From: Tue Ton <49886739+chirontt@users.noreply.github.com> Date: Mon, 15 Mar 2021 20:02:12 -0400 Subject: [PATCH 01/11] compile BGFX demos to native executable - compile against LWJGL 3.2.3 version - restrict to the four BGFX demos (code & resources) - add Gradle wrapper & build script - use GraalVM native-image utility to produce native executable containing the four BGFX demos --- .gitignore | 1 + build.gradle | 109 +++++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes gradle/wrapper/gradle-wrapper.properties | 5 + gradlew | 185 ++++++++ gradlew.bat | 89 ++++ pom.xml | 204 +++------ res/META-INF/native-image/jni-config.json | 49 +++ res/META-INF/native-image/proxy-config.json | 2 + res/META-INF/native-image/reflect-config.json | 410 ++++++++++++++++++ .../native-image/resource-config.json | 37 ++ .../native-image/serialization-config.json | 2 + settings.gradle | 10 + src/org/lwjgl/demo/DemoLauncher.java | 23 + src/org/lwjgl/demo/bgfx/Bump.java | 8 +- src/org/lwjgl/demo/bgfx/Cubes.java | 4 +- src/org/lwjgl/demo/bgfx/Metaballs.java | 4 +- src/org/lwjgl/demo/bgfx/Raymarch.java | 4 +- src/org/lwjgl/graalvm/LwjglSubstitutions.java | 60 +++ 19 files changed, 1063 insertions(+), 143 deletions(-) create mode 100644 build.gradle create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 res/META-INF/native-image/jni-config.json create mode 100644 res/META-INF/native-image/proxy-config.json create mode 100644 res/META-INF/native-image/reflect-config.json create mode 100644 res/META-INF/native-image/resource-config.json create mode 100644 res/META-INF/native-image/serialization-config.json create mode 100644 settings.gradle create mode 100644 src/org/lwjgl/demo/DemoLauncher.java create mode 100644 src/org/lwjgl/graalvm/LwjglSubstitutions.java diff --git a/.gitignore b/.gitignore index 97d03479..870a1fbc 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ /.project /*.iml /dependency-reduced-pom.xml +.gradle diff --git a/build.gradle b/build.gradle new file mode 100644 index 00000000..74304313 --- /dev/null +++ b/build.gradle @@ -0,0 +1,109 @@ +plugins { + id 'application' + id 'com.gluonhq.client-gradle-plugin' version '0.1.36' //requires GraalVM 21+ +} + +wrapper { + gradleVersion = '6.8.3' + distributionType = Wrapper.DistributionType.ALL +} + +group = 'org.lwjgl' +description = 'LWJGL3 BGFX demos with native image by GraalVM' +//version = '0.0.1-SNAPSHOT' + +ext { + lwjglVersion = '3.2.3' + jomlVersion = '1.10.1' + graalvmVersion = '21.0.0.2' + + //LWJGL modules used: minimal OpenGL (minus openal), plus bgfx + lwjglModules = ['lwjgl', 'lwjgl-assimp', 'lwjgl-bgfx', 'lwjgl-glfw', 'lwjgl-opengl', 'lwjgl-stb'] + + mainClassName = 'org.lwjgl.demo.DemoLauncher' +} + +repositories { + mavenCentral() + mavenLocal() +} + +//detect the OS (assuming 64-bit, on Intel/AMD hardware) +private static String getCurrentPlatform() { + def currentOS = org.gradle.nativeplatform.platform.internal.DefaultNativePlatform.currentOperatingSystem; + if (currentOS.isWindows()) { + return 'windows' + } else if (currentOS.isLinux()) { + return 'linux' + } else if (currentOS.isMacOsX()) { + return 'macos' + } + return null +} + +dependencies { + //get recommended dependency versions from the LWJGL BOM + implementation platform("org.lwjgl:lwjgl-bom:$lwjglVersion") + + implementation "org.joml:joml:$jomlVersion" + + def currentOS = getCurrentPlatform() + + //add LWJGL modules and the current OS's natives to the compile and runtime classpaths + lwjglModules.each { + implementation "org.lwjgl:$it" + if (it != 'lwjgl-egl') { //lwjgl-egl has no native libraries + //use natives for 64-bit Intel/AMD platforms only + runtimeOnly "org.lwjgl:$it::natives-$currentOS" + } + } + + //for compiling GraalVM substitution classes + compileOnly "org.graalvm.nativeimage:svm:$graalvmVersion" +} + +sourceSets { + main { + java { + srcDirs = ['src'] + //restrict to bgfx demo source code & GraalVM substitution code + include '**/DemoLauncher.java', '**/bgfx/*', '**/graalvm/*' + } + resources { + srcDirs = ['res'] + //restrict to bgfx demo resources only + include 'org/lwjgl/demo/bgfx/**' + //include the GraalVM native-image configuration files + include 'META-INF/native-image/**' + } + } +} + +application { + mainClass = project.mainClassName + applicationName = project.name //name of the resulting native executable +} + +compileJava { + options.release = 11 //use JDK11+ for compiling & running + options.encoding = 'UTF-8' +} + +jar.archiveBaseName = 'lwjgl3-bgfx-demos' + +run { + //use the following jvmArgs for as many different run scenarios as possible, + //and for all the code-execution paths as much as possible, + //to generate (or merge with) the GraalVM native-image configuration files + //in the res/META-INF/native-image directory. + //This directory is read by GraalVM during the native-image build. + + //jvmArgs = ["-agentlib:native-image-agent=config-merge-dir=res/META-INF/native-image"] +} + +gluonClient { + compilerArgs = [ + '--initialize-at-run-time=org.lwjgl', + '--report-unsupported-elements-at-runtime', + ] +} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..e708b1c023ec8b20f512888fe07c5bd3ff77bb8f GIT binary patch literal 59203 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

K7UpUK$>l@ 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 E2O(~oYXATM literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..8cf6eb5a --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.3-all.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100755 index 00000000..4f906e0c --- /dev/null +++ b/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 00000000..107acd32 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/pom.xml b/pom.xml index 84977ce0..c7f6fc7f 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 org.lwjgl - lwjgl3-demos + lwjgl3-bgfx-demos 0.0.1-SNAPSHOT UTF-8 @@ -11,13 +11,18 @@ 1.8 3.8.1 3.2.1 - 3.2.4-SNAPSHOT + 3.2.3 4.6.1 - 1.9.26-SNAPSHOT - - game.VoxelGameGL + 1.10.1 + 0.1.36 + 21.0.0.2 + org.lwjgl.demo.DemoLauncher + + bgfx.Bump + lwjgl3-bgfx-demos + LWJGL3 BGFX demos with native image by GraalVM windows @@ -38,13 +43,6 @@ x86 - - - org.eclipse.swt - org.eclipse.swt.win32.win32.x86 - ${swt.version} - - windows-amd64 @@ -54,13 +52,6 @@ amd64 - - - org.eclipse.swt - org.eclipse.swt.win32.win32.x86_64 - ${swt.version} - - linux @@ -81,13 +72,6 @@ x86 - - - org.eclipse.swt - org.eclipse.swt.gtk.linux.x86 - ${swt.version} - - linux-amd64 @@ -97,13 +81,6 @@ amd64 - - - org.eclipse.swt - org.eclipse.swt.gtk.linux.x86_64 - ${swt.version} - - mac @@ -115,19 +92,6 @@ macos - - - org.eclipse.swt - org.eclipse.swt.cocoa.macosx.x86_64 - ${swt.version} - - - org.lwjgl - lwjgl-vulkan - ${lwjgl.version} - natives-macos - - @@ -135,178 +99,152 @@ res + + + org/lwjgl/demo/bgfx/**/* + + META-INF/native-image/* + maven-compiler-plugin ${maven-compiler-plugin.version} + + + + org/lwjgl/demo/DemoLauncher.java + org/lwjgl/graalvm/*.java + + org/lwjgl/demo/bgfx/*.java + + - maven-shade-plugin - ${maven-shade-plugin.version} + org.codehaus.mojo + exec-maven-plugin + 3.0.0 - package - shade + exec - - - - org.lwjgl.demo.${class} - - - lwjgl3-demos - + + java + + + + -classpath + + ${exec.mainClass} + ${class} + + + + + com.gluonhq + client-maven-plugin + ${client-maven-plugin.version} + + ${exec.mainClass} + + --initialize-at-run-time=org.lwjgl + + oss.sonatype.org - https://oss.sonatype.org/content/repositories/snapshots/ - - true - + https://oss.sonatype.org/content/repositories/ swt-repo http://maven-eclipse.github.io/maven + + + + + org.lwjgl + lwjgl-bom + ${lwjgl.version} + import + pom + + + org.joml joml ${joml.version} + - org.joml - joml-primitives - ${joml.version} + org.graalvm.nativeimage + svm + ${graalvm.version} + provided + org.lwjgl lwjgl - ${lwjgl.version} - - - org.lwjgl - lwjgl-vulkan - ${lwjgl.version} org.lwjgl lwjgl-glfw - ${lwjgl.version} org.lwjgl lwjgl-opengl - ${lwjgl.version} - - - org.lwjgl - lwjgl-par - ${lwjgl.version} org.lwjgl lwjgl-stb - ${lwjgl.version} org.lwjgl lwjgl-bgfx - ${lwjgl.version} org.lwjgl lwjgl-assimp - ${lwjgl.version} org.lwjgl lwjgl - ${lwjgl.version} natives-${platform} org.lwjgl lwjgl-opengl - ${lwjgl.version} natives-${platform} - - org.lwjgl - lwjgl-cuda - ${lwjgl.version} - - - org.lwjgl - lwjgl-jemalloc - ${lwjgl.version} - - - org.lwjgl - lwjgl-shaderc - ${lwjgl.version} - - - org.lwjgl - lwjgl-vma - ${lwjgl.version} - org.lwjgl lwjgl-glfw - ${lwjgl.version} natives-${platform} org.lwjgl lwjgl-stb - ${lwjgl.version} - natives-${platform} - - - org.lwjgl - lwjgl-par - ${lwjgl.version} natives-${platform} org.lwjgl lwjgl-bgfx - ${lwjgl.version} - natives-${platform} - - - org.lwjgl - lwjgl-vma - ${lwjgl.version} natives-${platform} org.lwjgl lwjgl-assimp - ${lwjgl.version} - natives-${platform} - - - org.lwjgl - lwjgl-shaderc - ${lwjgl.version} - natives-${platform} - - - org.lwjgl - lwjgl-jemalloc - ${lwjgl.version} natives-${platform} diff --git a/res/META-INF/native-image/jni-config.json b/res/META-INF/native-image/jni-config.json new file mode 100644 index 00000000..8d4de800 --- /dev/null +++ b/res/META-INF/native-image/jni-config.json @@ -0,0 +1,49 @@ +[ +{ + "name":"java.lang.ClassLoader", + "methods":[{"name":"getPlatformClassLoader","parameterTypes":[] }] +}, +{ + "name":"java.lang.NoSuchMethodError" +}, +{ + "name":"org.lwjgl.system.CallbackI$B", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$D", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$F", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$I", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$J", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$N", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$P", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$S", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$V", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$Z", + "methods":[{"name":"callback","parameterTypes":["long"] }] +} +] diff --git a/res/META-INF/native-image/proxy-config.json b/res/META-INF/native-image/proxy-config.json new file mode 100644 index 00000000..0d4f101c --- /dev/null +++ b/res/META-INF/native-image/proxy-config.json @@ -0,0 +1,2 @@ +[ +] diff --git a/res/META-INF/native-image/reflect-config.json b/res/META-INF/native-image/reflect-config.json new file mode 100644 index 00000000..740fa654 --- /dev/null +++ b/res/META-INF/native-image/reflect-config.json @@ -0,0 +1,410 @@ +[ +{ + "name":"float[]" +}, +{ + "name":"java.lang.Double", + "methods":[{"name":"doubleToRawLongBits","parameterTypes":["double"] }] +}, +{ + "name":"java.lang.Float", + "methods":[{"name":"floatToRawIntBits","parameterTypes":["float"] }] +}, +{ + "name":"java.lang.Long", + "methods":[{"name":"rotateLeft","parameterTypes":["long","int"] }] +}, +{ + "name":"java.lang.Object" +}, +{ + "name":"java.nio.Buffer", + "fields":[{"name":"address", "allowUnsafeAccess":true}] +}, +{ + "name":"org.joml.Matrix2f", + "fields":[ + {"name":"m00", "allowUnsafeAccess":true}, + {"name":"m01", "allowUnsafeAccess":true}, + {"name":"m10", "allowUnsafeAccess":true}, + {"name":"m11", "allowUnsafeAccess":true} + ] +}, +{ + "name":"org.joml.Matrix3d", + "fields":[ + {"name":"m00", "allowUnsafeAccess":true}, + {"name":"m01", "allowUnsafeAccess":true}, + {"name":"m02", "allowUnsafeAccess":true}, + {"name":"m10", "allowUnsafeAccess":true}, + {"name":"m11", "allowUnsafeAccess":true}, + {"name":"m12", "allowUnsafeAccess":true}, + {"name":"m20", "allowUnsafeAccess":true}, + {"name":"m21", "allowUnsafeAccess":true}, + {"name":"m22", "allowUnsafeAccess":true} + ] +}, +{ + "name":"org.joml.Matrix3f", + "fields":[ + {"name":"m00", "allowUnsafeAccess":true}, + {"name":"m01", "allowUnsafeAccess":true}, + {"name":"m02", "allowUnsafeAccess":true}, + {"name":"m10", "allowUnsafeAccess":true}, + {"name":"m11", "allowUnsafeAccess":true}, + {"name":"m12", "allowUnsafeAccess":true}, + {"name":"m20", "allowUnsafeAccess":true}, + {"name":"m21", "allowUnsafeAccess":true}, + {"name":"m22", "allowUnsafeAccess":true} + ] +}, +{ + "name":"org.joml.Matrix3x2f", + "fields":[ + {"name":"m00", "allowUnsafeAccess":true}, + {"name":"m01", "allowUnsafeAccess":true}, + {"name":"m10", "allowUnsafeAccess":true}, + {"name":"m11", "allowUnsafeAccess":true}, + {"name":"m20", "allowUnsafeAccess":true}, + {"name":"m21", "allowUnsafeAccess":true} + ] +}, +{ + "name":"org.joml.Matrix4d", + "fields":[ + {"name":"m00", "allowUnsafeAccess":true}, + {"name":"m01", "allowUnsafeAccess":true}, + {"name":"m02", "allowUnsafeAccess":true}, + {"name":"m03", "allowUnsafeAccess":true}, + {"name":"m10", "allowUnsafeAccess":true}, + {"name":"m11", "allowUnsafeAccess":true}, + {"name":"m12", "allowUnsafeAccess":true}, + {"name":"m13", "allowUnsafeAccess":true}, + {"name":"m20", "allowUnsafeAccess":true}, + {"name":"m21", "allowUnsafeAccess":true}, + {"name":"m22", "allowUnsafeAccess":true}, + {"name":"m23", "allowUnsafeAccess":true}, + {"name":"m30", "allowUnsafeAccess":true}, + {"name":"m31", "allowUnsafeAccess":true}, + {"name":"m32", "allowUnsafeAccess":true}, + {"name":"m33", "allowUnsafeAccess":true} + ] +}, +{ + "name":"org.joml.Matrix4f", + "fields":[ + {"name":"m00", "allowUnsafeAccess":true}, + {"name":"m01", "allowUnsafeAccess":true}, + {"name":"m02", "allowUnsafeAccess":true}, + {"name":"m03", "allowUnsafeAccess":true}, + {"name":"m10", "allowUnsafeAccess":true}, + {"name":"m11", "allowUnsafeAccess":true}, + {"name":"m12", "allowUnsafeAccess":true}, + {"name":"m13", "allowUnsafeAccess":true}, + {"name":"m20", "allowUnsafeAccess":true}, + {"name":"m21", "allowUnsafeAccess":true}, + {"name":"m22", "allowUnsafeAccess":true}, + {"name":"m23", "allowUnsafeAccess":true}, + {"name":"m30", "allowUnsafeAccess":true}, + {"name":"m31", "allowUnsafeAccess":true}, + {"name":"m32", "allowUnsafeAccess":true}, + {"name":"m33", "allowUnsafeAccess":true} + ] +}, +{ + "name":"org.joml.Matrix4x3f", + "fields":[ + {"name":"m00", "allowUnsafeAccess":true}, + {"name":"m01", "allowUnsafeAccess":true}, + {"name":"m02", "allowUnsafeAccess":true}, + {"name":"m10", "allowUnsafeAccess":true}, + {"name":"m11", "allowUnsafeAccess":true}, + {"name":"m12", "allowUnsafeAccess":true}, + {"name":"m20", "allowUnsafeAccess":true}, + {"name":"m21", "allowUnsafeAccess":true}, + {"name":"m22", "allowUnsafeAccess":true}, + {"name":"m30", "allowUnsafeAccess":true}, + {"name":"m31", "allowUnsafeAccess":true}, + {"name":"m32", "allowUnsafeAccess":true} + ] +}, +{ + "name":"org.joml.Quaternionf", + "fields":[ + {"name":"w", "allowUnsafeAccess":true}, + {"name":"x", "allowUnsafeAccess":true}, + {"name":"y", "allowUnsafeAccess":true}, + {"name":"z", "allowUnsafeAccess":true} + ] +}, +{ + "name":"org.joml.Vector2f", + "fields":[ + {"name":"x", "allowUnsafeAccess":true}, + {"name":"y", "allowUnsafeAccess":true} + ] +}, +{ + "name":"org.joml.Vector2i", + "fields":[ + {"name":"x", "allowUnsafeAccess":true}, + {"name":"y", "allowUnsafeAccess":true} + ] +}, +{ + "name":"org.joml.Vector3f", + "fields":[ + {"name":"x", "allowUnsafeAccess":true}, + {"name":"y", "allowUnsafeAccess":true}, + {"name":"z", "allowUnsafeAccess":true} + ] +}, +{ + "name":"org.joml.Vector3i", + "fields":[ + {"name":"x", "allowUnsafeAccess":true}, + {"name":"y", "allowUnsafeAccess":true}, + {"name":"z", "allowUnsafeAccess":true} + ] +}, +{ + "name":"org.joml.Vector4f", + "fields":[ + {"name":"w", "allowUnsafeAccess":true}, + {"name":"x", "allowUnsafeAccess":true}, + {"name":"y", "allowUnsafeAccess":true}, + {"name":"z", "allowUnsafeAccess":true} + ] +}, +{ + "name":"org.joml.Vector4i", + "fields":[ + {"name":"w", "allowUnsafeAccess":true}, + {"name":"x", "allowUnsafeAccess":true}, + {"name":"y", "allowUnsafeAccess":true}, + {"name":"z", "allowUnsafeAccess":true} + ] +}, +{ + "name":"org.lwjgl.PointerBuffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.bgfx.BGFXCaps", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.bgfx.BGFXInit", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.bgfx.BGFXInstanceDataBuffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.bgfx.BGFXMemory", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.bgfx.BGFXPlatformData", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.bgfx.BGFXResolution", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.bgfx.BGFXTransientIndexBuffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.bgfx.BGFXTransientVertexBuffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.bgfx.BGFXVertexLayout", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.demo.bgfx.Bump", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.bgfx.Cubes", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.bgfx.Metaballs", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.bgfx.Raymarch", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.glfw.GLFW", + "allDeclaredFields":true +}, +{ + "name":"org.lwjgl.glfw.GLFWVidMode", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.opengl.GLCapabilities", + "allPublicFields":true +}, +{ + "name":"org.lwjgl.system.APIUtil", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.system.CallbackI$B", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$D", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$F", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$I", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$J", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$N", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$P", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$S", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$V", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$Z", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CustomBuffer", + "fields":[ + {"name":"capacity", "allowUnsafeAccess":true}, + {"name":"container", "allowUnsafeAccess":true}, + {"name":"limit", "allowUnsafeAccess":true}, + {"name":"mark", "allowUnsafeAccess":true}, + {"name":"position", "allowUnsafeAccess":true} + ] +}, +{ + "name":"org.lwjgl.system.Pointer$Default", + "fields":[{"name":"address", "allowUnsafeAccess":true}] +}, +{ + "name":"org.lwjgl.system.Struct", + "fields":[{"name":"container", "allowUnsafeAccess":true}] +}, +{ + "name":"sun.misc.Unsafe", + "allDeclaredFields":true, + "methods":[ + {"name":"getLong","parameterTypes":["java.lang.Object","long"] }, + {"name":"putLong","parameterTypes":["java.lang.Object","long","long"] } + ] +} +] diff --git a/res/META-INF/native-image/resource-config.json b/res/META-INF/native-image/resource-config.json new file mode 100644 index 00000000..14b30bb0 --- /dev/null +++ b/res/META-INF/native-image/resource-config.json @@ -0,0 +1,37 @@ +{ + "resources":{ + "includes":[ + {"pattern":"\\Qlinux/x64/org/lwjgl/assimp/libassimp.so\\E"}, + {"pattern":"\\Qlinux/x64/org/lwjgl/bgfx/libbgfx.so\\E"}, + {"pattern":"\\Qlinux/x64/org/lwjgl/glfw/libglfw.so\\E"}, + {"pattern":"\\Qlinux/x64/org/lwjgl/glfw/libglfw_wayland.so\\E"}, + {"pattern":"\\Qlinux/x64/org/lwjgl/liblwjgl.so\\E"}, + {"pattern":"\\Qlinux/x64/org/lwjgl/openal/libopenal.so\\E"}, + {"pattern":"\\Qlinux/x64/org/lwjgl/opengl/liblwjgl_opengl.so\\E"}, + {"pattern":"\\Qlinux/x64/org/lwjgl/stb/liblwjgl_stb.so\\E"}, + {"pattern":"\\Qmacos/x64/org/lwjgl/assimp/libassimp.dylib\\E"}, + {"pattern":"\\Qmacos/x64/org/lwjgl/bgfx/libbgfx.dylib\\E"}, + {"pattern":"\\Qmacos/x64/org/lwjgl/glfw/libglfw.dylib\\E"}, + {"pattern":"\\Qmacos/x64/org/lwjgl/liblwjgl.dylib\\E"}, + {"pattern":"\\Qmacos/x64/org/lwjgl/openal/libopenal.dylib\\E"}, + {"pattern":"\\Qmacos/x64/org/lwjgl/opengl/liblwjgl_opengl.dylib\\E"}, + {"pattern":"\\Qmacos/x64/org/lwjgl/stb/liblwjgl_stb.dylib\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/bgfx/shaders/dx11/fs_bump.bin\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/bgfx/shaders/dx11/fs_cubes.bin\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/bgfx/shaders/dx11/fs_raymarching.bin\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/bgfx/shaders/dx11/vs_bump_instanced.bin\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/bgfx/shaders/dx11/vs_cubes.bin\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/bgfx/shaders/dx11/vs_raymarching.bin\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/bgfx/textures/fieldstone-n.dds\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/bgfx/textures/fieldstone-rgba.dds\\E"}, + {"pattern":"\\Qorg/lwjgl/system/APIUtil.class\\E"}, + {"pattern":"\\Qwindows/x64/org/lwjgl/assimp/assimp.dll\\E"}, + {"pattern":"\\Qwindows/x64/org/lwjgl/bgfx/bgfx.dll\\E"}, + {"pattern":"\\Qwindows/x64/org/lwjgl/glfw/glfw.dll\\E"}, + {"pattern":"\\Qwindows/x64/org/lwjgl/lwjgl.dll\\E"}, + {"pattern":"\\Qwindows/x64/org/lwjgl/openal/OpenAL.dll\\E"}, + {"pattern":"\\Qwindows/x64/org/lwjgl/opengl/lwjgl_opengl.dll\\E"}, + {"pattern":"\\Qwindows/x64/org/lwjgl/stb/lwjgl_stb.dll\\E"} + ]}, + "bundles":[] +} diff --git a/res/META-INF/native-image/serialization-config.json b/res/META-INF/native-image/serialization-config.json new file mode 100644 index 00000000..0d4f101c --- /dev/null +++ b/res/META-INF/native-image/serialization-config.json @@ -0,0 +1,2 @@ +[ +] diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 00000000..baaeba5c --- /dev/null +++ b/settings.gradle @@ -0,0 +1,10 @@ +pluginManagement { + repositories { + maven { + url "https://nexus.gluonhq.com/nexus/content/repositories/releases" + } + gradlePluginPortal() + } +} + +rootProject.name = 'lwjgl3-bgfx-demos' diff --git a/src/org/lwjgl/demo/DemoLauncher.java b/src/org/lwjgl/demo/DemoLauncher.java new file mode 100644 index 00000000..2aac3e02 --- /dev/null +++ b/src/org/lwjgl/demo/DemoLauncher.java @@ -0,0 +1,23 @@ +package org.lwjgl.demo; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +public class DemoLauncher { + + public static void main(String[] args) { + String demoClassName = "bgfx.Bump"; //default is the bgfx.Bump demo + if (args.length > 0) { + demoClassName = args[0]; + } + try { + Class demoClass = Class.forName("org.lwjgl.demo." + demoClassName); + Method mainMethod = demoClass.getMethod("main", String[].class); + mainMethod.invoke(null, (Object)new String[]{}); + } catch (ClassNotFoundException | NoSuchMethodException | SecurityException | + IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + e.printStackTrace(); + } + } + +} diff --git a/src/org/lwjgl/demo/bgfx/Bump.java b/src/org/lwjgl/demo/bgfx/Bump.java index f4d8b1c0..bb4bf6da 100644 --- a/src/org/lwjgl/demo/bgfx/Bump.java +++ b/src/org/lwjgl/demo/bgfx/Bump.java @@ -331,7 +331,7 @@ protected void frame(float time, float frameTime) { bgfx_encoder_set_instance_data_buffer(encoder, idb, 0, numInstances); // Set vertex and index buffer. - bgfx_encoder_set_vertex_buffer(encoder, 0, vbh, 0, 24); + bgfx_encoder_set_vertex_buffer(encoder, 0, vbh, 0, 24, BGFX_INVALID_HANDLE); bgfx_encoder_set_index_buffer(encoder, ibh, 0, 36); // Bind textures. @@ -346,7 +346,7 @@ protected void frame(float time, float frameTime) { | BGFX_STATE_MSAA, 0); // Submit primitive for rendering to view 0. - bgfx_encoder_submit(encoder, 0, program, 0, 0); + bgfx_encoder_submit(encoder, 0, program, 0, false); idb.free(); } } else { @@ -359,7 +359,7 @@ protected void frame(float time, float frameTime) { .get4x4(mtxBuf)); // Set vertex and index buffer. - bgfx_encoder_set_vertex_buffer(encoder, 0, vbh, 0, 24); + bgfx_encoder_set_vertex_buffer(encoder, 0, vbh, 0, 24, BGFX_INVALID_HANDLE); bgfx_encoder_set_index_buffer(encoder, ibh, 0, 36); // Bind textures. @@ -374,7 +374,7 @@ protected void frame(float time, float frameTime) { | BGFX_STATE_MSAA, 0); // Submit primitive for rendering to view 0. - bgfx_encoder_submit(encoder, 0, program, 0, 0); + bgfx_encoder_submit(encoder, 0, program, 0, false); } } } diff --git a/src/org/lwjgl/demo/bgfx/Cubes.java b/src/org/lwjgl/demo/bgfx/Cubes.java index c85e1e4a..824e1218 100644 --- a/src/org/lwjgl/demo/bgfx/Cubes.java +++ b/src/org/lwjgl/demo/bgfx/Cubes.java @@ -119,12 +119,12 @@ protected void frame(float time, float frameTime) { 0.0f) .get4x4(modelBuf)); - bgfx_encoder_set_vertex_buffer(encoder, 0, vbh, 0, 8); + bgfx_encoder_set_vertex_buffer(encoder, 0, vbh, 0, 8, BGFX_INVALID_HANDLE); bgfx_encoder_set_index_buffer(encoder, ibh, 0, 36); bgfx_encoder_set_state(encoder, BGFX_STATE_DEFAULT, 0); - bgfx_encoder_submit(encoder, 0, program, 0, 0); + bgfx_encoder_submit(encoder, 0, program, 0, false); } } bgfx_encoder_end(encoder); diff --git a/src/org/lwjgl/demo/bgfx/Metaballs.java b/src/org/lwjgl/demo/bgfx/Metaballs.java index 65fb7c7b..9e29065b 100644 --- a/src/org/lwjgl/demo/bgfx/Metaballs.java +++ b/src/org/lwjgl/demo/bgfx/Metaballs.java @@ -633,13 +633,13 @@ protected void frame(float time, float frameTime) { bgfx_encoder_set_transform(encoder, model.get4x4(modelBuf)); // Set vertex and index buffer. - bgfx_encoder_set_transient_vertex_buffer(encoder, 0, tvb, 0, numVertices); + bgfx_encoder_set_transient_vertex_buffer(encoder, 0, tvb, 0, numVertices, BGFX_INVALID_HANDLE); // Set render states. bgfx_encoder_set_state(encoder, BGFX_STATE_DEFAULT, 0); // Submit primitive for rendering to view 0. - bgfx_encoder_submit(encoder, 0, program, 0, 0); + bgfx_encoder_submit(encoder, 0, program, 0, false); bgfx_encoder_end(encoder); diff --git a/src/org/lwjgl/demo/bgfx/Raymarch.java b/src/org/lwjgl/demo/bgfx/Raymarch.java index 28d03241..a98e451a 100644 --- a/src/org/lwjgl/demo/bgfx/Raymarch.java +++ b/src/org/lwjgl/demo/bgfx/Raymarch.java @@ -115,9 +115,9 @@ private void renderScreenSpaceQuad(long encoder, int _view, short _program, floa bgfx_encoder_set_transient_index_buffer(encoder, tib, 0, 6); vertex.flip(); - bgfx_encoder_set_transient_vertex_buffer(encoder, 0, tvb, 0, 4); + bgfx_encoder_set_transient_vertex_buffer(encoder, 0, tvb, 0, 4, BGFX_INVALID_HANDLE); - bgfx_encoder_submit(encoder, _view, _program, 0, 0); + bgfx_encoder_submit(encoder, _view, _program, 0, false); } } } diff --git a/src/org/lwjgl/graalvm/LwjglSubstitutions.java b/src/org/lwjgl/graalvm/LwjglSubstitutions.java new file mode 100644 index 00000000..5f514084 --- /dev/null +++ b/src/org/lwjgl/graalvm/LwjglSubstitutions.java @@ -0,0 +1,60 @@ +package org.lwjgl.graalvm; + +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.Pointer.*; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; + +import com.oracle.svm.core.annotate.Alias; +import com.oracle.svm.core.annotate.Substitute; +import com.oracle.svm.core.annotate.TargetClass; + +@TargetClass(org.lwjgl.system.ThreadLocalUtil.class) +final class Target_org_lwjgl_system_ThreadLocalUtil { + + @Alias + private static long JNI_NATIVE_INTERFACE; + + @Alias + private static long FUNCTION_MISSING_ABORT; + + @Substitute + public static void setFunctionMissingAddresses(Class capabilitiesClass, int index) { + if (capabilitiesClass == null) { + long missingCaps = memGetAddress(JNI_NATIVE_INTERFACE + Integer.toUnsignedLong(index) * POINTER_SIZE); + if (missingCaps != NULL) { + getAllocator().free(missingCaps); + memPutAddress(JNI_NATIVE_INTERFACE + Integer.toUnsignedLong(index) * POINTER_SIZE, NULL); + } + } else { + int functionCount = getFieldsFromCapabilities(capabilitiesClass).size(); + + long missingCaps = getAllocator().malloc(Integer.toUnsignedLong(functionCount) * POINTER_SIZE); + for (int i = 0; i < functionCount; i++) { + memPutAddress(missingCaps + Integer.toUnsignedLong(i) * POINTER_SIZE, FUNCTION_MISSING_ABORT); + } + + //the whole purpose of substituting this method is just to remove the following line + //(which causes the resulting native image to crash!) + //memPutAddress(JNI_NATIVE_INTERFACE + Integer.toUnsignedLong(index) * POINTER_SIZE, missingCaps); + } + } + + //copied verbatim from the original class + @Substitute + private static List getFieldsFromCapabilities(Class capabilitiesClass) { + List fields = new ArrayList<>(); + for (Field field : capabilitiesClass.getFields()) { + if (field.getType() == long.class) { + fields.add(field); + } + } + return fields; + } +} + +/** Dummy class with the file's name. */ +public class LwjglSubstitutions { +} From b7c11bddd4b2eed57398715fbae8976c8a5a1500 Mon Sep 17 00:00:00 2001 From: Tue Ton <49886739+chirontt@users.noreply.github.com> Date: Tue, 16 Mar 2021 20:08:35 -0400 Subject: [PATCH 02/11] detailed build description added to README.md the README.md changes are specific to this branch only. --- README.md | 144 +++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 131 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 9e9ea5db..828f584f 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,140 @@ -# lwjgl3-demos -Demo suite for LWJGL 3 +# lwjgl3-bgfx-demos + GraalVM native image -## Building +BGFX Demos for LWJGL 3 compiled to native executable by GraalVM native-image utility. - ./mvnw package - -To override main class +Four BGFX demos are included in the build: [Bump](src/org/lwjgl/demo/bgfx/Bump.java), +[Cubes](src/org/lwjgl/demo/bgfx/Cubes.java), [Metaballs](src/org/lwjgl/demo/bgfx/Metaballs.java), +and [Raymarch](src/org/lwjgl/demo/bgfx/Raymarch.java). - ./mvnw package -Dclass=opengl.UniformArrayDemo +Gradle and Maven build scripts are provided for building the project, +which requires JDK 11+ or GraalVM 21+ (for native image). -## Running +## GraalVM pre-requisites - java -jar target/lwjgl3-demos.jar +The [GraalVM native-image](https://www.graalvm.org/reference-manual/native-image) page +shows how to set up GraalVM and its native-image utility for common platforms. +[Gluon](https://gluonhq.com/) also provides some setup +[details](https://docs.gluonhq.com/#_platforms) for GraalVM native-image creation. -on Mac OS you need to specify the `-XstartOnFirstThread` JVM argument, so the above becomes: +This project's Gradle build script uses the +[client-gradle-plugin](https://github.com/gluonhq/client-gradle-plugin) +from Gluon to build the native executable from Gradle with GraalVM. - java -XstartOnFirstThread -jar target/lwjgl3-demos.jar +The GraalVM native-image utility will use the configuration files in +`res/META-INF/native-image` folder to assist in the native-image generation. -To override main class +Gluon also provides the [client-maven-plugin](https://github.com/gluonhq/client-maven-plugin) +which is used in this project's Maven build script and works similarly to the above +client-gradle-plugin. + +## Gradle build tasks + +To build and run the BGFX demos in standard JVM with Gradle, execute the `run` task: + + gradlew run + +By default, the [Bump](src/org/lwjgl/demo/bgfx/Bump.java) demo is executed +by the above `run` task without parameter. To run a different BGFX demo, e.g. +[Raymarch](src/org/lwjgl/demo/bgfx/Raymarch.java), execute the `run` task +with that specific demo class as parameter (prefixed by `bgfx.`): + + gradlew run --args=bgfx.Raymarch + +The above tasks can use any standard JDK 11+. + +To generate native executable, GraalVM 21+ need be set up as mentioned in +*GraalVM pre-requisites* section above. + +Once GraalVM is set up and available in the path, run the `nativeBuild` task: + + gradlew nativeBuild + +The `nativeBuild` task would take a while to compile the BGFX demo source code and +link them with the LWJGL libraries into an executable file. +The resulting `lwjgl3-bgfx-demos` file is: + + build/client/x86_64-linux/lwjgl3-bgfx-demos + +(or if building on a Windows machine: + + build\client\x86_64-windows\lwjgl3-bgfx-demos.exe + +) + +which can then be run directly: + + ./build/client/x86_64-linux/lwjgl3-bgfx-demos + +or, for example, with the [Cubes](src/org/lwjgl/demo/bgfx/Cubes.java) +demo as parameter prefixed by `bgfx.`: + + ./build/client/x86_64-linux/lwjgl3-bgfx-demos bgfx.Cubes + +(or if building on a Windows machine: + + build\client\x86_64-windows\lwjgl3-bgfx-demos.exe + build\client\x86_64-windows\lwjgl3-bgfx-demos.exe bgfx.Cubes + +) + +## Maven build tasks + +To build and run the BGFX demos in standard JVM with Maven, execute the +`compile` then `exec:exec` tasks: + + mvnw compile + mvnw exec:exec + +By default, the [Bump](src/org/lwjgl/demo/bgfx/Bump.java) demo is executed +by the above `exec:exec` task without parameter. To run a different BGFX demo, e.g. +[Raymarch](src/org/lwjgl/demo/bgfx/Raymarch.java), execute the `exec:exec` task +with that specific demo class (prefixed by `bgfx.`) as value of the property `class`: + + mvnw exec:exec -Dclass=bgfx.Raymarch + +The above tasks can use any standard JDK 11+. + +To generate native executable, GraalVM 21+ need be set up as mentioned in +*GraalVM pre-requisites* section above. + +Once GraalVM is set up and available in the path, run the `client:build` task: + + mvnw client:build + +The `client:build` task would take a while to compile the BGFX demo source code and +link them with the LWJGL libraries into an executable file. +The resulting `lwjgl3-bgfx-demos` file is: + + target/client/x86_64-linux/lwjgl3-bgfx-demos + +(or if building on a Windows machine: + + target\client\x86_64-windows\lwjgl3-bgfx-demos.exe + +) + +which can then be run directly: + + ./target/client/x86_64-linux/lwjgl3-bgfx-demos + +or, for example, with the [Metaballs](src/org/lwjgl/demo/bgfx/Metaballs.java) +demo as parameter prefixed by `bgfx.`: + + ./target/client/x86_64-linux/lwjgl3-bgfx-demos bgfx.Metaballs + +(or if building on a Windows machine: + + target\client\x86_64-windows\lwjgl3-bgfx-demos.exe + target\client\x86_64-windows\lwjgl3-bgfx-demos.exe bgfx.Metaballs + +) + +## Compressed native executable + +The resulting `lwjgl3-bgfx-demos` executable file, whether produced by Gradle or Maven build script, +can be further reduced in size via compression using the [UPX](https://upx.github.io) utility, +as described [here](https://medium.com/graalvm/compressed-graalvm-native-images-4d233766a214). + +For example, the resulting `lwjgl3-bgfx-demos.exe` native application file produced in Windows +is normally 59MB in size, but is compressed to 16MB with the UPX command: `upx --best lwjgl3-bgfx-demos.exe` - java -cp target/lwjgl3-demos.jar org.lwjgl.demo.opengl.UniformArrayDemo From 2504e1d5d3b9cab72a2996443f0fdbf3f9ba45bf Mon Sep 17 00:00:00 2001 From: Tue Ton <49886739+chirontt@users.noreply.github.com> Date: Fri, 19 Mar 2021 14:25:01 -0400 Subject: [PATCH 03/11] fix (substitute) Version class for build number - org.lwjgl.Version's getVersion() method is patched in native image to retrieve the build number correctly from manifest entry - system properties from the command line can be passed on to the running demo in Gradle/Maven build scripts and in native image --- README.md | 22 ++++++++++++++ build.gradle | 4 +++ pom.xml | 5 ++++ src/org/lwjgl/graalvm/LwjglSubstitutions.java | 29 +++++++++++++++++++ 4 files changed, 60 insertions(+) diff --git a/README.md b/README.md index 828f584f..04863e00 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,11 @@ with that specific demo class as parameter (prefixed by `bgfx.`): gradlew run --args=bgfx.Raymarch +System properties can be passed on to the running demo with the -D parameter, +e.g. to print out some debug info in the console: + + gradlew run --args=bgfx.Raymarch -Dorg.lwjgl.util.Debug=true + The above tasks can use any standard JDK 11+. To generate native executable, GraalVM 21+ need be set up as mentioned in @@ -70,10 +75,16 @@ demo as parameter prefixed by `bgfx.`: ./build/client/x86_64-linux/lwjgl3-bgfx-demos bgfx.Cubes +System properties can be passed on to the running demo with the -D parameter, +e.g. to print out some debug info in the console: + + ./build/client/x86_64-linux/lwjgl3-bgfx-demos bgfx.Cubes -Dorg.lwjgl.util.Debug=true + (or if building on a Windows machine: build\client\x86_64-windows\lwjgl3-bgfx-demos.exe build\client\x86_64-windows\lwjgl3-bgfx-demos.exe bgfx.Cubes + build\client\x86_64-windows\lwjgl3-bgfx-demos.exe bgfx.Cubes -Dorg.lwjgl.util.Debug=true ) @@ -92,6 +103,11 @@ with that specific demo class (prefixed by `bgfx.`) as value of the property `cl mvnw exec:exec -Dclass=bgfx.Raymarch +System properties can be passed on to the running demo with the -Dsys.props parameter, +e.g. to print out some debug info in the console: + + mvnw exec:exec -Dclass=bgfx.Raymarch -Dsys.props="-Dorg.lwjgl.util.Debug=true" + The above tasks can use any standard JDK 11+. To generate native executable, GraalVM 21+ need be set up as mentioned in @@ -122,10 +138,16 @@ demo as parameter prefixed by `bgfx.`: ./target/client/x86_64-linux/lwjgl3-bgfx-demos bgfx.Metaballs +System properties can be passed on to the running demo with the -D parameter, +e.g. to print out some debug info in the console: + + ./target/client/x86_64-linux/lwjgl3-bgfx-demos bgfx.Metaballs -Dorg.lwjgl.util.Debug=true + (or if building on a Windows machine: target\client\x86_64-windows\lwjgl3-bgfx-demos.exe target\client\x86_64-windows\lwjgl3-bgfx-demos.exe bgfx.Metaballs + target\client\x86_64-windows\lwjgl3-bgfx-demos.exe bgfx.Metaballs -Dorg.lwjgl.util.Debug=true ) diff --git a/build.gradle b/build.gradle index 74304313..e6944b6c 100644 --- a/build.gradle +++ b/build.gradle @@ -92,6 +92,10 @@ compileJava { jar.archiveBaseName = 'lwjgl3-bgfx-demos' run { + //get system properties specified from the command line (for debugging, etc.) + //and pass them on to the running application's JVM + systemProperties = System.getProperties() + //use the following jvmArgs for as many different run scenarios as possible, //and for all the code-execution paths as much as possible, //to generate (or merge with) the GraalVM native-image configuration files diff --git a/pom.xml b/pom.xml index c7f6fc7f..bcdf0fb5 100644 --- a/pom.xml +++ b/pom.xml @@ -20,6 +20,10 @@ bgfx.Bump + + lwjgl3-bgfx-demos LWJGL3 BGFX demos with native image by GraalVM @@ -137,6 +141,7 @@ + ${sys.props} -classpath ${exec.mainClass} diff --git a/src/org/lwjgl/graalvm/LwjglSubstitutions.java b/src/org/lwjgl/graalvm/LwjglSubstitutions.java index 5f514084..df02158f 100644 --- a/src/org/lwjgl/graalvm/LwjglSubstitutions.java +++ b/src/org/lwjgl/graalvm/LwjglSubstitutions.java @@ -6,18 +6,47 @@ import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; +import java.util.Optional; + +import org.lwjgl.Version; +import org.lwjgl.Version.BuildType; import com.oracle.svm.core.annotate.Alias; +import com.oracle.svm.core.annotate.RecomputeFieldValue; +import com.oracle.svm.core.annotate.RecomputeFieldValue.Kind; import com.oracle.svm.core.annotate.Substitute; import com.oracle.svm.core.annotate.TargetClass; +@TargetClass(org.lwjgl.Version.class) +final class Target_org_lwjgl_Version { + + @Alias + @RecomputeFieldValue(kind = Kind.FromAlias, isFinal = true) + public static int VERSION_MAJOR, VERSION_MINOR, VERSION_REVISION; + + @Alias + @RecomputeFieldValue(kind = Kind.FromAlias, isFinal = true) + public static BuildType BUILD_TYPE; + + @Substitute + public static String getVersion() { + String implVersion = Version.class.getPackage().getImplementationVersion(); + return String.valueOf(VERSION_MAJOR) + + '.' + VERSION_MINOR + + '.' + VERSION_REVISION + BUILD_TYPE.postfix + + ' ' + Optional.ofNullable(implVersion).orElse("SNAPSHOT"); + } +} + @TargetClass(org.lwjgl.system.ThreadLocalUtil.class) final class Target_org_lwjgl_system_ThreadLocalUtil { @Alias + @RecomputeFieldValue(kind = Kind.FromAlias, isFinal = true) private static long JNI_NATIVE_INTERFACE; @Alias + @RecomputeFieldValue(kind = Kind.FromAlias, isFinal = true) private static long FUNCTION_MISSING_ABORT; @Substitute From 04aa74d01d8e5dd53f11357f3e16c8181eeebc66 Mon Sep 17 00:00:00 2001 From: Tue Ton <49886739+chirontt@users.noreply.github.com> Date: Sun, 21 Mar 2021 15:31:21 -0400 Subject: [PATCH 04/11] add glsl and metal shader files to native image to make it work in Linux. Also, remove the ThreadLocalUtil's substitution by GraalVM, as the resulting native image seems to work fine without it. --- .../native-image/resource-config.json | 15 ++++++ src/org/lwjgl/graalvm/LwjglSubstitutions.java | 52 ------------------- 2 files changed, 15 insertions(+), 52 deletions(-) diff --git a/res/META-INF/native-image/resource-config.json b/res/META-INF/native-image/resource-config.json index 14b30bb0..c1679b26 100644 --- a/res/META-INF/native-image/resource-config.json +++ b/res/META-INF/native-image/resource-config.json @@ -19,9 +19,24 @@ {"pattern":"\\Qorg/lwjgl/demo/bgfx/shaders/dx11/fs_bump.bin\\E"}, {"pattern":"\\Qorg/lwjgl/demo/bgfx/shaders/dx11/fs_cubes.bin\\E"}, {"pattern":"\\Qorg/lwjgl/demo/bgfx/shaders/dx11/fs_raymarching.bin\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/bgfx/shaders/dx11/vs_bump.bin\\E"}, {"pattern":"\\Qorg/lwjgl/demo/bgfx/shaders/dx11/vs_bump_instanced.bin\\E"}, {"pattern":"\\Qorg/lwjgl/demo/bgfx/shaders/dx11/vs_cubes.bin\\E"}, {"pattern":"\\Qorg/lwjgl/demo/bgfx/shaders/dx11/vs_raymarching.bin\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/bgfx/shaders/glsl/fs_bump.bin\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/bgfx/shaders/glsl/fs_cubes.bin\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/bgfx/shaders/glsl/fs_raymarching.bin\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/bgfx/shaders/glsl/vs_bump.bin\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/bgfx/shaders/glsl/vs_bump_instanced.bin\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/bgfx/shaders/glsl/vs_cubes.bin\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/bgfx/shaders/glsl/vs_raymarching.bin\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/bgfx/shaders/metal/fs_bump.bin\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/bgfx/shaders/metal/fs_cubes.bin\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/bgfx/shaders/metal/fs_raymarching.bin\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/bgfx/shaders/metal/vs_bump.bin\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/bgfx/shaders/metal/vs_bump_instanced.bin\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/bgfx/shaders/metal/vs_cubes.bin\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/bgfx/shaders/metal/vs_raymarching.bin\\E"}, {"pattern":"\\Qorg/lwjgl/demo/bgfx/textures/fieldstone-n.dds\\E"}, {"pattern":"\\Qorg/lwjgl/demo/bgfx/textures/fieldstone-rgba.dds\\E"}, {"pattern":"\\Qorg/lwjgl/system/APIUtil.class\\E"}, diff --git a/src/org/lwjgl/graalvm/LwjglSubstitutions.java b/src/org/lwjgl/graalvm/LwjglSubstitutions.java index df02158f..a5e0aff8 100644 --- a/src/org/lwjgl/graalvm/LwjglSubstitutions.java +++ b/src/org/lwjgl/graalvm/LwjglSubstitutions.java @@ -1,11 +1,5 @@ package org.lwjgl.graalvm; -import static org.lwjgl.system.MemoryUtil.*; -import static org.lwjgl.system.Pointer.*; - -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.List; import java.util.Optional; import org.lwjgl.Version; @@ -38,52 +32,6 @@ public static String getVersion() { } } -@TargetClass(org.lwjgl.system.ThreadLocalUtil.class) -final class Target_org_lwjgl_system_ThreadLocalUtil { - - @Alias - @RecomputeFieldValue(kind = Kind.FromAlias, isFinal = true) - private static long JNI_NATIVE_INTERFACE; - - @Alias - @RecomputeFieldValue(kind = Kind.FromAlias, isFinal = true) - private static long FUNCTION_MISSING_ABORT; - - @Substitute - public static void setFunctionMissingAddresses(Class capabilitiesClass, int index) { - if (capabilitiesClass == null) { - long missingCaps = memGetAddress(JNI_NATIVE_INTERFACE + Integer.toUnsignedLong(index) * POINTER_SIZE); - if (missingCaps != NULL) { - getAllocator().free(missingCaps); - memPutAddress(JNI_NATIVE_INTERFACE + Integer.toUnsignedLong(index) * POINTER_SIZE, NULL); - } - } else { - int functionCount = getFieldsFromCapabilities(capabilitiesClass).size(); - - long missingCaps = getAllocator().malloc(Integer.toUnsignedLong(functionCount) * POINTER_SIZE); - for (int i = 0; i < functionCount; i++) { - memPutAddress(missingCaps + Integer.toUnsignedLong(i) * POINTER_SIZE, FUNCTION_MISSING_ABORT); - } - - //the whole purpose of substituting this method is just to remove the following line - //(which causes the resulting native image to crash!) - //memPutAddress(JNI_NATIVE_INTERFACE + Integer.toUnsignedLong(index) * POINTER_SIZE, missingCaps); - } - } - - //copied verbatim from the original class - @Substitute - private static List getFieldsFromCapabilities(Class capabilitiesClass) { - List fields = new ArrayList<>(); - for (Field field : capabilitiesClass.getFields()) { - if (field.getType() == long.class) { - fields.add(field); - } - } - return fields; - } -} - /** Dummy class with the file's name. */ public class LwjglSubstitutions { } From dc8e90a33b3128eaf6e7e913ce4d5692375e7639 Mon Sep 17 00:00:00 2001 From: Tue Ton <49886739+chirontt@users.noreply.github.com> Date: Sun, 21 Mar 2021 20:02:12 -0400 Subject: [PATCH 05/11] compile Vulkan demos to native executable - compile against LWJGL 3.2.3 version - restrict to the Vulkan demos (code & resources) - add Gradle wrapper & build script - use GraalVM native-image utility to produce native executable containing the Vulkan demos. --- .gitignore | 1 + build.gradle | 125 ++++++++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes gradle/wrapper/gradle-wrapper.properties | 5 + gradlew | 185 ++++++++++++ gradlew.bat | 89 ++++++ pom.xml | 203 ++++++------- res/META-INF/native-image/jni-config.json | 49 +++ res/META-INF/native-image/proxy-config.json | 2 + res/META-INF/native-image/reflect-config.json | 284 ++++++++++++++++++ .../native-image/resource-config.json | 14 + .../native-image/serialization-config.json | 2 + settings.gradle | 10 + src/org/lwjgl/demo/DemoLauncher.java | 26 ++ src/org/lwjgl/demo/util/AABBf.java | 23 ++ src/org/lwjgl/demo/util/Collider.java | 1 - 16 files changed, 902 insertions(+), 117 deletions(-) create mode 100644 build.gradle create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 res/META-INF/native-image/jni-config.json create mode 100644 res/META-INF/native-image/proxy-config.json create mode 100644 res/META-INF/native-image/reflect-config.json create mode 100644 res/META-INF/native-image/resource-config.json create mode 100644 res/META-INF/native-image/serialization-config.json create mode 100644 settings.gradle create mode 100644 src/org/lwjgl/demo/DemoLauncher.java create mode 100644 src/org/lwjgl/demo/util/AABBf.java diff --git a/.gitignore b/.gitignore index 97d03479..870a1fbc 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ /.project /*.iml /dependency-reduced-pom.xml +.gradle diff --git a/build.gradle b/build.gradle new file mode 100644 index 00000000..80d58443 --- /dev/null +++ b/build.gradle @@ -0,0 +1,125 @@ +plugins { + id 'application' + id 'com.gluonhq.client-gradle-plugin' version '0.1.36' //requires GraalVM 21+ +} + +wrapper { + gradleVersion = '6.8.3' + distributionType = Wrapper.DistributionType.ALL +} + +group = 'org.lwjgl' +description = 'LWJGL3 Vulkan demos with native image by GraalVM' +//version = '0.0.1-SNAPSHOT' + +ext { + lwjglVersion = '3.2.3' + jomlVersion = '1.10.1' + graalvmVersion = '21.0.0.2' + + //LWJGL modules used: minimal Vulkan (minus openal), plus shaderc and vma + lwjglModules = ['lwjgl', 'lwjgl-assimp', 'lwjgl-glfw', 'lwjgl-shaderc', 'lwjgl-stb', 'lwjgl-vma', 'lwjgl-vulkan'] + + mainClassName = 'org.lwjgl.demo.DemoLauncher' +} + +repositories { + mavenCentral() + mavenLocal() +} + +//detect the OS (assuming 64-bit, on Intel/AMD hardware) +private static String getCurrentPlatform() { + def currentOS = org.gradle.nativeplatform.platform.internal.DefaultNativePlatform.currentOperatingSystem; + if (currentOS.isWindows()) { + return 'windows' + } else if (currentOS.isLinux()) { + return 'linux' + } else if (currentOS.isMacOsX()) { + return 'macos' + } + return null +} + +dependencies { + //get recommended dependency versions from the LWJGL BOM + implementation platform("org.lwjgl:lwjgl-bom:$lwjglVersion") + + implementation "org.joml:joml:$jomlVersion" + + def currentOS = getCurrentPlatform() + + //add LWJGL modules and the current OS's natives to the compile and runtime classpaths + lwjglModules.each { + implementation "org.lwjgl:$it" + if (it != 'lwjgl-egl') { //lwjgl-egl has no native libraries + //use natives for 64-bit Intel/AMD platforms only + if (it == 'lwjgl-vulkan') { + if (currentOS == 'macos') { + //Vulkan natives exist for Mac OSX only + runtimeOnly "org.lwjgl:$it::natives-$currentOS" + } + } else { + runtimeOnly "org.lwjgl:$it::natives-$currentOS" + } + } + } + + //for compiling GraalVM substitution classes + compileOnly "org.graalvm.nativeimage:svm:$graalvmVersion" +} + +sourceSets { + main { + java { + srcDirs = ['src'] + //include launcher & GraalVM substitution code + include 'org/lwjgl/demo/DemoLauncher.java', 'org/lwjgl/graalvm/*' + //restrict to vulkan demo source code + include 'org/lwjgl/demo/vulkan/*' + include 'org/lwjgl/demo/util/*' + } + resources { + srcDirs = ['res'] + //include the GraalVM native-image configuration files + include 'META-INF/native-image/**' + //restrict to vulkan demo resources only + include 'org/lwjgl/demo/vulkan/**' + } + } +} + +application { + mainClass = project.mainClassName + applicationName = project.name //name of the resulting native executable +} + +compileJava { + options.release = 11 //use JDK11+ for compiling & running + options.encoding = 'UTF-8' +} + +jar.archiveBaseName = 'lwjgl3-vulkan-demos' + +run { + args 'vulkan.ColoredRotatingQuadDemo' //default demo is vulkan.ColoredRotatingQuadDemo + + //get system properties specified from the command line (for debugging, etc.) + //and pass them on to the running application's JVM + systemProperties = System.getProperties() + + //use the following jvmArgs for as many different run scenarios as possible, + //and for all the code-execution paths as much as possible, + //to generate (or merge with) the GraalVM native-image configuration files + //in the res/META-INF/native-image directory. + //This directory is read by GraalVM during the native-image build. + + //jvmArgs = ["-agentlib:native-image-agent=config-merge-dir=res/META-INF/native-image"] +} + +gluonClient { + compilerArgs = [ + '--initialize-at-run-time=org.lwjgl', + '--report-unsupported-elements-at-runtime', + ] +} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..e708b1c023ec8b20f512888fe07c5bd3ff77bb8f GIT binary patch literal 59203 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

K7UpUK$>l@ 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 E2O(~oYXATM literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..8cf6eb5a --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.3-all.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100755 index 00000000..4f906e0c --- /dev/null +++ b/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 00000000..107acd32 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/pom.xml b/pom.xml index 9acdebc2..00fbc640 100644 --- a/pom.xml +++ b/pom.xml @@ -1,9 +1,8 @@ - 4.0.0 org.lwjgl - lwjgl3-demos + lwjgl3-vulkan-demos 0.0.1-SNAPSHOT UTF-8 @@ -12,13 +11,22 @@ 1.8 3.8.1 3.2.1 - 3.2.4-SNAPSHOT + 3.2.3 4.6.1 - 1.9.26-SNAPSHOT - - game.SpaceGame + 1.10.1 + 0.1.36 + 21.0.0.2 + org.lwjgl.demo.DemoLauncher + + vulkan.ColoredRotatingQuadDemo + + + lwjgl3-vulkan-demos + LWJGL3 Vulkan demos with native image by GraalVM windows @@ -39,13 +47,6 @@ x86 - - - org.eclipse.swt - org.eclipse.swt.win32.win32.x86 - ${swt.version} - - windows-amd64 @@ -55,13 +56,6 @@ amd64 - - - org.eclipse.swt - org.eclipse.swt.win32.win32.x86_64 - ${swt.version} - - linux @@ -82,13 +76,6 @@ x86 - - - org.eclipse.swt - org.eclipse.swt.gtk.linux.x86 - ${swt.version} - - linux-amd64 @@ -98,13 +85,6 @@ amd64 - - - org.eclipse.swt - org.eclipse.swt.gtk.linux.x86_64 - ${swt.version} - - mac @@ -117,11 +97,6 @@ macos - - org.eclipse.swt - org.eclipse.swt.cocoa.macosx.x86_64 - ${swt.version} - org.lwjgl lwjgl-vulkan @@ -136,162 +111,158 @@ res + + + META-INF/native-image/* + + org/lwjgl/demo/vulkan/**/* + maven-compiler-plugin ${maven-compiler-plugin.version} + + + + org/lwjgl/demo/DemoLauncher.java + org/lwjgl/graalvm/*.java + + org/lwjgl/demo/vulkan/*.java + org/lwjgl/demo/util/*.java + + - maven-shade-plugin - ${maven-shade-plugin.version} + org.codehaus.mojo + exec-maven-plugin + 3.0.0 - package - shade + exec - - - - org.lwjgl.demo.${class} - - - lwjgl3-demos - + + java + + + + ${sys.props} + -classpath + + ${exec.mainClass} + ${class} + + + + + com.gluonhq + client-maven-plugin + ${client-maven-plugin.version} + + ${exec.mainClass} + + --initialize-at-run-time=org.lwjgl + + oss.sonatype.org - https://oss.sonatype.org/content/repositories/snapshots/ - - true - + https://oss.sonatype.org/content/repositories/ swt-repo http://maven-eclipse.github.io/maven + + + + + org.lwjgl + lwjgl-bom + ${lwjgl.version} + import + pom + + + org.joml joml ${joml.version} + - org.lwjgl - lwjgl - ${lwjgl.version} + org.graalvm.nativeimage + svm + ${graalvm.version} + provided + org.lwjgl - lwjgl-vulkan - ${lwjgl.version} + lwjgl org.lwjgl - lwjgl-glfw - ${lwjgl.version} + lwjgl-assimp org.lwjgl - lwjgl-opengl - ${lwjgl.version} + lwjgl-glfw org.lwjgl - lwjgl-par - ${lwjgl.version} + lwjgl-shaderc org.lwjgl lwjgl-stb - ${lwjgl.version} org.lwjgl - lwjgl-bgfx - ${lwjgl.version} + lwjgl-vma org.lwjgl - lwjgl-assimp - ${lwjgl.version} + lwjgl-vulkan org.lwjgl lwjgl - ${lwjgl.version} natives-${platform} org.lwjgl - lwjgl-opengl - ${lwjgl.version} + lwjgl-assimp natives-${platform} - - org.lwjgl - lwjgl-cuda - ${lwjgl.version} - - - org.lwjgl - lwjgl-shaderc - ${lwjgl.version} - - - org.lwjgl - lwjgl-vma - ${lwjgl.version} - org.lwjgl lwjgl-glfw - ${lwjgl.version} - natives-${platform} - - - org.lwjgl - lwjgl-stb - ${lwjgl.version} natives-${platform} org.lwjgl - lwjgl-par - ${lwjgl.version} + lwjgl-shaderc natives-${platform} org.lwjgl - lwjgl-bgfx - ${lwjgl.version} + lwjgl-stb natives-${platform} org.lwjgl lwjgl-vma - ${lwjgl.version} - natives-${platform} - - - org.lwjgl - lwjgl-assimp - ${lwjgl.version} - natives-${platform} - - - org.lwjgl - lwjgl-shaderc - ${lwjgl.version} natives-${platform} diff --git a/res/META-INF/native-image/jni-config.json b/res/META-INF/native-image/jni-config.json new file mode 100644 index 00000000..8d4de800 --- /dev/null +++ b/res/META-INF/native-image/jni-config.json @@ -0,0 +1,49 @@ +[ +{ + "name":"java.lang.ClassLoader", + "methods":[{"name":"getPlatformClassLoader","parameterTypes":[] }] +}, +{ + "name":"java.lang.NoSuchMethodError" +}, +{ + "name":"org.lwjgl.system.CallbackI$B", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$D", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$F", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$I", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$J", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$N", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$P", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$S", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$V", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$Z", + "methods":[{"name":"callback","parameterTypes":["long"] }] +} +] diff --git a/res/META-INF/native-image/proxy-config.json b/res/META-INF/native-image/proxy-config.json new file mode 100644 index 00000000..0d4f101c --- /dev/null +++ b/res/META-INF/native-image/proxy-config.json @@ -0,0 +1,2 @@ +[ +] diff --git a/res/META-INF/native-image/reflect-config.json b/res/META-INF/native-image/reflect-config.json new file mode 100644 index 00000000..4fbaaf35 --- /dev/null +++ b/res/META-INF/native-image/reflect-config.json @@ -0,0 +1,284 @@ +[ +{ + "name":"float[]" +}, +{ + "name":"java.lang.Double", + "methods":[{"name":"doubleToRawLongBits","parameterTypes":["double"] }] +}, +{ + "name":"java.lang.Float", + "methods":[{"name":"floatToRawIntBits","parameterTypes":["float"] }] +}, +{ + "name":"java.lang.Long", + "methods":[{"name":"rotateLeft","parameterTypes":["long","int"] }] +}, +{ + "name":"java.lang.Object" +}, +{ + "name":"java.nio.Buffer", + "fields":[{"name":"address", "allowUnsafeAccess":true}] +}, +{ + "name":"org.joml.Matrix2f", + "fields":[ + {"name":"m00", "allowUnsafeAccess":true}, + {"name":"m01", "allowUnsafeAccess":true}, + {"name":"m10", "allowUnsafeAccess":true}, + {"name":"m11", "allowUnsafeAccess":true} + ] +}, +{ + "name":"org.joml.Matrix3d", + "fields":[ + {"name":"m00", "allowUnsafeAccess":true}, + {"name":"m01", "allowUnsafeAccess":true}, + {"name":"m02", "allowUnsafeAccess":true}, + {"name":"m10", "allowUnsafeAccess":true}, + {"name":"m11", "allowUnsafeAccess":true}, + {"name":"m12", "allowUnsafeAccess":true}, + {"name":"m20", "allowUnsafeAccess":true}, + {"name":"m21", "allowUnsafeAccess":true}, + {"name":"m22", "allowUnsafeAccess":true} + ] +}, +{ + "name":"org.joml.Matrix3f", + "fields":[ + {"name":"m00", "allowUnsafeAccess":true}, + {"name":"m01", "allowUnsafeAccess":true}, + {"name":"m02", "allowUnsafeAccess":true}, + {"name":"m10", "allowUnsafeAccess":true}, + {"name":"m11", "allowUnsafeAccess":true}, + {"name":"m12", "allowUnsafeAccess":true}, + {"name":"m20", "allowUnsafeAccess":true}, + {"name":"m21", "allowUnsafeAccess":true}, + {"name":"m22", "allowUnsafeAccess":true} + ] +}, +{ + "name":"org.joml.Matrix3x2f", + "fields":[ + {"name":"m00", "allowUnsafeAccess":true}, + {"name":"m01", "allowUnsafeAccess":true}, + {"name":"m10", "allowUnsafeAccess":true}, + {"name":"m11", "allowUnsafeAccess":true}, + {"name":"m20", "allowUnsafeAccess":true}, + {"name":"m21", "allowUnsafeAccess":true} + ] +}, +{ + "name":"org.joml.Matrix4d", + "fields":[ + {"name":"m00", "allowUnsafeAccess":true}, + {"name":"m01", "allowUnsafeAccess":true}, + {"name":"m02", "allowUnsafeAccess":true}, + {"name":"m03", "allowUnsafeAccess":true}, + {"name":"m10", "allowUnsafeAccess":true}, + {"name":"m11", "allowUnsafeAccess":true}, + {"name":"m12", "allowUnsafeAccess":true}, + {"name":"m13", "allowUnsafeAccess":true}, + {"name":"m20", "allowUnsafeAccess":true}, + {"name":"m21", "allowUnsafeAccess":true}, + {"name":"m22", "allowUnsafeAccess":true}, + {"name":"m23", "allowUnsafeAccess":true}, + {"name":"m30", "allowUnsafeAccess":true}, + {"name":"m31", "allowUnsafeAccess":true}, + {"name":"m32", "allowUnsafeAccess":true}, + {"name":"m33", "allowUnsafeAccess":true} + ] +}, +{ + "name":"org.joml.Matrix4f", + "fields":[ + {"name":"m00", "allowUnsafeAccess":true}, + {"name":"m01", "allowUnsafeAccess":true}, + {"name":"m02", "allowUnsafeAccess":true}, + {"name":"m03", "allowUnsafeAccess":true}, + {"name":"m10", "allowUnsafeAccess":true}, + {"name":"m11", "allowUnsafeAccess":true}, + {"name":"m12", "allowUnsafeAccess":true}, + {"name":"m13", "allowUnsafeAccess":true}, + {"name":"m20", "allowUnsafeAccess":true}, + {"name":"m21", "allowUnsafeAccess":true}, + {"name":"m22", "allowUnsafeAccess":true}, + {"name":"m23", "allowUnsafeAccess":true}, + {"name":"m30", "allowUnsafeAccess":true}, + {"name":"m31", "allowUnsafeAccess":true}, + {"name":"m32", "allowUnsafeAccess":true}, + {"name":"m33", "allowUnsafeAccess":true} + ] +}, +{ + "name":"org.joml.Matrix4x3f", + "fields":[ + {"name":"m00", "allowUnsafeAccess":true}, + {"name":"m01", "allowUnsafeAccess":true}, + {"name":"m02", "allowUnsafeAccess":true}, + {"name":"m10", "allowUnsafeAccess":true}, + {"name":"m11", "allowUnsafeAccess":true}, + {"name":"m12", "allowUnsafeAccess":true}, + {"name":"m20", "allowUnsafeAccess":true}, + {"name":"m21", "allowUnsafeAccess":true}, + {"name":"m22", "allowUnsafeAccess":true}, + {"name":"m30", "allowUnsafeAccess":true}, + {"name":"m31", "allowUnsafeAccess":true}, + {"name":"m32", "allowUnsafeAccess":true} + ] +}, +{ + "name":"org.joml.Quaternionf", + "fields":[ + {"name":"w", "allowUnsafeAccess":true}, + {"name":"x", "allowUnsafeAccess":true}, + {"name":"y", "allowUnsafeAccess":true}, + {"name":"z", "allowUnsafeAccess":true} + ] +}, +{ + "name":"org.joml.Vector2f", + "fields":[ + {"name":"x", "allowUnsafeAccess":true}, + {"name":"y", "allowUnsafeAccess":true} + ] +}, +{ + "name":"org.joml.Vector2i", + "fields":[ + {"name":"x", "allowUnsafeAccess":true}, + {"name":"y", "allowUnsafeAccess":true} + ] +}, +{ + "name":"org.joml.Vector3f", + "fields":[ + {"name":"x", "allowUnsafeAccess":true}, + {"name":"y", "allowUnsafeAccess":true}, + {"name":"z", "allowUnsafeAccess":true} + ] +}, +{ + "name":"org.joml.Vector3i", + "fields":[ + {"name":"x", "allowUnsafeAccess":true}, + {"name":"y", "allowUnsafeAccess":true}, + {"name":"z", "allowUnsafeAccess":true} + ] +}, +{ + "name":"org.joml.Vector4f", + "fields":[ + {"name":"w", "allowUnsafeAccess":true}, + {"name":"x", "allowUnsafeAccess":true}, + {"name":"y", "allowUnsafeAccess":true}, + {"name":"z", "allowUnsafeAccess":true} + ] +}, +{ + "name":"org.joml.Vector4i", + "fields":[ + {"name":"w", "allowUnsafeAccess":true}, + {"name":"x", "allowUnsafeAccess":true}, + {"name":"y", "allowUnsafeAccess":true}, + {"name":"z", "allowUnsafeAccess":true} + ] +}, +{ + "name":"org.lwjgl.PointerBuffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.glfw.GLFW", + "allDeclaredFields":true +}, +{ + "name":"org.lwjgl.glfw.GLFWVidMode", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.opengl.GLCapabilities", + "allPublicFields":true +}, +{ + "name":"org.lwjgl.system.CallbackI$B", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$D", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$F", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$I", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$J", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$N", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$P", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$S", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$V", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$Z", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CustomBuffer", + "fields":[ + {"name":"capacity", "allowUnsafeAccess":true}, + {"name":"container", "allowUnsafeAccess":true}, + {"name":"limit", "allowUnsafeAccess":true}, + {"name":"mark", "allowUnsafeAccess":true}, + {"name":"position", "allowUnsafeAccess":true} + ] +}, +{ + "name":"org.lwjgl.system.Pointer$Default", + "fields":[{"name":"address", "allowUnsafeAccess":true}] +}, +{ + "name":"org.lwjgl.system.Struct", + "fields":[{"name":"container", "allowUnsafeAccess":true}] +}, +{ + "name":"sun.misc.Unsafe", + "allDeclaredFields":true, + "methods":[ + {"name":"getLong","parameterTypes":["java.lang.Object","long"] }, + {"name":"putLong","parameterTypes":["java.lang.Object","long","long"] } + ] +} +] diff --git a/res/META-INF/native-image/resource-config.json b/res/META-INF/native-image/resource-config.json new file mode 100644 index 00000000..cc13d8ae --- /dev/null +++ b/res/META-INF/native-image/resource-config.json @@ -0,0 +1,14 @@ +{ + "resources":{ + "includes":[ + {"pattern":"\\Qmacos/x64/org/lwjgl/assimp/libassimp.dylib\\E"}, + {"pattern":"\\Qmacos/x64/org/lwjgl/glfw/libglfw.dylib\\E"}, + {"pattern":"\\Qmacos/x64/org/lwjgl/liblwjgl.dylib\\E"}, + {"pattern":"\\Qmacos/x64/org/lwjgl/openal/libopenal.dylib\\E"}, + {"pattern":"\\Qmacos/x64/org/lwjgl/opengl/liblwjgl_opengl.dylib\\E"}, + {"pattern":"\\Qmacos/x64/org/lwjgl/stb/liblwjgl_stb.dylib\\E"}, + {"pattern":"\\Qmacos/x64/org/lwjgl/vulkan/libMoltenVK.dylib\\E"}, + {"pattern":"\\Qorg/lwjgl/system/APIUtil.class\\E"}, + ]}, + "bundles":[] +} diff --git a/res/META-INF/native-image/serialization-config.json b/res/META-INF/native-image/serialization-config.json new file mode 100644 index 00000000..0d4f101c --- /dev/null +++ b/res/META-INF/native-image/serialization-config.json @@ -0,0 +1,2 @@ +[ +] diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 00000000..9f53a074 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,10 @@ +pluginManagement { + repositories { + maven { + url "https://nexus.gluonhq.com/nexus/content/repositories/releases" + } + gradlePluginPortal() + } +} + +rootProject.name = 'lwjgl3-vulkan-demos' diff --git a/src/org/lwjgl/demo/DemoLauncher.java b/src/org/lwjgl/demo/DemoLauncher.java new file mode 100644 index 00000000..fcfabea8 --- /dev/null +++ b/src/org/lwjgl/demo/DemoLauncher.java @@ -0,0 +1,26 @@ +package org.lwjgl.demo; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +public class DemoLauncher { + + public static void main(String[] args) { + String demoClassName; + if (args.length > 0) { + demoClassName = args[0]; + } else { + throw new RuntimeException("Please specify a demo class!"); + } + + try { + Class demoClass = Class.forName("org.lwjgl.demo." + demoClassName); + Method mainMethod = demoClass.getMethod("main", String[].class); + mainMethod.invoke(null, (Object)new String[]{}); + } catch (ClassNotFoundException | NoSuchMethodException | SecurityException | + IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + e.printStackTrace(); + } + } + +} diff --git a/src/org/lwjgl/demo/util/AABBf.java b/src/org/lwjgl/demo/util/AABBf.java new file mode 100644 index 00000000..e11217bd --- /dev/null +++ b/src/org/lwjgl/demo/util/AABBf.java @@ -0,0 +1,23 @@ +package org.lwjgl.demo.util; + +public class AABBf { + public float minX, minY, minZ, maxX, maxY, maxZ; + + public float getMax(int k) { + switch (k) { + case 0: return maxX; + case 1: return maxY; + case 2: return maxZ; + default: throw new IllegalArgumentException(); + } + } + + public float getMin(int k) { + switch (k) { + case 0: return minX; + case 1: return minY; + case 2: return minZ; + default: throw new IllegalArgumentException(); + } + } +} diff --git a/src/org/lwjgl/demo/util/Collider.java b/src/org/lwjgl/demo/util/Collider.java index 43de2a96..7da7eb0a 100644 --- a/src/org/lwjgl/demo/util/Collider.java +++ b/src/org/lwjgl/demo/util/Collider.java @@ -4,7 +4,6 @@ */ package org.lwjgl.demo.util; -import org.joml.AABBf; import org.joml.Vector3f; import org.lwjgl.demo.util.KDTreei.Voxel; From 7d4bad4f49613cc36f9b86c5c40e29211540c934 Mon Sep 17 00:00:00 2001 From: Tue Ton <49886739+chirontt@users.noreply.github.com> Date: Sun, 21 Mar 2021 20:11:55 -0400 Subject: [PATCH 06/11] add GraalVM substitutions class --- src/org/lwjgl/graalvm/LwjglSubstitutions.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 src/org/lwjgl/graalvm/LwjglSubstitutions.java diff --git a/src/org/lwjgl/graalvm/LwjglSubstitutions.java b/src/org/lwjgl/graalvm/LwjglSubstitutions.java new file mode 100644 index 00000000..a5e0aff8 --- /dev/null +++ b/src/org/lwjgl/graalvm/LwjglSubstitutions.java @@ -0,0 +1,37 @@ +package org.lwjgl.graalvm; + +import java.util.Optional; + +import org.lwjgl.Version; +import org.lwjgl.Version.BuildType; + +import com.oracle.svm.core.annotate.Alias; +import com.oracle.svm.core.annotate.RecomputeFieldValue; +import com.oracle.svm.core.annotate.RecomputeFieldValue.Kind; +import com.oracle.svm.core.annotate.Substitute; +import com.oracle.svm.core.annotate.TargetClass; + +@TargetClass(org.lwjgl.Version.class) +final class Target_org_lwjgl_Version { + + @Alias + @RecomputeFieldValue(kind = Kind.FromAlias, isFinal = true) + public static int VERSION_MAJOR, VERSION_MINOR, VERSION_REVISION; + + @Alias + @RecomputeFieldValue(kind = Kind.FromAlias, isFinal = true) + public static BuildType BUILD_TYPE; + + @Substitute + public static String getVersion() { + String implVersion = Version.class.getPackage().getImplementationVersion(); + return String.valueOf(VERSION_MAJOR) + + '.' + VERSION_MINOR + + '.' + VERSION_REVISION + BUILD_TYPE.postfix + + ' ' + Optional.ofNullable(implVersion).orElse("SNAPSHOT"); + } +} + +/** Dummy class with the file's name. */ +public class LwjglSubstitutions { +} From 906ba51a95440a82c3bcd73f3c58556ea4eea2ac Mon Sep 17 00:00:00 2001 From: Tue Ton <49886739+chirontt@users.noreply.github.com> Date: Tue, 23 Mar 2021 19:30:54 -0400 Subject: [PATCH 07/11] compile the OpenGL demos to native executable - compile against LWJGL 3.2.3 version - restrict to the OpenGL demos (code & resources) - exclude the SWT demos for now - use GraalVM native-image utility to produce native executable containing the OpenGL demos. --- README.md | 162 +++++++- build.gradle | 37 +- pom.xml | 50 +-- res/META-INF/native-image/reflect-config.json | 382 ++++++++++++++++++ .../native-image/resource-config.json | 181 ++++++++- settings.gradle | 2 +- src/org/lwjgl/graalvm/LwjglSubstitutions.java | 52 +++ 7 files changed, 807 insertions(+), 59 deletions(-) diff --git a/README.md b/README.md index 9e9ea5db..ba18b324 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,158 @@ -# lwjgl3-demos -Demo suite for LWJGL 3 +# lwjgl3-opengl-demos + GraalVM native image -## Building +OpenGL Demos for LWJGL 3 compiled to native executable by GraalVM native-image utility. - ./mvnw package - -To override main class +All OpenGL demos in [src/org/lwjgl/demo/opengl](src/org/lwjgl/demo/opengl) are included in the build. - ./mvnw package -Dclass=opengl.UniformArrayDemo +Gradle and Maven build scripts are provided for building the project, +which requires JDK 11+ or GraalVM 21+ (for native image). -## Running +## GraalVM pre-requisites - java -jar target/lwjgl3-demos.jar +The [GraalVM native-image](https://www.graalvm.org/reference-manual/native-image) page +shows how to set up GraalVM and its native-image utility for common platforms. +[Gluon](https://gluonhq.com/) also provides some setup +[details](https://docs.gluonhq.com/#_platforms) for GraalVM native-image creation. -on Mac OS you need to specify the `-XstartOnFirstThread` JVM argument, so the above becomes: +This project's Gradle build script uses the +[client-gradle-plugin](https://github.com/gluonhq/client-gradle-plugin) +from Gluon to build the native executable from Gradle with GraalVM. - java -XstartOnFirstThread -jar target/lwjgl3-demos.jar +The GraalVM native-image utility will use the configuration files in +`res/META-INF/native-image` folder to assist in the native-image generation. -To override main class +Gluon also provides the [client-maven-plugin](https://github.com/gluonhq/client-maven-plugin) +which is used in this project's Maven build script and works similarly to the above +client-gradle-plugin. + +## Gradle build tasks + +### Run in standard JVM + +To build and run the OpenGL demos in standard JVM with Gradle, execute the `run` task: + + gradlew run + +By default, the [SimpleDrawElements](src/org/lwjgl/demo/opengl/SimpleDrawElements.java) demo is executed +by the above `run` task without parameter. To run a different OpenGL demo, e.g. +[WavefrontObjDemo](src/org/lwjgl/demo/opengl/assimp/WavefrontObjDemo.java), execute the `run` task +with that specific demo class as parameter: + + gradlew run --args=opengl.assimp.WavefrontObjDemo + +System properties can be passed on to the running demo with the -D parameter, +e.g. to print out some debug info in the console: + + gradlew run --args=opengl.assimp.WavefrontObjDemo -Dorg.lwjgl.util.Debug=true + +The above tasks can use any standard JDK 11+. + +### Produce native executable + +To generate native executable, GraalVM 21+ need be set up as mentioned in +*GraalVM pre-requisites* section above. + +Once GraalVM is set up and available in the path, run the `nativeBuild` task: + + gradlew nativeBuild + +The `nativeBuild` task would take a while to compile the OpenGL demo source code and +link them with the LWJGL libraries into an executable file. +The resulting `lwjgl3-opengl-demos` file is (in Linux): + + build/client/x86_64-linux/lwjgl3-opengl-demos + +(or if building on a Windows machine: + + build\client\x86_64-windows\lwjgl3-opengl-demos.exe + +) + +which can then be run directly with a demo class as parameter +(e.g. [DepthEdgeShaderDemo20](src/org/lwjgl/demo/opengl/fbo/DepthEdgeShaderDemo20.java)): + + ./build/client/x86_64-linux/lwjgl3-opengl-demos opengl.fbo.DepthEdgeShaderDemo20 + +System properties can be passed on to the running demo with the -D parameter, +e.g. to print out some debug info in the console: + + ./build/client/x86_64-linux/lwjgl3-opengl-demos opengl.fbo.DepthEdgeShaderDemo20 -Dorg.lwjgl.util.Debug=true + +(or if building on a Windows machine: + + build\client\x86_64-windows\lwjgl3-opengl-demos.exe opengl.fbo.DepthEdgeShaderDemo20 + build\client\x86_64-windows\lwjgl3-opengl-demos.exe opengl.fbo.DepthEdgeShaderDemo20 -Dorg.lwjgl.util.Debug=true + +) + +## Maven build tasks + +### Run in standard JVM + +To build and run the OpenGL demos in standard JVM with Maven, execute the +`compile` then `exec:exec` tasks: + + mvnw compile + mvnw exec:exec + +By default, the [SimpleDrawElements](src/org/lwjgl/demo/opengl/SimpleDrawElements.java) demo is executed +by the above `exec:exec` task without parameter. To run a different OpenGL demo, e.g. +[WavefrontObjDemo](src/org/lwjgl/demo/opengl/assimp/WavefrontObjDemo.java), execute the `exec:exec` task +with that specific demo class as value of the property `class`: + + mvnw exec:exec -Dclass=opengl.assimp.WavefrontObjDemo + +System properties can be passed on to the running demo with the -Dsys.props parameter, +e.g. to print out some debug info in the console: + + mvnw exec:exec -Dclass=opengl.assimp.WavefrontObjDemo -Dsys.props="-Dorg.lwjgl.util.Debug=true" + +The above tasks can use any standard JDK 11+. + +### Produce native executable + +To generate native executable, GraalVM 21+ need be set up as mentioned in +*GraalVM pre-requisites* section above. + +Once GraalVM is set up and available in the path, run the `client:build` task: + + mvnw client:build + +The `client:build` task would take a while to compile the OpenGL demo source code and +link them with the LWJGL libraries into an executable file. +The resulting `lwjgl3-opengl-demos` file is (in Linux): + + target/client/x86_64-linux/lwjgl3-opengl-demos + +(or if building on a Windows machine: + + target\client\x86_64-windows\lwjgl3-opengl-demos.exe + +) + +which can then be run directly with a demo class as parameter +(e.g. [Demo33Ubo](src/org/lwjgl/demo/opengl/raytracing/Demo33Ubo.java)): + + ./target/client/x86_64-linux/lwjgl3-opengl-demos opengl.raytracing.Demo33Ubo + +System properties can be passed on to the running demo with the -D parameter, +e.g. to print out some debug info in the console: + + ./target/client/x86_64-linux/lwjgl3-opengl-demos opengl.raytracing.Demo33Ubo -Dorg.lwjgl.util.Debug=true + +(or if building on a Windows machine: + + target\client\x86_64-windows\lwjgl3-opengl-demos.exe opengl.raytracing.Demo33Ubo + target\client\x86_64-windows\lwjgl3-opengl-demos.exe opengl.raytracing.Demo33Ubo -Dorg.lwjgl.util.Debug=true + +) + +## Compressed native executable + +The resulting `lwjgl3-opengl-demos` executable file, whether produced by Gradle or Maven build script, +can be further reduced in size via compression using the [UPX](https://upx.github.io) utility, +as described [here](https://medium.com/graalvm/compressed-graalvm-native-images-4d233766a214). + +For example, the resulting `lwjgl3-opengl-demos.exe` native application file produced in Windows +is normally 72MB in size, but is compressed to 24MB with the UPX command: `upx --best lwjgl3-opengl-demos.exe` - java -cp target/lwjgl3-demos.jar org.lwjgl.demo.opengl.UniformArrayDemo diff --git a/build.gradle b/build.gradle index 80d58443..1e2751e7 100644 --- a/build.gradle +++ b/build.gradle @@ -9,7 +9,7 @@ wrapper { } group = 'org.lwjgl' -description = 'LWJGL3 Vulkan demos with native image by GraalVM' +description = 'LWJGL3 OpenGL demos with native image by GraalVM' //version = '0.0.1-SNAPSHOT' ext { @@ -17,8 +17,8 @@ ext { jomlVersion = '1.10.1' graalvmVersion = '21.0.0.2' - //LWJGL modules used: minimal Vulkan (minus openal), plus shaderc and vma - lwjglModules = ['lwjgl', 'lwjgl-assimp', 'lwjgl-glfw', 'lwjgl-shaderc', 'lwjgl-stb', 'lwjgl-vma', 'lwjgl-vulkan'] + //LWJGL modules used: minimal OpenGL + lwjglModules = ['lwjgl', 'lwjgl-assimp', 'lwjgl-glfw', 'lwjgl-openal', 'lwjgl-opengl', 'lwjgl-stb'] mainClassName = 'org.lwjgl.demo.DemoLauncher' } @@ -42,13 +42,15 @@ private static String getCurrentPlatform() { } dependencies { - //get recommended dependency versions from the LWJGL BOM - implementation platform("org.lwjgl:lwjgl-bom:$lwjglVersion") - implementation "org.joml:joml:$jomlVersion" + //for compiling GraalVM substitution classes + compileOnly "org.graalvm.nativeimage:svm:$graalvmVersion" def currentOS = getCurrentPlatform() - + + //get recommended dependency versions from the LWJGL BOM + implementation platform("org.lwjgl:lwjgl-bom:$lwjglVersion") + //add LWJGL modules and the current OS's natives to the compile and runtime classpaths lwjglModules.each { implementation "org.lwjgl:$it" @@ -64,9 +66,6 @@ dependencies { } } } - - //for compiling GraalVM substitution classes - compileOnly "org.graalvm.nativeimage:svm:$graalvmVersion" } sourceSets { @@ -75,16 +74,20 @@ sourceSets { srcDirs = ['src'] //include launcher & GraalVM substitution code include 'org/lwjgl/demo/DemoLauncher.java', 'org/lwjgl/graalvm/*' - //restrict to vulkan demo source code - include 'org/lwjgl/demo/vulkan/*' + //restrict to opengl demo source code & utilities + include 'org/lwjgl/demo/opengl/**' + include 'org/lwjgl/demo/intro/*' include 'org/lwjgl/demo/util/*' + //exclude the SWT demo source code for now + exclude 'org/lwjgl/demo/opengl/swt/*' } resources { srcDirs = ['res'] //include the GraalVM native-image configuration files include 'META-INF/native-image/**' - //restrict to vulkan demo resources only - include 'org/lwjgl/demo/vulkan/**' + //restrict to opengl demo resources only + include 'org/lwjgl/demo/*' + include 'org/lwjgl/demo/opengl/**' } } } @@ -99,10 +102,12 @@ compileJava { options.encoding = 'UTF-8' } -jar.archiveBaseName = 'lwjgl3-vulkan-demos' +jar.archiveBaseName = 'lwjgl3-opengl-demos' run { - args 'vulkan.ColoredRotatingQuadDemo' //default demo is vulkan.ColoredRotatingQuadDemo + //default demo is opengl.SimpleDrawElements + //(the package "org.lwjgl.demo." is prepended automatically) + args 'opengl.SimpleDrawElements' //get system properties specified from the command line (for debugging, etc.) //and pass them on to the running application's JVM diff --git a/pom.xml b/pom.xml index 00fbc640..80878686 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 org.lwjgl - lwjgl3-vulkan-demos + lwjgl3-opengl-demos 0.0.1-SNAPSHOT UTF-8 @@ -19,14 +19,14 @@ org.lwjgl.demo.DemoLauncher - vulkan.ColoredRotatingQuadDemo + opengl.SimpleDrawElements - lwjgl3-vulkan-demos - LWJGL3 Vulkan demos with native image by GraalVM + lwjgl3-opengl-demos + LWJGL3 OpenGL demos with native image by GraalVM windows @@ -96,14 +96,6 @@ macos - - - org.lwjgl - lwjgl-vulkan - ${lwjgl.version} - natives-macos - - @@ -114,8 +106,9 @@ META-INF/native-image/* - - org/lwjgl/demo/vulkan/**/* + + org/lwjgl/demo/opengl/**/* + org/lwjgl/demo/* @@ -128,10 +121,15 @@ org/lwjgl/demo/DemoLauncher.java org/lwjgl/graalvm/*.java - - org/lwjgl/demo/vulkan/*.java + + org/lwjgl/demo/opengl/**/*.java + org/lwjgl/demo/intro/*.java org/lwjgl/demo/util/*.java + + + org/lwjgl/demo/opengl/swt/*.java + @@ -204,9 +202,9 @@ org.graalvm.nativeimage svm ${graalvm.version} - provided + compile - + org.lwjgl lwjgl @@ -221,19 +219,15 @@ org.lwjgl - lwjgl-shaderc + lwjgl-openal org.lwjgl - lwjgl-stb - - - org.lwjgl - lwjgl-vma + lwjgl-opengl org.lwjgl - lwjgl-vulkan + lwjgl-stb org.lwjgl @@ -252,17 +246,17 @@ org.lwjgl - lwjgl-shaderc + lwjgl-openal natives-${platform} org.lwjgl - lwjgl-stb + lwjgl-opengl natives-${platform} org.lwjgl - lwjgl-vma + lwjgl-stb natives-${platform} diff --git a/res/META-INF/native-image/reflect-config.json b/res/META-INF/native-image/reflect-config.json index 4fbaaf35..d2023041 100644 --- a/res/META-INF/native-image/reflect-config.json +++ b/res/META-INF/native-image/reflect-config.json @@ -196,6 +196,388 @@ "allDeclaredClasses":true, "allPublicClasses":true }, +{ + "name":"org.lwjgl.assimp.AIColor4D", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.assimp.AIFace", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.assimp.AIFace$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.assimp.AIFile", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.assimp.AIFileIO", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.assimp.AIMaterial", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.assimp.AIMesh", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.assimp.AIScene", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.assimp.AIVector3D", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.assimp.AIVector3D$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.demo.opengl.SimpleDrawElements", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.SimpleTriangleStripGrid", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.UniformArrayDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.assimp.WavefrontObjDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.fbo.DepthEdgeShaderDemo20", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.fbo.EdgeShaderDemo20", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.fbo.EdgeShaderMultisampleDemo20", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.fbo.MultisampledFbo2Demo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.fbo.MultisampledFboDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.fbo.ReadDepthBufferDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.geometry.GeometryShaderTest", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.geometry.GeometryShaderTest20", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.geometry.SilhouetteDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.glfw.Multithreaded", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.instancing.GrassDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.AlphaGrass", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.AtomicDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.CubeTraceMerged", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.Demo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.Demo20", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.Demo33", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.Demo33Ubo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.DemoSsbo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.DemoSsboTrianglesStacklessKdTree", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.GL33KdTreeTrace", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.HybridDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.HybridDemoSsbo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.HybridDemoSsboInstancing", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.HybridDemoSsboInstancing45", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.HybridDemoSsboTriangles", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.HybridDemoSsboTriangles$GPUObject", + "allDeclaredFields":true +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.LinearlyTransformedCosines", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.PhotonMappingBindlessDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.PhotonMappingDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.TransformFeedbackDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.VoxelLightmapping", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.VoxelLightmapping2", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.tutorial.Tutorial1", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.tutorial.Tutorial2", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.tutorial.Tutorial3", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.tutorial.Tutorial4", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.tutorial.Tutorial4_2", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.tutorial.Tutorial4_3", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.tutorial.Tutorial5", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.tutorial.Tutorial6", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.tutorial.Tutorial6_2", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.tutorial.Tutorial7", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.tutorial.Tutorial7$GPUNode", + "allDeclaredFields":true +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.tutorial.Tutorial8", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.tutorial.Tutorial8_2", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.shader.ImmediateModeDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.shader.InfiniteDraggablePlaneDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.shader.InfinitePlaneDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.shader.NoVerticesBSplineDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.shader.NoVerticesGridDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.shader.NoVerticesPolygonDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.shader.NoVerticesProjectedGridDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.shadow.Omni2dShadow", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.shadow.ShadowMappingDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.shadow.ShadowMappingDemo20", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.textures.BillboardCubemapDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.textures.EnvironmentDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.textures.EnvironmentTeapotDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.textures.FullscreenCubemapDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.textures.SimpleProceduralTextureDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.textures.SimpleTexturedQuad", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.textures.SimpleTexturedSphere", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.textures.Texture2DArrayMipmapping", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, { "name":"org.lwjgl.glfw.GLFW", "allDeclaredFields":true diff --git a/res/META-INF/native-image/resource-config.json b/res/META-INF/native-image/resource-config.json index cc13d8ae..d4401076 100644 --- a/res/META-INF/native-image/resource-config.json +++ b/res/META-INF/native-image/resource-config.json @@ -1,14 +1,193 @@ { "resources":{ "includes":[ + {"pattern":"\\Qlinux/x64/org/lwjgl/assimp/libassimp.so\\E"}, + {"pattern":"\\Qlinux/x64/org/lwjgl/glfw/libglfw.so\\E"}, + {"pattern":"\\Qlinux/x64/org/lwjgl/glfw/libglfw_wayland.so\\E"}, + {"pattern":"\\Qlinux/x64/org/lwjgl/liblwjgl.so\\E"}, + {"pattern":"\\Qlinux/x64/org/lwjgl/openal/libopenal.so\\E"}, + {"pattern":"\\Qlinux/x64/org/lwjgl/opengl/liblwjgl_opengl.so\\E"}, + {"pattern":"\\Qlinux/x64/org/lwjgl/stb/liblwjgl_stb.so\\E"}, {"pattern":"\\Qmacos/x64/org/lwjgl/assimp/libassimp.dylib\\E"}, {"pattern":"\\Qmacos/x64/org/lwjgl/glfw/libglfw.dylib\\E"}, {"pattern":"\\Qmacos/x64/org/lwjgl/liblwjgl.dylib\\E"}, {"pattern":"\\Qmacos/x64/org/lwjgl/openal/libopenal.dylib\\E"}, {"pattern":"\\Qmacos/x64/org/lwjgl/opengl/liblwjgl_opengl.dylib\\E"}, {"pattern":"\\Qmacos/x64/org/lwjgl/stb/liblwjgl_stb.dylib\\E"}, - {"pattern":"\\Qmacos/x64/org/lwjgl/vulkan/libMoltenVK.dylib\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/assimp/magnet.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/assimp/magnet.mtl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/assimp/magnet.obj\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/assimp/magnet.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/fbo/color.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/fbo/depth-edge-fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/fbo/depth-edge-vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/fbo/normal-fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/fbo/normal-vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/fbo/quadDepth.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/fbo/quadDepth.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/fbo/rasterDepth.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/fbo/rasterDepth.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/fbo/sobel-edge-fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/fbo/sobel-edge-vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/fbo/sobel-outline-fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/fbo/sobel-outline-vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/geometry/fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/geometry/fs110.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/geometry/gs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/geometry/gs110.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/geometry/silhouette-fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/geometry/silhouette-gs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/geometry/silhouette-vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/geometry/vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/geometry/vs110.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/instancing/grass.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/instancing/grass.png\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/instancing/grass.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/instancing/grass2.png\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/instancing/grass_flower.png\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/instancing/grass_flower_blue.png\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/instancing/ground.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/instancing/ground.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/models/cube.obj.zip\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/models/lwjgl3.obj.zip\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/models/smoothicosphere.obj.zip\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/models/teapot.obj.zip\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/alphagrass/grass_high.png\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/alphagrass/kdtreeseparate32grass.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/cubetracemerged/compute.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/feedbackSsboTriangle.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/gl33kdtreetrace/quad.vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/gl33kdtreetrace/raytracing.fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/hybrid.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/hybridSsbo.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/hybridSsboTriangle.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/hybridSsboUbo.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/linearlytransformedcosines/ltc1.data\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/linearlytransformedcosines/ltc2.data\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/linearlytransformedcosines/quad.fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/linearlytransformedcosines/quad.vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/linearlytransformedcosines/raytracing.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/photonmap.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/quad.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/quad.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/quad110.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/quad110.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/random.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/random20.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/randomAtomic.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/randomCommon.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/raster.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/raster.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/rasterInstanced.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/rasterInstancedUbo.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/rasterPhotonMap.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/raytracing.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/raytracing.glslcs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/raytracing110.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/raytracingAtomic.glslcs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/raytracingSsbo.glslcs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/raytracingUbo.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/transformFeedback.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial1/quad.fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial1/quad.vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial1/raytracing.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial2/random.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial2/raytracing.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial3/quad.fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial3/quad.vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial3/random.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial3/raytracing.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial4/quad.fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial4/quad.vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial4/random.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial4/raytracing.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial4_2/blueNoise.png\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial4_2/random.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial4_3/random.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial4_3/ranking_128_128_8_4spp.data\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial4_3/scramble_128_128_8_4spp.data\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial4_3/sobol_256_256_4spp.data\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial5/atrous.fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial5/atrous.vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial5/quad.fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial5/quad.vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial5/random.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial5/raytracing.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial7/raster.fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial7/raster.vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial7/sponza.obj.zip\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial8/atrous.fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial8/atrous.vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial8/cubes.obj\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial8/quad.fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial8/quad.vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial8/random.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial8/raster.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial8/rasterAndTrace.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial8/rasterDepth.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial8/rasterDepth.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial8_2/cubes.obj\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial8_2/random.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial8_2/raster.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial8_2/rasterAndTrace.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/voxellightmapping/raster.fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/voxellightmapping/raster.vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/voxellightmapping2/raster.fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/voxellightmapping2/raster.vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/voxellightmapping2/trace.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/shader/noverticesbspline.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/shader/noverticesbspline.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/shader/noverticesgrid.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/shader/noverticesgrid.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/shader/noverticespolygon.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/shader/noverticespolygon.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/shader/noverticesprojectedgrid.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/shader/noverticesprojectedgrid.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/shader/simple.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/shader/simple.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/shadow/omni2dShadow-fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/shadow/omni2dShadow-gs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/shadow/omni2dShadow-vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/shadow/omni2dShadowShade-fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/shadow/omni2dShadowShade-vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/shadow/scene.obj.zip\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/shadow/shadowMapping-fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/shadow/shadowMapping-vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/shadow/shadowMappingShade-fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/shadow/shadowMappingShade-vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/textures/cubemap.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/textures/cubemap.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/textures/cubemapBH.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/textures/cubemapBH.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/textures/cubemapBack.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/textures/cubemapBack.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/textures/earth.jpg\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/textures/environment.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/textures/environment.jpg\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/textures/environment.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/textures/teapot.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/textures/teapot.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/textures/texture2dArrayMipmap.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/textures/texture2dArrayMipmap.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/textures/texturedQuad.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/textures/texturedQuad.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/textures/texturedSphere.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/textures/texturedSphere.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/uniformarray-fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/uniformarray-vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/space_back6.jpg\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/space_bottom4.jpg\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/space_front5.jpg\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/space_left2.jpg\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/space_right1.jpg\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/space_top3.jpg\\E"}, {"pattern":"\\Qorg/lwjgl/system/APIUtil.class\\E"}, + {"pattern":"\\Qwindows/x64/org/lwjgl/assimp/assimp.dll\\E"}, + {"pattern":"\\Qwindows/x64/org/lwjgl/glfw/glfw.dll\\E"}, + {"pattern":"\\Qwindows/x64/org/lwjgl/lwjgl.dll\\E"}, + {"pattern":"\\Qwindows/x64/org/lwjgl/openal/OpenAL.dll\\E"}, + {"pattern":"\\Qwindows/x64/org/lwjgl/opengl/lwjgl_opengl.dll\\E"}, + {"pattern":"\\Qwindows/x64/org/lwjgl/stb/lwjgl_stb.dll\\E"} ]}, "bundles":[] } diff --git a/settings.gradle b/settings.gradle index 9f53a074..b4f5be60 100644 --- a/settings.gradle +++ b/settings.gradle @@ -7,4 +7,4 @@ pluginManagement { } } -rootProject.name = 'lwjgl3-vulkan-demos' +rootProject.name = 'lwjgl3-opengl-demos' diff --git a/src/org/lwjgl/graalvm/LwjglSubstitutions.java b/src/org/lwjgl/graalvm/LwjglSubstitutions.java index a5e0aff8..df02158f 100644 --- a/src/org/lwjgl/graalvm/LwjglSubstitutions.java +++ b/src/org/lwjgl/graalvm/LwjglSubstitutions.java @@ -1,5 +1,11 @@ package org.lwjgl.graalvm; +import static org.lwjgl.system.MemoryUtil.*; +import static org.lwjgl.system.Pointer.*; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; import java.util.Optional; import org.lwjgl.Version; @@ -32,6 +38,52 @@ public static String getVersion() { } } +@TargetClass(org.lwjgl.system.ThreadLocalUtil.class) +final class Target_org_lwjgl_system_ThreadLocalUtil { + + @Alias + @RecomputeFieldValue(kind = Kind.FromAlias, isFinal = true) + private static long JNI_NATIVE_INTERFACE; + + @Alias + @RecomputeFieldValue(kind = Kind.FromAlias, isFinal = true) + private static long FUNCTION_MISSING_ABORT; + + @Substitute + public static void setFunctionMissingAddresses(Class capabilitiesClass, int index) { + if (capabilitiesClass == null) { + long missingCaps = memGetAddress(JNI_NATIVE_INTERFACE + Integer.toUnsignedLong(index) * POINTER_SIZE); + if (missingCaps != NULL) { + getAllocator().free(missingCaps); + memPutAddress(JNI_NATIVE_INTERFACE + Integer.toUnsignedLong(index) * POINTER_SIZE, NULL); + } + } else { + int functionCount = getFieldsFromCapabilities(capabilitiesClass).size(); + + long missingCaps = getAllocator().malloc(Integer.toUnsignedLong(functionCount) * POINTER_SIZE); + for (int i = 0; i < functionCount; i++) { + memPutAddress(missingCaps + Integer.toUnsignedLong(i) * POINTER_SIZE, FUNCTION_MISSING_ABORT); + } + + //the whole purpose of substituting this method is just to remove the following line + //(which causes the resulting native image to crash!) + //memPutAddress(JNI_NATIVE_INTERFACE + Integer.toUnsignedLong(index) * POINTER_SIZE, missingCaps); + } + } + + //copied verbatim from the original class + @Substitute + private static List getFieldsFromCapabilities(Class capabilitiesClass) { + List fields = new ArrayList<>(); + for (Field field : capabilitiesClass.getFields()) { + if (field.getType() == long.class) { + fields.add(field); + } + } + return fields; + } +} + /** Dummy class with the file's name. */ public class LwjglSubstitutions { } From a02719c9a25d462c76b0b51a418cc8bad9fa640d Mon Sep 17 00:00:00 2001 From: Tue Ton <49886739+chirontt@users.noreply.github.com> Date: Thu, 25 Mar 2021 18:55:16 -0400 Subject: [PATCH 08/11] include SWT demos in the overall OpenGL demo suite - src/org/lwjgl/demo/opengl/swt classes are now included in the build - SWT has different APIs for different platforms, especially in the native-to-Java callbacks, which makes it challenging to create portable build script to generate platform-specific native images from platform-specific configuration files - Gluon provides the client-gradle-plugin/client-maven-plugin for Gradle/Maven, which have excellent supports for platform-specific configuration files to generate platform-specific native images - platform-specific configuration files for SWT are in the res/META-INF/substrate/config directory which are used by the Gluon plugins during the native-image building. --- build.gradle | 13 +- pom.xml | 41 ++- res/META-INF/native-image/reflect-config.json | 11 + .../native-image/resource-config.json | 4 + .../config/jniconfig-x86_64-darwin.json | 2 + .../config/jniconfig-x86_64-linux.json | 260 ++++++++++++++++ .../config/jniconfig-x86_64-windows.json | 289 ++++++++++++++++++ 7 files changed, 612 insertions(+), 8 deletions(-) create mode 100644 res/META-INF/substrate/config/jniconfig-x86_64-darwin.json create mode 100644 res/META-INF/substrate/config/jniconfig-x86_64-linux.json create mode 100644 res/META-INF/substrate/config/jniconfig-x86_64-windows.json diff --git a/build.gradle b/build.gradle index 1e2751e7..3d7f60c4 100644 --- a/build.gradle +++ b/build.gradle @@ -15,6 +15,7 @@ description = 'LWJGL3 OpenGL demos with native image by GraalVM' ext { lwjglVersion = '3.2.3' jomlVersion = '1.10.1' + swtVersion = '4.6.1' graalvmVersion = '21.0.0.2' //LWJGL modules used: minimal OpenGL @@ -48,6 +49,14 @@ dependencies { def currentOS = getCurrentPlatform() + //OS-specific SWT library (64-bit Intel/AMD hardware only) + if (currentOS == 'windows') + implementation "org.eclipse.swt:org.eclipse.swt.win32.win32.x86_64:$swtVersion" + else if (currentOS == 'linux') + implementation "org.eclipse.swt:org.eclipse.swt.gtk.linux.x86_64:$swtVersion" + else if (currentOS == 'macos') + implementation "org.eclipse.swt:org.eclipse.swt.cocoa.macosx.x86_64:$swtVersion" + //get recommended dependency versions from the LWJGL BOM implementation platform("org.lwjgl:lwjgl-bom:$lwjglVersion") @@ -78,13 +87,11 @@ sourceSets { include 'org/lwjgl/demo/opengl/**' include 'org/lwjgl/demo/intro/*' include 'org/lwjgl/demo/util/*' - //exclude the SWT demo source code for now - exclude 'org/lwjgl/demo/opengl/swt/*' } resources { srcDirs = ['res'] //include the GraalVM native-image configuration files - include 'META-INF/native-image/**' + include 'META-INF/**' //restrict to opengl demo resources only include 'org/lwjgl/demo/*' include 'org/lwjgl/demo/opengl/**' diff --git a/pom.xml b/pom.xml index 80878686..00d7a239 100644 --- a/pom.xml +++ b/pom.xml @@ -47,6 +47,13 @@ x86 + + + org.eclipse.swt + org.eclipse.swt.win32.win32.x86 + ${swt.version} + + windows-amd64 @@ -56,6 +63,13 @@ amd64 + + + org.eclipse.swt + org.eclipse.swt.win32.win32.x86_64 + ${swt.version} + + linux @@ -76,6 +90,13 @@ x86 + + + org.eclipse.swt + org.eclipse.swt.gtk.linux.x86 + ${swt.version} + + linux-amd64 @@ -85,6 +106,13 @@ amd64 + + + org.eclipse.swt + org.eclipse.swt.gtk.linux.x86_64 + ${swt.version} + + mac @@ -96,6 +124,13 @@ macos + + + org.eclipse.swt + org.eclipse.swt.cocoa.macosx.x86_64 + ${swt.version} + + @@ -105,7 +140,7 @@ res - META-INF/native-image/* + META-INF/**/* org/lwjgl/demo/opengl/**/* org/lwjgl/demo/* @@ -126,10 +161,6 @@ org/lwjgl/demo/intro/*.java org/lwjgl/demo/util/*.java - - - org/lwjgl/demo/opengl/swt/*.java - diff --git a/res/META-INF/native-image/reflect-config.json b/res/META-INF/native-image/reflect-config.json index d2023041..08b61af9 100644 --- a/res/META-INF/native-image/reflect-config.json +++ b/res/META-INF/native-image/reflect-config.json @@ -21,6 +21,9 @@ "name":"java.nio.Buffer", "fields":[{"name":"address", "allowUnsafeAccess":true}] }, +{ + "name":"org.eclipse.swt.widgets.Display" +}, { "name":"org.joml.Matrix2f", "fields":[ @@ -546,6 +549,14 @@ "name":"org.lwjgl.demo.opengl.shadow.ShadowMappingDemo20", "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] }, +{ + "name":"org.lwjgl.demo.opengl.swt.SwtAndGlfwDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.swt.SwtDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, { "name":"org.lwjgl.demo.opengl.textures.BillboardCubemapDemo", "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] diff --git a/res/META-INF/native-image/resource-config.json b/res/META-INF/native-image/resource-config.json index d4401076..58b55ab4 100644 --- a/res/META-INF/native-image/resource-config.json +++ b/res/META-INF/native-image/resource-config.json @@ -1,6 +1,10 @@ { "resources":{ "includes":[ + {"pattern":"\\Qlibswt-cairo-gtk-4626.so\\E"}, + {"pattern":"\\Qlibswt-glx-gtk-4626.so\\E"}, + {"pattern":"\\Qlibswt-gtk-4626.so\\E"}, + {"pattern":"\\Qlibswt-pi3-gtk-4626.so\\E"}, {"pattern":"\\Qlinux/x64/org/lwjgl/assimp/libassimp.so\\E"}, {"pattern":"\\Qlinux/x64/org/lwjgl/glfw/libglfw.so\\E"}, {"pattern":"\\Qlinux/x64/org/lwjgl/glfw/libglfw_wayland.so\\E"}, diff --git a/res/META-INF/substrate/config/jniconfig-x86_64-darwin.json b/res/META-INF/substrate/config/jniconfig-x86_64-darwin.json new file mode 100644 index 00000000..0d4f101c --- /dev/null +++ b/res/META-INF/substrate/config/jniconfig-x86_64-darwin.json @@ -0,0 +1,2 @@ +[ +] diff --git a/res/META-INF/substrate/config/jniconfig-x86_64-linux.json b/res/META-INF/substrate/config/jniconfig-x86_64-linux.json new file mode 100644 index 00000000..1d7b2b60 --- /dev/null +++ b/res/META-INF/substrate/config/jniconfig-x86_64-linux.json @@ -0,0 +1,260 @@ +[ +{ + "name":"org.eclipse.swt.graphics.Device", + "methods":[{"name":"logProc","parameterTypes":["long","long","long","long"] }] +}, +{ + "name":"org.eclipse.swt.internal.gtk.GTypeInfo", + "fields":[ + {"name":"base_finalize"}, + {"name":"base_init"}, + {"name":"class_data"}, + {"name":"class_finalize"}, + {"name":"class_init"}, + {"name":"class_size"}, + {"name":"instance_init"}, + {"name":"instance_size"}, + {"name":"n_preallocs"}, + {"name":"value_table"} + ] +}, +{ + "name":"org.eclipse.swt.internal.gtk.GdkEvent", + "fields":[{"name":"type"}] +}, +{ + "name":"org.eclipse.swt.internal.gtk.GdkEventButton", + "fields":[ + {"name":"axes"}, + {"name":"button"}, + {"name":"device"}, + {"name":"send_event"}, + {"name":"state"}, + {"name":"time"}, + {"name":"window"}, + {"name":"x"}, + {"name":"x_root"}, + {"name":"y"}, + {"name":"y_root"} + ] +}, +{ + "name":"org.eclipse.swt.internal.gtk.GdkEventCrossing", + "fields":[ + {"name":"detail"}, + {"name":"focus"}, + {"name":"mode"}, + {"name":"send_event"}, + {"name":"state"}, + {"name":"subwindow"}, + {"name":"time"}, + {"name":"window"}, + {"name":"x"}, + {"name":"x_root"}, + {"name":"y"}, + {"name":"y_root"} + ] +}, +{ + "name":"org.eclipse.swt.internal.gtk.GdkEventFocus", + "fields":[ + {"name":"in"}, + {"name":"send_event"}, + {"name":"window"} + ] +}, +{ + "name":"org.eclipse.swt.internal.gtk.GdkEventKey", + "fields":[ + {"name":"group"}, + {"name":"hardware_keycode"}, + {"name":"keyval"}, + {"name":"length"}, + {"name":"send_event"}, + {"name":"state"}, + {"name":"string"}, + {"name":"time"}, + {"name":"window"} + ] +}, +{ + "name":"org.eclipse.swt.internal.gtk.GdkEventMotion", + "fields":[ + {"name":"axes"}, + {"name":"device"}, + {"name":"is_hint"}, + {"name":"send_event"}, + {"name":"state"}, + {"name":"time"}, + {"name":"window"}, + {"name":"x"}, + {"name":"x_root"}, + {"name":"y"}, + {"name":"y_root"} + ] +}, +{ + "name":"org.eclipse.swt.internal.gtk.GdkEventProperty", + "fields":[ + {"name":"atom"}, + {"name":"send_event"}, + {"name":"state"}, + {"name":"time"}, + {"name":"window"} + ] +}, +{ + "name":"org.eclipse.swt.internal.gtk.GdkEventWindowState", + "fields":[ + {"name":"changed_mask"}, + {"name":"new_window_state"}, + {"name":"send_event"}, + {"name":"window"} + ] +}, +{ + "name":"org.eclipse.swt.internal.gtk.GdkGeometry", + "fields":[ + {"name":"base_height"}, + {"name":"base_width"}, + {"name":"height_inc"}, + {"name":"max_aspect"}, + {"name":"max_height"}, + {"name":"max_width"}, + {"name":"min_aspect"}, + {"name":"min_height"}, + {"name":"min_width"}, + {"name":"width_inc"}, + {"name":"win_gravity"} + ] +}, +{ + "name":"org.eclipse.swt.internal.gtk.GdkRGBA", + "fields":[ + {"name":"alpha"}, + {"name":"blue"}, + {"name":"green"}, + {"name":"red"} + ] +}, +{ + "name":"org.eclipse.swt.internal.gtk.GdkRectangle", + "fields":[ + {"name":"height"}, + {"name":"width"}, + {"name":"x"}, + {"name":"y"} + ] +}, +{ + "name":"org.eclipse.swt.internal.gtk.GdkWindowAttr", + "fields":[ + {"name":"colormap"}, + {"name":"cursor"}, + {"name":"event_mask"}, + {"name":"height"}, + {"name":"override_redirect"}, + {"name":"title"}, + {"name":"visual"}, + {"name":"wclass"}, + {"name":"width"}, + {"name":"window_type"}, + {"name":"wmclass_class"}, + {"name":"wmclass_name"}, + {"name":"x"}, + {"name":"y"} + ] +}, +{ + "name":"org.eclipse.swt.internal.gtk.GtkAllocation", + "fields":[ + {"name":"height"}, + {"name":"width"}, + {"name":"x"}, + {"name":"y"} + ] +}, +{ + "name":"org.eclipse.swt.internal.gtk.GtkBorder", + "fields":[ + {"name":"bottom"}, + {"name":"left"}, + {"name":"right"}, + {"name":"top"} + ] +}, +{ + "name":"org.eclipse.swt.internal.gtk.GtkRequisition", + "fields":[ + {"name":"height"}, + {"name":"width"} + ] +}, +{ + "name":"org.eclipse.swt.internal.gtk.XAnyEvent", + "fields":[ + {"name":"display"}, + {"name":"send_event"}, + {"name":"serial"}, + {"name":"window"} + ] +}, +{ + "name":"org.eclipse.swt.internal.gtk.XEvent", + "fields":[{"name":"type"}] +}, +{ + "name":"org.eclipse.swt.internal.gtk.XExposeEvent", + "fields":[ + {"name":"count"}, + {"name":"height"}, + {"name":"width"}, + {"name":"x"}, + {"name":"y"} + ] +}, +{ + "name":"org.eclipse.swt.internal.opengl.glx.XVisualInfo", + "fields":[ + {"name":"bits_per_rgb"}, + {"name":"blue_mask"}, + {"name":"cclass"}, + {"name":"colormap_size"}, + {"name":"depth"}, + {"name":"green_mask"}, + {"name":"red_mask"}, + {"name":"screen"}, + {"name":"visual"}, + {"name":"visualid"} + ] +}, +{ + "name":"org.eclipse.swt.widgets.Display", + "methods":[ + {"name":"allChildrenProc","parameterTypes":["long","long"] }, + {"name":"caretProc","parameterTypes":["long"] }, + {"name":"cellDataProc","parameterTypes":["long","long","long","long","long"] }, + {"name":"checkIfEventProc","parameterTypes":["long","long","long"] }, + {"name":"emissionProc","parameterTypes":["long","long","long","long"] }, + {"name":"eventProc","parameterTypes":["long","long"] }, + {"name":"filterProc","parameterTypes":["long","long","long"] }, + {"name":"idleProc","parameterTypes":["long"] }, + {"name":"menuPositionProc","parameterTypes":["long","long","long","long","long"] }, + {"name":"mouseHoverProc","parameterTypes":["long"] }, + {"name":"rendererClassInitProc","parameterTypes":["long","long"] }, + {"name":"rendererGetPreferredWidthProc","parameterTypes":["long","long","long","long"] }, + {"name":"rendererRenderProc","parameterTypes":["long","long","long","long","long","long"] }, + {"name":"setDirectionProc","parameterTypes":["long","long"] }, + {"name":"shellMapProc","parameterTypes":["long","long","long"] }, + {"name":"signalProc","parameterTypes":["long","long","long"] }, + {"name":"sizeAllocateProc","parameterTypes":["long","long","long"] }, + {"name":"sizeRequestProc","parameterTypes":["long","long","long"] }, + {"name":"timerProc","parameterTypes":["long"] }, + {"name":"windowProc","parameterTypes":["long","long"] }, + {"name":"windowProc","parameterTypes":["long","long","long"] }, + {"name":"windowProc","parameterTypes":["long","long","long","long"] }, + {"name":"windowProc","parameterTypes":["long","long","long","long","long"] }, + {"name":"windowTimerProc","parameterTypes":["long"] } + ] +} +] diff --git a/res/META-INF/substrate/config/jniconfig-x86_64-windows.json b/res/META-INF/substrate/config/jniconfig-x86_64-windows.json new file mode 100644 index 00000000..b2598a3f --- /dev/null +++ b/res/META-INF/substrate/config/jniconfig-x86_64-windows.json @@ -0,0 +1,289 @@ +[ +{ + "name":"org.eclipse.swt.internal.opengl.win32.PIXELFORMATDESCRIPTOR", + "fields":[ + {"name":"bReserved"}, + {"name":"cAccumAlphaBits"}, + {"name":"cAccumBits"}, + {"name":"cAccumBlueBits"}, + {"name":"cAccumGreenBits"}, + {"name":"cAccumRedBits"}, + {"name":"cAlphaBits"}, + {"name":"cAlphaShift"}, + {"name":"cAuxBuffers"}, + {"name":"cBlueBits"}, + {"name":"cBlueShift"}, + {"name":"cColorBits"}, + {"name":"cDepthBits"}, + {"name":"cGreenBits"}, + {"name":"cGreenShift"}, + {"name":"cRedBits"}, + {"name":"cRedShift"}, + {"name":"cStencilBits"}, + {"name":"dwDamageMask"}, + {"name":"dwFlags"}, + {"name":"dwLayerMask"}, + {"name":"dwVisibleMask"}, + {"name":"iLayerType"}, + {"name":"iPixelType"}, + {"name":"nSize"}, + {"name":"nVersion"} + ] +}, +{ + "name":"org.eclipse.swt.internal.win32.ACTCTX", + "fields":[ + {"name":"cbSize"}, + {"name":"dwFlags"}, + {"name":"hModule"}, + {"name":"lpApplicationName"}, + {"name":"lpAssemblyDirectory"}, + {"name":"lpResourceName"}, + {"name":"lpSource"}, + {"name":"wLangId"}, + {"name":"wProcessorArchitecture"} + ] +}, +{ + "name":"org.eclipse.swt.internal.win32.DLLVERSIONINFO", + "fields":[ + {"name":"cbSize"}, + {"name":"dwBuildNumber"}, + {"name":"dwMajorVersion"}, + {"name":"dwMinorVersion"}, + {"name":"dwPlatformID"} + ] +}, +{ + "name":"org.eclipse.swt.internal.win32.HIGHCONTRAST", + "fields":[ + {"name":"cbSize"}, + {"name":"dwFlags"}, + {"name":"lpszDefaultScheme"} + ] +}, +{ + "name":"org.eclipse.swt.internal.win32.LOGFONT", + "fields":[ + {"name":"lfCharSet"}, + {"name":"lfClipPrecision"}, + {"name":"lfEscapement"}, + {"name":"lfHeight"}, + {"name":"lfItalic"}, + {"name":"lfOrientation"}, + {"name":"lfOutPrecision"}, + {"name":"lfPitchAndFamily"}, + {"name":"lfQuality"}, + {"name":"lfStrikeOut"}, + {"name":"lfUnderline"}, + {"name":"lfWeight"}, + {"name":"lfWidth"} + ] +}, +{ + "name":"org.eclipse.swt.internal.win32.LOGFONTW", + "fields":[{"name":"lfFaceName"}] +}, +{ + "name":"org.eclipse.swt.internal.win32.MENUITEMINFO", + "fields":[ + {"name":"cbSize"}, + {"name":"cch"}, + {"name":"dwItemData"}, + {"name":"dwTypeData"}, + {"name":"fMask"}, + {"name":"fState"}, + {"name":"fType"}, + {"name":"hSubMenu"}, + {"name":"hbmpChecked"}, + {"name":"hbmpItem"}, + {"name":"hbmpUnchecked"}, + {"name":"wID"} + ] +}, +{ + "name":"org.eclipse.swt.internal.win32.MINMAXINFO", + "fields":[ + {"name":"ptMaxPosition_x"}, + {"name":"ptMaxPosition_y"}, + {"name":"ptMaxSize_x"}, + {"name":"ptMaxSize_y"}, + {"name":"ptMaxTrackSize_x"}, + {"name":"ptMaxTrackSize_y"}, + {"name":"ptMinTrackSize_x"}, + {"name":"ptMinTrackSize_y"}, + {"name":"ptReserved_x"}, + {"name":"ptReserved_y"} + ] +}, +{ + "name":"org.eclipse.swt.internal.win32.MSG", + "fields":[ + {"name":"hwnd"}, + {"name":"lParam"}, + {"name":"message"}, + {"name":"time"}, + {"name":"wParam"}, + {"name":"x"}, + {"name":"y"} + ] +}, +{ + "name":"org.eclipse.swt.internal.win32.NONCLIENTMETRICS", + "fields":[ + {"name":"cbSize"}, + {"name":"iBorderWidth"}, + {"name":"iCaptionHeight"}, + {"name":"iCaptionWidth"}, + {"name":"iMenuHeight"}, + {"name":"iMenuWidth"}, + {"name":"iScrollHeight"}, + {"name":"iScrollWidth"}, + {"name":"iSmCaptionHeight"}, + {"name":"iSmCaptionWidth"} + ] +}, +{ + "name":"org.eclipse.swt.internal.win32.NONCLIENTMETRICSW", + "fields":[ + {"name":"lfCaptionFont"}, + {"name":"lfMenuFont"}, + {"name":"lfMessageFont"}, + {"name":"lfSmCaptionFont"}, + {"name":"lfStatusFont"} + ] +}, +{ + "name":"org.eclipse.swt.internal.win32.OSVERSIONINFO", + "fields":[ + {"name":"dwBuildNumber"}, + {"name":"dwMajorVersion"}, + {"name":"dwMinorVersion"}, + {"name":"dwOSVersionInfoSize"}, + {"name":"dwPlatformId"} + ] +}, +{ + "name":"org.eclipse.swt.internal.win32.OSVERSIONINFOW", + "fields":[{"name":"szCSDVersion"}] +}, +{ + "name":"org.eclipse.swt.internal.win32.PAINTSTRUCT", + "fields":[ + {"name":"bottom"}, + {"name":"fErase"}, + {"name":"fIncUpdate"}, + {"name":"fRestore"}, + {"name":"hdc"}, + {"name":"left"}, + {"name":"rgbReserved"}, + {"name":"right"}, + {"name":"top"} + ] +}, +{ + "name":"org.eclipse.swt.internal.win32.POINT", + "fields":[ + {"name":"x"}, + {"name":"y"} + ] +}, +{ + "name":"org.eclipse.swt.internal.win32.RECT", + "fields":[ + {"name":"bottom"}, + {"name":"left"}, + {"name":"right"}, + {"name":"top"} + ] +}, +{ + "name":"org.eclipse.swt.internal.win32.STARTUPINFO", + "fields":[ + {"name":"cb"}, + {"name":"cbReserved2"}, + {"name":"dwFillAttribute"}, + {"name":"dwFlags"}, + {"name":"dwX"}, + {"name":"dwXCountChars"}, + {"name":"dwXSize"}, + {"name":"dwY"}, + {"name":"dwYCountChars"}, + {"name":"dwYSize"}, + {"name":"hStdError"}, + {"name":"hStdInput"}, + {"name":"hStdOutput"}, + {"name":"lpDesktop"}, + {"name":"lpReserved"}, + {"name":"lpReserved2"}, + {"name":"lpTitle"}, + {"name":"wShowWindow"} + ] +}, +{ + "name":"org.eclipse.swt.internal.win32.TEXTMETRIC", + "fields":[ + {"name":"tmAscent"}, + {"name":"tmAveCharWidth"}, + {"name":"tmCharSet"}, + {"name":"tmDescent"}, + {"name":"tmDigitizedAspectX"}, + {"name":"tmDigitizedAspectY"}, + {"name":"tmExternalLeading"}, + {"name":"tmHeight"}, + {"name":"tmInternalLeading"}, + {"name":"tmItalic"}, + {"name":"tmMaxCharWidth"}, + {"name":"tmOverhang"}, + {"name":"tmPitchAndFamily"}, + {"name":"tmStruckOut"}, + {"name":"tmUnderlined"}, + {"name":"tmWeight"} + ] +}, +{ + "name":"org.eclipse.swt.internal.win32.TEXTMETRICW", + "fields":[ + {"name":"tmBreakChar"}, + {"name":"tmDefaultChar"}, + {"name":"tmFirstChar"}, + {"name":"tmLastChar"} + ] +}, +{ + "name":"org.eclipse.swt.internal.win32.WINDOWPOS", + "fields":[ + {"name":"cx"}, + {"name":"cy"}, + {"name":"flags"}, + {"name":"hwnd"}, + {"name":"hwndInsertAfter"}, + {"name":"x"}, + {"name":"y"} + ] +}, +{ + "name":"org.eclipse.swt.internal.win32.WNDCLASS", + "fields":[ + {"name":"cbClsExtra"}, + {"name":"cbWndExtra"}, + {"name":"hCursor"}, + {"name":"hIcon"}, + {"name":"hInstance"}, + {"name":"hbrBackground"}, + {"name":"lpfnWndProc"}, + {"name":"lpszClassName"}, + {"name":"lpszMenuName"}, + {"name":"style"} + ] +}, +{ + "name":"org.eclipse.swt.widgets.Display", + "methods":[ + {"name":"foregroundIdleProc","parameterTypes":["long","long","long"] }, + {"name":"messageProc","parameterTypes":["long","long","long","long"] }, + {"name":"msgFilterProc","parameterTypes":["long","long","long"] }, + {"name":"windowProc","parameterTypes":["long","long","long","long"] } + ] +} +] From 8b3e7473f996c22f13a2b461857cad542cee2cbe Mon Sep 17 00:00:00 2001 From: Tue Ton <49886739+chirontt@users.noreply.github.com> Date: Sat, 17 Apr 2021 23:17:20 -0400 Subject: [PATCH 09/11] lots of Vulkan classes manually added to the reflect-config.json file, to make the Vulkan demos working in the generated native image. --- README.md | 10 +- pom.xml | 2 +- res/META-INF/native-image/reflect-config.json | 1673 +++++++++++++++++ .../native-image/resource-config.json | 41 +- 4 files changed, 1719 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index b30cd15a..655c4f61 100644 --- a/README.md +++ b/README.md @@ -2,10 +2,10 @@ Demos for LWJGL 3, compiled to native executable by GraalVM native-image utility. -All demos in [src](src) are included in the build. Most demos are portable across different OSes, -but some are platform-specific, like the [Vulkan demos](src/org/lwjgl/demo/vulkan) which work -only on Mac platform, or the [CUDA demos](src/org/lwjgl/demo/cuda) which require a NVIDIA graphics -card to run. +All demos in [src](src/org/lwjgl/demo) are included in the build. Most demos are portable +across different OSes, but some are GPU-specific, like the [Vulkan demos](src/org/lwjgl/demo/vulkan) +which need a discrete GPU with supporting Vulkan driver, or the [CUDA demos](src/org/lwjgl/demo/cuda) +which require a NVIDIA graphics card to run. Gradle and Maven build scripts are provided for building the project, which requires JDK 11+ or GraalVM 21+ (for native image). @@ -182,5 +182,5 @@ can be further reduced in size via compression using the [UPX](https://upx.githu as described [here](https://medium.com/graalvm/compressed-graalvm-native-images-4d233766a214). For example, the resulting `lwjgl3-demos.exe` native application file produced in Windows -is normally 79MB in size, but is compressed to 26MB with the UPX command: `upx --best lwjgl3-demos.exe` +is normally 109MB in size, but is compressed to 33MB with the UPX command: `upx --best lwjgl3-demos.exe` diff --git a/pom.xml b/pom.xml index 5fdbbcdb..33dd9b6f 100644 --- a/pom.xml +++ b/pom.xml @@ -215,7 +215,7 @@ org.graalvm.nativeimage svm ${graalvm.version} - compile + provided diff --git a/res/META-INF/native-image/reflect-config.json b/res/META-INF/native-image/reflect-config.json index a889b4f9..c7b29c57 100644 --- a/res/META-INF/native-image/reflect-config.json +++ b/res/META-INF/native-image/reflect-config.json @@ -532,6 +532,10 @@ "name":"org.lwjgl.demo.opengl.raytracing.DemoSsboTrianglesStacklessKdTree", "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] }, +{ + "name":"org.lwjgl.demo.opengl.raytracing.DemoSsboTrianglesStacklessKdTree$GPUNode", + "allDeclaredFields":true +}, { "name":"org.lwjgl.demo.opengl.raytracing.GL33KdTreeTrace", "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] @@ -616,10 +620,18 @@ "name":"org.lwjgl.demo.opengl.raytracing.tutorial.Tutorial6", "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] }, +{ + "name":"org.lwjgl.demo.opengl.raytracing.tutorial.Tutorial6$GPUNode", + "allDeclaredFields":true +}, { "name":"org.lwjgl.demo.opengl.raytracing.tutorial.Tutorial6_2", "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] }, +{ + "name":"org.lwjgl.demo.opengl.raytracing.tutorial.Tutorial6_2$GPUNode", + "allDeclaredFields":true +}, { "name":"org.lwjgl.demo.opengl.raytracing.tutorial.Tutorial7", "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] @@ -833,6 +845,1667 @@ "name":"org.lwjgl.system.jemalloc.JEmallocAllocator", "methods":[{"name":"","parameterTypes":[] }] }, +{ + "name":"org.lwjgl.util.shaderc.Shaderc", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.util.vma.VmaAllocationCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.util.vma.VmaAllocationInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.util.vma.VmaAllocatorCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.util.vma.VmaVulkanFunctions", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.EXTDebugReport", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.EXTDebugUtils", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.KHRDisplaySwapchain", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.KHRSurface", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.KHRSwapchain", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.NVRayTracing", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VK10", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkAccelerationStructureCreateInfoNV", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkAccelerationStructureInfoNV", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkAccelerationStructureMemoryRequirementsInfoNV", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkApplicationInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkAttachmentDescription", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkAttachmentDescription$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkAttachmentReference", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkAttachmentReference$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkBindAccelerationStructureMemoryInfoNV", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkBindAccelerationStructureMemoryInfoNV$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkBufferCopy", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkBufferCopy$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkBufferCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkBufferImageCopy", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkBufferImageCopy$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkClearColorValue", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkClearDepthStencilValue", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkClearValue", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkClearValue$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkCommandBuffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkCommandBufferAllocateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkCommandBufferBeginInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkCommandPoolCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkComponentMapping", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkDebugReportCallbackCreateInfoEXT", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkDebugReportCallbackEXT", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkDebugUtilsMessengerCallbackDataEXT", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkDebugUtilsMessengerCallbackEXT", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkDebugUtilsMessengerCreateInfoEXT", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorBufferInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorBufferInfo$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorImageInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorImageInfo$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorPoolCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorPoolSize", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorPoolSize$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorSetAllocateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorSetLayoutBinding", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorSetLayoutBinding$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorSetLayoutCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkDevice", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkDeviceCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkDeviceQueueCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkDeviceQueueCreateInfo$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkExtensionProperties", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkExtensionProperties$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkExtent2D", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkExtent3D", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkFenceCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkFormatProperties", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkFramebufferCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkGeometryAABBNV", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkGeometryNV", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkGeometryNV$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkGeometryTrianglesNV", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkGraphicsPipelineCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkGraphicsPipelineCreateInfo$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageBlit", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageBlit$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageCopy", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageCopy$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageMemoryBarrier", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageMemoryBarrier$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageSubresourceRange", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageViewCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkInstance", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkInstanceCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkLayerProperties", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkLayerProperties$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkMemoryAllocateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkMemoryBarrier", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkMemoryBarrier$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkMemoryRequirements", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkMemoryRequirements2KHR", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkMemoryType", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkOffset2D", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkOffset3D", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkPhysicalDevice", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkPhysicalDevice16BitStorageFeatures", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkPhysicalDevice8BitStorageFeaturesKHR", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkPhysicalDeviceDescriptorIndexingFeaturesEXT", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkPhysicalDeviceFeatures", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkPhysicalDeviceFeatures2", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkPhysicalDeviceFloat16Int8FeaturesKHR", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkPhysicalDeviceMemoryProperties", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkPhysicalDeviceProperties", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkPhysicalDeviceProperties2", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkPhysicalDeviceRayTracingPropertiesNV", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineColorBlendAttachmentState", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineColorBlendAttachmentState$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineColorBlendStateCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineDepthStencilStateCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineDynamicStateCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineInputAssemblyStateCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineLayoutCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineMultisampleStateCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineRasterizationStateCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineShaderStageCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineShaderStageCreateInfo$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineVertexInputStateCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineViewportStateCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkPresentInfoKHR", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkQueryPoolCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkQueue", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkQueueFamilyProperties", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkQueueFamilyProperties$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkRayTracingPipelineCreateInfoNV", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkRayTracingShaderGroupCreateInfoNV", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkRayTracingShaderGroupCreateInfoNV$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkRect2D", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkRect2D$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkRenderPassBeginInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkRenderPassCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkSamplerCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkSemaphoreCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkShaderModuleCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkSpecializationInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkSpecializationMapEntry", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkSpecializationMapEntry$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkStencilOpState", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkSubmitInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkSubpassDependency", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkSubpassDependency$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkSubpassDescription", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkSubpassDescription$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkSurfaceCapabilitiesKHR", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkSurfaceFormatKHR", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkSurfaceFormatKHR$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkSwapchainCreateInfoKHR", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkVertexInputAttributeDescription", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkVertexInputAttributeDescription$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkVertexInputBindingDescription", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkVertexInputBindingDescription$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkViewport", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkViewport$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkWriteDescriptorSet", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkWriteDescriptorSet$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkWriteDescriptorSetAccelerationStructureNV", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, { "name":"sun.misc.Unsafe", "allDeclaredFields":true, diff --git a/res/META-INF/native-image/resource-config.json b/res/META-INF/native-image/resource-config.json index 77d3f97e..aafbb70d 100644 --- a/res/META-INF/native-image/resource-config.json +++ b/res/META-INF/native-image/resource-config.json @@ -13,7 +13,10 @@ {"pattern":"\\Qlinux/x64/org/lwjgl/liblwjgl.so\\E"}, {"pattern":"\\Qlinux/x64/org/lwjgl/openal/libopenal.so\\E"}, {"pattern":"\\Qlinux/x64/org/lwjgl/opengl/liblwjgl_opengl.so\\E"}, + {"pattern":"\\Qlinux/x64/org/lwjgl/shaderc/libshaderc.so\\E"}, + {"pattern":"\\Qlinux/x64/org/lwjgl/shaderc/libshaderc_spvc.so\\E"}, {"pattern":"\\Qlinux/x64/org/lwjgl/stb/liblwjgl_stb.so\\E"}, + {"pattern":"\\Qlinux/x64/org/lwjgl/vma/liblwjgl_vma.so\\E"}, {"pattern":"\\Qmacos/x64/org/lwjgl/assimp/libassimp.dylib\\E"}, {"pattern":"\\Qmacos/x64/org/lwjgl/bgfx/libbgfx.dylib\\E"}, {"pattern":"\\Qmacos/x64/org/lwjgl/glfw/libglfw.dylib\\E"}, @@ -21,7 +24,10 @@ {"pattern":"\\Qmacos/x64/org/lwjgl/liblwjgl.dylib\\E"}, {"pattern":"\\Qmacos/x64/org/lwjgl/openal/libopenal.dylib\\E"}, {"pattern":"\\Qmacos/x64/org/lwjgl/opengl/liblwjgl_opengl.dylib\\E"}, + {"pattern":"\\Qmacos/x64/org/lwjgl/shaderc/libshaderc.dylib\\E"}, + {"pattern":"\\Qmacos/x64/org/lwjgl/shaderc/libshaderc_spvc.dylib\\E"}, {"pattern":"\\Qmacos/x64/org/lwjgl/stb/liblwjgl_stb.dylib\\E"}, + {"pattern":"\\Qmacos/x64/org/lwjgl/vma/liblwjgl_vma.dylib\\E"}, {"pattern":"\\Qmacos/x64/org/lwjgl/vulkan/libMoltenVK.dylib\\E"}, {"pattern":"\\Qorg/lwjgl/demo/bgfx/shaders/dx11/fs_bump.bin\\E"}, {"pattern":"\\Qorg/lwjgl/demo/bgfx/shaders/dx11/fs_cubes.bin\\E"}, @@ -56,6 +62,9 @@ {"pattern":"\\Qorg/lwjgl/demo/game/voxelgame/collectdrawcalls.vs.glsl\\E"}, {"pattern":"\\Qorg/lwjgl/demo/game/voxelgame/selection.fs.glsl\\E"}, {"pattern":"\\Qorg/lwjgl/demo/game/voxelgame/selection.vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/models/mikelovesrobots_mmmm/obj_house1.vox\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/models/mikelovesrobots_mmmm/scene_house5.vox\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/models/mikelovesrobots_mmmm/scene_house6.vox\\E"}, {"pattern":"\\Qorg/lwjgl/demo/opengl/assimp/magnet.fs\\E"}, {"pattern":"\\Qorg/lwjgl/demo/opengl/assimp/magnet.mtl\\E"}, {"pattern":"\\Qorg/lwjgl/demo/opengl/assimp/magnet.obj\\E"}, @@ -110,6 +119,7 @@ {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/linearlytransformedcosines/quad.vs.glsl\\E"}, {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/linearlytransformedcosines/raytracing.glsl\\E"}, {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/photonmap.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/photonmapBindless.glsl\\E"}, {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/quad.fs\\E"}, {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/quad.vs\\E"}, {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/quad110.fs\\E"}, @@ -129,6 +139,7 @@ {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/raytracingAtomic.glslcs\\E"}, {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/raytracingSsbo.glslcs\\E"}, {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/raytracingUbo.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/ssboTriangleStacklessKdTree.glsl\\E"}, {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/transformFeedback.vs\\E"}, {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial1/quad.fs.glsl\\E"}, {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial1/quad.vs.glsl\\E"}, @@ -145,8 +156,11 @@ {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial4/raytracing.glsl\\E"}, {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial4_2/blueNoise.png\\E"}, {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial4_2/random.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial4_3/quad.fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial4_3/quad.vs.glsl\\E"}, {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial4_3/random.glsl\\E"}, {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial4_3/ranking_128_128_8_4spp.data\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial4_3/raytracing.glsl\\E"}, {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial4_3/scramble_128_128_8_4spp.data\\E"}, {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial4_3/sobol_256_256_4spp.data\\E"}, {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial5/atrous.fs.glsl\\E"}, @@ -155,8 +169,23 @@ {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial5/quad.vs.glsl\\E"}, {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial5/random.glsl\\E"}, {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial5/raytracing.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial6/geometry.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial6/quad.fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial6/quad.vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial6/raytracing.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial6/scene.obj.zip\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial6_2/geometry.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial6_2/quad.fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial6_2/quad.vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial6_2/raytracing.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial6_2/scene.obj.zip\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial7/geometry.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial7/quad.fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial7/quad.vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial7/random.glsl\\E"}, {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial7/raster.fs.glsl\\E"}, {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial7/raster.vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial7/raytracing.glsl\\E"}, {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial7/sponza.obj.zip\\E"}, {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial8/atrous.fs.glsl\\E"}, {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial8/atrous.vs.glsl\\E"}, @@ -172,8 +201,15 @@ {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial8_2/random.glsl\\E"}, {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial8_2/raster.vs\\E"}, {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial8_2/rasterAndTrace.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/voxellightmapping/lightmap.fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/voxellightmapping/lightmap.vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/voxellightmapping/random.glsl\\E"}, {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/voxellightmapping/raster.fs.glsl\\E"}, {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/voxellightmapping/raster.vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/voxellightmapping/trace.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/voxellightmapping2/lightmap.fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/voxellightmapping2/lightmap.vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/voxellightmapping2/random.glsl\\E"}, {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/voxellightmapping2/raster.fs.glsl\\E"}, {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/voxellightmapping2/raster.vs.glsl\\E"}, {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/voxellightmapping2/trace.glsl\\E"}, @@ -254,7 +290,10 @@ {"pattern":"\\Qwindows/x64/org/lwjgl/lwjgl.dll\\E"}, {"pattern":"\\Qwindows/x64/org/lwjgl/openal/OpenAL.dll\\E"}, {"pattern":"\\Qwindows/x64/org/lwjgl/opengl/lwjgl_opengl.dll\\E"}, - {"pattern":"\\Qwindows/x64/org/lwjgl/stb/lwjgl_stb.dll\\E"} + {"pattern":"\\Qwindows/x64/org/lwjgl/shaderc/shaderc.dll\\E"}, + {"pattern":"\\Qwindows/x64/org/lwjgl/shaderc/shaderc_spvc.dll\\E"}, + {"pattern":"\\Qwindows/x64/org/lwjgl/stb/lwjgl_stb.dll\\E"}, + {"pattern":"\\Qwindows/x64/org/lwjgl/vma/lwjgl_vma.dll\\E"} ]}, "bundles":[] } From b34edafbd166014af19c8d4e680656a8299e3ae8 Mon Sep 17 00:00:00 2001 From: Tue Ton <49886739+chirontt@users.noreply.github.com> Date: Sat, 24 Apr 2021 18:42:54 -0400 Subject: [PATCH 10/11] update to use GraalVM 21.1.0 version --- build.gradle | 7 ++++--- pom.xml | 6 +++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/build.gradle b/build.gradle index 6e7e085a..54255da2 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,7 @@ plugins { id 'application' - id 'com.gluonhq.client-gradle-plugin' version '0.1.36' //requires GraalVM 21+ + id 'org.openjfx.javafxplugin' version '0.0.9' //requires JDK11+ + id 'com.gluonhq.client-gradle-plugin' version '0.1.39' //requires GraalVM 21.1+ } wrapper { @@ -16,7 +17,7 @@ ext { lwjglVersion = '3.2.3' jomlVersion = '1.10.1' swtVersion = '4.6.1' - graalvmVersion = '21.0.0.2' + graalvmVersion = '21.1.0' //LWJGL modules used: minimal OpenGL, plus bgfx, cuda, jemalloc, shaderc, vma, vulkan lwjglModules = [ @@ -24,7 +25,7 @@ ext { 'lwjgl-bgfx', //for BGFX demos 'lwjgl-cuda', //for CUDA demos (require NVIDIA hardware) 'lwjgl-jemalloc', //utilities - 'lwjgl-shaderc', 'lwjgl-vma', 'lwjgl-vulkan', //for Vulkan demos (run on Mac platform only) + 'lwjgl-shaderc', 'lwjgl-vma', 'lwjgl-vulkan', //for Vulkan demos (requires discrete GPU with Vulkan driver) ] mainClassName = 'org.lwjgl.demo.DemoLauncher' diff --git a/pom.xml b/pom.xml index 33dd9b6f..814ea481 100644 --- a/pom.xml +++ b/pom.xml @@ -13,8 +13,8 @@ 3.2.3 4.6.1 1.10.1 - 0.1.36 - 21.0.0.2 + 0.1.39 + 21.1.0 org.lwjgl.demo.DemoLauncher @@ -217,7 +217,7 @@ ${graalvm.version} provided - + org.lwjgl lwjgl From 3cee09a314e7f761eff0ea150c6754d07b381ba3 Mon Sep 17 00:00:00 2001 From: Tue Ton <49886739+chirontt@users.noreply.github.com> Date: Tue, 24 Aug 2021 13:15:32 -0400 Subject: [PATCH 11/11] use newer SWT version from Maven Central as the http://maven-eclipse.github.io/maven repo is no longer available. GraalVM native-image config files updated accordingly. --- .gitignore | 1 + .mvn/wrapper/maven-wrapper.properties | 2 +- README.md | 53 +- build.gradle | 43 +- .../META-INF/native-image/jni-config.json | 72 + .../predefined-classes-config.json | 8 + .../META-INF/native-image/proxy-config.json | 0 .../META-INF/native-image/reflect-config.json | 299 +- .../native-image/resource-config.json | 10 +- .../native-image/serialization-config.json | 0 .../macos/META-INF/native-image/.gitignore | 0 .../META-INF/native-image/jni-config.json | 73 + .../predefined-classes-config.json | 8 + .../META-INF/native-image/proxy-config.json | 0 .../META-INF/native-image/reflect-config.json | 2612 +++++++++++++++++ .../native-image/resource-config.json | 301 ++ .../native-image/serialization-config.json | 2 + gradle/wrapper/gradle-wrapper.properties | 2 +- pom.xml | 50 +- res/META-INF/native-image/jni-config.json | 49 - settings.gradle | 9 - 21 files changed, 3363 insertions(+), 231 deletions(-) rename res/META-INF/substrate/config/jniconfig-x86_64-linux.json => graal-cfg/linux/META-INF/native-image/jni-config.json (78%) create mode 100644 graal-cfg/linux/META-INF/native-image/predefined-classes-config.json rename {res => graal-cfg/linux}/META-INF/native-image/proxy-config.json (100%) rename {res => graal-cfg/linux}/META-INF/native-image/reflect-config.json (93%) rename {res => graal-cfg/linux}/META-INF/native-image/resource-config.json (98%) rename {res => graal-cfg/linux}/META-INF/native-image/serialization-config.json (100%) create mode 100644 graal-cfg/macos/META-INF/native-image/.gitignore rename res/META-INF/substrate/config/jniconfig-x86_64-windows.json => graal-cfg/windows/META-INF/native-image/jni-config.json (78%) create mode 100644 graal-cfg/windows/META-INF/native-image/predefined-classes-config.json rename res/META-INF/substrate/config/jniconfig-x86_64-darwin.json => graal-cfg/windows/META-INF/native-image/proxy-config.json (100%) create mode 100644 graal-cfg/windows/META-INF/native-image/reflect-config.json create mode 100644 graal-cfg/windows/META-INF/native-image/resource-config.json create mode 100644 graal-cfg/windows/META-INF/native-image/serialization-config.json delete mode 100644 res/META-INF/native-image/jni-config.json diff --git a/.gitignore b/.gitignore index 870a1fbc..380d08b8 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ /*.iml /dependency-reduced-pom.xml .gradle +.vscode diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties index 642d572c..abd303b6 100644 --- a/.mvn/wrapper/maven-wrapper.properties +++ b/.mvn/wrapper/maven-wrapper.properties @@ -1,2 +1,2 @@ -distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.2/apache-maven-3.8.2-bin.zip wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar diff --git a/README.md b/README.md index 655c4f61..bc1f4823 100644 --- a/README.md +++ b/README.md @@ -20,12 +20,12 @@ shows how to set up GraalVM and its native-image utility for common platforms. [details](https://docs.gluonhq.com/#_platforms) for GraalVM native-image creation. This project's Gradle build script uses the -[client-gradle-plugin](https://github.com/gluonhq/client-gradle-plugin) +[gluonfx-gradle-plugin](https://github.com/gluonhq/gluonfx-gradle-plugin) from Gluon to build the native executable from Gradle with GraalVM. -Gluon also provides the [client-maven-plugin](https://github.com/gluonhq/client-maven-plugin) +Gluon also provides the [gluonfx-maven-plugin](https://github.com/gluonhq/gluonfx-maven-plugin) which is used in this project's Maven build script and works similarly to the above -client-gradle-plugin. +gluonfx-gradle-plugin. ### Native-image configuration files @@ -36,23 +36,16 @@ The configuration files were generated when running the demos in standard JVM wi [GraalVM agent](https://www.graalvm.org/reference-manual/native-image/BuildConfiguration/#assisted-configuration-of-native-image-builds), which tracks all usages of dynamic features of an execution of the demos and writes the info to the configuration files. -Usage of the agent is contained in the [Gradle build script](build.gradle#L129), -or in the [Maven build script](pom.xml#L163), which can be turned on (i.e. uncommented) +Usage of the agent is contained in the [Gradle build script](build.gradle#L135), +or in the [Maven build script](pom.xml#L185), which can be turned on (i.e. uncommented) and the demos are re-run to update the configuration files, if need be. The above agent is not perfect; it sometimes misses some classes referenced via reflection -which is used extensively in LWJGL. In the case of the LWJGL demos, many org.lwjgl.bgfx.\* -and org.lwjgl.assimp.\* classes need be added manually to the configuration files, +which is used extensively in LWJGL. In the case of the LWJGL demos, many `org.lwjgl.bgfx.*` +and `org.lwjgl.assimp.*` classes need be added manually to the configuration files, to avoid ClassNotFoundException being thrown when running the [bgfx](src/org/lwjgl/demo/bgfx) or [assimp](src/org/lwjgl/demo/opengl/assimp) demos in the generated native image. -Gluon's client-gradle-plugin/client-maven-plugin also support their own configuration files, -in `res/META-INF/substrate/config` folder, which can be platform-specific -(e.g. for the Eclipse [SWT](https://www.eclipse.org/swt/) library used in our -[SWT demos](src/org/lwjgl/demo/opengl/swt)), as documented -[here](https://docs.gluonhq.com/#_substrate_config_files). -These files need be maintained manually. - ## Gradle build tasks ### Run in standard JVM @@ -88,28 +81,28 @@ The `nativeBuild` task would take a while to compile all demo source code and link them with the LWJGL libraries into an executable file. The resulting `lwjgl3-demos` file is (in Linux): - build/client/x86_64-linux/lwjgl3-demos + build/gluonfx/x86_64-linux/lwjgl3-demos (or if building on a Windows machine: - build\client\x86_64-windows\lwjgl3-demos.exe + build\gluonfx\x86_64-windows\lwjgl3-demos.exe ) which can then be run directly with a demo class as parameter (e.g. [DepthEdgeShaderDemo20](src/org/lwjgl/demo/opengl/fbo/DepthEdgeShaderDemo20.java)): - ./build/client/x86_64-linux/lwjgl3-demos opengl.fbo.DepthEdgeShaderDemo20 + ./build/gluonfx/x86_64-linux/lwjgl3-demos opengl.fbo.DepthEdgeShaderDemo20 System properties can be passed on to the running demo with the -D parameter, e.g. to print out some debug info in the console: - ./build/client/x86_64-linux/lwjgl3-demos opengl.fbo.DepthEdgeShaderDemo20 -Dorg.lwjgl.util.Debug=true + ./build/gluonfx/x86_64-linux/lwjgl3-demos opengl.fbo.DepthEdgeShaderDemo20 -Dorg.lwjgl.util.Debug=true (or if building on a Windows machine: - build\client\x86_64-windows\lwjgl3-demos.exe opengl.fbo.DepthEdgeShaderDemo20 - build\client\x86_64-windows\lwjgl3-demos.exe opengl.fbo.DepthEdgeShaderDemo20 -Dorg.lwjgl.util.Debug=true + build\gluonfx\x86_64-windows\lwjgl3-demos.exe opengl.fbo.DepthEdgeShaderDemo20 + build\gluonfx\x86_64-windows\lwjgl3-demos.exe opengl.fbo.DepthEdgeShaderDemo20 -Dorg.lwjgl.util.Debug=true ) @@ -142,36 +135,36 @@ The above tasks can use any standard JDK 11+. To generate native executable, GraalVM 21+ need be set up as mentioned in *GraalVM pre-requisites* section above. -Once GraalVM is set up and available in the path, run the `client:build` task: +Once GraalVM is set up and available in the path, run the `gluonfx:build` task: - mvnw client:build + mvnw gluonfx:build -The `client:build` task would take a while to compile all demo source code and +The `gluonfx:build` task would take a while to compile all demo source code and link them with the LWJGL libraries into an executable file. The resulting `lwjgl3-demos` file is (in Linux): - target/client/x86_64-linux/lwjgl3-demos + target/gluonfx/x86_64-linux/lwjgl3-demos (or if building on a Windows machine: - target\client\x86_64-windows\lwjgl3-demos.exe + target\gluonfx\x86_64-windows\lwjgl3-demos.exe ) which can then be run directly with a demo class as parameter (e.g. [Demo33Ubo](src/org/lwjgl/demo/opengl/raytracing/Demo33Ubo.java)): - ./target/client/x86_64-linux/lwjgl3-demos opengl.raytracing.Demo33Ubo + ./target/gluonfx/x86_64-linux/lwjgl3-demos opengl.raytracing.Demo33Ubo System properties can be passed on to the running demo with the -D parameter, e.g. to print out some debug info in the console: - ./target/client/x86_64-linux/lwjgl3-demos opengl.raytracing.Demo33Ubo -Dorg.lwjgl.util.Debug=true + ./target/gluonfx/x86_64-linux/lwjgl3-demos opengl.raytracing.Demo33Ubo -Dorg.lwjgl.util.Debug=true (or if building on a Windows machine: - target\client\x86_64-windows\lwjgl3-demos.exe opengl.raytracing.Demo33Ubo - target\client\x86_64-windows\lwjgl3-demos.exe opengl.raytracing.Demo33Ubo -Dorg.lwjgl.util.Debug=true + target\gluonfx\x86_64-windows\lwjgl3-demos.exe opengl.raytracing.Demo33Ubo + target\gluonfx\x86_64-windows\lwjgl3-demos.exe opengl.raytracing.Demo33Ubo -Dorg.lwjgl.util.Debug=true ) @@ -182,5 +175,5 @@ can be further reduced in size via compression using the [UPX](https://upx.githu as described [here](https://medium.com/graalvm/compressed-graalvm-native-images-4d233766a214). For example, the resulting `lwjgl3-demos.exe` native application file produced in Windows -is normally 109MB in size, but is compressed to 33MB with the UPX command: `upx --best lwjgl3-demos.exe` +is normally 88MB in size, but is compressed to 29MB with the UPX command: `upx --best lwjgl3-demos.exe` diff --git a/build.gradle b/build.gradle index 54255da2..05f47313 100644 --- a/build.gradle +++ b/build.gradle @@ -1,11 +1,11 @@ plugins { id 'application' - id 'org.openjfx.javafxplugin' version '0.0.9' //requires JDK11+ - id 'com.gluonhq.client-gradle-plugin' version '0.1.39' //requires GraalVM 21.1+ + id 'org.openjfx.javafxplugin' version '0.0.10' //requires JDK11+ + id 'com.gluonhq.gluonfx-gradle-plugin' version '1.0.4' //requires GraalVM 21.1+ } wrapper { - gradleVersion = '6.8.3' + gradleVersion = '7.2' distributionType = Wrapper.DistributionType.ALL } @@ -16,8 +16,8 @@ description = 'LWJGL3 demos with native image by GraalVM' ext { lwjglVersion = '3.2.3' jomlVersion = '1.10.1' - swtVersion = '4.6.1' - graalvmVersion = '21.1.0' + swtMavenVersion = '3.105.3' //contains Eclipse SWT 4.6.2.9 software + graalvmVersion = '21.2.0' //LWJGL modules used: minimal OpenGL, plus bgfx, cuda, jemalloc, shaderc, vma, vulkan lwjglModules = [ @@ -29,6 +29,7 @@ ext { ] mainClassName = 'org.lwjgl.demo.DemoLauncher' + currentPlatform = getCurrentPlatform() } repositories { @@ -54,21 +55,25 @@ dependencies { //for compiling GraalVM substitution classes compileOnly "org.graalvm.nativeimage:svm:$graalvmVersion" - def currentOS = getCurrentPlatform() - //OS-specific SWT library (64-bit Intel/AMD hardware only) - switch (currentOS) { + switch (currentPlatform) { case 'linux': - implementation "org.eclipse.swt:org.eclipse.swt.gtk.linux.x86_64:$swtVersion" + implementation("org.eclipse.platform:org.eclipse.swt.gtk.linux.x86_64:$swtMavenVersion") { + exclude group: 'org.eclipse.platform', module: 'org.eclipse.swt' + } break case 'macos': - implementation "org.eclipse.swt:org.eclipse.swt.cocoa.macosx.x86_64:$swtVersion" + implementation("org.eclipse.platform:org.eclipse.swt.cocoa.macosx.x86_64:$swtMavenVersion") { + exclude group: 'org.eclipse.platform', module: 'org.eclipse.swt' + } break case 'windows': - implementation "org.eclipse.swt:org.eclipse.swt.win32.win32.x86_64:$swtVersion" + implementation("org.eclipse.platform:org.eclipse.swt.win32.win32.x86_64:$swtMavenVersion") { + exclude group: 'org.eclipse.platform', module: 'org.eclipse.swt' + } break default: - throw new GradleException('Unknown OS: ' + currentOS) + throw new GradleException('Unknown OS: ' + currentPlatform) } //get recommended dependency versions from the LWJGL BOM @@ -80,12 +85,12 @@ dependencies { if (it != 'lwjgl-cuda' && it != 'lwjgl-egl') { //cuda, egl have no native modules //use natives for 64-bit Intel/AMD platforms only if (it == 'lwjgl-vulkan') { - if (currentOS == 'macos') { + if (currentPlatform == 'macos') { //Vulkan natives exist for Mac OSX only - runtimeOnly "org.lwjgl:$it::natives-$currentOS" + runtimeOnly "org.lwjgl:$it::natives-$currentPlatform" } } else { - runtimeOnly "org.lwjgl:$it::natives-$currentOS" + runtimeOnly "org.lwjgl:$it::natives-$currentPlatform" } } } @@ -97,7 +102,7 @@ sourceSets { srcDirs = ['src'] } resources { - srcDirs = ['res'] + srcDirs = ['res', "graal-cfg/$currentPlatform"] } } } @@ -124,13 +129,13 @@ run { //use the following jvmArgs for as many different run scenarios as possible, //and for all the code-execution paths as much as possible, //to generate (or merge with) the GraalVM native-image configuration files - //in the res/META-INF/native-image directory. + //in the graal-cfg/$currentPlatform/META-INF/native-image directory. //This directory is read by GraalVM during the native-image build. - //jvmArgs = ["-agentlib:native-image-agent=config-merge-dir=res/META-INF/native-image"] + //jvmArgs = ["-agentlib:native-image-agent=config-merge-dir=graal-cfg/$currentPlatform/META-INF/native-image"] } -gluonClient { +gluonfx { compilerArgs = [ '--initialize-at-run-time=org.lwjgl', '--report-unsupported-elements-at-runtime', diff --git a/res/META-INF/substrate/config/jniconfig-x86_64-linux.json b/graal-cfg/linux/META-INF/native-image/jni-config.json similarity index 78% rename from res/META-INF/substrate/config/jniconfig-x86_64-linux.json rename to graal-cfg/linux/META-INF/native-image/jni-config.json index 1d7b2b60..adb9a64c 100644 --- a/res/META-INF/substrate/config/jniconfig-x86_64-linux.json +++ b/graal-cfg/linux/META-INF/native-image/jni-config.json @@ -1,4 +1,17 @@ [ +{ + "name":"java.lang.ClassLoader", + "methods":[ + {"name":"getPlatformClassLoader","parameterTypes":[] }, + {"name":"loadClass","parameterTypes":["java.lang.String"] } + ] +}, +{ + "name":"java.lang.NoSuchMethodError" +}, +{ + "name":"jdk.internal.loader.ClassLoaders$PlatformClassLoader" +}, { "name":"org.eclipse.swt.graphics.Device", "methods":[{"name":"logProc","parameterTypes":["long","long","long","long"] }] @@ -103,6 +116,21 @@ {"name":"window"} ] }, +{ + "name":"org.eclipse.swt.internal.gtk.GdkEventScroll", + "fields":[ + {"name":"device"}, + {"name":"direction"}, + {"name":"send_event"}, + {"name":"state"}, + {"name":"time"}, + {"name":"window"}, + {"name":"x"}, + {"name":"x_root"}, + {"name":"y"}, + {"name":"y_root"} + ] +}, { "name":"org.eclipse.swt.internal.gtk.GdkEventWindowState", "fields":[ @@ -256,5 +284,49 @@ {"name":"windowProc","parameterTypes":["long","long","long","long","long"] }, {"name":"windowTimerProc","parameterTypes":["long"] } ] +}, +{ + "name":"org.graalvm.nativebridge.jni.JNIExceptionWrapperEntryPoints", + "methods":[{"name":"getClassName","parameterTypes":["java.lang.Class"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$B", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$D", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$F", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$I", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$J", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$N", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$P", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$S", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$V", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$Z", + "methods":[{"name":"callback","parameterTypes":["long"] }] } ] diff --git a/graal-cfg/linux/META-INF/native-image/predefined-classes-config.json b/graal-cfg/linux/META-INF/native-image/predefined-classes-config.json new file mode 100644 index 00000000..0e79b2c5 --- /dev/null +++ b/graal-cfg/linux/META-INF/native-image/predefined-classes-config.json @@ -0,0 +1,8 @@ +[ + { + "type":"agent-extracted", + "classes":[ + ] + } +] + diff --git a/res/META-INF/native-image/proxy-config.json b/graal-cfg/linux/META-INF/native-image/proxy-config.json similarity index 100% rename from res/META-INF/native-image/proxy-config.json rename to graal-cfg/linux/META-INF/native-image/proxy-config.json diff --git a/res/META-INF/native-image/reflect-config.json b/graal-cfg/linux/META-INF/native-image/reflect-config.json similarity index 93% rename from res/META-INF/native-image/reflect-config.json rename to graal-cfg/linux/META-INF/native-image/reflect-config.json index c7b29c57..78189540 100644 --- a/res/META-INF/native-image/reflect-config.json +++ b/graal-cfg/linux/META-INF/native-image/reflect-config.json @@ -1,4 +1,7 @@ [ +{ + "name":"byte[]" +}, { "name":"float[]" }, @@ -17,9 +20,32 @@ { "name":"java.lang.Object" }, +{ + "name":"java.lang.String" +}, +{ + "name":"java.lang.String[]" +}, { "name":"java.nio.Buffer", - "fields":[{"name":"address", "allowUnsafeAccess":true}] + "fields":[{"name":"address"}] +}, +{ + "name":"java.security.MessageDigestSpi" +}, +{ + "name":"java.security.interfaces.RSAPrivateKey" +}, +{ + "name":"java.security.interfaces.RSAPublicKey" +}, +{ + "name":"java.util.Date" +}, +{ + "name":"javax.security.auth.x500.X500Principal", + "fields":[{"name":"thisX500Name"}], + "methods":[{"name":"","parameterTypes":["sun.security.x509.X500Name"] }] }, { "name":"org.eclipse.swt.widgets.Display" @@ -27,165 +53,165 @@ { "name":"org.joml.Matrix2f", "fields":[ - {"name":"m00", "allowUnsafeAccess":true}, - {"name":"m01", "allowUnsafeAccess":true}, - {"name":"m10", "allowUnsafeAccess":true}, - {"name":"m11", "allowUnsafeAccess":true} + {"name":"m00"}, + {"name":"m01"}, + {"name":"m10"}, + {"name":"m11"} ] }, { "name":"org.joml.Matrix3d", "fields":[ - {"name":"m00", "allowUnsafeAccess":true}, - {"name":"m01", "allowUnsafeAccess":true}, - {"name":"m02", "allowUnsafeAccess":true}, - {"name":"m10", "allowUnsafeAccess":true}, - {"name":"m11", "allowUnsafeAccess":true}, - {"name":"m12", "allowUnsafeAccess":true}, - {"name":"m20", "allowUnsafeAccess":true}, - {"name":"m21", "allowUnsafeAccess":true}, - {"name":"m22", "allowUnsafeAccess":true} + {"name":"m00"}, + {"name":"m01"}, + {"name":"m02"}, + {"name":"m10"}, + {"name":"m11"}, + {"name":"m12"}, + {"name":"m20"}, + {"name":"m21"}, + {"name":"m22"} ] }, { "name":"org.joml.Matrix3f", "fields":[ - {"name":"m00", "allowUnsafeAccess":true}, - {"name":"m01", "allowUnsafeAccess":true}, - {"name":"m02", "allowUnsafeAccess":true}, - {"name":"m10", "allowUnsafeAccess":true}, - {"name":"m11", "allowUnsafeAccess":true}, - {"name":"m12", "allowUnsafeAccess":true}, - {"name":"m20", "allowUnsafeAccess":true}, - {"name":"m21", "allowUnsafeAccess":true}, - {"name":"m22", "allowUnsafeAccess":true} + {"name":"m00"}, + {"name":"m01"}, + {"name":"m02"}, + {"name":"m10"}, + {"name":"m11"}, + {"name":"m12"}, + {"name":"m20"}, + {"name":"m21"}, + {"name":"m22"} ] }, { "name":"org.joml.Matrix3x2f", "fields":[ - {"name":"m00", "allowUnsafeAccess":true}, - {"name":"m01", "allowUnsafeAccess":true}, - {"name":"m10", "allowUnsafeAccess":true}, - {"name":"m11", "allowUnsafeAccess":true}, - {"name":"m20", "allowUnsafeAccess":true}, - {"name":"m21", "allowUnsafeAccess":true} + {"name":"m00"}, + {"name":"m01"}, + {"name":"m10"}, + {"name":"m11"}, + {"name":"m20"}, + {"name":"m21"} ] }, { "name":"org.joml.Matrix4d", "fields":[ - {"name":"m00", "allowUnsafeAccess":true}, - {"name":"m01", "allowUnsafeAccess":true}, - {"name":"m02", "allowUnsafeAccess":true}, - {"name":"m03", "allowUnsafeAccess":true}, - {"name":"m10", "allowUnsafeAccess":true}, - {"name":"m11", "allowUnsafeAccess":true}, - {"name":"m12", "allowUnsafeAccess":true}, - {"name":"m13", "allowUnsafeAccess":true}, - {"name":"m20", "allowUnsafeAccess":true}, - {"name":"m21", "allowUnsafeAccess":true}, - {"name":"m22", "allowUnsafeAccess":true}, - {"name":"m23", "allowUnsafeAccess":true}, - {"name":"m30", "allowUnsafeAccess":true}, - {"name":"m31", "allowUnsafeAccess":true}, - {"name":"m32", "allowUnsafeAccess":true}, - {"name":"m33", "allowUnsafeAccess":true} + {"name":"m00"}, + {"name":"m01"}, + {"name":"m02"}, + {"name":"m03"}, + {"name":"m10"}, + {"name":"m11"}, + {"name":"m12"}, + {"name":"m13"}, + {"name":"m20"}, + {"name":"m21"}, + {"name":"m22"}, + {"name":"m23"}, + {"name":"m30"}, + {"name":"m31"}, + {"name":"m32"}, + {"name":"m33"} ] }, { "name":"org.joml.Matrix4f", "fields":[ - {"name":"m00", "allowUnsafeAccess":true}, - {"name":"m01", "allowUnsafeAccess":true}, - {"name":"m02", "allowUnsafeAccess":true}, - {"name":"m03", "allowUnsafeAccess":true}, - {"name":"m10", "allowUnsafeAccess":true}, - {"name":"m11", "allowUnsafeAccess":true}, - {"name":"m12", "allowUnsafeAccess":true}, - {"name":"m13", "allowUnsafeAccess":true}, - {"name":"m20", "allowUnsafeAccess":true}, - {"name":"m21", "allowUnsafeAccess":true}, - {"name":"m22", "allowUnsafeAccess":true}, - {"name":"m23", "allowUnsafeAccess":true}, - {"name":"m30", "allowUnsafeAccess":true}, - {"name":"m31", "allowUnsafeAccess":true}, - {"name":"m32", "allowUnsafeAccess":true}, - {"name":"m33", "allowUnsafeAccess":true} + {"name":"m00"}, + {"name":"m01"}, + {"name":"m02"}, + {"name":"m03"}, + {"name":"m10"}, + {"name":"m11"}, + {"name":"m12"}, + {"name":"m13"}, + {"name":"m20"}, + {"name":"m21"}, + {"name":"m22"}, + {"name":"m23"}, + {"name":"m30"}, + {"name":"m31"}, + {"name":"m32"}, + {"name":"m33"} ] }, { "name":"org.joml.Matrix4x3f", "fields":[ - {"name":"m00", "allowUnsafeAccess":true}, - {"name":"m01", "allowUnsafeAccess":true}, - {"name":"m02", "allowUnsafeAccess":true}, - {"name":"m10", "allowUnsafeAccess":true}, - {"name":"m11", "allowUnsafeAccess":true}, - {"name":"m12", "allowUnsafeAccess":true}, - {"name":"m20", "allowUnsafeAccess":true}, - {"name":"m21", "allowUnsafeAccess":true}, - {"name":"m22", "allowUnsafeAccess":true}, - {"name":"m30", "allowUnsafeAccess":true}, - {"name":"m31", "allowUnsafeAccess":true}, - {"name":"m32", "allowUnsafeAccess":true} + {"name":"m00"}, + {"name":"m01"}, + {"name":"m02"}, + {"name":"m10"}, + {"name":"m11"}, + {"name":"m12"}, + {"name":"m20"}, + {"name":"m21"}, + {"name":"m22"}, + {"name":"m30"}, + {"name":"m31"}, + {"name":"m32"} ] }, { "name":"org.joml.Quaternionf", "fields":[ - {"name":"w", "allowUnsafeAccess":true}, - {"name":"x", "allowUnsafeAccess":true}, - {"name":"y", "allowUnsafeAccess":true}, - {"name":"z", "allowUnsafeAccess":true} + {"name":"w"}, + {"name":"x"}, + {"name":"y"}, + {"name":"z"} ] }, { "name":"org.joml.Vector2f", "fields":[ - {"name":"x", "allowUnsafeAccess":true}, - {"name":"y", "allowUnsafeAccess":true} + {"name":"x"}, + {"name":"y"} ] }, { "name":"org.joml.Vector2i", "fields":[ - {"name":"x", "allowUnsafeAccess":true}, - {"name":"y", "allowUnsafeAccess":true} + {"name":"x"}, + {"name":"y"} ] }, { "name":"org.joml.Vector3f", "fields":[ - {"name":"x", "allowUnsafeAccess":true}, - {"name":"y", "allowUnsafeAccess":true}, - {"name":"z", "allowUnsafeAccess":true} + {"name":"x"}, + {"name":"y"}, + {"name":"z"} ] }, { "name":"org.joml.Vector3i", "fields":[ - {"name":"x", "allowUnsafeAccess":true}, - {"name":"y", "allowUnsafeAccess":true}, - {"name":"z", "allowUnsafeAccess":true} + {"name":"x"}, + {"name":"y"}, + {"name":"z"} ] }, { "name":"org.joml.Vector4f", "fields":[ - {"name":"w", "allowUnsafeAccess":true}, - {"name":"x", "allowUnsafeAccess":true}, - {"name":"y", "allowUnsafeAccess":true}, - {"name":"z", "allowUnsafeAccess":true} + {"name":"w"}, + {"name":"x"}, + {"name":"y"}, + {"name":"z"} ] }, { "name":"org.joml.Vector4i", "fields":[ - {"name":"w", "allowUnsafeAccess":true}, - {"name":"x", "allowUnsafeAccess":true}, - {"name":"y", "allowUnsafeAccess":true}, - {"name":"z", "allowUnsafeAccess":true} + {"name":"w"}, + {"name":"x"}, + {"name":"y"}, + {"name":"z"} ] }, { @@ -826,20 +852,20 @@ { "name":"org.lwjgl.system.CustomBuffer", "fields":[ - {"name":"capacity", "allowUnsafeAccess":true}, - {"name":"container", "allowUnsafeAccess":true}, - {"name":"limit", "allowUnsafeAccess":true}, - {"name":"mark", "allowUnsafeAccess":true}, - {"name":"position", "allowUnsafeAccess":true} + {"name":"capacity"}, + {"name":"container"}, + {"name":"limit"}, + {"name":"mark"}, + {"name":"position"} ] }, { "name":"org.lwjgl.system.Pointer$Default", - "fields":[{"name":"address", "allowUnsafeAccess":true}] + "fields":[{"name":"address"}] }, { "name":"org.lwjgl.system.Struct", - "fields":[{"name":"container", "allowUnsafeAccess":true}] + "fields":[{"name":"container"}] }, { "name":"org.lwjgl.system.jemalloc.JEmallocAllocator", @@ -2513,5 +2539,74 @@ {"name":"getLong","parameterTypes":["java.lang.Object","long"] }, {"name":"putLong","parameterTypes":["java.lang.Object","long","long"] } ] +}, +{ + "name":"sun.security.pkcs.SignerInfo[]" +}, +{ + "name":"sun.security.provider.SHA", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.security.provider.SHA2$SHA256", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.security.provider.X509Factory", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.security.rsa.RSAKeyFactory$Legacy", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.security.rsa.RSASignature$SHA1withRSA", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.security.rsa.RSASignature$SHA256withRSA", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.security.util.ObjectIdentifier" +}, +{ + "name":"sun.security.x509.AuthorityInfoAccessExtension", + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] +}, +{ + "name":"sun.security.x509.AuthorityKeyIdentifierExtension", + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] +}, +{ + "name":"sun.security.x509.BasicConstraintsExtension", + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] +}, +{ + "name":"sun.security.x509.CRLDistributionPointsExtension", + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] +}, +{ + "name":"sun.security.x509.CertificateExtensions" +}, +{ + "name":"sun.security.x509.CertificatePoliciesExtension", + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] +}, +{ + "name":"sun.security.x509.ExtendedKeyUsageExtension", + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] +}, +{ + "name":"sun.security.x509.KeyUsageExtension", + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] +}, +{ + "name":"sun.security.x509.SubjectAlternativeNameExtension", + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] +}, +{ + "name":"sun.security.x509.SubjectKeyIdentifierExtension", + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] } ] diff --git a/res/META-INF/native-image/resource-config.json b/graal-cfg/linux/META-INF/native-image/resource-config.json similarity index 98% rename from res/META-INF/native-image/resource-config.json rename to graal-cfg/linux/META-INF/native-image/resource-config.json index aafbb70d..26207411 100644 --- a/res/META-INF/native-image/resource-config.json +++ b/graal-cfg/linux/META-INF/native-image/resource-config.json @@ -1,10 +1,10 @@ { "resources":{ "includes":[ - {"pattern":"\\Qlibswt-cairo-gtk-4626.so\\E"}, - {"pattern":"\\Qlibswt-glx-gtk-4626.so\\E"}, - {"pattern":"\\Qlibswt-gtk-4626.so\\E"}, - {"pattern":"\\Qlibswt-pi3-gtk-4626.so\\E"}, + {"pattern":"\\Qlibswt-cairo-gtk-4629.so\\E"}, + {"pattern":"\\Qlibswt-glx-gtk-4629.so\\E"}, + {"pattern":"\\Qlibswt-gtk-4629.so\\E"}, + {"pattern":"\\Qlibswt-pi3-gtk-4629.so\\E"}, {"pattern":"\\Qlinux/x64/org/lwjgl/assimp/libassimp.so\\E"}, {"pattern":"\\Qlinux/x64/org/lwjgl/bgfx/libbgfx.so\\E"}, {"pattern":"\\Qlinux/x64/org/lwjgl/glfw/libglfw.so\\E"}, @@ -283,6 +283,8 @@ {"pattern":"\\Qorg/lwjgl/demo/vulkan/twoRotatingTriangles.frag\\E"}, {"pattern":"\\Qorg/lwjgl/demo/vulkan/twoRotatingTriangles.vert\\E"}, {"pattern":"\\Qorg/lwjgl/system/APIUtil.class\\E"}, + {"pattern":"\\Qswt-wgl-win32-4629.dll\\E"}, + {"pattern":"\\Qswt-win32-4629.dll\\E"}, {"pattern":"\\Qwindows/x64/org/lwjgl/assimp/assimp.dll\\E"}, {"pattern":"\\Qwindows/x64/org/lwjgl/bgfx/bgfx.dll\\E"}, {"pattern":"\\Qwindows/x64/org/lwjgl/glfw/glfw.dll\\E"}, diff --git a/res/META-INF/native-image/serialization-config.json b/graal-cfg/linux/META-INF/native-image/serialization-config.json similarity index 100% rename from res/META-INF/native-image/serialization-config.json rename to graal-cfg/linux/META-INF/native-image/serialization-config.json diff --git a/graal-cfg/macos/META-INF/native-image/.gitignore b/graal-cfg/macos/META-INF/native-image/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/res/META-INF/substrate/config/jniconfig-x86_64-windows.json b/graal-cfg/windows/META-INF/native-image/jni-config.json similarity index 78% rename from res/META-INF/substrate/config/jniconfig-x86_64-windows.json rename to graal-cfg/windows/META-INF/native-image/jni-config.json index b2598a3f..c39c6eef 100644 --- a/res/META-INF/substrate/config/jniconfig-x86_64-windows.json +++ b/graal-cfg/windows/META-INF/native-image/jni-config.json @@ -1,4 +1,17 @@ [ +{ + "name":"java.lang.ClassLoader", + "methods":[ + {"name":"getPlatformClassLoader","parameterTypes":[] }, + {"name":"loadClass","parameterTypes":["java.lang.String"] } + ] +}, +{ + "name":"java.lang.NoSuchMethodError" +}, +{ + "name":"jdk.internal.loader.ClassLoaders$PlatformClassLoader" +}, { "name":"org.eclipse.swt.internal.opengl.win32.PIXELFORMATDESCRIPTOR", "fields":[ @@ -250,6 +263,22 @@ {"name":"tmLastChar"} ] }, +{ + "name":"org.eclipse.swt.internal.win32.WINDOWPLACEMENT", + "fields":[ + {"name":"bottom"}, + {"name":"flags"}, + {"name":"left"}, + {"name":"length"}, + {"name":"ptMaxPosition_x"}, + {"name":"ptMaxPosition_y"}, + {"name":"ptMinPosition_x"}, + {"name":"ptMinPosition_y"}, + {"name":"right"}, + {"name":"showCmd"}, + {"name":"top"} + ] +}, { "name":"org.eclipse.swt.internal.win32.WINDOWPOS", "fields":[ @@ -285,5 +314,49 @@ {"name":"msgFilterProc","parameterTypes":["long","long","long"] }, {"name":"windowProc","parameterTypes":["long","long","long","long"] } ] +}, +{ + "name":"org.graalvm.nativebridge.jni.JNIExceptionWrapperEntryPoints", + "methods":[{"name":"getClassName","parameterTypes":["java.lang.Class"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$B", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$D", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$F", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$I", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$J", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$N", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$P", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$S", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$V", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$Z", + "methods":[{"name":"callback","parameterTypes":["long"] }] } ] diff --git a/graal-cfg/windows/META-INF/native-image/predefined-classes-config.json b/graal-cfg/windows/META-INF/native-image/predefined-classes-config.json new file mode 100644 index 00000000..0e79b2c5 --- /dev/null +++ b/graal-cfg/windows/META-INF/native-image/predefined-classes-config.json @@ -0,0 +1,8 @@ +[ + { + "type":"agent-extracted", + "classes":[ + ] + } +] + diff --git a/res/META-INF/substrate/config/jniconfig-x86_64-darwin.json b/graal-cfg/windows/META-INF/native-image/proxy-config.json similarity index 100% rename from res/META-INF/substrate/config/jniconfig-x86_64-darwin.json rename to graal-cfg/windows/META-INF/native-image/proxy-config.json diff --git a/graal-cfg/windows/META-INF/native-image/reflect-config.json b/graal-cfg/windows/META-INF/native-image/reflect-config.json new file mode 100644 index 00000000..78189540 --- /dev/null +++ b/graal-cfg/windows/META-INF/native-image/reflect-config.json @@ -0,0 +1,2612 @@ +[ +{ + "name":"byte[]" +}, +{ + "name":"float[]" +}, +{ + "name":"java.lang.Double", + "methods":[{"name":"doubleToRawLongBits","parameterTypes":["double"] }] +}, +{ + "name":"java.lang.Float", + "methods":[{"name":"floatToRawIntBits","parameterTypes":["float"] }] +}, +{ + "name":"java.lang.Long", + "methods":[{"name":"rotateLeft","parameterTypes":["long","int"] }] +}, +{ + "name":"java.lang.Object" +}, +{ + "name":"java.lang.String" +}, +{ + "name":"java.lang.String[]" +}, +{ + "name":"java.nio.Buffer", + "fields":[{"name":"address"}] +}, +{ + "name":"java.security.MessageDigestSpi" +}, +{ + "name":"java.security.interfaces.RSAPrivateKey" +}, +{ + "name":"java.security.interfaces.RSAPublicKey" +}, +{ + "name":"java.util.Date" +}, +{ + "name":"javax.security.auth.x500.X500Principal", + "fields":[{"name":"thisX500Name"}], + "methods":[{"name":"","parameterTypes":["sun.security.x509.X500Name"] }] +}, +{ + "name":"org.eclipse.swt.widgets.Display" +}, +{ + "name":"org.joml.Matrix2f", + "fields":[ + {"name":"m00"}, + {"name":"m01"}, + {"name":"m10"}, + {"name":"m11"} + ] +}, +{ + "name":"org.joml.Matrix3d", + "fields":[ + {"name":"m00"}, + {"name":"m01"}, + {"name":"m02"}, + {"name":"m10"}, + {"name":"m11"}, + {"name":"m12"}, + {"name":"m20"}, + {"name":"m21"}, + {"name":"m22"} + ] +}, +{ + "name":"org.joml.Matrix3f", + "fields":[ + {"name":"m00"}, + {"name":"m01"}, + {"name":"m02"}, + {"name":"m10"}, + {"name":"m11"}, + {"name":"m12"}, + {"name":"m20"}, + {"name":"m21"}, + {"name":"m22"} + ] +}, +{ + "name":"org.joml.Matrix3x2f", + "fields":[ + {"name":"m00"}, + {"name":"m01"}, + {"name":"m10"}, + {"name":"m11"}, + {"name":"m20"}, + {"name":"m21"} + ] +}, +{ + "name":"org.joml.Matrix4d", + "fields":[ + {"name":"m00"}, + {"name":"m01"}, + {"name":"m02"}, + {"name":"m03"}, + {"name":"m10"}, + {"name":"m11"}, + {"name":"m12"}, + {"name":"m13"}, + {"name":"m20"}, + {"name":"m21"}, + {"name":"m22"}, + {"name":"m23"}, + {"name":"m30"}, + {"name":"m31"}, + {"name":"m32"}, + {"name":"m33"} + ] +}, +{ + "name":"org.joml.Matrix4f", + "fields":[ + {"name":"m00"}, + {"name":"m01"}, + {"name":"m02"}, + {"name":"m03"}, + {"name":"m10"}, + {"name":"m11"}, + {"name":"m12"}, + {"name":"m13"}, + {"name":"m20"}, + {"name":"m21"}, + {"name":"m22"}, + {"name":"m23"}, + {"name":"m30"}, + {"name":"m31"}, + {"name":"m32"}, + {"name":"m33"} + ] +}, +{ + "name":"org.joml.Matrix4x3f", + "fields":[ + {"name":"m00"}, + {"name":"m01"}, + {"name":"m02"}, + {"name":"m10"}, + {"name":"m11"}, + {"name":"m12"}, + {"name":"m20"}, + {"name":"m21"}, + {"name":"m22"}, + {"name":"m30"}, + {"name":"m31"}, + {"name":"m32"} + ] +}, +{ + "name":"org.joml.Quaternionf", + "fields":[ + {"name":"w"}, + {"name":"x"}, + {"name":"y"}, + {"name":"z"} + ] +}, +{ + "name":"org.joml.Vector2f", + "fields":[ + {"name":"x"}, + {"name":"y"} + ] +}, +{ + "name":"org.joml.Vector2i", + "fields":[ + {"name":"x"}, + {"name":"y"} + ] +}, +{ + "name":"org.joml.Vector3f", + "fields":[ + {"name":"x"}, + {"name":"y"}, + {"name":"z"} + ] +}, +{ + "name":"org.joml.Vector3i", + "fields":[ + {"name":"x"}, + {"name":"y"}, + {"name":"z"} + ] +}, +{ + "name":"org.joml.Vector4f", + "fields":[ + {"name":"w"}, + {"name":"x"}, + {"name":"y"}, + {"name":"z"} + ] +}, +{ + "name":"org.joml.Vector4i", + "fields":[ + {"name":"w"}, + {"name":"x"}, + {"name":"y"}, + {"name":"z"} + ] +}, +{ + "name":"org.lwjgl.PointerBuffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.assimp.AIColor4D", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.assimp.AIFace", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.assimp.AIFace$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.assimp.AIFile", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.assimp.AIFileIO", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.assimp.AIMaterial", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.assimp.AIMesh", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.assimp.AIScene", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.assimp.AIVector3D", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.assimp.AIVector3D$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.bgfx.BGFXCaps", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.bgfx.BGFXInit", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.bgfx.BGFXInstanceDataBuffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.bgfx.BGFXMemory", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.bgfx.BGFXPlatformData", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.bgfx.BGFXResolution", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.bgfx.BGFXTransientIndexBuffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.bgfx.BGFXTransientVertexBuffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.bgfx.BGFXVertexLayout", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.demo.bgfx.Bump", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.bgfx.Cubes", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.bgfx.Metaballs", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.bgfx.Raymarch", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.cuda.OpenGLExample", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.cuda.SequencePTX", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.game.VoxelGameGL", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.SimpleDrawElements", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.SimpleTriangleStripGrid", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.UniformArrayDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.assimp.WavefrontObjDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.fbo.DepthEdgeShaderDemo20", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.fbo.EdgeShaderDemo20", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.fbo.EdgeShaderMultisampleDemo20", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.fbo.MultisampledFbo2Demo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.fbo.MultisampledFboDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.fbo.ReadDepthBufferDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.geometry.GeometryShaderTest", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.geometry.GeometryShaderTest20", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.geometry.SilhouetteDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.glfw.Multithreaded", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.instancing.GrassDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.AlphaGrass", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.AtomicDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.CubeTraceMerged", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.Demo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.Demo20", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.Demo33", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.Demo33Ubo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.DemoSsbo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.DemoSsboTrianglesStacklessKdTree", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.DemoSsboTrianglesStacklessKdTree$GPUNode", + "allDeclaredFields":true +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.GL33KdTreeTrace", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.HybridDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.HybridDemoSsbo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.HybridDemoSsboInstancing", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.HybridDemoSsboInstancing45", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.HybridDemoSsboTriangles", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.HybridDemoSsboTriangles$GPUObject", + "allDeclaredFields":true +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.LinearlyTransformedCosines", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.PhotonMappingBindlessDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.PhotonMappingDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.TransformFeedbackDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.VoxelLightmapping", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.VoxelLightmapping2", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.tutorial.Tutorial1", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.tutorial.Tutorial2", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.tutorial.Tutorial3", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.tutorial.Tutorial4", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.tutorial.Tutorial4_2", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.tutorial.Tutorial4_3", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.tutorial.Tutorial5", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.tutorial.Tutorial6", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.tutorial.Tutorial6$GPUNode", + "allDeclaredFields":true +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.tutorial.Tutorial6_2", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.tutorial.Tutorial6_2$GPUNode", + "allDeclaredFields":true +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.tutorial.Tutorial7", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.tutorial.Tutorial7$GPUNode", + "allDeclaredFields":true +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.tutorial.Tutorial8", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.raytracing.tutorial.Tutorial8_2", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.shader.ImmediateModeDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.shader.InfiniteDraggablePlaneDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.shader.InfinitePlaneDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.shader.NoVerticesBSplineDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.shader.NoVerticesGridDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.shader.NoVerticesPolygonDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.shader.NoVerticesProjectedGridDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.shadow.Omni2dShadow", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.shadow.ShadowMappingDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.shadow.ShadowMappingDemo20", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.swt.SwtAndGlfwDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.swt.SwtDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.textures.BillboardCubemapDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.textures.EnvironmentDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.textures.EnvironmentTeapotDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.textures.FullscreenCubemapDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.textures.SimpleProceduralTextureDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.textures.SimpleTexturedQuad", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.textures.SimpleTexturedSphere", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.opengl.textures.Texture2DArrayMipmapping", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.vulkan.ClearScreenDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.vulkan.ColoredRotatingQuadDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.vulkan.ColoredTriangleDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.vulkan.InstancedSpheresDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.vulkan.NvRayTracingExample", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.vulkan.NvRayTracingHybridExample", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.vulkan.TriangleDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.vulkan.TwoRotatingTrianglesDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.demo.vulkan.TwoRotatingTrianglesInvDepthDemo", + "methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"org.lwjgl.glfw.GLFW", + "allDeclaredFields":true +}, +{ + "name":"org.lwjgl.glfw.GLFWVidMode", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.opengl.GLCapabilities", + "allPublicFields":true +}, +{ + "name":"org.lwjgl.system.CallbackI$B", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$D", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$F", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$I", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$J", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$N", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$P", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$S", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$V", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CallbackI$Z", + "methods":[{"name":"callback","parameterTypes":["long"] }] +}, +{ + "name":"org.lwjgl.system.CustomBuffer", + "fields":[ + {"name":"capacity"}, + {"name":"container"}, + {"name":"limit"}, + {"name":"mark"}, + {"name":"position"} + ] +}, +{ + "name":"org.lwjgl.system.Pointer$Default", + "fields":[{"name":"address"}] +}, +{ + "name":"org.lwjgl.system.Struct", + "fields":[{"name":"container"}] +}, +{ + "name":"org.lwjgl.system.jemalloc.JEmallocAllocator", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.lwjgl.util.shaderc.Shaderc", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.util.vma.VmaAllocationCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.util.vma.VmaAllocationInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.util.vma.VmaAllocatorCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.util.vma.VmaVulkanFunctions", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.EXTDebugReport", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.EXTDebugUtils", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.KHRDisplaySwapchain", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.KHRSurface", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.KHRSwapchain", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.NVRayTracing", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VK10", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkAccelerationStructureCreateInfoNV", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkAccelerationStructureInfoNV", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkAccelerationStructureMemoryRequirementsInfoNV", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkApplicationInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkAttachmentDescription", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkAttachmentDescription$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkAttachmentReference", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkAttachmentReference$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkBindAccelerationStructureMemoryInfoNV", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkBindAccelerationStructureMemoryInfoNV$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkBufferCopy", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkBufferCopy$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkBufferCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkBufferImageCopy", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkBufferImageCopy$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkClearColorValue", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkClearDepthStencilValue", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkClearValue", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkClearValue$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkCommandBuffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkCommandBufferAllocateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkCommandBufferBeginInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkCommandPoolCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkComponentMapping", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkDebugReportCallbackCreateInfoEXT", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkDebugReportCallbackEXT", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkDebugUtilsMessengerCallbackDataEXT", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkDebugUtilsMessengerCallbackEXT", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkDebugUtilsMessengerCreateInfoEXT", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorBufferInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorBufferInfo$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorImageInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorImageInfo$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorPoolCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorPoolSize", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorPoolSize$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorSetAllocateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorSetLayoutBinding", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorSetLayoutBinding$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorSetLayoutCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkDevice", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkDeviceCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkDeviceQueueCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkDeviceQueueCreateInfo$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkExtensionProperties", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkExtensionProperties$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkExtent2D", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkExtent3D", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkFenceCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkFormatProperties", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkFramebufferCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkGeometryAABBNV", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkGeometryNV", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkGeometryNV$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkGeometryTrianglesNV", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkGraphicsPipelineCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkGraphicsPipelineCreateInfo$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageBlit", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageBlit$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageCopy", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageCopy$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageMemoryBarrier", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageMemoryBarrier$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageSubresourceRange", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageViewCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkInstance", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkInstanceCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkLayerProperties", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkLayerProperties$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkMemoryAllocateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkMemoryBarrier", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkMemoryBarrier$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkMemoryRequirements", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkMemoryRequirements2KHR", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkMemoryType", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkOffset2D", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkOffset3D", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkPhysicalDevice", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkPhysicalDevice16BitStorageFeatures", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkPhysicalDevice8BitStorageFeaturesKHR", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkPhysicalDeviceDescriptorIndexingFeaturesEXT", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkPhysicalDeviceFeatures", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkPhysicalDeviceFeatures2", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkPhysicalDeviceFloat16Int8FeaturesKHR", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkPhysicalDeviceMemoryProperties", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkPhysicalDeviceProperties", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkPhysicalDeviceProperties2", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkPhysicalDeviceRayTracingPropertiesNV", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineColorBlendAttachmentState", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineColorBlendAttachmentState$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineColorBlendStateCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineDepthStencilStateCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineDynamicStateCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineInputAssemblyStateCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineLayoutCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineMultisampleStateCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineRasterizationStateCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineShaderStageCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineShaderStageCreateInfo$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineVertexInputStateCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineViewportStateCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkPresentInfoKHR", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkQueryPoolCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkQueue", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkQueueFamilyProperties", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkQueueFamilyProperties$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkRayTracingPipelineCreateInfoNV", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkRayTracingShaderGroupCreateInfoNV", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkRayTracingShaderGroupCreateInfoNV$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkRect2D", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkRect2D$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkRenderPassBeginInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkRenderPassCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkSamplerCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkSemaphoreCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkShaderModuleCreateInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkSpecializationInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkSpecializationMapEntry", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkSpecializationMapEntry$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkStencilOpState", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkSubmitInfo", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkSubpassDependency", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkSubpassDependency$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkSubpassDescription", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkSubpassDescription$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkSurfaceCapabilitiesKHR", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkSurfaceFormatKHR", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkSurfaceFormatKHR$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkSwapchainCreateInfoKHR", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkVertexInputAttributeDescription", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkVertexInputAttributeDescription$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkVertexInputBindingDescription", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkVertexInputBindingDescription$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkViewport", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkViewport$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkWriteDescriptorSet", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkWriteDescriptorSet$Buffer", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"org.lwjgl.vulkan.VkWriteDescriptorSetAccelerationStructureNV", + "allDeclaredFields":true, + "allPublicFields":true, + "allDeclaredMethods":true, + "allPublicMethods":true, + "allDeclaredConstructors":true, + "allPublicConstructors":true, + "allDeclaredClasses":true, + "allPublicClasses":true +}, +{ + "name":"sun.misc.Unsafe", + "allDeclaredFields":true, + "methods":[ + {"name":"getLong","parameterTypes":["java.lang.Object","long"] }, + {"name":"putLong","parameterTypes":["java.lang.Object","long","long"] } + ] +}, +{ + "name":"sun.security.pkcs.SignerInfo[]" +}, +{ + "name":"sun.security.provider.SHA", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.security.provider.SHA2$SHA256", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.security.provider.X509Factory", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.security.rsa.RSAKeyFactory$Legacy", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.security.rsa.RSASignature$SHA1withRSA", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.security.rsa.RSASignature$SHA256withRSA", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.security.util.ObjectIdentifier" +}, +{ + "name":"sun.security.x509.AuthorityInfoAccessExtension", + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] +}, +{ + "name":"sun.security.x509.AuthorityKeyIdentifierExtension", + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] +}, +{ + "name":"sun.security.x509.BasicConstraintsExtension", + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] +}, +{ + "name":"sun.security.x509.CRLDistributionPointsExtension", + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] +}, +{ + "name":"sun.security.x509.CertificateExtensions" +}, +{ + "name":"sun.security.x509.CertificatePoliciesExtension", + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] +}, +{ + "name":"sun.security.x509.ExtendedKeyUsageExtension", + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] +}, +{ + "name":"sun.security.x509.KeyUsageExtension", + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] +}, +{ + "name":"sun.security.x509.SubjectAlternativeNameExtension", + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] +}, +{ + "name":"sun.security.x509.SubjectKeyIdentifierExtension", + "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }] +} +] diff --git a/graal-cfg/windows/META-INF/native-image/resource-config.json b/graal-cfg/windows/META-INF/native-image/resource-config.json new file mode 100644 index 00000000..26207411 --- /dev/null +++ b/graal-cfg/windows/META-INF/native-image/resource-config.json @@ -0,0 +1,301 @@ +{ + "resources":{ + "includes":[ + {"pattern":"\\Qlibswt-cairo-gtk-4629.so\\E"}, + {"pattern":"\\Qlibswt-glx-gtk-4629.so\\E"}, + {"pattern":"\\Qlibswt-gtk-4629.so\\E"}, + {"pattern":"\\Qlibswt-pi3-gtk-4629.so\\E"}, + {"pattern":"\\Qlinux/x64/org/lwjgl/assimp/libassimp.so\\E"}, + {"pattern":"\\Qlinux/x64/org/lwjgl/bgfx/libbgfx.so\\E"}, + {"pattern":"\\Qlinux/x64/org/lwjgl/glfw/libglfw.so\\E"}, + {"pattern":"\\Qlinux/x64/org/lwjgl/glfw/libglfw_wayland.so\\E"}, + {"pattern":"\\Qlinux/x64/org/lwjgl/jemalloc/libjemalloc.so\\E"}, + {"pattern":"\\Qlinux/x64/org/lwjgl/liblwjgl.so\\E"}, + {"pattern":"\\Qlinux/x64/org/lwjgl/openal/libopenal.so\\E"}, + {"pattern":"\\Qlinux/x64/org/lwjgl/opengl/liblwjgl_opengl.so\\E"}, + {"pattern":"\\Qlinux/x64/org/lwjgl/shaderc/libshaderc.so\\E"}, + {"pattern":"\\Qlinux/x64/org/lwjgl/shaderc/libshaderc_spvc.so\\E"}, + {"pattern":"\\Qlinux/x64/org/lwjgl/stb/liblwjgl_stb.so\\E"}, + {"pattern":"\\Qlinux/x64/org/lwjgl/vma/liblwjgl_vma.so\\E"}, + {"pattern":"\\Qmacos/x64/org/lwjgl/assimp/libassimp.dylib\\E"}, + {"pattern":"\\Qmacos/x64/org/lwjgl/bgfx/libbgfx.dylib\\E"}, + {"pattern":"\\Qmacos/x64/org/lwjgl/glfw/libglfw.dylib\\E"}, + {"pattern":"\\Qmacos/x64/org/lwjgl/jemalloc/libjemalloc.dylib\\E"}, + {"pattern":"\\Qmacos/x64/org/lwjgl/liblwjgl.dylib\\E"}, + {"pattern":"\\Qmacos/x64/org/lwjgl/openal/libopenal.dylib\\E"}, + {"pattern":"\\Qmacos/x64/org/lwjgl/opengl/liblwjgl_opengl.dylib\\E"}, + {"pattern":"\\Qmacos/x64/org/lwjgl/shaderc/libshaderc.dylib\\E"}, + {"pattern":"\\Qmacos/x64/org/lwjgl/shaderc/libshaderc_spvc.dylib\\E"}, + {"pattern":"\\Qmacos/x64/org/lwjgl/stb/liblwjgl_stb.dylib\\E"}, + {"pattern":"\\Qmacos/x64/org/lwjgl/vma/liblwjgl_vma.dylib\\E"}, + {"pattern":"\\Qmacos/x64/org/lwjgl/vulkan/libMoltenVK.dylib\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/bgfx/shaders/dx11/fs_bump.bin\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/bgfx/shaders/dx11/fs_cubes.bin\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/bgfx/shaders/dx11/fs_raymarching.bin\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/bgfx/shaders/dx11/vs_bump.bin\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/bgfx/shaders/dx11/vs_bump_instanced.bin\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/bgfx/shaders/dx11/vs_cubes.bin\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/bgfx/shaders/dx11/vs_raymarching.bin\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/bgfx/shaders/glsl/fs_bump.bin\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/bgfx/shaders/glsl/fs_cubes.bin\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/bgfx/shaders/glsl/fs_raymarching.bin\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/bgfx/shaders/glsl/vs_bump.bin\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/bgfx/shaders/glsl/vs_bump_instanced.bin\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/bgfx/shaders/glsl/vs_cubes.bin\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/bgfx/shaders/glsl/vs_raymarching.bin\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/bgfx/shaders/metal/fs_bump.bin\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/bgfx/shaders/metal/fs_cubes.bin\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/bgfx/shaders/metal/fs_raymarching.bin\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/bgfx/shaders/metal/vs_bump.bin\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/bgfx/shaders/metal/vs_bump_instanced.bin\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/bgfx/shaders/metal/vs_cubes.bin\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/bgfx/shaders/metal/vs_raymarching.bin\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/bgfx/textures/fieldstone-n.dds\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/bgfx/textures/fieldstone-rgba.dds\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/game/voxelgame/boundingboxes.fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/game/voxelgame/boundingboxes.gs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/game/voxelgame/boundingboxes.vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/game/voxelgame/chunk-points.vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/game/voxelgame/chunk.fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/game/voxelgame/chunk.gs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/game/voxelgame/chunk.vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/game/voxelgame/collectdrawcalls.vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/game/voxelgame/selection.fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/game/voxelgame/selection.vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/models/mikelovesrobots_mmmm/obj_house1.vox\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/models/mikelovesrobots_mmmm/scene_house5.vox\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/models/mikelovesrobots_mmmm/scene_house6.vox\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/assimp/magnet.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/assimp/magnet.mtl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/assimp/magnet.obj\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/assimp/magnet.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/fbo/color.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/fbo/depth-edge-fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/fbo/depth-edge-vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/fbo/normal-fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/fbo/normal-vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/fbo/quadDepth.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/fbo/quadDepth.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/fbo/rasterDepth.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/fbo/rasterDepth.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/fbo/sobel-edge-fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/fbo/sobel-edge-vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/fbo/sobel-outline-fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/fbo/sobel-outline-vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/geometry/fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/geometry/fs110.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/geometry/gs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/geometry/gs110.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/geometry/silhouette-fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/geometry/silhouette-gs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/geometry/silhouette-vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/geometry/vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/geometry/vs110.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/instancing/grass.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/instancing/grass.png\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/instancing/grass.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/instancing/grass2.png\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/instancing/grass_flower.png\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/instancing/grass_flower_blue.png\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/instancing/ground.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/instancing/ground.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/models/cube.obj.zip\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/models/lwjgl3.obj.zip\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/models/smoothicosphere.obj.zip\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/models/teapot.obj.zip\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/alphagrass/grass_high.png\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/alphagrass/kdtreeseparate32grass.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/cubetracemerged/compute.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/feedbackSsboTriangle.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/gl33kdtreetrace/quad.vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/gl33kdtreetrace/raytracing.fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/hybrid.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/hybridSsbo.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/hybridSsboTriangle.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/hybridSsboUbo.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/linearlytransformedcosines/ltc1.data\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/linearlytransformedcosines/ltc2.data\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/linearlytransformedcosines/quad.fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/linearlytransformedcosines/quad.vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/linearlytransformedcosines/raytracing.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/photonmap.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/photonmapBindless.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/quad.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/quad.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/quad110.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/quad110.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/random.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/random20.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/randomAtomic.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/randomCommon.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/raster.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/raster.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/rasterInstanced.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/rasterInstancedUbo.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/rasterPhotonMap.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/raytracing.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/raytracing.glslcs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/raytracing110.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/raytracingAtomic.glslcs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/raytracingSsbo.glslcs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/raytracingUbo.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/ssboTriangleStacklessKdTree.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/transformFeedback.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial1/quad.fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial1/quad.vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial1/raytracing.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial2/random.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial2/raytracing.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial3/quad.fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial3/quad.vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial3/random.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial3/raytracing.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial4/quad.fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial4/quad.vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial4/random.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial4/raytracing.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial4_2/blueNoise.png\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial4_2/random.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial4_3/quad.fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial4_3/quad.vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial4_3/random.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial4_3/ranking_128_128_8_4spp.data\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial4_3/raytracing.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial4_3/scramble_128_128_8_4spp.data\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial4_3/sobol_256_256_4spp.data\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial5/atrous.fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial5/atrous.vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial5/quad.fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial5/quad.vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial5/random.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial5/raytracing.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial6/geometry.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial6/quad.fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial6/quad.vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial6/raytracing.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial6/scene.obj.zip\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial6_2/geometry.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial6_2/quad.fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial6_2/quad.vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial6_2/raytracing.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial6_2/scene.obj.zip\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial7/geometry.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial7/quad.fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial7/quad.vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial7/random.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial7/raster.fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial7/raster.vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial7/raytracing.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial7/sponza.obj.zip\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial8/atrous.fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial8/atrous.vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial8/cubes.obj\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial8/quad.fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial8/quad.vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial8/random.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial8/raster.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial8/rasterAndTrace.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial8/rasterDepth.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial8/rasterDepth.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial8_2/cubes.obj\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial8_2/random.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial8_2/raster.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/tutorial8_2/rasterAndTrace.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/voxellightmapping/lightmap.fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/voxellightmapping/lightmap.vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/voxellightmapping/random.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/voxellightmapping/raster.fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/voxellightmapping/raster.vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/voxellightmapping/trace.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/voxellightmapping2/lightmap.fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/voxellightmapping2/lightmap.vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/voxellightmapping2/random.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/voxellightmapping2/raster.fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/voxellightmapping2/raster.vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/raytracing/voxellightmapping2/trace.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/shader/noverticesbspline.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/shader/noverticesbspline.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/shader/noverticesgrid.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/shader/noverticesgrid.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/shader/noverticespolygon.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/shader/noverticespolygon.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/shader/noverticesprojectedgrid.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/shader/noverticesprojectedgrid.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/shader/simple.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/shader/simple.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/shadow/omni2dShadow-fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/shadow/omni2dShadow-gs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/shadow/omni2dShadow-vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/shadow/omni2dShadowShade-fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/shadow/omni2dShadowShade-vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/shadow/scene.obj.zip\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/shadow/shadowMapping-fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/shadow/shadowMapping-vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/shadow/shadowMappingShade-fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/shadow/shadowMappingShade-vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/textures/cubemap.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/textures/cubemap.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/textures/cubemapBH.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/textures/cubemapBH.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/textures/cubemapBack.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/textures/cubemapBack.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/textures/earth.jpg\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/textures/environment.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/textures/environment.jpg\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/textures/environment.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/textures/teapot.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/textures/teapot.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/textures/texture2dArrayMipmap.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/textures/texture2dArrayMipmap.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/textures/texturedQuad.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/textures/texturedQuad.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/textures/texturedSphere.fs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/textures/texturedSphere.vs\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/uniformarray-fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/opengl/uniformarray-vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/space_back6.jpg\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/space_bottom4.jpg\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/space_front5.jpg\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/space_left2.jpg\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/space_right1.jpg\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/space_top3.jpg\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/vulkan/closesthit.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/vulkan/coloredRotatingTriangle.frag\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/vulkan/coloredRotatingTriangle.vert\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/vulkan/coloredTriangle.frag\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/vulkan/coloredTriangle.vert\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/vulkan/instancedSpheres.frag\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/vulkan/instancedSpheres.vert\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/vulkan/random.inc.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/vulkan/ranking_128_128_8_16spp.data\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/vulkan/ranking_128_128_8_4spp.data\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/vulkan/raster.fs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/vulkan/raster.vs.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/vulkan/raygen-hybrid.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/vulkan/raygen.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/vulkan/raymiss.glsl\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/vulkan/scramble_128_128_8_16spp.data\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/vulkan/scramble_128_128_8_4spp.data\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/vulkan/sobol_256_256_16spp.data\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/vulkan/sobol_256_256_4spp.data\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/vulkan/triangle.frag\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/vulkan/triangle.vert\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/vulkan/twoRotatingTriangles.frag\\E"}, + {"pattern":"\\Qorg/lwjgl/demo/vulkan/twoRotatingTriangles.vert\\E"}, + {"pattern":"\\Qorg/lwjgl/system/APIUtil.class\\E"}, + {"pattern":"\\Qswt-wgl-win32-4629.dll\\E"}, + {"pattern":"\\Qswt-win32-4629.dll\\E"}, + {"pattern":"\\Qwindows/x64/org/lwjgl/assimp/assimp.dll\\E"}, + {"pattern":"\\Qwindows/x64/org/lwjgl/bgfx/bgfx.dll\\E"}, + {"pattern":"\\Qwindows/x64/org/lwjgl/glfw/glfw.dll\\E"}, + {"pattern":"\\Qwindows/x64/org/lwjgl/jemalloc/jemalloc.dll\\E"}, + {"pattern":"\\Qwindows/x64/org/lwjgl/lwjgl.dll\\E"}, + {"pattern":"\\Qwindows/x64/org/lwjgl/openal/OpenAL.dll\\E"}, + {"pattern":"\\Qwindows/x64/org/lwjgl/opengl/lwjgl_opengl.dll\\E"}, + {"pattern":"\\Qwindows/x64/org/lwjgl/shaderc/shaderc.dll\\E"}, + {"pattern":"\\Qwindows/x64/org/lwjgl/shaderc/shaderc_spvc.dll\\E"}, + {"pattern":"\\Qwindows/x64/org/lwjgl/stb/lwjgl_stb.dll\\E"}, + {"pattern":"\\Qwindows/x64/org/lwjgl/vma/lwjgl_vma.dll\\E"} + ]}, + "bundles":[] +} diff --git a/graal-cfg/windows/META-INF/native-image/serialization-config.json b/graal-cfg/windows/META-INF/native-image/serialization-config.json new file mode 100644 index 00000000..0d4f101c --- /dev/null +++ b/graal-cfg/windows/META-INF/native-image/serialization-config.json @@ -0,0 +1,2 @@ +[ +] diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 8cf6eb5a..a0f7639f 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/pom.xml b/pom.xml index 814ea481..9626e522 100644 --- a/pom.xml +++ b/pom.xml @@ -11,10 +11,10 @@ 11 3.8.1 3.2.3 - 4.6.1 + 3.105.3 1.10.1 - 0.1.39 - 21.1.0 + 1.0.4 + 21.2.0 org.lwjgl.demo.DemoLauncher @@ -57,9 +57,15 @@ - org.eclipse.swt + org.eclipse.platform org.eclipse.swt.win32.win32.x86_64 - ${swt.version} + ${swt.maven.version} + + + org.eclipse.platform + org.eclipse.swt + + @@ -93,9 +99,15 @@ - org.eclipse.swt + org.eclipse.platform org.eclipse.swt.gtk.linux.x86_64 - ${swt.version} + ${swt.maven.version} + + + org.eclipse.platform + org.eclipse.swt + + @@ -120,9 +132,15 @@ - org.eclipse.swt + org.eclipse.platform org.eclipse.swt.cocoa.macosx.x86_64 - ${swt.version} + ${swt.maven.version} + + + org.eclipse.platform + org.eclipse.swt + + org.lwjgl @@ -139,6 +157,10 @@ res + + + graal-cfg/${platform} + @@ -160,7 +182,7 @@ java - + ${sys.props} -classpath @@ -171,8 +193,8 @@ com.gluonhq - client-maven-plugin - ${client-maven-plugin.version} + gluonfx-maven-plugin + ${gluonfx-maven-plugin.version} ${exec.mainClass} @@ -187,10 +209,6 @@ oss.sonatype.org https://oss.sonatype.org/content/repositories/ - - swt-repo - http://maven-eclipse.github.io/maven - diff --git a/res/META-INF/native-image/jni-config.json b/res/META-INF/native-image/jni-config.json deleted file mode 100644 index 8d4de800..00000000 --- a/res/META-INF/native-image/jni-config.json +++ /dev/null @@ -1,49 +0,0 @@ -[ -{ - "name":"java.lang.ClassLoader", - "methods":[{"name":"getPlatformClassLoader","parameterTypes":[] }] -}, -{ - "name":"java.lang.NoSuchMethodError" -}, -{ - "name":"org.lwjgl.system.CallbackI$B", - "methods":[{"name":"callback","parameterTypes":["long"] }] -}, -{ - "name":"org.lwjgl.system.CallbackI$D", - "methods":[{"name":"callback","parameterTypes":["long"] }] -}, -{ - "name":"org.lwjgl.system.CallbackI$F", - "methods":[{"name":"callback","parameterTypes":["long"] }] -}, -{ - "name":"org.lwjgl.system.CallbackI$I", - "methods":[{"name":"callback","parameterTypes":["long"] }] -}, -{ - "name":"org.lwjgl.system.CallbackI$J", - "methods":[{"name":"callback","parameterTypes":["long"] }] -}, -{ - "name":"org.lwjgl.system.CallbackI$N", - "methods":[{"name":"callback","parameterTypes":["long"] }] -}, -{ - "name":"org.lwjgl.system.CallbackI$P", - "methods":[{"name":"callback","parameterTypes":["long"] }] -}, -{ - "name":"org.lwjgl.system.CallbackI$S", - "methods":[{"name":"callback","parameterTypes":["long"] }] -}, -{ - "name":"org.lwjgl.system.CallbackI$V", - "methods":[{"name":"callback","parameterTypes":["long"] }] -}, -{ - "name":"org.lwjgl.system.CallbackI$Z", - "methods":[{"name":"callback","parameterTypes":["long"] }] -} -] diff --git a/settings.gradle b/settings.gradle index 7f308a7f..3c522209 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,10 +1 @@ -pluginManagement { - repositories { - maven { - url "https://nexus.gluonhq.com/nexus/content/repositories/releases" - } - gradlePluginPortal() - } -} - rootProject.name = 'lwjgl3-demos'