changeset 57649:a89720df2d17

8237458: J2Ddemo test becomes unresponsive after launching Backed out changeset 09b8eb38bbfa 8236137 (avoid texture reallocations inside vertex-cache)
author avu
date Mon, 20 Jan 2020 16:54:42 +0300
parents 2e3d5e1ba69d
children b97bada6ccdf
files src/java.desktop/macosx/native/libawt_lwawt/java2d/metal/MTLBlitLoops.m src/java.desktop/macosx/native/libawt_lwawt/java2d/metal/MTLVertexCache.m
diffstat 2 files changed, 19 insertions(+), 26 deletions(-) [+]
line wrap: on
line diff
--- a/src/java.desktop/macosx/native/libawt_lwawt/java2d/metal/MTLBlitLoops.m	Tue Jan 14 15:32:41 2020 +0530
+++ b/src/java.desktop/macosx/native/libawt_lwawt/java2d/metal/MTLBlitLoops.m	Mon Jan 20 16:54:42 2020 +0300
@@ -262,7 +262,6 @@
         return;
     }
     [[mtlc getCommandBufferWrapper] registerPooledTexture:texHandle];
-    [texHandle release];
 
     id<MTLTexture> texBuff = texHandle.texture;
     id<MTLTexture> swizzledTexture = replaceTextureRegion(texBuff, srcInfo, rfi, 0, 0, sw, sh);
--- a/src/java.desktop/macosx/native/libawt_lwawt/java2d/metal/MTLVertexCache.m	Tue Jan 14 15:32:41 2020 +0530
+++ b/src/java.desktop/macosx/native/libawt_lwawt/java2d/metal/MTLVertexCache.m	Mon Jan 20 16:54:42 2020 +0300
@@ -32,7 +32,6 @@
 
 #include "MTLPaints.h"
 #include "MTLVertexCache.h"
-#include "MTLTexturePool.h"
 #include "common.h"
 
 typedef struct _J2DVertex {
@@ -43,7 +42,7 @@
 static J2DVertex *vertexCache = NULL;
 static jint vertexCacheIndex = 0;
 
-static MTLPooledTextureHandle * maskCacheTex = NULL;
+static id<MTLTexture> maskCacheTex = NULL;
 static jint maskCacheIndex = 0;
 static id<MTLRenderCommandEncoder> encoder = NULL;
 
@@ -91,7 +90,7 @@
         [encoder setVertexBytes: vertexCache length:vertexCacheIndex * sizeof(J2DVertex)
                                                 atIndex:MeshVertexBuffer];
 
-        [encoder setFragmentTexture:maskCacheTex.texture atIndex: 0];
+        [encoder setFragmentTexture:maskCacheTex atIndex: 0];
         for (int i = 0; i < maskCacheIndex; i++) {
             J2dTraceLn1(J2D_TRACE_INFO, "MTLVertexCache_FlushVertexCache : draw texture at index %d", i);
             [encoder drawPrimitives:MTLPrimitiveTypeTriangle vertexStart:i*6 vertexCount:6];
@@ -99,12 +98,8 @@
     }
     vertexCacheIndex = 0;
     maskCacheIndex = 0;
-
-    if (maskCacheTex != nil) {
-        [[mtlc getCommandBufferWrapper] registerPooledTexture:maskCacheTex];
-        [maskCacheTex release];
-        maskCacheTex = nil;
-    }
+    [maskCacheTex release];
+    maskCacheTex = nil;
 }
 
 /**
@@ -154,13 +149,14 @@
     // when we need more than 1 byte to store a pixel(LCD) we need to update
     // below code.
     if (maskCacheTex == NULL) {
-        maskCacheTex = [mtlc.texturePool getTexture:MTLVC_MASK_CACHE_WIDTH_IN_TEXELS
-                                             height:MTLVC_MASK_CACHE_HEIGHT_IN_TEXELS
-                                             format:MTLPixelFormatA8Unorm];
-        if (maskCacheTex == nil) {
-            J2dTraceLn(J2D_TRACE_ERROR, "MTLVertexCache_InitMaskCache: can't obtain temporary texture object from pool");
-            return JNI_FALSE;
-        }
+        MTLTextureDescriptor *textureDescriptor =
+            [MTLTextureDescriptor texture2DDescriptorWithPixelFormat:MTLPixelFormatA8Unorm
+                                                               width:MTLVC_MASK_CACHE_WIDTH_IN_TEXELS
+                                                              height:MTLVC_MASK_CACHE_HEIGHT_IN_TEXELS
+                                                           mipmapped:NO];
+
+        maskCacheTex = [mtlc.device newTextureWithDescriptor:textureDescriptor];
+        [textureDescriptor release];
     }
     // init special fully opaque tile in the upper-right corner of
     // the mask cache texture
@@ -180,8 +176,7 @@
     };
 
 
-    // do we really need this??
-    [maskCacheTex.texture replaceRegion:region
+    [maskCacheTex replaceRegion:region
                     mipmapLevel:0
                       withBytes:tile
                     bytesPerRow:bytesPerRow];
@@ -215,11 +210,8 @@
     J2dTraceLn(J2D_TRACE_INFO, "MTLVertexCache_DisableMaskCache");
     MTLVertexCache_FlushVertexCache(mtlc);
     MTLVertexCache_RestoreColorState(mtlc);
-    if (maskCacheTex != nil) {
-        [[mtlc getCommandBufferWrapper] registerPooledTexture:maskCacheTex];
-        [maskCacheTex release];
-        maskCacheTex = nil;
-    }
+    [maskCacheTex release];
+    maskCacheTex = nil;
     maskCacheIndex = 0;
     free(vertexCache);
     vertexCache = NULL;
@@ -251,6 +243,8 @@
     {
         J2dTraceLn2(J2D_TRACE_INFO, "maskCacheIndex = %d, vertexCacheIndex = %d", maskCacheIndex, vertexCacheIndex);
         MTLVertexCache_FlushVertexCache(mtlc);
+        [maskCacheTex release];
+        maskCacheTex = nil;
         // TODO : Since we are not committing command buffer
         // in FlushVertexCache we need to create new maskcache
         // after present cache is full. Check whether we can
@@ -285,7 +279,7 @@
         // TODO : Research more and try removing memcpy logic.
         if (fullwidth <= width) {
             int height_offset = bytesPerRow * srcy;
-            [maskCacheTex.texture replaceRegion:region
+            [maskCacheTex replaceRegion:region
                             mipmapLevel:0
                               withBytes:mask + height_offset
                             bytesPerRow:bytesPerRow];
@@ -301,7 +295,7 @@
                 memcpy(tile + dst_offset, mask + src_offset, width);
                 dst_offset = dst_offset + width;
             }
-            [maskCacheTex.texture replaceRegion:region
+            [maskCacheTex replaceRegion:region
                             mipmapLevel:0
                               withBytes:tile
                             bytesPerRow:bytesPerRow];