On Tue, 29 Jun 2021 23:31:33 GMT, Sergey Bylokhov <s...@openjdk.org> wrote:

>> Final blit operation in MTLLayer.blitTexture() is driven by CVDisplayLink in 
>> Metal.
>> In this test case we are hitting an invalid condition because of which we 
>> exit from MTLLayer.blitTexture(), but we are not stopping the CVDisplayLink. 
>> This is causing the CVDisplayLink callback to run in loop. Fix is to stop 
>> CVDisplayLink when we return without completing final blit operation in 
>> MTLLayer.blitTexture().
>> 
>> Sanity and performance analysis is green. More details in JBS.
>
> src/java.desktop/macosx/native/libawt_lwawt/java2d/metal/MTLLayer.m line 286:
> 
>> 284:     if (layer == NULL || ctx == NULL) {
>> 285:         J2dTraceLn(J2D_TRACE_VERBOSE, "MTLLayer_blit : Layer or Context 
>> is null");
>> 286:         [layer stopDisplayLink];
> 
> What happens if we exit before this "blitTexture" is called? Do not we need 
> to stop(w/o possibility to restart it) that thread on toolkit shutdown or 
> something like this?

At this point if we exit, we just return and unlock MTLRenderQueue for 
backbuffer rendering. And when it is done we again start CVDisplayLink in 
MTLRenderQueue which in turn calls setNeedsDisplay to get callback to 
MTLLayer.display().

This scenario is same as returning from CGLLayer.blitTexture() when textureID 
is 0. Appkit thread will be running in the background and we dont stop it.

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

PR: https://git.openjdk.java.net/jdk17/pull/175

Reply via email to