Skip to content

Commit

Permalink
fix(fmod) load fmod lib before Studio & FSBank
Browse files Browse the repository at this point in the history
Close #941
  • Loading branch information
Spasi committed Nov 22, 2023
1 parent aab5bb9 commit b428b2f
Show file tree
Hide file tree
Showing 10 changed files with 72 additions and 28 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ abstract class SimpleBinding(
writer.println("$t${t}long ${if (function has Address) RESULT else FUNCTION_ADDRESS} = Functions.${function.simpleName};")
}

abstract fun PrintWriter.generateFunctionSetup(nativeClass: NativeClass)
abstract fun generateFunctionSetup(writer: PrintWriter, nativeClass: NativeClass)

protected fun PrintWriter.generateFunctionsClass(nativeClass: NativeClass, javadoc: String) {
val bindingFunctions = nativeClass.functions.filter { !it.hasExplicitFunctionAddress && !it.has<Macro>() }
Expand Down Expand Up @@ -138,36 +138,40 @@ abstract class SimpleBinding(
}""")
}
}
// TODO: Remove if KT-7859 is fixed.
private fun SimpleBinding.generateFunctionSetup(writer: PrintWriter, nativeClass: NativeClass) = writer.generateFunctionSetup(nativeClass)

/** Creates a simple APIBinding that stores the shared library and function pointers inside the binding class. The shared library is never unloaded. */
fun simpleBinding(
module: Module,
libraryName: String = module.name.lowercase(),
libraryExpression: String = "\"$libraryName\"",
bundledWithLWJGL: Boolean = false
bundledWithLWJGL: Boolean = false,
preamble: String? = null
) = object : SimpleBinding(module, libraryName.uppercase()) {
// TODO: Sync HARFBUZZ_BINDING if this changes
override fun PrintWriter.generateFunctionSetup(nativeClass: NativeClass) {
override fun generateFunctionSetup(writer: PrintWriter, nativeClass: NativeClass) {
val libraryReference = libraryName.uppercase()

println("\n${t}private static final SharedLibrary $libraryReference = Library.loadNative(${nativeClass.className}.class, \"${module.java}\", $libraryExpression${if (bundledWithLWJGL) ", true" else ""});")
generateFunctionsClass(nativeClass, "\n$t/** Contains the function pointers loaded from the $libraryName {@link SharedLibrary}. */")
println("""
with(writer) {
if (preamble != null) {
println(preamble)
}
println("\n${t}private static final SharedLibrary $libraryReference = Library.loadNative(${nativeClass.className}.class, \"${module.java}\", $libraryExpression${if (bundledWithLWJGL) ", true" else ""});")
generateFunctionsClass(nativeClass, "\n$t/** Contains the function pointers loaded from the $libraryName {@link SharedLibrary}. */")
println("""
/** Returns the $libraryName {@link SharedLibrary}. */
public static SharedLibrary getLibrary() {
return $libraryReference;
}""")
}
}
}

