Commit ed3b00b7 authored by Igor Demin's avatar Igor Demin

Ability to change isVsyncEnabled through constructor of SkiaLayer

parent b6e0411e
......@@ -14,7 +14,7 @@ internal interface PlatformOperations {
fun isFullscreen(component: Component): Boolean
fun setFullscreen(component: Component, value: Boolean)
fun getDpiScale(component: Component): Float
fun createRedrawer(layer: HardwareLayer): Redrawer
fun createRedrawer(layer: HardwareLayer, properties: SkiaLayerProperties): Redrawer
}
internal val platformOperations: PlatformOperations by lazy {
......@@ -32,9 +32,9 @@ internal val platformOperations: PlatformOperations by lazy {
return component.graphicsConfiguration.defaultTransform.scaleX.toFloat()
}
override fun createRedrawer(layer: HardwareLayer) = when(renderApi) {
override fun createRedrawer(layer: HardwareLayer, properties: SkiaLayerProperties) = when(renderApi) {
GraphicsApi.SOFTWARE -> RasterRedrawer(layer)
else -> MacOsOpenGLRedrawer(layer)
else -> MacOsOpenGLRedrawer(layer, properties)
}
}
OS.Windows -> {
......@@ -55,9 +55,9 @@ internal val platformOperations: PlatformOperations by lazy {
return component.graphicsConfiguration.defaultTransform.scaleX.toFloat()
}
override fun createRedrawer(layer: HardwareLayer) = when(renderApi) {
override fun createRedrawer(layer: HardwareLayer, properties: SkiaLayerProperties) = when(renderApi) {
GraphicsApi.SOFTWARE -> RasterRedrawer(layer)
else -> WindowsOpenGLRedrawer(layer)
else -> WindowsOpenGLRedrawer(layer, properties)
}
}
}
......@@ -91,9 +91,9 @@ internal val platformOperations: PlatformOperations by lazy {
// return component.useDrawingSurfacePlatformInfo(::linuxGetDpiScaleNative)
}
override fun createRedrawer(layer: HardwareLayer) = when(renderApi) {
override fun createRedrawer(layer: HardwareLayer, properties: SkiaLayerProperties) = when(renderApi) {
GraphicsApi.SOFTWARE -> RasterRedrawer(layer)
else -> LinuxOpenGLRedrawer(layer)
else -> LinuxOpenGLRedrawer(layer, properties)
}
}
}
......
......@@ -18,7 +18,9 @@ interface SkiaRenderer {
private class PictureHolder(val instance: Picture, val width: Int, val height: Int)
open class SkiaLayer : HardwareLayer() {
open class SkiaLayer(
private val properties: SkiaLayerProperties = SkiaLayerProperties()
) : HardwareLayer() {
var renderer: SkiaRenderer? = null
val clipComponents = mutableListOf<ClipRectangle>()
......@@ -35,7 +37,7 @@ open class SkiaLayer : HardwareLayer() {
override fun init() {
super.init()
redrawer = platformOperations.createRedrawer(this)
redrawer = platformOperations.createRedrawer(this, properties)
redrawer?.syncSize()
redrawer?.redrawImmediately()
}
......
package org.jetbrains.skiko
class SkiaLayerProperties(
val isVsyncEnabled: Boolean = SkikoProperties.vsyncEnabled
)
\ No newline at end of file
......@@ -2,8 +2,10 @@ package org.jetbrains.skiko
import javax.swing.JFrame
open class SkiaWindow : JFrame() {
val layer = SkiaLayer()
open class SkiaWindow(
properties: SkiaLayerProperties = SkiaLayerProperties()
) : JFrame() {
val layer = SkiaLayer(properties)
init {
contentPane.add(layer)
......
......@@ -7,11 +7,12 @@ import org.jetbrains.skiko.DrawingSurface
import org.jetbrains.skiko.FrameDispatcher
import org.jetbrains.skiko.HardwareLayer
import org.jetbrains.skiko.OpenGLApi
import org.jetbrains.skiko.SkikoProperties
import org.jetbrains.skiko.SkiaLayerProperties
import org.jetbrains.skiko.getDrawingSurface
internal class LinuxOpenGLRedrawer(
private val layer: HardwareLayer
private val layer: HardwareLayer,
private val properties: SkiaLayerProperties
) : Redrawer {
private val context = layer.lockDrawingSurface {
it.createContext()
......@@ -70,6 +71,8 @@ internal class LinuxOpenGLRedrawer(
}
}
val isVsyncEnabled = toRedrawAlive.all { it.properties.isVsyncEnabled }
val drawingSurfaces = toRedrawAlive.map { lockDrawingSurface(it.layer) }.toList()
try {
toRedrawAlive.forEachIndexed { index, redrawer ->
......@@ -79,7 +82,7 @@ internal class LinuxOpenGLRedrawer(
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].setSwapInterval(if (isVsyncEnabled) 1 else 0)
drawingSurfaces[index].swapBuffers()
}
......
......@@ -5,14 +5,15 @@ import kotlinx.coroutines.swing.Swing
import org.jetbrains.skiko.FrameDispatcher
import org.jetbrains.skiko.HardwareLayer
import org.jetbrains.skiko.OpenGLApi
import org.jetbrains.skiko.SkikoProperties
import org.jetbrains.skiko.useDrawingSurfacePlatformInfo
import org.jetbrains.skiko.SkiaLayerProperties
import org.jetbrains.skiko.Task
import org.jetbrains.skiko.useDrawingSurfacePlatformInfo
import javax.swing.SwingUtilities.convertPoint
import javax.swing.SwingUtilities.getRootPane
internal class MacOsOpenGLRedrawer(
private val layer: HardwareLayer
private val layer: HardwareLayer,
private val properties: SkiaLayerProperties
) : Redrawer {
private val containerLayerPtr = layer.useDrawingSurfacePlatformInfo(::initContainer)
private val drawLock = Any()
......@@ -78,7 +79,7 @@ internal class MacOsOpenGLRedrawer(
synchronized(drawLock) {
layer.update(System.nanoTime())
}
if (SkikoProperties.vsyncEnabled) {
if (properties.isVsyncEnabled) {
drawLayer.setNeedsDisplay()
vsyncLayer.sync()
} else {
......
......@@ -7,11 +7,12 @@ import kotlinx.coroutines.withContext
import org.jetbrains.skiko.FrameDispatcher
import org.jetbrains.skiko.HardwareLayer
import org.jetbrains.skiko.OpenGLApi
import org.jetbrains.skiko.SkikoProperties
import org.jetbrains.skiko.SkiaLayerProperties
import org.jetbrains.skiko.useDrawingSurfacePlatformInfo
internal class WindowsOpenGLRedrawer(
private val layer: HardwareLayer
private val layer: HardwareLayer,
private val properties: SkiaLayerProperties
) : Redrawer {
private val device = layer.useDrawingSurfacePlatformInfo(::getDevice)
private val context = createContext(device)
......@@ -92,7 +93,8 @@ internal class WindowsOpenGLRedrawer(
OpenGLApi.instance.glFinish()
}
if (SkikoProperties.vsyncEnabled) {
val isVsyncEnabled = toRedrawAlive.all { it.properties.isVsyncEnabled }
if (isVsyncEnabled) {
withContext(Dispatchers.IO) {
dwmFlush() // wait for vsync
}
......
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