Unverified Commit bb9cefcb authored by Igor Demin's avatar Igor Demin Committed by GitHub

Fix deadlock on OpenGL on window dispose. (#301)

parent 46716ddb
......@@ -212,7 +212,7 @@ actual open class SkiaLayer internal constructor(
@Volatile
private var isDisposed = false
internal var redrawer: Redrawer? = null
private var contextHandler: ContextHandler? = null
internal var contextHandler: ContextHandler? = null
private val fallbackRenderApiQueue = SkikoProperties.fallbackRenderApiQueue.toMutableList()
private var renderApi_ = fallbackRenderApiQueue[0]
actual var renderApi: GraphicsApi
......
......@@ -73,4 +73,13 @@ internal class OpenGLContextHandler(layer: SkiaLayer) : ContextHandler(layer) {
"Model: ${gl.glGetString(gl.GL_RENDERER)}\n" +
"Total VRAM: ${gl.glGetIntegerv(gl.GL_TOTAL_MEMORY) / 1024} MB\n"
}
fun disposeInOpenGLContext() {
super.dispose()
}
// dispose should be called only in the OpenGL context.
// TODO remove in https://github.com/JetBrains/skiko/pull/300
override open fun dispose() {
}
}
......@@ -3,6 +3,7 @@ package org.jetbrains.skiko.redrawer
import kotlinx.coroutines.*
import kotlinx.coroutines.swing.Swing
import org.jetbrains.skiko.*
import org.jetbrains.skiko.context.OpenGLContextHandler
internal class LinuxOpenGLRedrawer(
private val layer: SkiaLayer,
......@@ -51,6 +52,8 @@ internal class LinuxOpenGLRedrawer(
// makeCurrent is mandatory to destroy context, otherwise, OpenGL will destroy wrong context (from another window).
// see the official example: https://www.khronos.org/opengl/wiki/Tutorial:_OpenGL_3.0_Context_Creation_(GLX)
it.makeCurrent(context)
// TODO remove in https://github.com/JetBrains/skiko/pull/300
(layer.contextHandler as OpenGLContextHandler).disposeInOpenGLContext()
it.destroyContext(context)
}
runBlocking {
......
......@@ -5,6 +5,7 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.swing.Swing
import kotlinx.coroutines.withContext
import org.jetbrains.skiko.*
import org.jetbrains.skiko.context.OpenGLContextHandler
internal class WindowsOpenGLRedrawer(
private val layer: SkiaLayer,
......@@ -34,6 +35,8 @@ internal class WindowsOpenGLRedrawer(
override fun dispose() {
check(!isDisposed) { "WindowsOpenGLRedrawer is disposed" }
makeCurrent()
// TODO remove in https://github.com/JetBrains/skiko/pull/300
(layer.contextHandler as OpenGLContextHandler).disposeInOpenGLContext()
deleteContext(context)
isDisposed = true
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment