Commit b83b0e67 authored by Roman Sedaikin's avatar Roman Sedaikin

Fixed rendering issue when launching the application.

parent fe2440d9
......@@ -41,7 +41,6 @@ open class SkiaLayer(
val initialRenderApi = fallbackRenderApiQueue.removeAt(0)
contextHandler = createContextHandler(this, initialRenderApi)
redrawer = platformOperations.createRedrawer(this, initialRenderApi, properties)
println("init ${redrawer == null}")
redrawer?.syncSize()
redraw()
}
......@@ -58,14 +57,12 @@ open class SkiaLayer(
}
override fun setBounds(x: Int, y: Int, width: Int, height: Int) {
println("setBounds: $x $y $width $height ${redrawer == null}")
super.setBounds(x, y, width, height)
redrawer?.syncSize()
redraw()
}
override fun paint(g: Graphics) {
println("paint ${redrawer == null}")
super.paint(g)
redrawer?.syncSize()
redrawer?.redrawImmediately()
......
package org.jetbrains.skiko.context
import java.lang.ref.Reference
import org.jetbrains.skija.ColorSpace
import org.jetbrains.skija.impl.Native
import org.jetbrains.skija.Surface
import org.jetbrains.skija.SurfaceColorFormat
import org.jetbrains.skija.SurfaceOrigin
import org.jetbrains.skiko.GraphicsApi
import org.jetbrains.skiko.SkiaLayer
import org.jetbrains.skiko.redrawer.MetalRedrawer
import javax.swing.SwingUtilities.convertPoint
import javax.swing.SwingUtilities.getRootPane
internal class MetalContextHandler(layer: SkiaLayer) : ContextHandler(layer) {
val metalRedrawer: MetalRedrawer
get() = layer.redrawer!! as MetalRedrawer
var device: Long = 0
override fun initContext(): Boolean {
try {
if (context == null) {
device = metalRedrawer.createDevice()
if (device == 0L) {
throw Exception("Failed to create Metal device.")
}
context = metalRedrawer.makeContext(device)
context = metalRedrawer.makeContext()
}
} catch (e: Exception) {
println("${e.message}\nFailed to create Skia Metal context!")
......@@ -40,7 +30,7 @@ internal class MetalContextHandler(layer: SkiaLayer) : ContextHandler(layer) {
val w = (layer.width * scale).toInt().coerceAtLeast(0)
val h = (layer.height * scale).toInt().coerceAtLeast(0)
renderTarget = metalRedrawer.makeRenderTarget(device, w, h)
renderTarget = metalRedrawer.makeRenderTarget(w, h)
surface = Surface.makeFromBackendRenderTarget(
context!!,
......@@ -56,6 +46,6 @@ internal class MetalContextHandler(layer: SkiaLayer) : ContextHandler(layer) {
override fun flush() {
super.flush()
surface!!.flushAndSubmit()
metalRedrawer.finishFrame(device)
metalRedrawer.finishFrame()
}
}
......@@ -16,7 +16,7 @@ internal class MetalRedrawer(
private val properties: SkiaLayerProperties
) : Redrawer {
private var isDisposed = false
private var device: Long = 0
private val device = layer.useDrawingSurfacePlatformInfo(::createMetalDevice)
private val frameDispatcher = FrameDispatcher(Dispatchers.Swing) {
update(System.nanoTime())
......@@ -49,7 +49,6 @@ internal class MetalRedrawer(
}
override fun syncSize() {
println("syncsize")
val globalPosition = convertPoint(layer, layer.x, layer.y, getRootPane(layer))
setContentScale(device, layer.contentScale)
resizeLayers(device,
......@@ -60,24 +59,21 @@ internal class MetalRedrawer(
)
}
fun makeContext(device: Long) = DirectContext(
fun makeContext() = DirectContext(
makeMetalContext(device)
)
fun makeRenderTarget(device: Long, width: Int, height: Int) = BackendRenderTarget(
fun makeRenderTarget(width: Int, height: Int) = BackendRenderTarget(
makeMetalRenderTarget(device, width, height)
)
fun createDevice(): Long {
device = layer.useDrawingSurfacePlatformInfo(::createMetalDevice)
return device
}
fun finishFrame() = finishFrame(device)
private external fun createMetalDevice(platformInfo: Long): Long
private external fun makeMetalContext(device: Long): Long
private external fun makeMetalRenderTarget(device: Long, width: Int, height: Int): Long
private external fun disposeDevice(device: Long)
external fun finishFrame(device: Long)
external fun resizeLayers(device: Long, x: Int, y: Int, width: Int, height: Int)
external fun setContentScale(device: Long, contentScale: Float)
private external fun finishFrame(device: Long)
private external fun resizeLayers(device: Long, x: Int, y: Int, width: Int, height: Int)
private external fun setContentScale(device: Long, contentScale: Float)
}
......@@ -13,8 +13,6 @@
#import <mtl/GrMtlBackendContext.h>
#import <mtl/GrMtlTypes.h>
JavaVM *jvmMetal = NULL;
@interface AWTMetalLayer : CAMetalLayer
@property jobject javaRef;
......@@ -102,7 +100,6 @@ JNIEXPORT jlong JNICALL Java_org_jetbrains_skiko_redrawer_MetalRedrawer_createMe
JNIEnv *env, jobject redrawer, jlong platformInfoPtr)
{
MetalDevice *device = [MetalDevice new];
env->GetJavaVM(&jvmMetal);
NSObject<JAWT_SurfaceLayers>* dsi_mac = (__bridge NSObject<JAWT_SurfaceLayers> *) platformInfoPtr;
......@@ -143,15 +140,18 @@ JNIEXPORT void JNICALL Java_org_jetbrains_skiko_redrawer_MetalRedrawer_resizeLay
[CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];
device.layer.frame = CGRectMake(x, y, width, height);
[CATransaction commit];
[device.layer performSelectorOnMainThread:@selector(setNeedsDisplay) withObject:0 waitUntilDone:NO];
[CATransaction flush];
}
JNIEXPORT void JNICALL Java_org_jetbrains_skiko_redrawer_MetalRedrawer_setContentScale(JNIEnv *env, jobject obj, jlong devicePtr, jfloat contentScale)
{
MetalDevice *device = (MetalDevice *) devicePtr;
[CATransaction begin];
[CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];
assert(contentScale != 0);
device.layer.contentsScale = contentScale;
device.container.contentsScale = contentScale;
[CATransaction commit];
[CATransaction flush];
}
JNIEXPORT void JNICALL Java_org_jetbrains_skiko_redrawer_MetalRedrawer_finishFrame(
......
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