diff --git a/modules/javafx.graphics/src/main/java/com/sun/prism/sw/SWPipeline.java b/modules/javafx.graphics/src/main/java/com/sun/prism/sw/SWPipeline.java index 3bcdf5fa05..0376f210c1 100644 --- a/modules/javafx.graphics/src/main/java/com/sun/prism/sw/SWPipeline.java +++ b/modules/javafx.graphics/src/main/java/com/sun/prism/sw/SWPipeline.java @@ -29,6 +29,7 @@ import com.sun.glass.ui.Screen; import com.sun.glass.utils.NativeLibLoader; import com.sun.prism.GraphicsPipeline; import com.sun.prism.ResourceFactory; +import com.sun.javafx.PlatformUtil; import java.util.List; import java.util.HashMap; @@ -40,6 +41,8 @@ public final class SWPipeline extends GraphicsPipeline { } @Override public boolean init() { + HashMap devDetails = new HashMap(); + setDeviceDetails(devDetails); return true; } @@ -69,6 +72,14 @@ public final class SWPipeline extends GraphicsPipeline { if (factory == null) { factory = new SWResourceFactory(screen); factories.put(index, factory); + if (PlatformUtil.isMac()) { + HashMap devDetails = + (HashMap)SWPipeline.getInstance().getDeviceDetails(); + // When Metal becomes default hardware pipeline, we need + // enable this flag + devDetails.put("useMTLInGlass", + false); + } } return factory; } diff --git a/modules/javafx.graphics/src/main/native-glass/mac/GlassLayer.h b/modules/javafx.graphics/src/main/native-glass/mac/GlassLayer.h index 16e159a1b8..99e6fb2eb3 100644 --- a/modules/javafx.graphics/src/main/native-glass/mac/GlassLayer.h +++ b/modules/javafx.graphics/src/main/native-glass/mac/GlassLayer.h @@ -36,7 +36,8 @@ andClientContext:(NSObject*)clCtx mtlQueuePtr:(long)mtlCommandQueuePtr withHiDPIAware:(BOOL)HiDPIAware - withIsSwPipe:(BOOL)isSwPipe; + withIsSwPipe:(BOOL)isSwPipe + useMTLForBlit:(BOOL)useMTLInGlass; - (GlassOffscreen*)getPainterOffscreen; - (void)bindForWidth:(unsigned int)width diff --git a/modules/javafx.graphics/src/main/native-glass/mac/GlassLayer.m b/modules/javafx.graphics/src/main/native-glass/mac/GlassLayer.m index 99f5503677..bfb0073805 100644 --- a/modules/javafx.graphics/src/main/native-glass/mac/GlassLayer.m +++ b/modules/javafx.graphics/src/main/native-glass/mac/GlassLayer.m @@ -29,7 +29,7 @@ #import "GlassLayerCGL.h" #import "GlassLayerMTL.h" -//#define VERBOSE +#define VERBOSE #ifndef VERBOSE #define LOG(MSG, ...) #else @@ -45,18 +45,22 @@ - (id)initGlassLayer:(NSObject*)ctx mtlQueuePtr:(long)mtlCommandQueuePtr withHiDPIAware:(BOOL)HiDPIAware withIsSwPipe:(BOOL)isSwPipe + useMTLForBlit:(BOOL)useMTLInGlass { LOG("GlassLayer initGlassLayer]"); self = [super init]; if (self != nil) { - if (mtlCommandQueuePtr != 0l) { // MTL + if (mtlCommandQueuePtr != 0l || + useMTLInGlass) { // MTL + LOG("GlassLayer initGlassLayer using MTLLayer"); GlassLayerMTL* mtlLayer = [[GlassLayerMTL alloc] init:mtlCommandQueuePtr withIsSwPipe:isSwPipe]; self->painterOffScreen = [mtlLayer getPainterOffscreen]; self->glassOffScreen = nil; [self addSublayer:mtlLayer]; } else { + LOG("GlassLayer initGlassLayer using CGLLayer"); GlassLayerCGL* cglLayer = [[GlassLayerCGL alloc] initWithSharedContext:(CGLContextObj)ctx andClientContext:(CGLContextObj)clCtx withHiDPIAware:HiDPIAware diff --git a/modules/javafx.graphics/src/main/native-glass/mac/GlassView3D.m b/modules/javafx.graphics/src/main/native-glass/mac/GlassView3D.m index 482c761426..806677b0d2 100644 --- a/modules/javafx.graphics/src/main/native-glass/mac/GlassView3D.m +++ b/modules/javafx.graphics/src/main/native-glass/mac/GlassView3D.m @@ -36,7 +36,7 @@ #import "GlassViewMTL.h" #import "GlassApplication.h" -//#define VERBOSE +#define VERBOSE #ifndef VERBOSE #define LOG(MSG, ...) #else @@ -110,6 +110,7 @@ - (id)initWithFrame:(NSRect)frame withJview:(jobject)jView withJproperties:(jobj // TODO : We again fetch isHiDPIAware in GlassViewCGL // Try to merge it self->isHiDPIAware = NO; + BOOL useMTLInGlass = NO; if (jproperties != NULL) { jobject kHiDPIAwareKey = (*env)->NewObject(env, jIntegerClass, jIntegerInitMethod, com_sun_glass_ui_View_Capability_kHiDPIAwareKeyValue); @@ -121,18 +122,29 @@ - (id)initWithFrame:(NSRect)frame withJview:(jobject)jView withJproperties:(jobj self->isHiDPIAware = (*env)->CallBooleanMethod(env, kHiDPIAwareValue, jBooleanValueMethod) ? YES : NO; GLASS_CHECK_EXCEPTION(env); } + jobject useMTLInGlassKey = (*env)->NewStringUTF(env, "useMTLInGlass"); + jobject useMTLInGlassValue = (*env)->CallObjectMethod(env, jproperties, jMapGetMethod, useMTLInGlassKey); + GLASS_CHECK_EXCEPTION(env); + if (useMTLInGlassValue != NULL) + { + useMTLInGlass = (*env)->CallBooleanMethod(env, useMTLInGlassValue, jBooleanValueMethod) ? YES : NO; + GLASS_CHECK_EXCEPTION(env); + } } self = [super initWithFrame:frame]; if (self != nil) { - if (mtlCommandQueuePtr != 0l) { + if (mtlCommandQueuePtr != 0l || + useMTLInGlass) { + LOG("GlassView3D initWithFrame using MTLView"); GlassViewMTL* mtlSubView; - subView = mtlSubView = [[GlassViewMTL alloc] initWithFrame:frame withJview:jView withJproperties:jproperties]; + subView = mtlSubView = [[GlassViewMTL alloc] initWithFrame:frame withJview:jView withJproperties:jproperties useMTLForBlit:useMTLInGlass]; self->layer = [mtlSubView getLayer]; self->isHiDPIAware = YES; } else { + LOG("GlassView3D initWithFrame using CGLView"); GlassViewCGL* cglSubView; - subView = cglSubView = [[GlassViewCGL alloc] initWithFrame:frame withJview:jView withJproperties:jproperties]; + subView = cglSubView = [[GlassViewCGL alloc] initWithFrame:frame withJview:jView withJproperties:jproperties useMTLForBlit:useMTLInGlass]; self->layer = [cglSubView getLayer]; } [subView setAutoresizingMask:(NSViewWidthSizable|NSViewHeightSizable)]; diff --git a/modules/javafx.graphics/src/main/native-glass/mac/GlassViewCGL.h b/modules/javafx.graphics/src/main/native-glass/mac/GlassViewCGL.h index 1f887b4fcb..935cdcb79a 100644 --- a/modules/javafx.graphics/src/main/native-glass/mac/GlassViewCGL.h +++ b/modules/javafx.graphics/src/main/native-glass/mac/GlassViewCGL.h @@ -46,6 +46,7 @@ - (id)initWithFrame:(NSRect)frame withJview:(jobject)jView - withJproperties:(jobject)jproperties; + withJproperties:(jobject)jproperties + useMTLForBlit:(BOOL)useMTLInGlass; @end diff --git a/modules/javafx.graphics/src/main/native-glass/mac/GlassViewCGL.m b/modules/javafx.graphics/src/main/native-glass/mac/GlassViewCGL.m index 7004b0cd24..62eb15ac29 100644 --- a/modules/javafx.graphics/src/main/native-glass/mac/GlassViewCGL.m +++ b/modules/javafx.graphics/src/main/native-glass/mac/GlassViewCGL.m @@ -88,6 +88,7 @@ - (CGLContextObj)_createContextWithShared:(CGLContextObj)share } - (void)_initialize3dWithJproperties:(jobject)jproperties + useMTLForBlit:(BOOL)useMTLInGlass { GET_MAIN_JENV; @@ -173,7 +174,8 @@ - (void)_initialize3dWithJproperties:(jobject)jproperties andClientContext:(NSObject*)clientCGL mtlQueuePtr:0l withHiDPIAware:isHiDPIAware - withIsSwPipe:isSwPipe]; + withIsSwPipe:isSwPipe + useMTLForBlit:useMTLInGlass]; // https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/nsview_Class/Reference/NSView.html#//apple_ref/occ/instm/NSView/setWantsLayer: // the order of the following 2 calls is important: here we indicate we want a layer-hosting view [self setLayer:self->layer]; @@ -183,6 +185,7 @@ - (void)_initialize3dWithJproperties:(jobject)jproperties - (id)initWithFrame:(NSRect)frame withJview:(jobject)jView withJproperties:(jobject)jproperties + useMTLForBlit:(BOOL)useMTLInGlass; { LOG("GlassViewCGL initWithFrame:withJview:withJproperties"); @@ -200,7 +203,8 @@ - (id)initWithFrame:(NSRect)frame self = [super initWithFrame:frame pixelFormat:pFormat]; if (self != nil) { - [self _initialize3dWithJproperties:jproperties]; + [self _initialize3dWithJproperties:jproperties + useMTLForBlit:(BOOL)useMTLInGlass]; } return self; } diff --git a/modules/javafx.graphics/src/main/native-glass/mac/GlassViewMTL.h b/modules/javafx.graphics/src/main/native-glass/mac/GlassViewMTL.h index 24097c273a..84ad5f91e5 100644 --- a/modules/javafx.graphics/src/main/native-glass/mac/GlassViewMTL.h +++ b/modules/javafx.graphics/src/main/native-glass/mac/GlassViewMTL.h @@ -35,6 +35,7 @@ - (GlassLayer*)getLayer; - (id)initWithFrame:(NSRect)frame withJview:(jobject)jView - withJproperties:(jobject)jproperties; + withJproperties:(jobject)jproperties + useMTLForBlit:(BOOL)useMTLInGlass; @end diff --git a/modules/javafx.graphics/src/main/native-glass/mac/GlassViewMTL.m b/modules/javafx.graphics/src/main/native-glass/mac/GlassViewMTL.m index 9ff514ac74..918e123747 100644 --- a/modules/javafx.graphics/src/main/native-glass/mac/GlassViewMTL.m +++ b/modules/javafx.graphics/src/main/native-glass/mac/GlassViewMTL.m @@ -37,6 +37,7 @@ @implementation GlassViewMTL - (void)_initialize3dWithJproperties:(jobject)jproperties + useMTLForBlit:(BOOL)useMTLInGlass { GET_MAIN_JENV; long mtlCommandQueuePtr = 0l; @@ -86,7 +87,8 @@ - (void)_initialize3dWithJproperties:(jobject)jproperties self->layer = [[GlassLayer alloc] initGlassLayer:nil andClientContext:nil mtlQueuePtr:mtlCommandQueuePtr - withHiDPIAware:YES withIsSwPipe:isSwPipe]; + withHiDPIAware:YES withIsSwPipe:isSwPipe + useMTLForBlit:useMTLInGlass]; // https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/nsview_Class/Reference/NSView.html#//apple_ref/occ/instm/NSView/setWantsLayer: // the order of the following 2 calls is important: here we indicate we want a layer-hosting view @@ -102,14 +104,15 @@ - (BOOL) wantsUpdateLayer { return TRUE; } -- (id)initWithFrame:(NSRect)frame withJview:(jobject)jView withJproperties:(jobject)jproperties +- (id)initWithFrame:(NSRect)frame withJview:(jobject)jView withJproperties:(jobject)jproperties useMTLForBlit:(BOOL)useMTLInGlass { LOG("GlassViewMTL initWithFrame:withJview:withJproperties"); self = [super initWithFrame: frame]; if (self != nil) { - [self _initialize3dWithJproperties:jproperties]; + [self _initialize3dWithJproperties:jproperties + useMTLForBlit:(BOOL)useMTLInGlass]; } return self; }