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