Commit 0556e3e7 authored by Roman Sedaikin's avatar Roman Sedaikin

Fixed memory leak when closing window with Metal rendering.

parent b1dcc60a
...@@ -6,6 +6,8 @@ import org.jetbrains.skija.SurfaceColorFormat ...@@ -6,6 +6,8 @@ import org.jetbrains.skija.SurfaceColorFormat
import org.jetbrains.skija.SurfaceOrigin import org.jetbrains.skija.SurfaceOrigin
import org.jetbrains.skiko.SkiaLayer import org.jetbrains.skiko.SkiaLayer
import org.jetbrains.skiko.redrawer.MetalRedrawer import org.jetbrains.skiko.redrawer.MetalRedrawer
import org.jetbrains.skija.impl.Native
import org.jetbrains.skiko.destroyContext
internal class MetalContextHandler(layer: SkiaLayer) : ContextHandler(layer) { internal class MetalContextHandler(layer: SkiaLayer) : ContextHandler(layer) {
val metalRedrawer: MetalRedrawer val metalRedrawer: MetalRedrawer
...@@ -48,4 +50,8 @@ internal class MetalContextHandler(layer: SkiaLayer) : ContextHandler(layer) { ...@@ -48,4 +50,8 @@ internal class MetalContextHandler(layer: SkiaLayer) : ContextHandler(layer) {
surface!!.flushAndSubmit() surface!!.flushAndSubmit()
metalRedrawer.finishFrame() metalRedrawer.finishFrame()
} }
override fun destroyContext() {
destroyContext(Native.getPtr(context!!))
}
} }
...@@ -122,6 +122,7 @@ JNIEXPORT void JNICALL Java_org_jetbrains_skiko_HardwareLayer_nativeDispose(JNIE ...@@ -122,6 +122,7 @@ JNIEXPORT void JNICALL Java_org_jetbrains_skiko_HardwareLayer_nativeDispose(JNIE
{ {
[layerStorage removeObject: layer]; [layerStorage removeObject: layer];
[layer disposeLayer: env]; [layer disposeLayer: env];
[layer release];
} }
} }
......
...@@ -63,6 +63,16 @@ ...@@ -63,6 +63,16 @@
return self; return self;
} }
-(void)dealloc {
NSLog(@"dealock");
[self.layer removeFromSuperlayer];
[self.layer release];
[self.device release];
[self.queue release];
[self.drawableHandle release];
[super dealloc];
}
@end @end
extern "C" extern "C"
...@@ -82,6 +92,7 @@ JNIEXPORT jlong JNICALL Java_org_jetbrains_skiko_redrawer_MetalRedrawer_makeMeta ...@@ -82,6 +92,7 @@ JNIEXPORT jlong JNICALL Java_org_jetbrains_skiko_redrawer_MetalRedrawer_makeMeta
JNIEnv * env, jobject redrawer, jlong devicePtr, jint width, jint height) JNIEnv * env, jobject redrawer, jlong devicePtr, jint width, jint height)
{ {
MetalDevice *device = (MetalDevice *) devicePtr; MetalDevice *device = (MetalDevice *) devicePtr;
[device.drawableHandle release];
id<CAMetalDrawable> currentDrawable = [device.layer nextDrawable]; id<CAMetalDrawable> currentDrawable = [device.layer nextDrawable];
GrMtlTextureInfo info; GrMtlTextureInfo info;
info.fTexture.retain(currentDrawable.texture); info.fTexture.retain(currentDrawable.texture);
...@@ -173,9 +184,7 @@ JNIEXPORT void JNICALL Java_org_jetbrains_skiko_redrawer_MetalRedrawer_disposeDe ...@@ -173,9 +184,7 @@ JNIEXPORT void JNICALL Java_org_jetbrains_skiko_redrawer_MetalRedrawer_disposeDe
JNIEnv *env, jobject redrawer, jlong devicePtr) JNIEnv *env, jobject redrawer, jlong devicePtr)
{ {
MetalDevice *device = (MetalDevice *) devicePtr; MetalDevice *device = (MetalDevice *) devicePtr;
[device.layer removeFromSuperlayer];
env->DeleteGlobalRef(device.layer.javaRef); env->DeleteGlobalRef(device.layer.javaRef);
[device.layer release];
[device release]; [device release];
} }
......
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