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