diff a/src/java.desktop/macosx/native/libawt_lwawt/java2d/metal/MTLPaints.m b/src/java.desktop/macosx/native/libawt_lwawt/java2d/metal/MTLPaints.m
--- a/src/java.desktop/macosx/native/libawt_lwawt/java2d/metal/MTLPaints.m
+++ b/src/java.desktop/macosx/native/libawt_lwawt/java2d/metal/MTLPaints.m
@@ -281,74 +281,17 @@
     _anchor.yParams[0] = yp0;
     _anchor.yParams[1] = yp1;
     _anchor.yParams[2] = yp3;
 }
 
-static id<MTLSamplerState> samplerNearestClamp = nil;
-static id<MTLSamplerState> samplerLinearClamp = nil;
-static id<MTLSamplerState> samplerNearestRepeat = nil;
-static id<MTLSamplerState> samplerLinearRepeat = nil;
-
-void initSamplers(id<MTLDevice> device) {
-    // TODO: move this code into SamplerManager (need implement)
-
-    if (samplerNearestClamp != nil)
-        return;
-
-    MTLSamplerDescriptor *samplerDescriptor = [MTLSamplerDescriptor new];
-
-    samplerDescriptor.rAddressMode = MTLSamplerAddressModeClampToEdge;
-    samplerDescriptor.sAddressMode = MTLSamplerAddressModeClampToEdge;
-    samplerDescriptor.tAddressMode = MTLSamplerAddressModeClampToEdge;
-
-    samplerDescriptor.minFilter = MTLSamplerMinMagFilterNearest;
-    samplerDescriptor.magFilter = MTLSamplerMinMagFilterNearest;
-    samplerNearestClamp = [device newSamplerStateWithDescriptor:samplerDescriptor];
-
-    samplerDescriptor.minFilter = MTLSamplerMinMagFilterLinear;
-    samplerDescriptor.magFilter = MTLSamplerMinMagFilterLinear;
-    samplerLinearClamp = [device newSamplerStateWithDescriptor:samplerDescriptor];
-
-    samplerDescriptor.rAddressMode = MTLSamplerAddressModeRepeat;
-    samplerDescriptor.sAddressMode = MTLSamplerAddressModeRepeat;
-    samplerDescriptor.tAddressMode = MTLSamplerAddressModeRepeat;
-
-    samplerDescriptor.minFilter = MTLSamplerMinMagFilterNearest;
-    samplerDescriptor.magFilter = MTLSamplerMinMagFilterNearest;
-    samplerNearestRepeat = [device newSamplerStateWithDescriptor:samplerDescriptor];
-
-    samplerDescriptor.minFilter = MTLSamplerMinMagFilterLinear;
-    samplerDescriptor.magFilter = MTLSamplerMinMagFilterLinear;
-    samplerLinearRepeat = [device newSamplerStateWithDescriptor:samplerDescriptor];
-}
-
-static void setTxtUniforms(
-        id<MTLRenderCommandEncoder> encoder, int color, int mode, int interpolation, bool repeat, jfloat extraAlpha,
-        const SurfaceRasterFlags * srcFlags, const SurfaceRasterFlags * dstFlags
-) {
-    struct TxtFrameUniforms uf = {RGBA_TO_V4(color), mode, srcFlags->isOpaque, dstFlags->isOpaque, interpolation};
-    [encoder setFragmentBytes:&uf length:sizeof(uf) atIndex:FrameUniformBuffer];
-
-    id<MTLSamplerState> sampler;
-    if (repeat) {
-        sampler = interpolation == INTERPOLATION_BILINEAR ? samplerLinearRepeat : samplerNearestRepeat;
-    } else {
-        sampler = interpolation == INTERPOLATION_BILINEAR ? samplerLinearClamp : samplerNearestClamp;
-    }
-    [encoder setFragmentSamplerState:sampler atIndex:0];
-}
-
-// TODO: need support hints for all shaders
-
 // For the current paint mode:
 // 1. Selects vertex+fragment shaders (and corresponding pipelineDesc) and set pipelineState
 // 2. Set vertex and fragment buffers
 - (void)setPipelineState:(id<MTLRenderCommandEncoder>)encoder
                composite:(MTLComposite *)composite
            isStencilUsed:(jboolean)isStencilUsed
                isTexture:(jboolean)isTexture
-           interpolation:(int)interpolation
                     isAA:(jboolean)isAA
                 srcFlags:(const SurfaceRasterFlags *)srcFlags
                 dstFlags:(const SurfaceRasterFlags *)dstFlags
     pipelineStateStorage:(MTLPipelineStatesStorage *)pipelineStateStorage
 {
@@ -369,11 +312,15 @@
                                                       dstFlags:dstFlags
                                                  stencilNeeded:stencil];
         [encoder setVertexBytes:&_anchor length:sizeof(_anchor) atIndex:FrameUniformBuffer];
         [encoder setFragmentTexture:_paintTexture atIndex: 1];
 
