Commit 092c2196 authored by Igor Demin's avatar Igor Demin

Redraw immediately on resize and window start

parent 132f77ae
...@@ -33,7 +33,7 @@ open class SkiaLayer : HardwareLayer() { ...@@ -33,7 +33,7 @@ open class SkiaLayer : HardwareLayer() {
super.init() super.init()
redrawer = platformOperations.createRedrawer(this) redrawer = platformOperations.createRedrawer(this)
redrawer?.syncSize() redrawer?.syncSize()
needRedraw() redrawer?.redrawImmediately()
} }
override fun dispose() { override fun dispose() {
...@@ -49,7 +49,7 @@ open class SkiaLayer : HardwareLayer() { ...@@ -49,7 +49,7 @@ open class SkiaLayer : HardwareLayer() {
override fun setBounds(x: Int, y: Int, width: Int, height: Int) { override fun setBounds(x: Int, y: Int, width: Int, height: Int) {
super.setBounds(x, y, width, height) super.setBounds(x, y, width, height)
redrawer?.syncSize() redrawer?.syncSize()
needRedraw() redrawer?.redrawImmediately()
} }
override fun paint(g: Graphics) { override fun paint(g: Graphics) {
......
...@@ -12,10 +12,7 @@ internal class LinuxRedrawer( ...@@ -12,10 +12,7 @@ internal class LinuxRedrawer(
private val layer: HardwareLayer private val layer: HardwareLayer
) : Redrawer { ) : Redrawer {
private val context = layer.lockDrawingSurface { private val context = layer.lockDrawingSurface {
val context = it.createContext() it.createContext()
it.makeCurrent(context)
it.setSwapInterval(if (SkikoProperties.vsyncEnabled) 1 else 0)
context
} }
private var isDisposed = false private var isDisposed = false
...@@ -33,6 +30,16 @@ internal class LinuxRedrawer( ...@@ -33,6 +30,16 @@ internal class LinuxRedrawer(
frameDispatcher.scheduleFrame() frameDispatcher.scheduleFrame()
} }
override fun redrawImmediately() = layer.lockDrawingSurface {
check(!isDisposed)
update(System.nanoTime())
it.makeCurrent(context)
draw()
it.setSwapInterval(0)
it.swapBuffers()
OpenGLApi.instance.glFinish()
}
private fun update(nanoTime: Long) { private fun update(nanoTime: Long) {
layer.update(nanoTime) layer.update(nanoTime)
} }
...@@ -69,6 +76,8 @@ internal class LinuxRedrawer( ...@@ -69,6 +76,8 @@ internal class LinuxRedrawer(
} }
toRedrawAlive.forEachIndexed { index, _ -> toRedrawAlive.forEachIndexed { index, _ ->
// it is ok to set swap interval every frame, there is no performance overhead
drawingSurfaces[index].setSwapInterval(if (SkikoProperties.vsyncEnabled) 1 else 0)
drawingSurfaces[index].swapBuffers() drawingSurfaces[index].swapBuffers()
} }
......
...@@ -104,6 +104,11 @@ internal class MacOsRedrawer( ...@@ -104,6 +104,11 @@ internal class MacOsRedrawer(
override fun needRedraw() { override fun needRedraw() {
frameDispatcher.scheduleFrame() frameDispatcher.scheduleFrame()
} }
override fun redrawImmediately() {
layer.update(System.nanoTime())
drawLayer.setNeedsDisplay()
}
} }
private open class AWTGLLayer(private val containerPtr: Long, setNeedsDisplayOnBoundsChange: Boolean) { private open class AWTGLLayer(private val containerPtr: Long, setNeedsDisplayOnBoundsChange: Boolean) {
......
...@@ -3,5 +3,6 @@ package org.jetbrains.skiko.redrawer ...@@ -3,5 +3,6 @@ package org.jetbrains.skiko.redrawer
interface Redrawer { interface Redrawer {
fun dispose() fun dispose()
fun needRedraw() fun needRedraw()
fun redrawImmediately()
fun syncSize() = Unit fun syncSize() = Unit
} }
\ No newline at end of file
...@@ -37,6 +37,15 @@ internal class WindowsRedrawer( ...@@ -37,6 +37,15 @@ internal class WindowsRedrawer(
frameDispatcher.scheduleFrame() frameDispatcher.scheduleFrame()
} }
override fun redrawImmediately() {
check(!isDisposed)
update(System.nanoTime())
makeCurrent()
draw()
swapBuffers()
OpenGLApi.instance.glFinish()
}
private fun update(nanoTime: Long) { private fun update(nanoTime: Long) {
layer.update(nanoTime) layer.update(nanoTime)
} }
......
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