54
54
static MTLRenderPipelineDescriptor * templateAATexturePipelineDesc = nil ;
55
55
static MTLRenderPipelineDescriptor * templateLCDPipelineDesc = nil ;
56
56
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);
61
60
62
61
static void initTemplatePipelineDescriptors () {
63
62
if (templateRenderPipelineDesc != nil && templateTexturePipelineDesc != nil )
@@ -205,9 +204,9 @@ - (void)setPipelineState:(id<MTLRenderCommandEncoder>)encoder
205
204
fragShader = @" lcd_color" ;
206
205
rpDesc = [[templateLCDPipelineDesc copy ] autorelease ];
207
206
}
208
- setTxtUniforms (encoder , _color, 1 ,
207
+ setTxtUniforms (mtlc , _color, encoder ,
209
208
renderOptions->interpolation , NO , [mtlc.composite getExtraAlpha ], &renderOptions->srcFlags ,
210
- &renderOptions->dstFlags );
209
+ &renderOptions->dstFlags , 1 );
211
210
} else if (renderOptions->isAAShader ) {
212
211
vertShader = @" vert_col_aa" ;
213
212
fragShader = @" frag_col_aa" ;
@@ -248,9 +247,9 @@ - (void)setXorModePipelineState:(id<MTLRenderCommandEncoder>)encoder
248
247
fragShader = @" frag_txt_xorMode" ;
249
248
rpDesc = [[templateTexturePipelineDesc copy ] autorelease ];
250
249
251
- setTxtUniforms (encoder , col, 1 ,
250
+ setTxtUniforms (mtlc , col, encoder ,
252
251
renderOptions->interpolation , NO , [mtlc.composite getExtraAlpha ],
253
- &renderOptions->srcFlags , &renderOptions->dstFlags );
252
+ &renderOptions->srcFlags , &renderOptions->dstFlags , 1 );
254
253
[encoder setFragmentBytes: &xorColor length: sizeof (xorColor) atIndex: 0 ];
255
254
256
255
[encoder setFragmentTexture: dstOps->pTexture atIndex: 1 ];
@@ -786,9 +785,9 @@ - (void)setPipelineState:(id)encoder
786
785
[encoder setFragmentTexture: _paintTexture atIndex: 0 ];
787
786
}
788
787
const SurfaceRasterFlags srcFlags = {_isOpaque, renderOptions->srcFlags .isPremultiplied };
789
- setTxtUniforms (encoder , 0 , 0 ,
788
+ setTxtUniforms (mtlc , 0 , encoder ,
790
789
renderOptions->interpolation , YES , [mtlc.composite getExtraAlpha ],
791
- &srcFlags, &renderOptions->dstFlags );
790
+ &srcFlags, &renderOptions->dstFlags , 0 );
792
791
793
792
id <MTLRenderPipelineState > pipelineState = [pipelineStateStorage getPipelineState: rpDesc
794
793
vertexShaderId: vertShader
@@ -867,72 +866,12 @@ - (NSString *)description {
867
866
return @" unknown-paint" ;
868
867
}
869
868
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) {
932
872
struct TxtFrameUniforms uf = {RGBA_TO_V4 (color), mode, srcFlags->isOpaque , dstFlags->isOpaque , extraAlpha};
933
873
[encoder setFragmentBytes: &uf length: sizeof (uf) atIndex: FrameUniformBuffer];
934
-
935
- setSampler (encoder, interpolation, repeat);
874
+ [mtlc.samplerManager setSamplerWithEncoder: encoder interpolation: interpolation repeat: repeat];
936
875
}
937
876
938
877
// For the current paint mode:
@@ -963,7 +902,7 @@ - (void)setPipelineState:(id <MTLRenderCommandEncoder>)encoder
963
902
FLOAT_ARR_TO_V4 ([rescaleOp getScaleFactors ]), FLOAT_ARR_TO_V4 ([rescaleOp getOffsets ])
964
903
};
965
904
[encoder setFragmentBytes: &uf length: sizeof (uf) atIndex: FrameUniformBuffer];
966
- setSampler ( encoder, renderOptions->interpolation , NO ) ;
905
+ [mtlc.samplerManager setSamplerWithEncoder: encoder interpolation: renderOptions->interpolation repeat: NO ] ;
967
906
} else if ([bufImgOp isKindOfClass: [MTLConvolveOp class ]]) {
968
907
MTLConvolveOp *convolveOp = bufImgOp;
969
908
fragShader = @" frag_txt_op_convolve" ;
@@ -974,7 +913,7 @@ - (void)setPipelineState:(id <MTLRenderCommandEncoder>)encoder
974
913
convolveOp.kernelSize , convolveOp.isEdgeZeroFill ,
975
914
};
976
915
[encoder setFragmentBytes: &uf length: sizeof (uf) atIndex: FrameUniformBuffer];
977
- setSampler ( encoder, renderOptions->interpolation , NO ) ;
916
+ [mtlc.samplerManager setSamplerWithEncoder: encoder interpolation: renderOptions->interpolation repeat: NO ] ;
978
917
979
918
[encoder setFragmentBuffer: [convolveOp getBuffer ] offset: 0 atIndex: 2 ];
980
919
} else if ([bufImgOp isKindOfClass: [MTLLookupOp class ]]) {
@@ -986,14 +925,14 @@ - (void)setPipelineState:(id <MTLRenderCommandEncoder>)encoder
986
925
FLOAT_ARR_TO_V4 ([lookupOp getOffset ]), lookupOp.isUseSrcAlpha , lookupOp.isNonPremult ,
987
926
};
988
927
[encoder setFragmentBytes: &uf length: sizeof (uf) atIndex: FrameUniformBuffer];
989
- setSampler ( encoder, renderOptions->interpolation , NO ) ;
928
+ [mtlc.samplerManager setSamplerWithEncoder: encoder interpolation: renderOptions->interpolation repeat: NO ] ;
990
929
[encoder setFragmentTexture: [lookupOp getLookupTexture ] atIndex: 1 ];
991
930
}
992
931
} else {
993
- setTxtUniforms (encoder , 0 , 0 ,
932
+ setTxtUniforms (mtlc , 0 , encoder ,
994
933
renderOptions->interpolation , NO , [mtlc.composite getExtraAlpha ],
995
934
&renderOptions->srcFlags ,
996
- &renderOptions->dstFlags );
935
+ &renderOptions->dstFlags , 0 );
997
936
998
937
}
999
938
id <MTLRenderPipelineState > pipelineState = [pipelineStateStorage getPipelineState: rpDesc
@@ -1022,18 +961,18 @@ - (void)setXorModePipelineState:(id <MTLRenderCommandEncoder>)encoder
1022
961
MTLRenderPipelineDescriptor * rpDesc = [[templateTexturePipelineDesc copy ] autorelease ];
1023
962
1024
963
const int col = 0 ^ xorColor;
1025
- setTxtUniforms (encoder , col, 0 ,
964
+ setTxtUniforms (mtlc , col, encoder ,
1026
965
renderOptions->interpolation , NO , [mtlc.composite getExtraAlpha ],
1027
- &renderOptions->srcFlags , &renderOptions->dstFlags );
966
+ &renderOptions->srcFlags , &renderOptions->dstFlags , 0 );
1028
967
[encoder setFragmentBytes: &xorColor length: sizeof (xorColor) atIndex: 0 ];
1029
968
1030
969
BMTLSDOps *dstOps = MTLRenderQueue_GetCurrentDestination ();
1031
970
[encoder setFragmentTexture: dstOps->pTexture atIndex: 1 ];
1032
971
1033
- setTxtUniforms (encoder , 0 , 0 ,
972
+ setTxtUniforms (mtlc , 0 , encoder ,
1034
973
renderOptions->interpolation , NO , [mtlc.composite getExtraAlpha ],
1035
974
&renderOptions->srcFlags ,
1036
- &renderOptions->dstFlags );
975
+ &renderOptions->dstFlags , 0 );
1037
976
1038
977
id <MTLRenderPipelineState > pipelineState = [pipelineStateStorage getPipelineState: rpDesc
1039
978
vertexShaderId: vertShader
0 commit comments