< prev index next >

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

Print this page
@@ -38,10 +38,12 @@
  
      // Persistent encoder properties
      id<MTLTexture> _destination;
      SurfaceRasterFlags _dstFlags;
  
+     jboolean _isAA;
+ 
      //
      // Cached 'mutable' states of encoder
      //
  
      // Composite rule and source raster flags (it affects the CAD-multipliers (of pipelineState))

@@ -51,11 +53,11 @@
      // Paint mode (it affects shaders (of pipelineState) and corresponding buffers)
      MTLPaint * _paint;
  
      // If true, indicates that encoder is used for texture drawing (user must do [encoder setFragmentTexture:] before drawing)
      jboolean _isTexture;
-     jboolean _isAA;
+     int _interpolationMode;
  
      // Clip rect or stencil
      MTLClip * _clip;
  
      // Transform (affects transformation inside vertex shader)

@@ -100,10 +102,11 @@
  
  - (void)updateEncoder:(id<MTLRenderCommandEncoder>)encoder
                  paint:(MTLPaint *)paint
              composite:(MTLComposite *)composite
              isTexture:(jboolean)isTexture
+         interpolation:(int)interpolation
                   isAA:(jboolean)isAA
               srcFlags:(const SurfaceRasterFlags * _Nullable)srcFlags
                   clip:(MTLClip *)clip
              transform:(MTLTransform *)transform
            forceUpdate:(jboolean)forceUpdate

@@ -127,10 +130,11 @@
      [self updatePipelineState:encoder
                          paint:paint
                      composite:composite
                  isStencilUsed:[clip isShape]
                      isTexture:isTexture
+                 interpolation:interpolation
                           isAA:isAA
                       srcFlags:srcFlags
                    forceUpdate:forceUpdate];
      [self updateTransform:encoder transform:transform forceUpdate:forceUpdate];
      [self updateClip:encoder clip:clip forceUpdate:forceUpdate];

@@ -144,44 +148,48 @@
  - (void)updatePipelineState:(id<MTLRenderCommandEncoder>)encoder
                        paint:(MTLPaint *)paint
                    composite:(MTLComposite *)composite
                isStencilUsed:(jboolean)isStencilUsed
                    isTexture:(jboolean)isTexture
