From 99874878f7b99c735eb56ee905840b9c6749a34e Mon Sep 17 00:00:00 2001 From: Ajit Ghaisas Date: Mon, 22 Feb 2021 11:07:31 +0000 Subject: [PATCH] 8262115: Crash on graphics card switch when Metal API validation enabled --- .../native/libawt_lwawt/java2d/metal/MTLClip.h | 1 + .../native/libawt_lwawt/java2d/metal/MTLClip.m | 9 ++++++++- .../native/libawt_lwawt/java2d/metal/MTLContext.h | 2 +- .../native/libawt_lwawt/java2d/metal/MTLContext.m | 7 +++++++ .../native/libawt_lwawt/java2d/metal/MTLPaints.m | 14 ++++++++++++-- .../libawt_lwawt/java2d/metal/MTLRenderQueue.m | 12 ++++++++++-- 6 files changed, 39 insertions(+), 6 deletions(-) diff --git a/src/java.desktop/macosx/native/libawt_lwawt/java2d/metal/MTLClip.h b/src/java.desktop/macosx/native/libawt_lwawt/java2d/metal/MTLClip.h index 31908fc1c7e..1233e577ceb 100644 --- a/src/java.desktop/macosx/native/libawt_lwawt/java2d/metal/MTLClip.h +++ b/src/java.desktop/macosx/native/libawt_lwawt/java2d/metal/MTLClip.h @@ -65,6 +65,7 @@ enum Clip { - (const MTLScissorRect *) getRect; - (void)reset; +- (void)resetStencilState; - (void)setClipRectX1:(jint)x1 Y1:(jint)y1 X2:(jint)x2 Y2:(jint)y2; - (void)beginShapeClip:(BMTLSDOps *)dstOps context:(MTLContext *)mtlc; - (void)endShapeClip:(BMTLSDOps *)dstOps context:(MTLContext *)mtlc; diff --git a/src/java.desktop/macosx/native/libawt_lwawt/java2d/metal/MTLClip.m b/src/java.desktop/macosx/native/libawt_lwawt/java2d/metal/MTLClip.m index 719e0b71fa1..dbccd84db5b 100644 --- a/src/java.desktop/macosx/native/libawt_lwawt/java2d/metal/MTLClip.m +++ b/src/java.desktop/macosx/native/libawt_lwawt/java2d/metal/MTLClip.m @@ -29,6 +29,7 @@ #include "common.h" static MTLRenderPipelineDescriptor * templateStencilPipelineDesc = nil; +static id stencilState = nil; static void initTemplatePipelineDescriptors() { if (templateStencilPipelineDesc != nil) @@ -50,7 +51,6 @@ static void initTemplatePipelineDescriptors() { } static id getStencilState(id device) { - static id stencilState = nil; if (stencilState == nil) { MTLDepthStencilDescriptor* stencilDescriptor; stencilDescriptor = [[MTLDepthStencilDescriptor new] autorelease]; @@ -138,6 +138,13 @@ - (void)reset { _stencilMaskGenerationInProgress = JNI_FALSE; } +- (void)resetStencilState { + if (stencilState != nil) { + [stencilState release]; + stencilState = nil; + } +} + - (void)setClipRectX1:(jint)x1 Y1:(jint)y1 X2:(jint)x2 Y2:(jint)y2 { if (_clipType == SHAPE_CLIP) { _dstOps = NULL; diff --git a/src/java.desktop/macosx/native/libawt_lwawt/java2d/metal/MTLContext.h b/src/java.desktop/macosx/native/libawt_lwawt/java2d/metal/MTLContext.h index 84178f9530f..def0aa85498 100644 --- a/src/java.desktop/macosx/native/libawt_lwawt/java2d/metal/MTLContext.h +++ b/src/java.desktop/macosx/native/libawt_lwawt/java2d/metal/MTLContext.h @@ -172,7 +172,7 @@ M01:(jdouble) m01 M11:(jdouble) m11 M02:(jdouble) m02 M12:(jdouble) m12; - +- (void)reset; - (void)resetPaint; - (void)setColorPaint:(int)pixel; - (void)setGradientPaintUseMask:(jboolean)useMask diff --git a/src/java.desktop/macosx/native/libawt_lwawt/java2d/metal/MTLContext.m b/src/java.desktop/macosx/native/libawt_lwawt/java2d/metal/MTLContext.m index 869541604a7..9c37039be76 100644 --- a/src/java.desktop/macosx/native/libawt_lwawt/java2d/metal/MTLContext.m +++ b/src/java.desktop/macosx/native/libawt_lwawt/java2d/metal/MTLContext.m @@ -173,6 +173,13 @@ - (void)dealloc { [super dealloc]; } +- (void) reset { + J2dTraceLn(J2D_TRACE_VERBOSE, "MTLContext : reset"); + + // Add code for context state reset here + [_clip resetStencilState]; +} + - (MTLCommandBufferWrapper *) getCommandBufferWrapper { if (_commandBufferWrapper == nil) { J2dTraceLn(J2D_TRACE_VERBOSE, "MTLContext : commandBuffer is NULL"); diff --git a/src/java.desktop/macosx/native/libawt_lwawt/java2d/metal/MTLPaints.m b/src/java.desktop/macosx/native/libawt_lwawt/java2d/metal/MTLPaints.m index 3a7d3343033..f1679268f20 100644 --- a/src/java.desktop/macosx/native/libawt_lwawt/java2d/metal/MTLPaints.m +++ b/src/java.desktop/macosx/native/libawt_lwawt/java2d/metal/MTLPaints.m @@ -835,6 +835,7 @@ - (NSString *)description { return @"unknown-paint"; } +static bool samplersInitialized = false; static id samplerNearestClamp = nil; static id samplerLinearClamp = nil; static id samplerNearestRepeat = nil; @@ -843,8 +844,15 @@ - (NSString *)description { void initSamplers(id device) { // TODO: move this code into SamplerManager (need implement) - if (samplerNearestClamp != nil) - return; + if (samplersInitialized) { + // Release old samplers if any + [samplerNearestClamp release]; + [samplerLinearClamp release]; + [samplerNearestRepeat release]; + [samplerLinearRepeat release]; + + samplersInitialized = false; + } MTLSamplerDescriptor *samplerDescriptor = [[MTLSamplerDescriptor new] autorelease]; @@ -871,6 +879,8 @@ void initSamplers(id device) { samplerDescriptor.minFilter = MTLSamplerMinMagFilterLinear; samplerDescriptor.magFilter = MTLSamplerMinMagFilterLinear; samplerLinearRepeat = [device newSamplerStateWithDescriptor:samplerDescriptor]; + + samplersInitialized = true; } static void setSampler(id encoder, int interpolation, bool repeat) { diff --git a/src/java.desktop/macosx/native/libawt_lwawt/java2d/metal/MTLRenderQueue.m b/src/java.desktop/macosx/native/libawt_lwawt/java2d/metal/MTLRenderQueue.m index bcdd306110b..0f829e93c44 100644 --- a/src/java.desktop/macosx/native/libawt_lwawt/java2d/metal/MTLRenderQueue.m +++ b/src/java.desktop/macosx/native/libawt_lwawt/java2d/metal/MTLRenderQueue.m @@ -663,10 +663,18 @@ void MTLRenderQueue_CheckPreviousOp(jint op) { // invalidate the references to the current context and // destination surface that are maintained at the native level if (mtlc != NULL) { - [mtlc.encoderManager endEncoder]; + commitEncodedCommands(); + RESET_PREVIOUS_OP(); + [mtlc reset]; } + + MTLTR_FreeGlyphCaches(); + if (dstOps != NULL) { + MTLSD_Delete(env, dstOps); + } + mtlc = NULL; - // dstOps = NULL; + dstOps = NULL; break; } case sun_java2d_pipe_BufferedOpCodes_SYNC: