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