+               interpolation:(int)interpolation
                         isAA:(jboolean)isAA
                     srcFlags:(const SurfaceRasterFlags * _Nullable)srcFlags
                  forceUpdate:(jboolean)forceUpdate
  {
      if (srcFlags == NULL)
          srcFlags = &defaultRasterFlags;
  
      if (!forceUpdate
          && [_paint isEqual:paint]
          && [_composite isEqual:composite]
-         && _isTexture == isTexture
+         && (_isTexture == isTexture && (!isTexture || _interpolationMode == interpolation)) // interpolation is used only in texture mode
          && _isAA == isAA
          && _srcFlags.isOpaque == srcFlags->isOpaque && _srcFlags.isPremultiplied == srcFlags->isPremultiplied)
          return;
  
      [_paint copyFrom:paint];
      [_composite copyFrom:composite];
      _isTexture = isTexture;
+     _interpolationMode = interpolation;
      _isAA = isAA;
      _srcFlags = *srcFlags;
  
      if ((jint)[composite getCompositeState] == sun_java2d_SunGraphics2D_COMP_XOR) {
          [paint setXorModePipelineState:encoder
                        composite:_composite
                    isStencilUsed:isStencilUsed
                        isTexture:_isTexture
+                   interpolation:interpolation
                         srcFlags:&_srcFlags
                         dstFlags:&_dstFlags
             pipelineStateStorage:_pipelineStateStorage];
      } else {
          [paint setPipelineState:encoder
                        composite:_composite
                    isStencilUsed:isStencilUsed
                        isTexture:_isTexture
+                   interpolation:interpolation
                             isAA:isAA
                         srcFlags:&_srcFlags
                         dstFlags:&_dstFlags
             pipelineStateStorage:_pipelineStateStorage];
      }

@@ -265,54 +273,74 @@
  - (id<MTLRenderCommandEncoder> _Nonnull)getAARenderEncoder:(const BMTLSDOps * _Nonnull)dstOps {
    id<MTLTexture> dstTxt = dstOps->pTexture;
    return [self getEncoder:dstTxt
                   isOpaque:dstOps->isOpaque
                  isTexture:JNI_FALSE
+            interpolation:INTERPOLATION_NEAREST_NEIGHBOR
                       isAA:JNI_TRUE
                   srcFlags:NULL];
  }
  
  - (id<MTLRenderCommandEncoder> _Nonnull)getRenderEncoder:(id<MTLTexture> _Nonnull)dest
                                               isDstOpaque:(bool)isOpaque
  {
      return [self getEncoder:dest
                   isOpaque:isOpaque
                  isTexture:JNI_FALSE
+             interpolation:INTERPOLATION_NEAREST_NEIGHBOR
                       isAA:JNI_FALSE
                   srcFlags:NULL];
  }
  
  - (id<MTLRenderCommandEncoder> _Nonnull) getTextureEncoder:(const BMTLSDOps * _Nonnull)dstOps
                                        isSrcOpaque:(bool)isSrcOpaque
  {
-     return [self getTextureEncoder:dstOps->pTexture isSrcOpaque:isSrcOpaque isDstOpaque:dstOps->isOpaque];
+     return [self getTextureEncoder:dstOps->pTexture
+                        isSrcOpaque:isSrcOpaque
+                        isDstOpaque:dstOps->isOpaque
+                      interpolation:INTERPOLATION_NEAREST_NEIGHBOR];
+ }
+ 
+ - (id<MTLRenderCommandEncoder> _Nonnull) getTextureEncoder:(id<MTLTexture> _Nonnull)dest
+                                                isSrcOpaque:(bool)isSrcOpaque
+                                                isDstOpaque:(bool)isDstOpaque
+ {
+     return [self getTextureEncoder:dest
+                        isSrcOpaque:isSrcOpaque
+                        isDstOpaque:isDstOpaque
+                      interpolation:INTERPOLATION_NEAREST_NEIGHBOR
+                               isAA:JNI_FALSE];
  }
  
  - (id<MTLRenderCommandEncoder> _Nonnull) getTextureEncoder:(id<MTLTexture> _Nonnull)dest
                                        isSrcOpaque:(bool)isSrcOpaque
                                        isDstOpaque:(bool)isDstOpaque
+                                     interpolation:(int)interpolation
                                               isAA:(jboolean)isAA
  {
      SurfaceRasterFlags srcFlags = { isSrcOpaque, JNI_TRUE };
      return [self getEncoder:dest
                     isOpaque:isDstOpaque
                    isTexture:JNI_TRUE
+               interpolation:interpolation
                         isAA:isAA
                     srcFlags:&srcFlags];
  }
  
  - (id<MTLRenderCommandEncoder> _Nonnull) getTextureEncoder:(id<MTLTexture> _Nonnull)dest
                                                 isSrcOpaque:(bool)isSrcOpaque
                                                 isDstOpaque:(bool)isDstOpaque
+                                              interpolation:(int)interpolation
  {
-     return [self getTextureEncoder:dest isSrcOpaque:isSrcOpaque isDstOpaque:isDstOpaque isAA:JNI_FALSE];
+     return [self getTextureEncoder:dest isSrcOpaque:isSrcOpaque isDstOpaque:isDstOpaque interpolation:interpolation isAA:JNI_FALSE];
  }
  
  - (id<MTLRenderCommandEncoder> _Nonnull)
      getEncoder:(id<MTLTexture> _Nonnull)dest
        isOpaque:(jboolean)isOpaque
       isTexture:(jboolean)isTexture
+  interpolation:(int)interpolation
            isAA:(jboolean)isAA
        srcFlags:(const SurfaceRasterFlags *_Nullable)srcFlags {
    //
    // 1. check whether it's necessary to call endEncoder
    //

@@ -407,10 +435,11 @@
    //
    [_encoderStates updateEncoder:_encoder
                            paint:_mtlc.paint
                        composite:_mtlc.composite
                        isTexture:isTexture
+                   interpolation:interpolation
                             isAA:isAA
                         srcFlags:srcFlags
                             clip:_mtlc.clip
                        transform:_mtlc.transform
                      forceUpdate:forceUpdate];

@@ -434,10 +463,11 @@
            NSUInteger _w = _destination.width;
            NSUInteger _h = _destination.height;
            _encoder = [self getTextureEncoder:_destination
                                   isSrcOpaque:JNI_FALSE
                                   isDstOpaque:JNI_TRUE
+                                interpolation:INTERPOLATION_NEAREST_NEIGHBOR
                                          isAA:JNI_TRUE];
  
            struct TxtVertex quadTxVerticesBuffer[] = {
                {{0, 0}, {0, 0}},
                {{0,_h}, {0, 1}},
< prev index next >