RFR: 8271024: Implement macOS Metal Rendering Pipeline [v2]
Ambarish Rapte
arapte at openjdk.org
Thu Jun 19 10:35:41 UTC 2025
> ### Description
> This is the implementation of new graphics rendering pipeline for JavaFX using Metal APIs on MacOS.
> We released two Early Access (EA) builds and have reached a stage where it is ready to be integrated.
> 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 (by providing `-Dprism.order=mtl`)
> The `-Dprism.verbose=true` option can be used to verify the rendering pipeline in use.
>
> ### Details about the changes
>
> **Shader changes**
> - MSLBackend class: This is the primary class that parses (Prism and Decora) jsl shaders into Metal shaders(msl)
> - There are a few additional Metal shader files added under directory : modules/javafx.graphics/src/main/native-prism-mtl/msl
>
> **Build changes** - There are new tasks added to build.gradle for
> - Generation/ Compilation/ linking of Metal shaders
> - Compilation of Prism Java and Objective C files
>
> **Prism** - Prism is the rendering engine of JavaFX.
> - Added Metal specific Java classes and respective native implementation which use Metal APIs
> - Java side changes:
> - New Metal specific classes: Classes prefixed with MTL, are added here : modules/javafx.graphics/src/main/java/com/sun/prism/mtl
> - Modification to Prism common classes: A few limited changes were required in Prism common classes to support Metal classes.
> - Native side changes:
> - New Metal specific Objective C implementation is added here: modules/javafx.graphics/src/main/native-prism-mtl
>
> **Glass** - Glass is the windowing toolkit of JavaFX
> - Existing Glass classes are refactored to support both OpenGL and Metal pipelines
> - Added Metal specific Glass implementation.
>
> ### Testing
> - Testing performed on different hardware and macOS versions.
> - HW - macBooks with Intel, Intel with discrete graphics card, Apple Silicon (M1, M2 and M4)
> - macOS versions - macOS 13, macOS 14 and macOS 15
> - Functional Testing:
> - All headful tests pass with Metal pipeline.
> - Verified samples applications: Ensemble and toys
> - Performance Testing:
> - Tested with RenderPerfTest: Almost all tests match/exceed es2 performance except a few that fall a little short on different hardwares. These will be addressed separately (there are open bugs already filed)
>
> ### Note to reviewers :
> - Providing `-Dprism.order=mtl` option is a must for testing the Metal pipeline
> - It would be a good idea to test both OpenGL and Metal pipelines
> - Known issues and tasks ...
Ambarish Rapte 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 two additional commits since the last revision:
- Merge branch 'master' into impl-metal
- implement metal rendering pipeline
-------------
Changes:
- all: https://git.openjdk.org/jfx/pull/1824/files
- new: https://git.openjdk.org/jfx/pull/1824/files/9634aafe..ca8b6af0
Webrevs:
- full: https://webrevs.openjdk.org/?repo=jfx&pr=1824&range=01
- incr: https://webrevs.openjdk.org/?repo=jfx&pr=1824&range=00-01
Stats: 8639 lines in 103 files changed: 7798 ins; 602 del; 239 mod
Patch: https://git.openjdk.org/jfx/pull/1824.diff
Fetch: git fetch https://git.openjdk.org/jfx.git pull/1824/head:pull/1824
PR: https://git.openjdk.org/jfx/pull/1824
More information about the openjfx-dev
mailing list