On Mon, 2 Nov 2026 18:45:48 GMT, Kevin Rushforth <[email protected]> wrote:

>> ## Description
>> 
>> This PR is for review and integration of Direct3D 12 Rendering Pipeline into 
>> JavaFX mainline. We released three Early Access (EA) versions of this 
>> implementation while keeping the development ongoing on [JavaFX 
>> Sandbox](https://github.com/openjdk/jfx-sandbox/tree/direct3d12) and reached 
>> a stage where it is ready to be integrated into mainline. Any further work 
>> and potential fixes will be done on mainline.
>> 
>> At the time of writing, this PR is identical to the [JavaFX Sandbox D3D12 
>> branch](https://github.com/openjdk/jfx-sandbox/tree/direct3d12) with only 
>> one difference - the Sandbox defaults to D3D12 backend. This PR, however, 
>> does *NOT* change the default rendering pipeline on Windows. D3D9 remains 
>> the default rendering pipeline and D3D12 is optional - it can be selected by 
>> providing `-Dprism.order=d3d12`. To verify which pipeline is actually in use 
>> `-Dprism.verbose=true` is recommended.
>> 
>> ## Details
>> 
>> Below are general changes introduced by the backend:
>> 
>> ### JSL changes
>> 
>> - Introduced `HLSL6Backend` class which translates JSL shader code into 
>> HLSL6 code. D3D12 introduced HLSL Shader Level 6 support and won't support 
>> existing HLSL shaders used with D3D9, as those are compiled for unsupported 
>> Shader Level 3.
>> - D3D12-specific shaders are kept in 
>> `modules/javafx.graphics/src/main/native-prism-d3d12/hlsl6`
>> - Shader compilation is done with DXC instead of FXC (FXC does not support 
>> SL6). DXC is bundled in Windows SDK which JavaFX already integrates with.
>> - Backend also generates C++ headers with Shader resource binding 
>> information, used by the native-side
>> 
>> ### Build changes
>> 
>> - Added new build tasks for generation and compilation of HLSL6 shaders for 
>> D3D12
>> - Added tasks to compile D3D12 native backend code
>> 
>> ### Prism changes
>> 
>> - Added D3D12-specific Java classes (package `com.sun.prism.d3d12`) and a 
>> Java-to-JNI layer (package `com.sun.prism.d3d12.ni`)
>>   - Java implementation is mostly similar to D3D9 implementation, with only 
>> some minor changes needed to accommodate slightly different presentation 
>> behavior of the new runtime
>>   - JNI interface is relatively high level to reduce the amount of JNI calls 
>> for performance
>> - Added a native Prism backend implementation using D3D12 runtime (stored in 
>> `modules/javafx.graphics/src/main/native-prism-d3d12`)
>>   - Written in C++ 20
>>   - Uses only interfaces available via Windows API with no third-party 
>> libraries - WinAPI, Windows COM interface system and "bare...
>
> modules/javafx.graphics/src/main/java/com/sun/prism/d3d12/D3D12Pipeline.java 
> line 69:
> 
>> 67:         isEnabled = nInit(PrismSettings.class);
>> 68: 
>> 69:         creator = Thread.currentThread();
> 
> Which thread do you expect this to be? The QuantumRenderer thread? And I 
> presume that in all cases, that thread is used to initialize this class, call 
> `D2D12Pipeline.init()`, and call `dispose()?`

Similar comment to the code where `creator` is being used

> modules/javafx.graphics/src/main/java/com/sun/prism/d3d12/D3D12Pipeline.java 
> line 217:
> 
>> 215:     public void dispose() {
>> 216:         if (creator != Thread.currentThread()) {
>> 217:             throw new IllegalStateException(
> 
> Is this more of an assertion or are there cases where it might happen?

This is following D3D9's and ES2's code - I didn't look too deep into why it is 
there (I don't think this could ever be called on a different thread than 
Quantum) but I assumed it would also be necessary. I guess this is more of an 
assertion, but MTL I think did not do this check.

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

PR Review Comment: https://git.openjdk.org/jfx/pull/2346#discussion_r4458139801
PR Review Comment: https://git.openjdk.org/jfx/pull/2346#discussion_r4458135494

Reply via email to