diff --git a/kmem/build.gradle b/kmem/build.gradle index 0b5cb0406c..05214a82d3 100644 --- a/kmem/build.gradle +++ b/kmem/build.gradle @@ -1,5 +1,26 @@ description = "Memory utilities for Kotlin" dependencies { - add("jvmMainApi", libs.bundles.jna) + //add("jvmMainApi", libs.bundles.jna) + + // Includes this change to support direct OpenGL Win32 mapping: + // https://github.com/korlibs/jna/commit/c5d87cc4b1034b402b5d114e0efd401533636832 + add("jvmMainApi", files("lib/jna-patched.jar", "lib/jna-platform-5.12.1.jar")) +} + +configurations { + // configuration that holds jars to copy into lib + extraLibs +} +dependencies { + extraLibs files("lib/jna-patched.jar", "lib/jna-platform-5.12.1.jar") +} + +jvmJar { + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + into('lib') { + from { + configurations.extraLibs.collect { it.isDirectory() ? it : zipTree(it) } + } + } } diff --git a/kmem/lib/jna-patched.jar b/kmem/lib/jna-patched.jar new file mode 100644 index 0000000000..e762d38794 Binary files /dev/null and b/kmem/lib/jna-patched.jar differ diff --git a/kmem/lib/jna-platform-5.12.1.jar b/kmem/lib/jna-platform-5.12.1.jar new file mode 100644 index 0000000000..d39193e69f Binary files /dev/null and b/kmem/lib/jna-platform-5.12.1.jar differ diff --git a/korgw/src/jvmMain/kotlin/com/soywiz/korgw/platform/INativeGL.kt b/korgw/src/jvmMain/kotlin/com/soywiz/korgw/platform/INativeGL.kt index db32d929c6..f7babc5011 100644 --- a/korgw/src/jvmMain/kotlin/com/soywiz/korgw/platform/INativeGL.kt +++ b/korgw/src/jvmMain/kotlin/com/soywiz/korgw/platform/INativeGL.kt @@ -2,6 +2,9 @@ package com.soywiz.korgw.platform +import com.soywiz.kmem.* +import com.soywiz.kmem.Platform +import com.soywiz.kmem.dyn.* import com.soywiz.korio.lang.* import com.soywiz.korio.time.* import com.soywiz.korio.util.* @@ -38,6 +41,10 @@ typealias IntPtr = IntBuffer typealias FloatPtr = FloatBuffer object DirectGL : INativeGL { + + external fun glGenVertexArrays(n: Int, out: IntArray) + external fun glBindVertexArray(varray: Int) + external override fun glActiveTexture(texture: GLenum) external override fun glAttachShader(program: GLuint, shader: GLuint) external override fun glBindAttribLocation(program: GLuint, index: GLuint, name: String) @@ -205,7 +212,27 @@ object DirectGL : INativeGL { if (nativeOpenGLLibraryPath == null) error("Can't get OpenGL library") traceTime("OpenGL Native.register") { // @TODO: Can we provide a custom loader? like a dysym, to use the glGetProcAddress? If so, we will be able to use this on Windows too - Native.register(DirectGL::class.java, NativeLibrary.getInstance(nativeOpenGLLibraryPath, mutableMapOf())) + Native.register( + DirectGL::class.java, + NativeLibrary.getInstance( + nativeOpenGLLibraryPath, + mutableMapOf().apply { + if (Platform.isWindows) { + + this[Library.OPTION_SYMBOL_PROVIDER] = SymbolProvider { handle, name, parent -> + val ptr = Win32.wglGetProcAddress(name) + //println("LOADING $name: ${ptr.address}, $parent") + //error(name) + if (ptr.address == 0L) { + parent.getSymbolAddress(handle, name, null) + } else { + ptr.address + } + } + } + } + ) + ) } loaded = true } catch (e: Throwable) { @@ -213,6 +240,12 @@ object DirectGL : INativeGL { //e.printStackTrace() } } + + interface Win32 : Library { + fun wglGetProcAddress(name: String): Pointer + + companion object : Win32 by Native.load("opengl32", Win32::class.java) + } } private val arch by lazy { System.getProperty("os.arch").toLowerCase() } diff --git a/korgw/src/jvmMain/kotlin/com/soywiz/korgw/win32/Win32Tools.kt b/korgw/src/jvmMain/kotlin/com/soywiz/korgw/win32/Win32Tools.kt index e774ad356f..f31fbdea0b 100644 --- a/korgw/src/jvmMain/kotlin/com/soywiz/korgw/win32/Win32Tools.kt +++ b/korgw/src/jvmMain/kotlin/com/soywiz/korgw/win32/Win32Tools.kt @@ -5,9 +5,7 @@ import com.soywiz.kgl.getIntegerv import com.soywiz.klogger.Console import com.soywiz.korgw.GameWindow import com.soywiz.korgw.GameWindowConfig -import com.soywiz.korgw.platform.BaseOpenglContext -import com.soywiz.korgw.platform.INativeGL -import com.soywiz.korgw.platform.NativeKgl +import com.soywiz.korgw.platform.* import com.soywiz.korim.bitmap.Bitmap32 import com.soywiz.korio.lang.Environment import com.sun.jna.* @@ -24,7 +22,8 @@ import java.lang.reflect.Method import java.lang.reflect.Proxy //open class Win32KmlGl : CheckErrorsKmlGlProxy(NativeKgl(Win32GL)) { -open class Win32KmlGl : NativeKgl(Win32GL) { +//open class Win32KmlGl : NativeKgl(Win32GL) { +open class Win32KmlGl : NativeKgl(DirectGL) { companion object : Win32KmlGl() var vertexArrayCachedVersion = -1 @@ -35,11 +34,11 @@ open class Win32KmlGl : NativeKgl(Win32GL) { vertexArrayCachedVersion = contextVersion val out = intArrayOf(-1) //checkError("before glGenVertexArrays") - Win32GL.glGenVertexArrays(1, out) + DirectGL.glGenVertexArrays(1, out) checkError("glGenVertexArrays") vertexArray = out[0] } - Win32GL.glBindVertexArray(vertexArray) + DirectGL.glBindVertexArray(vertexArray) //checkError("glBindVertexArray") } } @@ -54,9 +53,6 @@ interface Win32GL : INativeGL, Library { //fun wglCreateContextAttribsARB(hDC: HDC, hshareContext: WinGDI.PIXELFORMATDESCRIPTOR.ByReference?, attribList: Pointer?): Int fun wglCreateContextAttribsARB(hDC: HDC, hshareContext: WinGDI.PIXELFORMATDESCRIPTOR.ByReference?, attribList: IntArray?): HGLRC? - fun glGenVertexArrays(n: Int, out: IntArray) - fun glBindVertexArray(varray: Int) - companion object : Win32GLBase(Win32GLLoader()) class Win32GLLoader {