< prev index next >

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

Print this page
@@ -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
< prev index next >