Skip to content
This repository was archived by the owner on Aug 27, 2022. It is now read-only.
/ lanai Public archive

Commit 15df88a

Browse files
author
Alexey Ushakov
committed
8262496: Lanai: Do not use resources of off-line MTLDevice
1 parent b1419d2 commit 15df88a

File tree

10 files changed

+297
-116
lines changed

10 files changed

+297
-116
lines changed

src/java.desktop/macosx/native/libawt_lwawt/java2d/metal/MTLBlitLoops.m

+9
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,12 @@ jboolean clipDestCoords(
361361
RETURN_IF_NULL(mtlc);
362362
RETURN_IF_NULL(srcOps);
363363
RETURN_IF_NULL(dstOps);
364+
// Verify if we use a valid MTLContext
365+
MTLSDOps *dstMTLOps = (MTLSDOps *)dstOps->privOps;
366+
RETURN_IF_TRUE(dstMTLOps->configInfo != NULL && mtlc != dstMTLOps->configInfo->context);
367+
368+
MTLSDOps *srcMTLOps = (MTLSDOps *)srcOps->privOps;
369+
RETURN_IF_TRUE(srcMTLOps->configInfo != NULL && mtlc != srcMTLOps->configInfo->context);
364370

365371
id<MTLTexture> srcTex = srcOps->pTexture;
366372
id<MTLTexture> dstTex = dstOps->pTexture;
@@ -484,6 +490,9 @@ jboolean clipDestCoords(
484490
RETURN_IF_NULL(mtlc);
485491
RETURN_IF_NULL(srcOps);
486492
RETURN_IF_NULL(dstOps);
493+
// Verify if we use a valid MTLContext
494+
MTLSDOps *dstMTLOps = (MTLSDOps *)dstOps->privOps;
495+
RETURN_IF_TRUE(dstMTLOps->configInfo != NULL && mtlc != dstMTLOps->configInfo->context);
487496

488497
id<MTLTexture> dest = dstOps->pTexture;
489498
if (dest == NULL) {

src/java.desktop/macosx/native/libawt_lwawt/java2d/metal/MTLClip.m

+3-29
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@
2626
#include "MTLClip.h"
2727

2828
#include "MTLContext.h"
29+
#include "MTLStencilManager.h"
2930
#include "common.h"
3031

3132
static MTLRenderPipelineDescriptor * templateStencilPipelineDesc = nil;
32-
static id<MTLDepthStencilState> stencilState = nil;
3333

3434
static void initTemplatePipelineDescriptors() {
3535
if (templateStencilPipelineDesc != nil)
@@ -50,27 +50,6 @@ static void initTemplatePipelineDescriptors() {
5050
templateStencilPipelineDesc.label = @"template_stencil";
5151
}
5252

53-
static id<MTLDepthStencilState> getStencilState(id<MTLDevice> device) {
54-
if (stencilState == nil) {
55-
MTLDepthStencilDescriptor* stencilDescriptor;
56-
stencilDescriptor = [[MTLDepthStencilDescriptor new] autorelease];
57-
stencilDescriptor.frontFaceStencil.stencilCompareFunction = MTLCompareFunctionEqual;
58-
stencilDescriptor.frontFaceStencil.stencilFailureOperation = MTLStencilOperationKeep;
59-
60-
// TODO : backFaceStencil can be set to nil if all primitives are drawn as front-facing primitives
61-
// currently, fill parallelogram uses back-facing primitive drawing - that needs to be changed.
62-
// Once that part is changed, set backFaceStencil to nil
63-
//stencilDescriptor.backFaceStencil = nil;
64-
65-
stencilDescriptor.backFaceStencil.stencilCompareFunction = MTLCompareFunctionEqual;
66-
stencilDescriptor.backFaceStencil.stencilFailureOperation = MTLStencilOperationKeep;
67-
68-
stencilState = [device newDepthStencilStateWithDescriptor:stencilDescriptor];
69-
}
70-
71-
return stencilState;
72-
}
73-
7453
@implementation MTLClip {
7554
jint _clipType;
7655
MTLScissorRect _clipRect;
@@ -128,6 +107,7 @@ - (void)copyFrom:(MTLClip *)other {
128107
_clipType = other->_clipType;
129108
_stencilMaskGenerationInProgress = other->_stencilMaskGenerationInProgress;
130109
_dstOps = other->_dstOps;
110+
_mtlc = other->_mtlc;
131111
if (other->_clipType == RECT_CLIP) {
132112
_clipRect = other->_clipRect;
133113
}
@@ -138,12 +118,6 @@ - (void)reset {
138118
_stencilMaskGenerationInProgress = JNI_FALSE;
139119
}
140120

141-
- (void)resetStencilState {
142-
if (stencilState != nil) {
143-
[stencilState release];
144-
stencilState = nil;
145-
}
146-
}
147121

148122
- (void)setClipRectX1:(jint)x1 Y1:(jint)y1 X2:(jint)x2 Y2:(jint)y2 {
149123
if (_clipType == SHAPE_CLIP) {
@@ -308,7 +282,7 @@ - (void)setScissorOrStencil:(id<MTLRenderCommandEncoder>)encoder
308282

309283
if (_clipType == SHAPE_CLIP) {
310284
// Enable stencil test
311-
[encoder setDepthStencilState:getStencilState(device)];
285+
[encoder setDepthStencilState:_mtlc.stencilManager.stencilState];
312286
[encoder setStencilReferenceValue:0xFF];
313287
}
314288
}

src/java.desktop/macosx/native/libawt_lwawt/java2d/metal/MTLContext.h

+5
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@
3838
#include "MTLPaints.h"
3939
#include "MTLClip.h"
4040
#include "EncoderManager.h"
41+
#include "MTLSamplerManager.h"
42+
43+
@class MTLStencilManager;
4144

4245
// Constant from
4346
// https://developer.apple.com/metal/Metal-Feature-Set-Tables.pdf
@@ -74,6 +77,8 @@
7477
@property (strong) id<MTLBuffer> vertexBuffer;
7578

7679
@property (readonly) EncoderManager * encoderManager;
80+
@property (readonly) MTLSamplerManager * samplerManager;
81+
@property (readonly) MTLStencilManager * stencilManager;
7782

7883
@property (strong)MTLPipelineStatesStorage* pipelineStateStorage;
7984
@property (strong)MTLTexturePool* texturePool;

src/java.desktop/macosx/native/libawt_lwawt/java2d/metal/MTLContext.m

+10-4
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030
#include "jlong.h"
3131
#import "MTLContext.h"
3232
#include "MTLRenderQueue.h"
33+
#import "MTLSamplerManager.h"
34+
#import "MTLStencilManager.h"
3335

3436

3537
extern jboolean MTLSD_InitMTLWindow(JNIEnv *env, MTLSDOps *mtlsdo);
@@ -108,12 +110,15 @@ @implementation MTLContext {
108110
NSObject* _bufImgOp; // TODO: pass as parameter of IsoBlit
109111

110112
EncoderManager * _encoderManager;
113+
MTLSamplerManager * _samplerManager;
114+
MTLStencilManager * _stencilManager;
111115
}
112116

113117
@synthesize textureFunction,
114118
vertexCacheEnabled, aaEnabled, device, pipelineStateStorage,
115119
commandQueue, blitCommandQueue, vertexBuffer,
116-
texturePool, paint=_paint;
120+
texturePool, paint=_paint, encoderManager=_encoderManager,
121+
samplerManager=_samplerManager, stencilManager=_stencilManager;
117122

118123
extern void initSamplers(id<MTLDevice> device);
119124

@@ -137,6 +142,8 @@ - (id)initWithDevice:(id<MTLDevice>)d shadersLib:(NSString*)shadersLib {
137142

138143
_encoderManager = [[EncoderManager alloc] init];
139144
[_encoderManager setContext:self];
145+
_samplerManager = [[MTLSamplerManager alloc] initWithDevice:device];
146+
_stencilManager = [[MTLStencilManager alloc] initWithDevice:device];
140147
_composite = [[MTLComposite alloc] init];
141148
_paint = [[MTLPaint alloc] init];
142149
_transform = [[MTLTransform alloc] init];
@@ -150,8 +157,6 @@ - (id)initWithDevice:(id<MTLDevice>)d shadersLib:(NSString*)shadersLib {
150157
blitCommandQueue = [device newCommandQueue];
151158

152159
_tempTransform = [[MTLTransform alloc] init];
153-
154-
initSamplers(device);
155160
}
156161
return self;
157162
}
@@ -165,6 +170,8 @@ - (void)dealloc {
165170
self.blitCommandQueue = nil;
166171
self.pipelineStateStorage = nil;
167172
[_encoderManager release];
173+
[_samplerManager release];
174+
[_stencilManager release];
168175
[_composite release];
169176
[_paint release];
170177
[_transform release];
@@ -177,7 +184,6 @@ - (void) reset {
177184
J2dTraceLn(J2D_TRACE_VERBOSE, "MTLContext : reset");
178185

179186
// Add code for context state reset here
180-
[_clip resetStencilState];
181187
}
182188

183189
- (MTLCommandBufferWrapper *) getCommandBufferWrapper {

src/java.desktop/macosx/native/libawt_lwawt/java2d/metal/MTLPaints.m

+22-83
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,9 @@
5454
static MTLRenderPipelineDescriptor * templateAATexturePipelineDesc = nil;
5555
static MTLRenderPipelineDescriptor * templateLCDPipelineDesc = nil;
5656
static MTLRenderPipelineDescriptor * templateAAPipelineDesc = nil;
57-
static void setTxtUniforms(
58-
id<MTLRenderCommandEncoder> encoder, int color, int mode, int interpolation, bool repeat, jfloat extraAlpha,
59-
const SurfaceRasterFlags * srcFlags, const SurfaceRasterFlags * dstFlags
60-
);
57+
static void
58+
setTxtUniforms(MTLContext *mtlc, int color, id <MTLRenderCommandEncoder> encoder, int interpolation, bool repeat,
59+
jfloat extraAlpha, const SurfaceRasterFlags *srcFlags, const SurfaceRasterFlags *dstFlags, int mode);
6160

6261
static void initTemplatePipelineDescriptors() {
6362
if (templateRenderPipelineDesc != nil && templateTexturePipelineDesc != nil)
@@ -205,9 +204,9 @@ - (void)setPipelineState:(id<MTLRenderCommandEncoder>)encoder
205204
fragShader = @"lcd_color";
206205
rpDesc = [[templateLCDPipelineDesc copy] autorelease];
207206
}
208-
setTxtUniforms(encoder, _color, 1,
207+
setTxtUniforms(mtlc, _color, encoder,
209208
renderOptions->interpolation, NO, [mtlc.composite getExtraAlpha], &renderOptions->srcFlags,
210-
&renderOptions->dstFlags);
209+
&renderOptions->dstFlags, 1);
211210
} else if (renderOptions->isAAShader) {
212211
vertShader = @"vert_col_aa";
213212
fragShader = @"frag_col_aa";
@@ -248,9 +247,9 @@ - (void)setXorModePipelineState:(id<MTLRenderCommandEncoder>)encoder
248247
fragShader = @"frag_txt_xorMode";
249248
rpDesc = [[templateTexturePipelineDesc copy] autorelease];
250249

251-
setTxtUniforms(encoder, col, 1,
250+
setTxtUniforms(mtlc, col, encoder,
252251
renderOptions->interpolation, NO, [mtlc.composite getExtraAlpha],
253-
&renderOptions->srcFlags, &renderOptions->dstFlags);
252+
&renderOptions->srcFlags, &renderOptions->dstFlags, 1);
254253
[encoder setFragmentBytes:&xorColor length:sizeof(xorColor) atIndex:0];
255254

256255
[encoder setFragmentTexture:dstOps->pTexture atIndex:1];
@@ -786,9 +785,9 @@ - (void)setPipelineState:(id)encoder
786785
[encoder setFragmentTexture:_paintTexture atIndex:0];
787786
}
788787
const SurfaceRasterFlags srcFlags = {_isOpaque, renderOptions->srcFlags.isPremultiplied};
789-
setTxtUniforms(encoder, 0, 0,
788+
setTxtUniforms(mtlc, 0, encoder,
790789
renderOptions->interpolation, YES, [mtlc.composite getExtraAlpha],
791-
&srcFlags, &renderOptions->dstFlags);
790+
&srcFlags, &renderOptions->dstFlags, 0);
792791

793792
id <MTLRenderPipelineState> pipelineState = [pipelineStateStorage getPipelineState:rpDesc
794793
vertexShaderId:vertShader
@@ -867,72 +866,12 @@ - (NSString *)description {
867866
return @"unknown-paint";
868867
}
869868

870-
static bool samplersInitialized = false;
871-
static id<MTLSamplerState> samplerNearestClamp = nil;
872-
static id<MTLSamplerState> samplerLinearClamp = nil;
873-
static id<MTLSamplerState> samplerNearestRepeat = nil;
874-
static id<MTLSamplerState> samplerLinearRepeat = nil;
875-
876-
void initSamplers(id<MTLDevice> device) {
877-
// TODO: move this code into SamplerManager (need implement)
878-
879-
if (samplersInitialized) {
880-
// Release old samplers if any
881-
[samplerNearestClamp release];
882-
[samplerLinearClamp release];
883-
[samplerNearestRepeat release];
884-
[samplerLinearRepeat release];
885-
886-
samplersInitialized = false;
887-
}
888-
889-
MTLSamplerDescriptor *samplerDescriptor = [[MTLSamplerDescriptor new] autorelease];
890-
891-
samplerDescriptor.rAddressMode = MTLSamplerAddressModeClampToEdge;
892-
samplerDescriptor.sAddressMode = MTLSamplerAddressModeClampToEdge;
893-
samplerDescriptor.tAddressMode = MTLSamplerAddressModeClampToEdge;
894-
895-
samplerDescriptor.minFilter = MTLSamplerMinMagFilterNearest;
896-
samplerDescriptor.magFilter = MTLSamplerMinMagFilterNearest;
897-
samplerNearestClamp = [device newSamplerStateWithDescriptor:samplerDescriptor];
898-
899-
samplerDescriptor.minFilter = MTLSamplerMinMagFilterLinear;
900-
samplerDescriptor.magFilter = MTLSamplerMinMagFilterLinear;
901-
samplerLinearClamp = [device newSamplerStateWithDescriptor:samplerDescriptor];
902-
903-
samplerDescriptor.rAddressMode = MTLSamplerAddressModeRepeat;
904-
samplerDescriptor.sAddressMode = MTLSamplerAddressModeRepeat;
905-
samplerDescriptor.tAddressMode = MTLSamplerAddressModeRepeat;
906-
907-
samplerDescriptor.minFilter = MTLSamplerMinMagFilterNearest;
908-
samplerDescriptor.magFilter = MTLSamplerMinMagFilterNearest;
909-
samplerNearestRepeat = [device newSamplerStateWithDescriptor:samplerDescriptor];
910-
911-
samplerDescriptor.minFilter = MTLSamplerMinMagFilterLinear;
912-
samplerDescriptor.magFilter = MTLSamplerMinMagFilterLinear;
913-
samplerLinearRepeat = [device newSamplerStateWithDescriptor:samplerDescriptor];
914-
915-
samplersInitialized = true;
916-
}
917-
918-
static void setSampler(id<MTLRenderCommandEncoder> encoder, int interpolation, bool repeat) {
919-
id<MTLSamplerState> sampler;
920-
if (repeat) {
921-
sampler = interpolation == INTERPOLATION_BILINEAR ? samplerLinearRepeat : samplerNearestRepeat;
922-
} else {
923-
sampler = interpolation == INTERPOLATION_BILINEAR ? samplerLinearClamp : samplerNearestClamp;
924-
}
925-
[encoder setFragmentSamplerState:sampler atIndex:0];
926-
}
927-
928-
static void setTxtUniforms(
929-
id<MTLRenderCommandEncoder> encoder, int color, int mode, int interpolation, bool repeat, jfloat extraAlpha,
930-
const SurfaceRasterFlags * srcFlags, const SurfaceRasterFlags * dstFlags
931-
) {
869+
static void
870+
setTxtUniforms(MTLContext *mtlc, int color, id <MTLRenderCommandEncoder> encoder, int interpolation, bool repeat,
871+
jfloat extraAlpha, const SurfaceRasterFlags *srcFlags, const SurfaceRasterFlags *dstFlags, int mode) {
932872
struct TxtFrameUniforms uf = {RGBA_TO_V4(color), mode, srcFlags->isOpaque, dstFlags->isOpaque, extraAlpha};
933873
[encoder setFragmentBytes:&uf length:sizeof(uf) atIndex:FrameUniformBuffer];
934-
935-
setSampler(encoder, interpolation, repeat);
874+
[mtlc.samplerManager setSamplerWithEncoder:encoder interpolation:interpolation repeat:repeat];
936875
}
937876

938877
// For the current paint mode:
@@ -963,7 +902,7 @@ - (void)setPipelineState:(id <MTLRenderCommandEncoder>)encoder
963902
FLOAT_ARR_TO_V4([rescaleOp getScaleFactors]), FLOAT_ARR_TO_V4([rescaleOp getOffsets])
964903
};
965904
[encoder setFragmentBytes:&uf length:sizeof(uf) atIndex:FrameUniformBuffer];
966-
setSampler(encoder, renderOptions->interpolation, NO);
905+
[mtlc.samplerManager setSamplerWithEncoder:encoder interpolation:renderOptions->interpolation repeat:NO];
967906
} else if ([bufImgOp isKindOfClass:[MTLConvolveOp class]]) {
968907
MTLConvolveOp *convolveOp = bufImgOp;
969908
fragShader = @"frag_txt_op_convolve";
@@ -974,7 +913,7 @@ - (void)setPipelineState:(id <MTLRenderCommandEncoder>)encoder
974913
convolveOp.kernelSize, convolveOp.isEdgeZeroFill,
975914
};
976915
[encoder setFragmentBytes:&uf length:sizeof(uf) atIndex:FrameUniformBuffer];
977-
setSampler(encoder, renderOptions->interpolation, NO);
916+
[mtlc.samplerManager setSamplerWithEncoder:encoder interpolation:renderOptions->interpolation repeat:NO];
978917

979918
[encoder setFragmentBuffer:[convolveOp getBuffer] offset:0 atIndex:2];
980919
} else if ([bufImgOp isKindOfClass:[MTLLookupOp class]]) {
@@ -986,14 +925,14 @@ - (void)setPipelineState:(id <MTLRenderCommandEncoder>)encoder
986925
FLOAT_ARR_TO_V4([lookupOp getOffset]), lookupOp.isUseSrcAlpha, lookupOp.isNonPremult,
987926
};
988927
[encoder setFragmentBytes:&uf length:sizeof(uf) atIndex:FrameUniformBuffer];
989-
setSampler(encoder, renderOptions->interpolation, NO);
928+
[mtlc.samplerManager setSamplerWithEncoder:encoder interpolation:renderOptions->interpolation repeat:NO];
990929
[encoder setFragmentTexture:[lookupOp getLookupTexture] atIndex:1];
991930
}
992931
} else {
993-
setTxtUniforms(encoder, 0, 0,
932+
setTxtUniforms(mtlc, 0, encoder,
994933
renderOptions->interpolation, NO, [mtlc.composite getExtraAlpha],
995934
&renderOptions->srcFlags,
996-
&renderOptions->dstFlags);
935+
&renderOptions->dstFlags, 0);
997936

998937
}
999938
id <MTLRenderPipelineState> pipelineState = [pipelineStateStorage getPipelineState:rpDesc
@@ -1022,18 +961,18 @@ - (void)setXorModePipelineState:(id <MTLRenderCommandEncoder>)encoder
1022961
MTLRenderPipelineDescriptor * rpDesc = [[templateTexturePipelineDesc copy] autorelease];
1023962

1024963
const int col = 0 ^ xorColor;
1025-
setTxtUniforms(encoder, col, 0,
964+
setTxtUniforms(mtlc, col, encoder,
1026965
renderOptions->interpolation, NO, [mtlc.composite getExtraAlpha],
1027-
&renderOptions->srcFlags, &renderOptions->dstFlags);
966+
&renderOptions->srcFlags, &renderOptions->dstFlags, 0);
1028967
[encoder setFragmentBytes:&xorColor length:sizeof(xorColor) atIndex: 0];
1029968

1030969
BMTLSDOps *dstOps = MTLRenderQueue_GetCurrentDestination();
1031970
[encoder setFragmentTexture:dstOps->pTexture atIndex:1];
1032971

1033-
setTxtUniforms(encoder, 0, 0,
972+
setTxtUniforms(mtlc, 0, encoder,
1034973
renderOptions->interpolation, NO, [mtlc.composite getExtraAlpha],
1035974
&renderOptions->srcFlags,
1036-
&renderOptions->dstFlags);
975+
&renderOptions->dstFlags, 0);
1037976

1038977
id <MTLRenderPipelineState> pipelineState = [pipelineStateStorage getPipelineState:rpDesc
1039978
vertexShaderId:vertShader

src/java.desktop/macosx/native/libawt_lwawt/java2d/metal/MTLRenderQueue.h

+9
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,15 @@ enum {
8888
#define RETURN_IF_NULL(value) ACT_IF_NULL(return, value)
8989
#define CONTINUE_IF_NULL(value) ACT_IF_NULL(continue, value)
9090

91+
#define ACT_IF_TRUE(ACTION, value) \
92+
if ((value)) { \
93+
J2dTraceLn1(J2D_TRACE_ERROR, \
94+
"%s is false", #value);\
95+
ACTION; \
96+
} else do { } while (0)
97+
98+
#define RETURN_IF_TRUE(value) ACT_IF_TRUE(return, value)
99+
91100
MTLContext *MTLRenderQueue_GetCurrentContext();
92101
BMTLSDOps *MTLRenderQueue_GetCurrentDestination();
93102
void commitEncodedCommands();

0 commit comments

Comments
 (0)