From dc0ca3ab7e05d3bb944c47688e25406801fa925b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A8=D1=82=D0=B5=D0=BD=D0=B3=D0=B0=D1=83=D1=8D=D1=80=20?= =?UTF-8?q?=D0=9D=D0=B8=D0=BA=D0=B8=D1=82=D0=B0=20=D0=94=D0=BC=D0=B8=D1=82?= =?UTF-8?q?=D1=80=D0=B8=D0=B5=D0=B2=D0=B8=D1=87?= Date: Sun, 3 Dec 2023 23:35:40 +0300 Subject: [PATCH] Some improvements, new Linux natives --- .../async/AsyncNVDXInteropCanvasImpl.kt | 7 ++--- .../canvas/async/AsyncSharedCanvasImpl.kt | 27 +++++++++++------- .../openglfx/natives/openglfx-x64.so | Bin 30744 -> 31152 bytes .../openglfx/natives/openglfx-x86.so | Bin 28884 -> 29232 bytes modules/lwjgl/src/examples/kotlin/LWJGL.kt | 11 ++++++- 5 files changed, 29 insertions(+), 16 deletions(-) diff --git a/modules/core/src/main/kotlin/com/huskerdev/openglfx/internal/canvas/async/AsyncNVDXInteropCanvasImpl.kt b/modules/core/src/main/kotlin/com/huskerdev/openglfx/internal/canvas/async/AsyncNVDXInteropCanvasImpl.kt index e63ee2f..efec49c 100644 --- a/modules/core/src/main/kotlin/com/huskerdev/openglfx/internal/canvas/async/AsyncNVDXInteropCanvasImpl.kt +++ b/modules/core/src/main/kotlin/com/huskerdev/openglfx/internal/canvas/async/AsyncNVDXInteropCanvasImpl.kt @@ -100,15 +100,14 @@ open class AsyncNVDXInteropCanvasImpl( } glViewport(0, 0, drawSize.width, drawSize.height) - canvas.fireRenderEvent(if (msaaFBO != null) msaaFBO!!.id else fbo.id) - if (msaaFBO != null) - msaaFBO!!.blitTo(fbo) + canvas.fireRenderEvent(msaaFBO?.id ?: fbo.id) + msaaFBO?.blitTo(fbo) } private fun updateFramebufferSize(width: Int, height: Int) { if (::fbo.isInitialized) { fbo.delete() - if(msaaFBO != null) msaaFBO!!.delete() + msaaFBO?.delete() } // Create GL texture diff --git a/modules/core/src/main/kotlin/com/huskerdev/openglfx/internal/canvas/async/AsyncSharedCanvasImpl.kt b/modules/core/src/main/kotlin/com/huskerdev/openglfx/internal/canvas/async/AsyncSharedCanvasImpl.kt index 48d298e..cc41145 100644 --- a/modules/core/src/main/kotlin/com/huskerdev/openglfx/internal/canvas/async/AsyncSharedCanvasImpl.kt +++ b/modules/core/src/main/kotlin/com/huskerdev/openglfx/internal/canvas/async/AsyncSharedCanvasImpl.kt @@ -36,7 +36,7 @@ open class AsyncSharedCanvasImpl( private lateinit var fxContext: GLContext private lateinit var fbo: Framebuffer - private lateinit var msaaFBO: MultiSampledFramebuffer + private var msaaFBO: MultiSampledFramebuffer? = null private lateinit var transferFBO: Framebuffer private lateinit var resultFBO: Framebuffer @@ -79,22 +79,27 @@ open class AsyncSharedCanvasImpl( if(::resultFBO.isInitialized) resultFBO.delete() if(::transferFBO.isInitialized) transferFBO.delete() if(::fbo.isInitialized) fbo.delete() - if(::msaaFBO.isInitialized) msaaFBO.delete() + msaaFBO?.delete() GLContext.delete(context) GLContext.delete(fxWrapperContext) + fxContext.makeCurrent() } } } private fun paint(){ - drawSize.executeOnDifferenceWith(scaledSize, ::updateRenderFramebufferSize, canvas::fireReshapeEvent) + if(drawSize != scaledSize || + msaa != (msaaFBO?.requestedSamples ?: 0) + ){ + scaledSize.copyTo(drawSize) + updateRenderFramebufferSize(drawSize.width, drawSize.height) + canvas.fireReshapeEvent(drawSize.width, drawSize.height) + } glViewport(0, 0, drawSize.width, drawSize.height) - canvas.fireRenderEvent(if(msaa != 0) msaaFBO.id else fbo.id) - if(msaa != 0) - msaaFBO.blitTo(fbo) - glFinish() + canvas.fireRenderEvent(msaaFBO?.id ?: fbo.id) + msaaFBO?.blitTo(fbo) } override fun renderContent(g: Graphics) { @@ -142,7 +147,7 @@ open class AsyncSharedCanvasImpl( private fun updateRenderFramebufferSize(width: Int, height: Int) { if(::fbo.isInitialized){ fbo.delete() - if(msaa != 0) msaaFBO.delete() + msaaFBO?.delete() } // Create framebuffer @@ -150,10 +155,10 @@ open class AsyncSharedCanvasImpl( fbo.bindFramebuffer() // Create multi-sampled framebuffer - if(msaa != 0){ + if(msaa > 0){ msaaFBO = MultiSampledFramebuffer(msaa, width, height) - msaaFBO.bindFramebuffer() - } + msaaFBO!!.bindFramebuffer() + } else msaaFBO = null } override fun repaint() { diff --git a/modules/core/src/main/resources/com/huskerdev/openglfx/natives/openglfx-x64.so b/modules/core/src/main/resources/com/huskerdev/openglfx/natives/openglfx-x64.so index 0a8e63561e6b562563f93bd5463c9fbcf7765164..e965860c1a9a77e0087bea61e542fcbf7d5848a8 100644 GIT binary patch literal 31152 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 i+U%BxYw7gg%KV1eVL>EOxC1jjsFIl%&0B^ delta 7741 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 Mn6BS~S>J#C10Xz6j{pDw diff --git a/modules/lwjgl/src/examples/kotlin/LWJGL.kt b/modules/lwjgl/src/examples/kotlin/LWJGL.kt index a30fea9..5021055 100644 --- a/modules/lwjgl/src/examples/kotlin/LWJGL.kt +++ b/modules/lwjgl/src/examples/kotlin/LWJGL.kt @@ -20,6 +20,9 @@ import javafx.scene.layout.* import javafx.scene.layout.Region.USE_PREF_SIZE import javafx.scene.paint.Paint import javafx.stage.Stage +import org.lwjgl.opengl.GL11.glGetInteger +import org.lwjgl.opengl.GL30.GL_MAJOR_VERSION +import org.lwjgl.opengl.GL30.GL_MINOR_VERSION import scene.ExampleScene @@ -32,6 +35,8 @@ class ExampleApp: Application(){ private lateinit var stage: Stage private lateinit var canvas: GLCanvas + private var majorVersion = -1 + private var minorVersion = -1 private var iteration = 0 override fun start(stage: Stage) { @@ -118,7 +123,7 @@ class ExampleApp: Application(){ "GLInteropType" to { canvas.interopType }, "Impl" to { RegionHelper.getPeer(canvas)::class.java.simpleName }, separator, - "GLProfile" to { canvas.profile }, + "GLProfile" to { "${canvas.profile} ${majorVersion}.${minorVersion}" }, "Async" to { canvas.async }, "Flip-Y" to { canvas.flipY }, "MSAA" to { canvas.msaa }, @@ -144,6 +149,10 @@ class ExampleApp: Application(){ } } canvas.addOnRenderEvent { e -> + if(majorVersion == -1) + majorVersion = glGetInteger(GL_MAJOR_VERSION) + if(minorVersion == -1) + minorVersion = glGetInteger(GL_MINOR_VERSION) Platform.runLater { labels.forEach { it.key.text = it.value().toString()