On Mon, 1 Mar 2021 11:17:39 GMT, Ajit Ghaisas <aghai...@openjdk.org> wrote:
>> **Description :** >> This is the implementation of [JEP 382 : New macOS Rendering >> Pipeline](https://bugs.openjdk.java.net/browse/JDK-8238361) >> It implements a Java 2D internal rendering pipeline for macOS using the >> Apple Metal API. >> The entire work on this was done under [OpenJDK Project - >> Lanai](http://openjdk.java.net/projects/lanai/) >> >> We iterated through several Early Access (EA) builds and have reached a >> stage where it is ready to be integrated to openjdk/jdk. The latest EA build >> is available at - https://jdk.java.net/lanai/ >> >> A new option -Dsun.java2d.metal=true | True needs to be used to use this >> pipeline. >> >> **Testing :** >> This implementation has been tested with the tests present at - [Test Plan >> for JEP 382: New macOS Rendering >> Pipeline](https://bugs.openjdk.java.net/browse/JDK-8251396) >> >> **Note to reviewers :** >> 1) Default rendering pipeline on macOS has not been changed by this PR. >> OpenGL still stays as the default rendering pipeline and Metal rendering >> pipeline is optional to choose. >> >> 2) To apply and test this PR - >> To enable the metal pipeline you must specify on command line >> -Dsun.java2d.metal=true (No message will be printed in this case) or >> -Dsun.java2d.metal=True (A message indicating Metal rendering pipeline is >> enabled gets printed) >> >> 3) Review comments (including some preliminary informal review comments) are >> tracked with JBS issues - https://bugs.openjdk.java.net/issues/?filter=40598 > > Ajit Ghaisas has updated the pull request with a new target base due to a > merge or a rebase. The incremental webrev excludes the unrelated changes > brought in by the merge/rebase. The pull request contains 36 additional > commits since the last revision: > > - Lanai PR#206 - 8262729 - aghaisas > - Lanai PR#205 - 8262496 - avu > - Lanai PR#203 - 8262313 - jdv > - Lanai PR#202 - 8262293 - avu > - Lanai PR#201 - 8261891 - avu > - Lanai PR#200 - 8262115 - aghaisas > - Merge branch 'master' into 8260931_lanai_JEP_branch > - Lanai PR#199 - 8262091 - aghaisas > - Lanai PR#198 - 8261646 - avu > - Lanai PR#197 - 8261960 - jdv > - ... and 26 more: > https://git.openjdk.java.net/jdk/compare/49503c0d...5cb1fd91 src/java.desktop/macosx/classes/sun/awt/CGraphicsDevice.java line 81: > 79: // Try falling back to OpenGL pipeline > 80: if (MacOSFlags.isMetalVerbose()) { > 81: System.out.println("Metal rendering pipeline > initialization failed. Using OpenGL rendering pipeline."); Please split the long lines, here and there. Most of these files use 80 chars per line. src/java.desktop/macosx/classes/sun/java2d/metal/MTLBlitLoops.java line 499: > 497: } > 498: > 499: // We can convert argb_pre data from MTL surface in two places: Does anybody check that this is true for the metal pipeline? or It is just copied from the OGL? src/java.desktop/macosx/classes/sun/java2d/metal/MTLContext.java line 58: > 56: * Makes the given GraphicsConfig's context current to its associated > 57: * "scratch surface". Each GraphicsConfig maintains a native context > 58: * (MTLDevice) as well as a native pbuffer "pbuffer"? src/java.desktop/macosx/classes/sun/java2d/metal/MTLContext.java line 68: > 66: * when disposing a texture-based surface). > 67: */ > 68: public static void setScratchSurface(long pConfigInfo) { How the scratch surface is used in the metal pipeline? Why it is not enough to set the "context current"? src/java.desktop/macosx/classes/sun/java2d/metal/MTLGraphicsConfig.java line 168: > 166: } > 167: > 168: ContextCapabilities caps = new MTLContext.MTLContextCaps( CAPS_DOUBLEBUFFERED is not included? src/java.desktop/macosx/classes/sun/java2d/metal/MTLContext.java line 140: > 138: StringBuilder sb = new StringBuilder(super.toString()); > 139: if ((caps & CAPS_DOUBLEBUFFERED) != 0) { > 140: sb.append("CAPS_DOUBLEBUFFERED|"); Related to other questions, we do not include CAPS_DOUBLEBUFFERED, but anyway, report the surface as double buffered. src/java.desktop/macosx/classes/sun/java2d/metal/MTLLayer.java line 44: > 42: > 43: // Pass the insets to native code to make adjustments in blitTexture > 44: private static native void nativeSetInsets(long layerPtr, int top, > int left); Probably I have asked this already, but why we need to use insets? Why insets is not necessary for ogl? src/java.desktop/macosx/classes/sun/java2d/metal/MTLRenderer.java line 25: > 23: * questions. > 24: */ > 25: package sun.java2d.metal; Looks like other files use blank line befor "package". src/java.desktop/macosx/classes/sun/java2d/metal/MTLSurfaceData.java line 146: > 144: return MTLSurfaceRTT; > 145: default: > 146: return MTLSurface; Do we really support 3 different types of surface? I guess only two of them are different: textures used for manageable images, and surfaces used by the volatile image. src/java.desktop/macosx/classes/sun/java2d/metal/MTLSurfaceData.java line 194: > 192: * Creates a SurfaceData object representing an off-screen buffer > 193: */ > 194: public static MTLOffScreenSurfaceData createData(MTLGraphicsConfig > gc, Something wrong in the formatting. src/java.desktop/macosx/classes/sun/java2d/metal/MTLSurfaceData.java line 221: > 219: protected native boolean initRTexture(long pData, boolean isOpaque, > int width, int height); > 220: > 221: protected native boolean initFlipBackbuffer(long pData); flip back buffer is supported? src/java.desktop/macosx/classes/sun/lwawt/macosx/CWarningWindow.java line 304: > 302: }; > 303: } > 304: public MTLLayer createMTLLayer() { TODO to test that this functionality works src/java.desktop/macosx/native/libawt_lwawt/java2d/metal/MTLBlitLoops.m line 36: > 34: #include "GraphicsPrimitiveMgr.h" > 35: > 36: #include <stdlib.h> // malloc malloc is unused in this file? src/java.desktop/macosx/native/libawt_lwawt/java2d/metal/MTLBlitLoops.m line 676: > 674: height = srcInfo.bounds.y2 - srcInfo.bounds.y1; > 675: > 676: pDst = PtrAddBytes(pDst, dstx * dstInfo.pixelStride); Here and in other places use the PtrPixelsRow instead, do not use multiplication, see the history of the OGLBlitLoops_SurfaceToSwBlit method. src/java.desktop/macosx/native/libawt_lwawt/java2d/metal/MTLSurfaceData.m line 284: > 282: */ > 283: jboolean > 284: MTLSD_InitMTLWindow(JNIEnv *env, BMTLSDOps *bmtlsdo) When the MTLWindow is used? src/java.desktop/macosx/native/libawt_lwawt/java2d/metal/MTLSurfaceData.m line 316: > 314: > 315: void > 316: MTLSD_SwapBuffers(JNIEnv *env, jlong pPeerData) Copied from OGL and can be removed? src/java.desktop/macosx/native/libawt_lwawt/java2d/metal/MTLSurfaceDataBase.h line 109: > 107: #define MTLSD_TEXTURE sun_java2d_pipe_hw_AccelSurface_TEXTURE > 108: #define MTLSD_FLIP_BACKBUFFER > sun_java2d_pipe_hw_AccelSurface_FLIP_BACKBUFFER > 109: #define MTLSD_RT_TEXTURE > sun_java2d_pipe_hw_AccelSurface_RT_TEXTURE Only two of them are supported? MTLSD_TEXTURE and MTLSD_RT_TEXTURE? ------------- PR: https://git.openjdk.java.net/jdk/pull/2403