Commit 132f77ae authored by Igor Demin's avatar Igor Demin

Make SkiaRenderer non-suspend

Suspend was added because compose's onRender was suspend.
Now it is non-suspend.

If we make this method non-suspend, we can synchronously redraw window after it is resized or started (to avoid lags at resize and start)
parent 6ad0a4e6
...@@ -89,7 +89,7 @@ class Renderer( ...@@ -89,7 +89,7 @@ class Renderer(
var canvas: Canvas? = null var canvas: Canvas? = null
override suspend fun onRender(canvas: Canvas, width: Int, height: Int, nanoTime: Long) { override fun onRender(canvas: Canvas, width: Int, height: Int, nanoTime: Long) {
this.canvas = canvas this.canvas = canvas
val contentScale = layer.contentScale val contentScale = layer.contentScale
canvas.scale(contentScale, contentScale) canvas.scale(contentScale, contentScale)
......
...@@ -73,7 +73,7 @@ native crash in SkiaWindowTest "render single window" ...@@ -73,7 +73,7 @@ native crash in SkiaWindowTest "render single window"
setSize(width, height) setSize(width, height)
defaultCloseOperation = WindowConstants.DISPOSE_ON_CLOSE defaultCloseOperation = WindowConstants.DISPOSE_ON_CLOSE
layer.renderer = object : SkiaRenderer { layer.renderer = object : SkiaRenderer {
override suspend fun onRender(canvas: Canvas, width: Int, height: Int, nanoTime: Long) { override fun onRender(canvas: Canvas, width: Int, height: Int, nanoTime: Long) {
if (canCollect && frameTimes.size < frameCount) { if (canCollect && frameTimes.size < frameCount) {
frameTimes.add(System.nanoTime()) // we check the real time, not the time provided by the argument frameTimes.add(System.nanoTime()) // we check the real time, not the time provided by the argument
} }
...@@ -183,7 +183,7 @@ j org.jetbrains.skiko.redrawer.MacOsRedrawer$drawLayer$1.draw()V+7 ...@@ -183,7 +183,7 @@ j org.jetbrains.skiko.redrawer.MacOsRedrawer$drawLayer$1.draw()V+7
var t1 = Long.MAX_VALUE var t1 = Long.MAX_VALUE
val refreshRate = window.graphicsConfiguration.device.displayMode.refreshRate val refreshRate = window.graphicsConfiguration.device.displayMode.refreshRate
override suspend fun onRender(canvas: Canvas, width: Int, height: Int, nanoTime: Long) { override fun onRender(canvas: Canvas, width: Int, height: Int, nanoTime: Long) {
val t2 = System.nanoTime() val t2 = System.nanoTime()
val frameTime = (t2 - t1).coerceAtLeast(0) val frameTime = (t2 - t1).coerceAtLeast(0)
t1 = t2 t1 = t2
......
...@@ -138,7 +138,7 @@ class SkiaWindowTest { ...@@ -138,7 +138,7 @@ class SkiaWindowTest {
window.setSize(40, 20) window.setSize(40, 20)
window.defaultCloseOperation = WindowConstants.DISPOSE_ON_CLOSE window.defaultCloseOperation = WindowConstants.DISPOSE_ON_CLOSE
window.layer.renderer = object : SkiaRenderer { window.layer.renderer = object : SkiaRenderer {
override suspend fun onRender(canvas: Canvas, width: Int, height: Int, nanoTime: Long) { override fun onRender(canvas: Canvas, width: Int, height: Int, nanoTime: Long) {
renderCount++ renderCount++
} }
} }
...@@ -231,7 +231,7 @@ class SkiaWindowTest { ...@@ -231,7 +231,7 @@ class SkiaWindowTest {
val paragraph by lazy { paragraph(window.layer.contentScale * 40, "=-+Нп") } val paragraph by lazy { paragraph(window.layer.contentScale * 40, "=-+Нп") }
window.layer.renderer = object : SkiaRenderer { window.layer.renderer = object : SkiaRenderer {
override suspend fun onRender(canvas: Canvas, width: Int, height: Int, nanoTime: Long) { override fun onRender(canvas: Canvas, width: Int, height: Int, nanoTime: Long) {
paragraph.layout(Float.POSITIVE_INFINITY) paragraph.layout(Float.POSITIVE_INFINITY)
paragraph.paint(canvas, 0f, 0f) paragraph.paint(canvas, 0f, 0f)
} }
...@@ -259,7 +259,7 @@ class SkiaWindowTest { ...@@ -259,7 +259,7 @@ class SkiaWindowTest {
var rectHeight: Int, var rectHeight: Int,
private val rectColor: Color private val rectColor: Color
) : SkiaRenderer { ) : SkiaRenderer {
override suspend fun onRender(canvas: Canvas, width: Int, height: Int, nanoTime: Long) { override fun onRender(canvas: Canvas, width: Int, height: Int, nanoTime: Long) {
val dpi = layer.contentScale val dpi = layer.contentScale
canvas.drawRect(Rect(0f, 0f, width.toFloat(), height.toFloat()), Paint().apply { canvas.drawRect(Rect(0f, 0f, width.toFloat(), height.toFloat()), Paint().apply {
color = Color.WHITE.rgb color = Color.WHITE.rgb
...@@ -278,7 +278,7 @@ class SkiaWindowTest { ...@@ -278,7 +278,7 @@ class SkiaWindowTest {
private var oldNanoTime = Long.MAX_VALUE private var oldNanoTime = Long.MAX_VALUE
private var x = 0.0 private var x = 0.0
override suspend fun onRender(canvas: Canvas, width: Int, height: Int, nanoTime: Long) { override fun onRender(canvas: Canvas, width: Int, height: Int, nanoTime: Long) {
canvas.clear(Color.WHITE.rgb) canvas.clear(Color.WHITE.rgb)
val dt = (nanoTime - oldNanoTime).coerceAtLeast(0) / 1E9 val dt = (nanoTime - oldNanoTime).coerceAtLeast(0) / 1E9
......
...@@ -62,7 +62,7 @@ abstract class HardwareLayer : Canvas() { ...@@ -62,7 +62,7 @@ abstract class HardwareLayer : Canvas() {
} }
// Should be called in Swing thread // Should be called in Swing thread
internal abstract suspend fun update(nanoTime: Long) internal abstract fun update(nanoTime: Long)
// Should be called in the OpenGL thread, and only once after update // Should be called in the OpenGL thread, and only once after update
internal abstract fun draw() internal abstract fun draw()
......
...@@ -9,7 +9,7 @@ import java.awt.Graphics ...@@ -9,7 +9,7 @@ import java.awt.Graphics
import javax.swing.SwingUtilities.isEventDispatchThread import javax.swing.SwingUtilities.isEventDispatchThread
interface SkiaRenderer { interface SkiaRenderer {
suspend fun onRender(canvas: Canvas, width: Int, height: Int, nanoTime: Long) fun onRender(canvas: Canvas, width: Int, height: Int, nanoTime: Long)
} }
private class PictureHolder(val instance: Picture, val width: Int, val height: Int) private class PictureHolder(val instance: Picture, val width: Int, val height: Int)
...@@ -69,7 +69,7 @@ open class SkiaLayer : HardwareLayer() { ...@@ -69,7 +69,7 @@ open class SkiaLayer : HardwareLayer() {
probability = SkikoProperties.fpsProbability probability = SkikoProperties.fpsProbability
) )
override suspend fun update(nanoTime: Long) { override fun update(nanoTime: Long) {
check(!isDisposed) check(!isDisposed)
check(isEventDispatchThread()) check(isEventDispatchThread())
......
...@@ -2,9 +2,7 @@ package org.jetbrains.skiko.redrawer ...@@ -2,9 +2,7 @@ package org.jetbrains.skiko.redrawer
import kotlinx.coroutines.CancellationException import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.swing.Swing import kotlinx.coroutines.swing.Swing
import kotlinx.coroutines.withContext
import org.jetbrains.skiko.FrameDispatcher import org.jetbrains.skiko.FrameDispatcher
import org.jetbrains.skiko.HardwareLayer import org.jetbrains.skiko.HardwareLayer
import org.jetbrains.skiko.OpenGLApi import org.jetbrains.skiko.OpenGLApi
...@@ -20,7 +18,6 @@ internal class LinuxRedrawer( ...@@ -20,7 +18,6 @@ internal class LinuxRedrawer(
context context
} }
private var isDisposed = false private var isDisposed = false
private val job = Job()
override fun dispose() { override fun dispose() {
check(!isDisposed) check(!isDisposed)
...@@ -28,7 +25,6 @@ internal class LinuxRedrawer( ...@@ -28,7 +25,6 @@ internal class LinuxRedrawer(
it.destroyContext(context) it.destroyContext(context)
} }
isDisposed = true isDisposed = true
job.cancel()
} }
override fun needRedraw() { override fun needRedraw() {
...@@ -37,10 +33,8 @@ internal class LinuxRedrawer( ...@@ -37,10 +33,8 @@ internal class LinuxRedrawer(
frameDispatcher.scheduleFrame() frameDispatcher.scheduleFrame()
} }
private suspend fun update(nanoTime: Long) { private fun update(nanoTime: Long) {
withContext(job) { layer.update(nanoTime)
layer.update(nanoTime)
}
} }
private fun draw() { private fun draw() {
......
...@@ -2,7 +2,6 @@ package org.jetbrains.skiko.redrawer ...@@ -2,7 +2,6 @@ package org.jetbrains.skiko.redrawer
import kotlinx.coroutines.CancellationException import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.swing.Swing import kotlinx.coroutines.swing.Swing
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import org.jetbrains.skiko.FrameDispatcher import org.jetbrains.skiko.FrameDispatcher
...@@ -16,7 +15,6 @@ internal class WindowsRedrawer( ...@@ -16,7 +15,6 @@ internal class WindowsRedrawer(
private val device = getDevice(layer) private val device = getDevice(layer)
private val context = createContext(device) private val context = createContext(device)
private var isDisposed = false private var isDisposed = false
private val job = Job()
init { init {
makeCurrent() makeCurrent()
...@@ -31,7 +29,6 @@ internal class WindowsRedrawer( ...@@ -31,7 +29,6 @@ internal class WindowsRedrawer(
check(!isDisposed) check(!isDisposed)
deleteContext(context) deleteContext(context)
isDisposed = true isDisposed = true
job.cancel()
} }
override fun needRedraw() { override fun needRedraw() {
...@@ -40,10 +37,8 @@ internal class WindowsRedrawer( ...@@ -40,10 +37,8 @@ internal class WindowsRedrawer(
frameDispatcher.scheduleFrame() frameDispatcher.scheduleFrame()
} }
private suspend fun update(nanoTime: Long) { private fun update(nanoTime: Long) {
withContext(job) { layer.update(nanoTime)
layer.update(nanoTime)
}
} }
private fun draw() { private fun draw() {
......
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