RFR: 8271024: Implement macOS Metal Rendering Pipeline [v17]
Kevin Rushforth
kcr at openjdk.org
Mon Aug 4 16:06:21 UTC 2025
On Mon, 4 Aug 2025 10:46:37 GMT, Ambarish Rapte <arapte at openjdk.org> wrote:
>> ### 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 woul...
>
> Ambarish Rapte has updated the pull request incrementally with one additional commit since the last revision:
>
> kcr-andy: review comments
I did a quick test build on Windows and I see the following non-fatal error:
> Task :graphics:generateDecoraShaders
Custom actions are attached to task ':graphics:generateDecoraShaders'.
Caching disabled for task ':graphics:generateDecoraShaders' because:
Build cache is disabled
Gradle would require more information to cache this task
Task ':graphics:generateDecoraShaders' is not up-to-date because:
No history is available.
Starting process 'command 'jdk-24.0.2\bin\java.exe''. Working directory: jfx\modules\javafx.graphics Command: jdk-24.0.2\bin\java.exe --module-path=jfx\modules\javafx.graphics\build\classes\java\main;jfx/modules/javafx.base/build/classes/java/main --add-modules=javafx.graphics --add-exports=javafx.graphics/com.sun.scenario.effect=ALL-UNNAMED --add-exports=javafx.graphics/com.sun.scenario.effect.light=ALL-UNNAMED --add-exports=javafx.graphics/com.sun.scenario.effect.impl.state=ALL-UNNAMED -Dfile.encoding=UTF-8 -Duser.country=US -Duser.language=en -Duser.variant -cp jfx\modules\javafx.base\build\libs\base.jar;.gradle\caches\modules-2\files-2.1\org.antlr\antlr4\4.7.2\34fc363424d3b060b660f84974a82d6bdc7ebe0c\antlr4-4.7.2-complete.jar;jfx\modules\javafx.graphics\build\classes\java\jslc;jfx\modules\javafx.graphics\src\jslc\resources;jfx\modules\javafx.graphics\build\classes\jsl-compilers\decora GenAllDecoraShaders -i jfx\modules\javafx.graphics\src\main\jsl-decora -o jfx\modules\javafx.gra
phics\build\gensrc\jsl-decora -t -pkg com/sun/scenario/effect -all GenAllDecoraShaders
Successfully started process 'command 'jdk-24.0.2\bin\java.exe''
IOException occurred while creating FragmentShaderCommon.h: jfx\modules\javafx.graphics\build\gensrc\mtl-headers\FragmentShaderCommon.h (The system cannot find the path specified)
java.io.FileNotFoundException: jfx\modules\javafx.graphics\build\gensrc\mtl-headers\FragmentShaderCommon.h (The system cannot find the path specified)
at java.base/java.io.FileOutputStream.open0(Native Method)
at java.base/java.io.FileOutputStream.open(FileOutputStream.java:255)
at java.base/java.io.FileOutputStream.<init>(FileOutputStream.java:210)
at java.base/java.io.FileOutputStream.<init>(FileOutputStream.java:120)
at java.base/java.io.FileWriter.<init>(FileWriter.java:67)
at com.sun.scenario.effect.compiler.backend.hw.MSLBackend.writeFragmentShaderHeader(MSLBackend.java:498)
at com.sun.scenario.effect.compiler.backend.hw.MSLBackend.setShaderNameAndHeaderPath(MSLBackend.java:470)
at com.sun.scenario.effect.compiler.JSLC.compile(JSLC.java:234)
at com.sun.scenario.effect.compiler.JSLC.compile(JSLC.java:191)
at com.sun.scenario.effect.compiler.JSLC.compile(JSLC.java:158)
at CompileJSL.main(CompileJSL.java:75)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
at java.base/java.lang.reflect.Method.invoke(Method.java:565)
at GenAllDecoraShaders.main(GenAllDecoraShaders.java:53)
An error occurred.
java.io.FileNotFoundException: jfx\modules\javafx.graphics\build\gensrc\mtl-headers\DecoraShaderCommon.h (The system cannot find the path specified)
at java.base/java.io.FileOutputStream.open0(Native Method)
at java.base/java.io.FileOutputStream.open(FileOutputStream.java:255)
at java.base/java.io.FileOutputStream.<init>(FileOutputStream.java:210)
at java.base/java.io.FileOutputStream.<init>(FileOutputStream.java:120)
at java.base/java.io.FileWriter.<init>(FileWriter.java:67)
at com.sun.scenario.effect.compiler.backend.hw.MSLBackend.updateCommonHeaders(MSLBackend.java:314)
at com.sun.scenario.effect.compiler.backend.hw.MSLBackend.getShader(MSLBackend.java:429)
at com.sun.scenario.effect.compiler.JSLC.compile(JSLC.java:236)
at com.sun.scenario.effect.compiler.JSLC.compile(JSLC.java:191)
at com.sun.scenario.effect.compiler.JSLC.compile(JSLC.java:158)
at CompileJSL.main(CompileJSL.java:75)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
at java.base/java.lang.reflect.Method.invoke(Method.java:565)
at GenAllDecoraShaders.main(GenAllDecoraShaders.java:53)
An error occurred.
... (repeated many times)
> Task :graphics:generatePrismShaders
Custom actions are attached to task ':graphics:generatePrismShaders'.
Caching disabled for task ':graphics:generatePrismShaders' because:
Build cache is disabled
Gradle would require more information to cache this task
Task ':graphics:generatePrismShaders' is not up-to-date because:
No history is available.
Starting process 'command 'jdk-24.0.2\bin\java.exe''. Working directory: jfx\modules\javafx.graphics Command: jdk-24.0.2\bin\java.exe -Dfile.encoding=UTF-8 -Duser.country=US -Duser.language=en -Duser.variant -cp jfx\modules\javafx.base\build\libs\base.jar;.gradle\caches\modules-2\files-2.1\org.antlr\antlr4\4.7.2\34fc363424d3b060b660f84974a82d6bdc7ebe0c\antlr4-4.7.2-complete.jar;jfx\modules\javafx.graphics\build\classes\java\jslc;jfx\modules\javafx.graphics\src\jslc\resources\com\sun\scenario\effect\compiler\backend\prism\PrismGlue.stg;jfx\modules\javafx.graphics\src\jslc\resources\com\sun\scenario\effect\compiler\backend\sw\java\JSWGlue.stg;jfx\modules\javafx.graphics\src\jslc\resources\com\sun\scenario\effect\compiler\backend\sw\me\MEJavaGlue.stg;jfx\modules\javafx.graphics\src\jslc\resources\com\sun\scenario\effect\compiler\backend\sw\me\MENativeGlue.stg;jfx\modules\javafx.graphics\src\jslc\resources\com\sun\scenario\effect\compiler\backend\sw\sse\SSEJavaGlue.stg;jfx\modules\javafx
.graphics\src\jslc\resources\com\sun\scenario\effect\compiler\backend\sw\sse\SSENativeGlue.stg;jfx\modules\javafx.graphics\build\classes\jsl-compilers\prism;jfx\modules\javafx.graphics\src\main\jsl-prism CompileJSL -i jfx\modules\javafx.graphics\src\main\jsl-prism -o jfx\modules\javafx.graphics\build\gensrc\jsl-prism -t -pkg com/sun/prism -d3d -es2 -mtl -name jfx\modules\javafx.graphics\src\main\jsl-prism\MaskAlphaOne.jsl
Successfully started process 'command 'jdk-24.0.2\bin\java.exe''
IOException occurred while creating FragmentShaderCommon.h: jfx\modules\javafx.graphics\build\gensrc\mtl-headers\FragmentShaderCommon.h (The system cannot find the path specified)
java.io.FileNotFoundException: jfx\modules\javafx.graphics\build\gensrc\mtl-headers\FragmentShaderCommon.h (The system cannot find the path specified)
at java.base/java.io.FileOutputStream.open0(Native Method)
at java.base/java.io.FileOutputStream.open(FileOutputStream.java:255)
at java.base/java.io.FileOutputStream.<init>(FileOutputStream.java:210)
at java.base/java.io.FileOutputStream.<init>(FileOutputStream.java:120)
at java.base/java.io.FileWriter.<init>(FileWriter.java:67)
at com.sun.scenario.effect.compiler.backend.hw.MSLBackend.writeFragmentShaderHeader(MSLBackend.java:498)
at com.sun.scenario.effect.compiler.backend.hw.MSLBackend.setShaderNameAndHeaderPath(MSLBackend.java:470)
at com.sun.scenario.effect.compiler.JSLC.compile(JSLC.java:234)
at com.sun.scenario.effect.compiler.JSLC.compile(JSLC.java:191)
at com.sun.scenario.effect.compiler.JSLC.compile(JSLC.java:151)
at CompileJSL.compileShader(CompileJSL.java:422)
at CompileJSL.compileShader(CompileJSL.java:414)
at CompileJSL.compileColorPaint(CompileJSL.java:248)
at CompileJSL.main(CompileJSL.java:481)
An error occurred.
java.io.FileNotFoundException: jfx\modules\javafx.graphics\build\gensrc\mtl-headers\PrismShaderCommon.h (The system cannot find the path specified)
at java.base/java.io.FileOutputStream.open0(Native Method)
at java.base/java.io.FileOutputStream.open(FileOutputStream.java:255)
at java.base/java.io.FileOutputStream.<init>(FileOutputStream.java:210)
at java.base/java.io.FileOutputStream.<init>(FileOutputStream.java:120)
at java.base/java.io.FileWriter.<init>(FileWriter.java:67)
at com.sun.scenario.effect.compiler.backend.hw.MSLBackend.updateCommonHeaders(MSLBackend.java:314)
at com.sun.scenario.effect.compiler.backend.hw.MSLBackend.getShader(MSLBackend.java:429)
at com.sun.scenario.effect.compiler.JSLC.compile(JSLC.java:236)
at com.sun.scenario.effect.compiler.JSLC.compile(JSLC.java:191)
at com.sun.scenario.effect.compiler.JSLC.compile(JSLC.java:151)
at CompileJSL.compileShader(CompileJSL.java:422)
at CompileJSL.compileShader(CompileJSL.java:414)
at CompileJSL.compileColorPaint(CompileJSL.java:248)
at CompileJSL.main(CompileJSL.java:481)
An error occurred.
... (repeated many times)
-------------
PR Comment: https://git.openjdk.org/jfx/pull/1824#issuecomment-3151365650
More information about the openjfx-dev
mailing list