-        setTxtUniforms(encoder, 0, 0, interpolation, YES, [composite getExtraAlpha], srcFlags, dstFlags);
+        struct TxtFrameUniforms uf = {RGBA_TO_V4(0), 0, srcFlags->isOpaque,
+                                      dstFlags->isOpaque, [composite getExtraAlpha]};
+        [encoder setFragmentBytes:&uf length:sizeof(uf)
+                          atIndex:FrameUniformBuffer];
+
       } else if (_paintState == sun_java2d_SunGraphics2D_PAINT_GRADIENT) {
         pipelineState = [pipelineStateStorage getPipelineState:templateTexturePipelineDesc
                                                 vertexShaderId:@"vert_txt_grad"
                                               fragmentShaderId:@"frag_txt_grad"
                                                  compositeRule:[composite getRule]
@@ -410,11 +357,19 @@
                                             srcFlags:srcFlags
                                             dstFlags:dstFlags
                                        stencilNeeded:stencil];
         }
 
-        setTxtUniforms(encoder, _color, _paintState == sun_java2d_SunGraphics2D_PAINT_ALPHACOLOR ? 1 : 0, interpolation, NO, [composite getExtraAlpha], srcFlags, dstFlags);
+        if (_paintState == sun_java2d_SunGraphics2D_PAINT_ALPHACOLOR) {
+          struct TxtFrameUniforms uf = {RGBA_TO_V4(_color), 1,
+                  srcFlags->isOpaque, dstFlags->isOpaque, [composite getExtraAlpha]};
+          [encoder setFragmentBytes:&uf length:sizeof(uf) atIndex:FrameUniformBuffer];
+        } else {
+          struct TxtFrameUniforms uf = {RGBA_TO_V4(0), 0,
+                  srcFlags->isOpaque, dstFlags->isOpaque, [composite getExtraAlpha]};
+          [encoder setFragmentBytes:&uf length:sizeof(uf) atIndex:FrameUniformBuffer];
+        }
       }
     } else {
         if (_paintState == sun_java2d_SunGraphics2D_PAINT_ALPHACOLOR) {
             pipelineState = [pipelineStateStorage getPipelineState:templateRenderPipelineDesc
                                                     vertexShaderId:@"vert_col"
@@ -466,11 +421,10 @@
 // 2. Set vertex and fragment buffers
 - (void)setXorModePipelineState:(id<MTLRenderCommandEncoder>)encoder
                composite:(MTLComposite *)composite
            isStencilUsed:(jboolean)isStencilUsed
                isTexture:(jboolean)isTexture
-           interpolation:(int)interpolation
                 srcFlags:(const SurfaceRasterFlags *)srcFlags
                 dstFlags:(const SurfaceRasterFlags *)dstFlags
     pipelineStateStorage:(MTLPipelineStatesStorage *)pipelineStateStorage {
     initTemplatePipelineDescriptors();
 
@@ -483,12 +437,20 @@
                                           vertexShaderId:@"vert_txt"
                                         fragmentShaderId:@"frag_txt"
                                                 srcFlags:srcFlags
                                                 dstFlags:dstFlags
                                            stencilNeeded:stencil];
-        const int col = _paintState == sun_java2d_SunGraphics2D_PAINT_ALPHACOLOR ? _color ^ xorColor : 0 ^ xorColor;
-        setTxtUniforms(encoder, col, _paintState == sun_java2d_SunGraphics2D_PAINT_ALPHACOLOR ? 1 : 0, interpolation, NO, [composite getExtraAlpha], srcFlags, dstFlags);
+
+        if (_paintState == sun_java2d_SunGraphics2D_PAINT_ALPHACOLOR) {
+            struct TxtFrameUniforms uf = {RGBA_TO_V4(_color ^ xorColor), 1,
+                    srcFlags->isOpaque, dstFlags->isOpaque, [composite getExtraAlpha]};
+            [encoder setFragmentBytes:&uf length:sizeof(uf) atIndex:FrameUniformBuffer];
+        } else {
+            struct TxtFrameUniforms uf = {RGBA_TO_V4(0 ^ xorColor), 0,
+                    srcFlags->isOpaque, dstFlags->isOpaque, [composite getExtraAlpha]};
+            [encoder setFragmentBytes:&uf length:sizeof(uf) atIndex:FrameUniformBuffer];
+        }
         [encoder setFragmentBytes:&xorColor length:sizeof(xorColor) atIndex: 0];
     } else {
         if (_paintState == sun_java2d_SunGraphics2D_PAINT_ALPHACOLOR) {
 
             pipelineState = [pipelineStateStorage getXorModePipelineState:templateRenderPipelineDesc
