Commit c9066364 authored by Roman Sedaikin's avatar Roman Sedaikin

Improved rendering stability on Mac OS.

parent a19a8bda
...@@ -104,15 +104,11 @@ open class SkiaWindow : JFrame() { ...@@ -104,15 +104,11 @@ open class SkiaWindow : JFrame() {
val layer: SkiaLayer = SkiaLayer() val layer: SkiaLayer = SkiaLayer()
init { init {
setLayout(null) contentPane.add(layer)
add(layer)
addComponentListener(object : ComponentAdapter() { addComponentListener(object : ComponentAdapter() {
override fun componentResized(e: ComponentEvent) { override fun componentResized(e: ComponentEvent) {
println("resize")
layer.reinit() layer.reinit()
layer.setSize(width, height)
display()
} }
}) })
} }
......
...@@ -7,18 +7,17 @@ ...@@ -7,18 +7,17 @@
#import <QuartzCore/QuartzCore.h> #import <QuartzCore/QuartzCore.h>
#import <OpenGL/gl3.h> #import <OpenGL/gl3.h>
JavaVM *jvm = NULL;
@interface AWTGLLayer : CAOpenGLLayer @interface AWTGLLayer : CAOpenGLLayer
@property jobject windowRef; @property jobject windowRef;
@property JavaVM *jvm;
@property bool isDrawing;
@end @end
@implementation AWTGLLayer @implementation AWTGLLayer
jobject windowRef; jobject windowRef;
JavaVM *jvm;
- (id)init - (id)init
{ {
...@@ -26,11 +25,11 @@ JavaVM *jvm; ...@@ -26,11 +25,11 @@ JavaVM *jvm;
if (self) if (self)
{ {
self.needsDisplayOnBoundsChange = YES; [self removeAllAnimations];
self.asynchronous = NO; [self setAutoresizingMask: (kCALayerWidthSizable|kCALayerHeightSizable)];
[self setNeedsDisplayOnBoundsChange: YES];
self.windowRef = NULL; self.windowRef = NULL;
self.jvm = NULL;
self.isDrawing = NO;
} }
return self; return self;
...@@ -41,14 +40,12 @@ JavaVM *jvm; ...@@ -41,14 +40,12 @@ JavaVM *jvm;
forLayerTime:(CFTimeInterval)t forLayerTime:(CFTimeInterval)t
displayTime:(const CVTimeStamp *)ts displayTime:(const CVTimeStamp *)ts
{ {
if (self.isDrawing) return;
self.isDrawing = YES;
CGLSetCurrentContext(ctx); CGLSetCurrentContext(ctx);
if (self.jvm != NULL) { if (jvm != NULL) {
// TODO: cache wndClass and drawMethod. // TODO: cache wndClass and drawMethod.
JNIEnv *env; JNIEnv *env;
(*self.jvm)->AttachCurrentThread(self.jvm, (void **)&env, NULL); (*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL);
static jclass wndClass = NULL; static jclass wndClass = NULL;
if (!wndClass) wndClass = (*env)->GetObjectClass(env, self.windowRef); if (!wndClass) wndClass = (*env)->GetObjectClass(env, self.windowRef);
...@@ -62,13 +59,11 @@ JavaVM *jvm; ...@@ -62,13 +59,11 @@ JavaVM *jvm;
} }
[super drawInCGLContext:ctx pixelFormat:pf forLayerTime:t displayTime:ts]; [super drawInCGLContext:ctx pixelFormat:pf forLayerTime:t displayTime:ts];
self.isDrawing = NO;
} }
- (void) dispose - (void) dispose
{ {
self.windowRef = NULL; self.windowRef = NULL;
self.jvm = NULL;
} }
@end @end
...@@ -110,7 +105,6 @@ AWTGLLayer *glLayer; ...@@ -110,7 +105,6 @@ AWTGLLayer *glLayer;
- (void) update - (void) update
{ {
[self.glLayer performSelectorOnMainThread:@selector(setNeedsDisplay) withObject:0 waitUntilDone:NO]; [self.glLayer performSelectorOnMainThread:@selector(setNeedsDisplay) withObject:0 waitUntilDone:NO];
[self.glLayer performSelectorOnMainThread:@selector(displayIfNeeded) withObject:0 waitUntilDone:NO];
} }
- (void) dispose - (void) dispose
...@@ -137,7 +131,6 @@ extern jboolean Skiko_GetAWT(JNIEnv* env, JAWT* awt); ...@@ -137,7 +131,6 @@ extern jboolean Skiko_GetAWT(JNIEnv* env, JAWT* awt);
JNIEXPORT void JNICALL Java_org_jetbrains_skiko_HardwareLayer_updateLayer(JNIEnv *env, jobject window) JNIEXPORT void JNICALL Java_org_jetbrains_skiko_HardwareLayer_updateLayer(JNIEnv *env, jobject window)
{ {
fprintf(stderr, "updateLayer\n");
if (windowsSet != nil) { if (windowsSet != nil) {
LayersSet *layer = findByObject(env, window); LayersSet *layer = findByObject(env, window);
if (layer != NULL) { if (layer != NULL) {
...@@ -168,7 +161,6 @@ JNIEXPORT void JNICALL Java_org_jetbrains_skiko_HardwareLayer_updateLayer(JNIEnv ...@@ -168,7 +161,6 @@ JNIEXPORT void JNICALL Java_org_jetbrains_skiko_HardwareLayer_updateLayer(JNIEnv
result = Skiko_GetAWT(env, &awt); result = Skiko_GetAWT(env, &awt);
assert(result != JNI_FALSE); assert(result != JNI_FALSE);
JavaVM *jvm;
(*env)->GetJavaVM(env, &jvm); (*env)->GetJavaVM(env, &jvm);
ds = awt.GetDrawingSurface(env, window); ds = awt.GetDrawingSurface(env, window);
...@@ -187,6 +179,9 @@ JNIEXPORT void JNICALL Java_org_jetbrains_skiko_HardwareLayer_updateLayer(JNIEnv ...@@ -187,6 +179,9 @@ JNIEXPORT void JNICALL Java_org_jetbrains_skiko_HardwareLayer_updateLayer(JNIEnv
[windowsSet addObject: layersSet]; [windowsSet addObject: layersSet];
layersSet.caLayer = [dsi_mac windowLayer]; layersSet.caLayer = [dsi_mac windowLayer];
[layersSet.caLayer removeAllAnimations];
[layersSet.caLayer setAutoresizingMask: (kCALayerWidthSizable|kCALayerHeightSizable)];
[layersSet.caLayer setNeedsDisplayOnBoundsChange: YES];
NSScreen *screen = [NSScreen mainScreen]; NSScreen *screen = [NSScreen mainScreen];
float scaleFactor = screen.backingScaleFactor; float scaleFactor = screen.backingScaleFactor;
...@@ -201,20 +196,18 @@ JNIEXPORT void JNICALL Java_org_jetbrains_skiko_HardwareLayer_updateLayer(JNIEnv ...@@ -201,20 +196,18 @@ JNIEXPORT void JNICALL Java_org_jetbrains_skiko_HardwareLayer_updateLayer(JNIEnv
jobject windowRef = (*env)->NewGlobalRef(env, window); jobject windowRef = (*env)->NewGlobalRef(env, window);
[layersSet.glLayer setJvm: jvm];
[layersSet.glLayer setWindowRef: windowRef]; [layersSet.glLayer setWindowRef: windowRef];
[layersSet setWindowRef: windowRef]; [layersSet setWindowRef: windowRef];
[layersSet syncSize];
ds->FreeDrawingSurfaceInfo(dsi); }
ds->FreeDrawingSurfaceInfo(dsi);
ds->Unlock(ds); ds->Unlock(ds);
awt.FreeDrawingSurface(ds); awt.FreeDrawingSurface(ds);
}
} }
JNIEXPORT void JNICALL Java_org_jetbrains_skiko_HardwareLayer_redrawLayer(JNIEnv *env, jobject window) { JNIEXPORT void JNICALL Java_org_jetbrains_skiko_HardwareLayer_redrawLayer(JNIEnv *env, jobject window) {
fprintf(stderr, "redrawLayer\n");
LayersSet *layer = findByObject(env, window); LayersSet *layer = findByObject(env, window);
if (layer != NULL) { if (layer != NULL) {
[layer update]; [layer update];
......
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