On Mon, 24 Nov 2025 11:54:26 GMT, Lukasz Kostyra <[email protected]> wrote:
>> **Issue:**
>> With metal pipeline, frame tearing is observed when scrolling the content.
>> Perform small fling gesture scrolls for observing the issue, the issue
>> occurs/observed easily when scroll is coming to and end.
>>
>> **Cause:**
>> vsync is not enabled for metal pipeline.
>>
>> **Fix:**
>> 1. Enable vsync for metal pipeline. The vsync shall be enabled by default.
>> It can be disabled with `-Djavafx.animation.fullspeed=true`.
>> 2. Synchronize the access to offline render target texture.
>> 2.1 The `GlassMTLFrameBufferObject._texture` object is created and destroyed
>> by **QuantumRenderer** thread, and
>> 2.2 `GlassMTLFrameBufferObject._texture` is also accessed on **Appkit**
>> thread through function `GlassLayerMTL.blitToScreen()`
>> 2.3 NSLock is created to synchronize the acess
>> 2.4 Without this synchronization, a crash could occur in scenario when
>> JavaFX app window is moved between screens that differ in refresh rate.
>>
>> **Verification:**
>> 1. Test that no frame tearing is observed, when scrolling(easy to test with
>> small fling scrolls)
>> 2. Test no issue observed when moving window among screens.
>> 3. General sanity testing of UI.
>>
>> **Test:**
>> A unit or system test is not possible for this scenario.
>
> modules/javafx.graphics/src/main/native-glass/mac/GlassLayerMTL.m line 155:
>
>> 153: // {
>> 154: // The texture is locked, either being created/destroyed or
>> being encoded into BlitEncoder
>> 155: // hence the frame could be dropped.
>
> Just a curiosity question, but would we have a possibility to wait for the
> texture to become available to us instead of dropping the frame?
Waiting could cause a crash, in situation when the lock is already acquired for
destroying / creating the texture.
In that case the size of current CAMetalDrawable and size of newly created
texture could mismatch.
-------------
PR Review Comment: https://git.openjdk.org/jfx/pull/1978#discussion_r2558702078