/** Creates a simple APIBinding that delegates function pointer loading to this APIBinding. */
fun APIBinding.delegate(
libraryExpression: String
) = object : SimpleBinding(module, libraryExpression) {
override fun PrintWriter.generateFunctionSetup(nativeClass: NativeClass) {
generateFunctionsClass(nativeClass, "\n$t/** Contains the function pointers loaded from {@code $libraryExpression}. */")
override fun generateFunctionSetup(writer: PrintWriter, nativeClass: NativeClass) {
writer.generateFunctionsClass(nativeClass, "\n$t/** Contains the function pointers loaded from {@code $libraryExpression}. */")
}
}

Expand Down
12 changes: 7 additions & 5 deletions modules/lwjgl/assimp/src/templates/kotlin/assimp/AssimpTypes.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,12 @@ import org.lwjgl.generator.*
import java.io.*

val ASSIMP_BINDING = object : SimpleBinding(Module.ASSIMP, "ASSIMP") {
override fun PrintWriter.generateFunctionSetup(nativeClass: NativeClass) {
println("\n${t}private static final SharedLibrary DRACO = Library.loadNative(Assimp.class, \"${module.java}\", Configuration.ASSIMP_DRACO_LIBRARY_NAME.get(Platform.mapLibraryNameBundled(\"draco\")), true);")
println("${t}private static final SharedLibrary ASSIMP = Library.loadNative(Assimp.class, \"${module.java}\", Configuration.ASSIMP_LIBRARY_NAME.get(Platform.mapLibraryNameBundled(\"assimp\")), true);")
generateFunctionsClass(nativeClass, "\n$t/** Contains the function pointers loaded from the assimp {@link SharedLibrary}. */")
println("""
override fun generateFunctionSetup(writer: PrintWriter, nativeClass: NativeClass) {
with(writer) {
println("\n${t}private static final SharedLibrary DRACO = Library.loadNative(Assimp.class, \"${module.java}\", Configuration.ASSIMP_DRACO_LIBRARY_NAME.get(Platform.mapLibraryNameBundled(\"draco\")), true);")
println("${t}private static final SharedLibrary ASSIMP = Library.loadNative(Assimp.class, \"${module.java}\", Configuration.ASSIMP_LIBRARY_NAME.get(Platform.mapLibraryNameBundled(\"assimp\")), true);")
generateFunctionsClass(nativeClass, "\n$t/** Contains the function pointers loaded from the assimp {@link SharedLibrary}. */")
println("""
/** Returns the assimp {@link SharedLibrary}. */
public static SharedLibrary getLibrary() {
return ASSIMP;
Expand All @@ -22,6 +23,7 @@ val ASSIMP_BINDING = object : SimpleBinding(Module.ASSIMP, "ASSIMP") {
public static SharedLibrary getDraco() {
return DRACO;
}""")
}
}
}

Expand Down
12 changes: 7 additions & 5 deletions modules/lwjgl/cuda/src/templates/kotlin/cuda/NVRTCTypes.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,17 @@ import org.lwjgl.generator.*
import java.io.*

val NVRTC_BINDING = object : SimpleBinding(Module.CUDA, "NVRTC") {
override fun PrintWriter.generateFunctionSetup(nativeClass: NativeClass) {
print ("\n${t}private static final SharedLibrary NVRTC = CUDA.getToolkitLibrary(NVRTC.class, Configuration.CUDA_NVRTC_LIBRARY_NAME, \"nvrtc\");")
println("\n${t}private static final SharedLibrary NVRTC_BUILTINS = CUDA.getToolkitLibrary(NVRTC.class, Configuration.CUDA_NVRTC_BUILTINS_LIBRARY_NAME, \"nvrtc-builtins\");")
generateFunctionsClass(nativeClass, "\n$t/** Contains the function pointers loaded from the NVRTC {@link SharedLibrary}. */")
println("""
override fun generateFunctionSetup(writer: PrintWriter, nativeClass: NativeClass) {
with(writer) {
print ("\n${t}private static final SharedLibrary NVRTC = CUDA.getToolkitLibrary(NVRTC.class, Configuration.CUDA_NVRTC_LIBRARY_NAME, \"nvrtc\");")
println("\n${t}private static final SharedLibrary NVRTC_BUILTINS = CUDA.getToolkitLibrary(NVRTC.class, Configuration.CUDA_NVRTC_BUILTINS_LIBRARY_NAME, \"nvrtc-builtins\");")
generateFunctionsClass(nativeClass, "\n$t/** Contains the function pointers loaded from the NVRTC {@link SharedLibrary}. */")
println("""
/** Returns the NVRTC {@link SharedLibrary}. */
public static SharedLibrary getLibrary() {
return NVRTC;
}""")
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,11 @@

public class FMODStudio {

static {
// Make sure fmod is loaded first, fmodstudio depends on it.
FMOD.getLibrary();
}

private static final SharedLibrary FMODSTUDIO = Library.loadNative(FMODStudio.class, "org.lwjgl.fmod", Configuration.FMOD_STUDIO_LIBRARY_NAME, "fmodstudio");

/** Contains the function pointers loaded from the FMODSTUDIO {@link SharedLibrary}. */
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,11 @@

public class FSBank {

static {
// Make sure fmod is loaded first, fsbank depends on it.
FMOD.getLibrary();
}

private static final SharedLibrary FSBANK = Library.loadNative(FSBank.class, "org.lwjgl.fmod", Configuration.FMOD_FSBANK_LIBRARY_NAME, "fsbank");

/** Contains the function pointers loaded from the FSBANK {@link SharedLibrary}. */
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,15 @@ val FMODStudio = "FMODStudio".nativeClass(
Module.FMOD,
prefix = "FMOD_STUDIO",
prefixMethod = "FMOD_Studio_",
binding = simpleBinding(Module.FMOD, libraryName = "FMODSTUDIO", libraryExpression = "Configuration.FMOD_STUDIO_LIBRARY_NAME, \"fmodstudio\"")
binding = simpleBinding(
Module.FMOD,
libraryName = "FMODSTUDIO",
libraryExpression = "Configuration.FMOD_STUDIO_LIBRARY_NAME, \"fmodstudio\"",
preamble = """
static {
// Make sure fmod is loaded first, fmodstudio depends on it.
FMOD.getLibrary();
}""")
) {

IntConstant("", "LOAD_MEMORY_ALIGNMENT".."32")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,15 @@ val FSBank = "FSBank".nativeClass(
Module.FMOD,
prefix = "FSBANK_",
prefixMethod = "FSBank_",
binding = simpleBinding(Module.FMOD, libraryName = "FSBANK", libraryExpression = "Configuration.FMOD_FSBANK_LIBRARY_NAME, \"fsbank\"")
binding = simpleBinding(
Module.FMOD,
libraryName = "FSBANK",
libraryExpression = "Configuration.FMOD_FSBANK_LIBRARY_NAME, \"fsbank\"",
preamble = """
static {
// Make sure fmod is loaded first, fsbank depends on it.
FMOD.getLibrary();
}""")
) {

IntConstant("", "INIT_NORMAL"..0x00000000)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,9 @@ import org.lwjgl.generator.*
import java.io.*

val HARFBUZZ_BINDING = object : SimpleBinding(Module.HARFBUZZ, "HARFBUZZ") {
override fun PrintWriter.generateFunctionSetup(nativeClass: NativeClass) {
println(
override fun generateFunctionSetup(writer: PrintWriter, nativeClass: NativeClass) {
with(writer) {
println(
"""
${t}private static final SharedLibrary HARFBUZZ;
${t}static {
Expand All @@ -36,12 +37,13 @@ $t$t}
$t${t}HARFBUZZ = library;
$t}""")
generateFunctionsClass(nativeClass, "\n$t/** Contains the function pointers loaded from the harfbuzz {@link SharedLibrary}. */")
println("""
generateFunctionsClass(nativeClass, "\n$t/** Contains the function pointers loaded from the harfbuzz {@link SharedLibrary}. */")
println("""
/** Returns the harfbuzz {@link SharedLibrary}. */
public static SharedLibrary getLibrary() {
return HARFBUZZ;
}""")
}
}
}
val HARFBUZZ_BINDING_DELEGATE = HARFBUZZ_BINDING.delegate("HarfBuzz.getLibrary()")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ import nanovg.*
import java.io.*

val nanovg_bgfx = "NanoVGBGFX".dependsOn(Module.BGFX)?.nativeClass(Module.NANOVG, prefix = "NVG", binding = object : SimpleBinding(Module.NANOVG, "BGFX.getLibrary()") {
override fun PrintWriter.generateFunctionSetup(nativeClass: NativeClass) {
generateFunctionsClass(nativeClass, "\n$t/** Contains the function pointers loaded from bgfx. */")
override fun generateFunctionSetup(writer:PrintWriter, nativeClass: NativeClass) {
writer.generateFunctionsClass(nativeClass, "\n$t/** Contains the function pointers loaded from bgfx. */")
}
}) {
documentation = "Implementation of the NanoVG API using bgfx."
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

import static org.lwjgl.fmod.FMOD.*;
import static org.lwjgl.fmod.FMODStudio.*;
import static org.lwjgl.fmod.FSBank.*;
import static org.lwjgl.system.MemoryStack.*;
import static org.lwjgl.system.MemoryUtil.*;

Expand Down Expand Up @@ -37,6 +38,13 @@ public static void main(String[] args) {
check(FMOD_Studio_System_Initialize(studio, 2, 0, 0, NULL));
check(FMOD_Studio_System_Release(studio));
}

// Test FSBank
{
check(FSBank_Init(FSBANK_FSBVERSION_FSB5, FSBANK_INIT_NORMAL, 1, (String)null));

check(FSBank_Release());
}
}

// TODO: add real FMOD sample
Expand Down

0 comments on commit b428b2f

Please sign in to comment.