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( ...@@ -212,7 +212,7 @@ actual open class SkiaLayer internal constructor(
@Volatile @Volatile
private var isDisposed = false private var isDisposed = false
internal var redrawer: Redrawer? = null internal var redrawer: Redrawer? = null
private var contextHandler: ContextHandler? = null internal var contextHandler: ContextHandler? = null
private val fallbackRenderApiQueue = SkikoProperties.fallbackRenderApiQueue.toMutableList() private val fallbackRenderApiQueue = SkikoProperties.fallbackRenderApiQueue.toMutableList()
private var renderApi_ = fallbackRenderApiQueue[0] private var renderApi_ = fallbackRenderApiQueue[0]
actual var renderApi: GraphicsApi actual var renderApi: GraphicsApi
......
...@@ -73,4 +73,13 @@ internal class OpenGLContextHandler(layer: SkiaLayer) : ContextHandler(layer) { ...@@ -73,4 +73,13 @@ internal class OpenGLContextHandler(layer: SkiaLayer) : ContextHandler(layer) {
"Model: ${gl.glGetString(gl.GL_RENDERER)}\n" + "Model: ${gl.glGetString(gl.GL_RENDERER)}\n" +
"Total VRAM: ${gl.glGetIntegerv(gl.GL_TOTAL_MEMORY) / 1024} MB\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 ...@@ -3,6 +3,7 @@ package org.jetbrains.skiko.redrawer
import kotlinx.coroutines.* import kotlinx.coroutines.*
import kotlinx.coroutines.swing.Swing import kotlinx.coroutines.swing.Swing
import org.jetbrains.skiko.* import org.jetbrains.skiko.*
import org.jetbrains.skiko.context.OpenGLContextHandler
internal class LinuxOpenGLRedrawer( internal class LinuxOpenGLRedrawer(
private val layer: SkiaLayer, private val layer: SkiaLayer,
...@@ -51,6 +52,8 @@ internal class LinuxOpenGLRedrawer( ...@@ -51,6 +52,8 @@ internal class LinuxOpenGLRedrawer(
// makeCurrent is mandatory to destroy context, otherwise, OpenGL will destroy wrong context (from another window). // 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) // see the official example: https://www.khronos.org/opengl/wiki/Tutorial:_OpenGL_3.0_Context_Creation_(GLX)
it.makeCurrent(context) it.makeCurrent(context)
// TODO remove in https://github.com/JetBrains/skiko/pull/300
(layer.contextHandler as OpenGLContextHandler).disposeInOpenGLContext()
it.destroyContext(context) it.destroyContext(context)
} }
runBlocking { runBlocking {
......
...@@ -5,6 +5,7 @@ import kotlinx.coroutines.Dispatchers ...@@ -5,6 +5,7 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.swing.Swing import kotlinx.coroutines.swing.Swing
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import org.jetbrains.skiko.* import org.jetbrains.skiko.*
import org.jetbrains.skiko.context.OpenGLContextHandler
internal class WindowsOpenGLRedrawer( internal class WindowsOpenGLRedrawer(
private val layer: SkiaLayer, private val layer: SkiaLayer,
...@@ -34,6 +35,8 @@ internal class WindowsOpenGLRedrawer( ...@@ -34,6 +35,8 @@ internal class WindowsOpenGLRedrawer(
override fun dispose() { override fun dispose() {
check(!isDisposed) { "WindowsOpenGLRedrawer is disposed" } check(!isDisposed) { "WindowsOpenGLRedrawer is disposed" }
makeCurrent() makeCurrent()
// TODO remove in https://github.com/JetBrains/skiko/pull/300
(layer.contextHandler as OpenGLContextHandler).disposeInOpenGLContext()
deleteContext(context) deleteContext(context)
isDisposed = true 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