Commit c02c672c authored by Roman Sedaikin's avatar Roman Sedaikin

Added fallback to raster if skia failed to create hardware context.

parent 48e4d6e7
...@@ -15,7 +15,7 @@ import kotlin.math.cos ...@@ -15,7 +15,7 @@ import kotlin.math.cos
import kotlin.math.sin import kotlin.math.sin
fun main(args: Array<String>) { fun main(args: Array<String>) {
System.setProperty("skiko.renderApi", "RASTER") // System.setProperty("skiko.renderApi", "RASTER")
repeat(1) { repeat(1) {
createWindow("window $it") createWindow("window $it")
} }
......
...@@ -2,7 +2,9 @@ package org.jetbrains.skiko ...@@ -2,7 +2,9 @@ package org.jetbrains.skiko
import org.jetbrains.skija.* import org.jetbrains.skija.*
import org.jetbrains.skiko.redrawer.Redrawer import org.jetbrains.skiko.redrawer.Redrawer
import org.jetbrains.skiko.redrawer.RasterRedrawer
import org.jetbrains.skiko.context.createContextHandler import org.jetbrains.skiko.context.createContextHandler
import org.jetbrains.skiko.context.RasterContextHandler
import java.awt.Graphics import java.awt.Graphics
import javax.swing.SwingUtilities.isEventDispatchThread import javax.swing.SwingUtilities.isEventDispatchThread
...@@ -16,7 +18,7 @@ open class SkiaLayer : HardwareLayer() { ...@@ -16,7 +18,7 @@ open class SkiaLayer : HardwareLayer() {
var renderer: SkiaRenderer? = null var renderer: SkiaRenderer? = null
val clipComponents = mutableListOf<ClipRectangle>() val clipComponents = mutableListOf<ClipRectangle>()
private val skijaState = createContextHandler(this) internal var skijaState = createContextHandler(this)
@Volatile @Volatile
private var isDisposed = false private var isDisposed = false
...@@ -101,7 +103,10 @@ open class SkiaLayer : HardwareLayer() { ...@@ -101,7 +103,10 @@ open class SkiaLayer : HardwareLayer() {
override fun draw() { override fun draw() {
check(!isDisposed) check(!isDisposed)
skijaState.apply { skijaState.apply {
initContext() if (!initContext()) {
fallbackToRaster()
return
}
initCanvas() initCanvas()
clearCanvas() clearCanvas()
synchronized(pictureLock) { synchronized(pictureLock) {
...@@ -127,4 +132,11 @@ open class SkiaLayer : HardwareLayer() { ...@@ -127,4 +132,11 @@ open class SkiaLayer : HardwareLayer() {
true true
) )
} }
private fun fallbackToRaster() {
println("Falling back to software rendering...")
skijaState = RasterContextHandler(this)
redrawer = RasterRedrawer(this)
needRedraw()
}
} }
...@@ -46,7 +46,7 @@ internal abstract class ContextHandler(val layer: HardwareLayer) { ...@@ -46,7 +46,7 @@ internal abstract class ContextHandler(val layer: HardwareLayer) {
var surface: Surface? = null var surface: Surface? = null
var canvas: Canvas? = null var canvas: Canvas? = null
abstract fun initContext() abstract fun initContext(): Boolean
abstract fun initCanvas() abstract fun initCanvas()
......
...@@ -10,10 +10,16 @@ import org.jetbrains.skiko.makeMetalContext ...@@ -10,10 +10,16 @@ import org.jetbrains.skiko.makeMetalContext
import org.jetbrains.skiko.makeMetalRenderTarget import org.jetbrains.skiko.makeMetalRenderTarget
internal class MetalContextHandler(layer: HardwareLayer) : ContextHandler(layer) { internal class MetalContextHandler(layer: HardwareLayer) : ContextHandler(layer) {
override fun initContext() { override fun initContext(): Boolean {
if (context == null) { try {
context = makeMetalContext() if (context == null) {
context = makeMetalContext()
}
} catch (e: Exception) {
println("Failed to create Skia Metal context!")
return false
} }
return true
} }
override fun initCanvas() { override fun initCanvas() {
......
...@@ -12,10 +12,16 @@ import org.jetbrains.skiko.makeGLRenderTarget ...@@ -12,10 +12,16 @@ import org.jetbrains.skiko.makeGLRenderTarget
import org.jetbrains.skiko.OpenGLApi import org.jetbrains.skiko.OpenGLApi
internal class OpenGLContextHandler(layer: HardwareLayer) : ContextHandler(layer) { internal class OpenGLContextHandler(layer: HardwareLayer) : ContextHandler(layer) {
override fun initContext() { override fun initContext(): Boolean {
if (context == null) { try {
context = makeGLContext() if (context == null) {
context = makeGLContext()
}
} catch (e: Exception) {
println("Failed to create Skia OpenGL context!")
return false
} }
return true
} }
override fun initCanvas() { override fun initCanvas() {
......
...@@ -33,8 +33,9 @@ internal class RasterContextHandler(layer: HardwareLayer) : ContextHandler(layer ...@@ -33,8 +33,9 @@ internal class RasterContextHandler(layer: HardwareLayer) : ContextHandler(layer
var imageData: ByteArray? = null var imageData: ByteArray? = null
var raster: WritableRaster? = null var raster: WritableRaster? = null
override fun initContext() { override fun initContext(): Boolean {
// Raster does not need context // Raster does not need context
return true
} }
override fun initCanvas() { override fun initCanvas() {
......
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