### 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 can be found here: 
https://bugs.openjdk.org/issues/?filter=46763

-------------

Commit messages:
 - implement metal rendering pipeline

Changes: https://git.openjdk.org/jfx/pull/1824/files
  Webrev: https://webrevs.openjdk.org/?repo=jfx&pr=1824&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8271024
  Stats: 12075 lines in 100 files changed: 11373 ins; 504 del; 198 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

Reply via email to