RFR: 8313648: JavaFX application continues to show a black screen after graphic card driver crash

Ambarish Rapte arapte at openjdk.org
Wed Nov 29 06:33:20 UTC 2023


On Mon, 27 Nov 2023 19:57:30 GMT, Thorsten Fischer <duke at openjdk.org> wrote:

>> I have put this in D3DContext.java (as per customer suggestion). Just wondering if I should just reinitialize directly and not wait loop: in testLostStateAndReset in D3DContext.java (D3DERR_DEVICEREMOVED is handled further down)
>>        if (hr == D3DERR_DEVICEHUNG) {
>>             setLost();
>> 
>>             long retryMillis = TimeUnit.MINUTES.toMillis(5);
>>             long sleepMillis = TimeUnit.SECONDS.toMillis(1);
>>             //Is this loop necessary?
>>             for (int i = 0; i < retryMillis; i += sleepMillis) {
>>                 int cooperativeLevel = D3DResourceFactory.nTestCooperativeLevel(pContext);
>>                 System.err.println("Checking Cooperative Level: " + cooperativeLevel);
>> 
>>                 if (cooperativeLevel == D3D_OK) {
>>                     break;
>>                 } else {
>>                     try {
>>                         Thread.sleep(sleepMillis);
>>                     } catch (InterruptedException e) {
>>                         e.printStackTrace();
>>                     }
>>                 }
>>             }
>> 
>>             // Reinitialize after 5 mins anyway, even if result is not OK.
>> 
>>             // Reinitialize the D3DPipeline. This will dispose and recreate
>>             // the resource factory and context for each adapt
>>             D3DPipeline.getInstance().reinitialize();
>>             LOGGER.warn("Reinit after graphics hang.");
>>         }
>
> Hello @mintykat , the loop is not necessary, in fact it is not recommended as it makes the whole application (window) unresponsive due to the Thread.sleep. It was just an approach to generate some debug output in order to see how the system and D3D is responding after the failure happens. Best is to call reinitialize directly after the check for the D3DERR_DEVICEHUNG error code.
> 
> I'm wondering a little bit, if JavaFX may be somehow responsible for the crash or if its just old drivers? This fix is going to keep the application running, but those crashes will still happen. You said, that you can reproduce this error every couple of hours? If you have the capacity, maybe you can track down the root cause? But I guess it is not a trivial task, I just [found here that some debug.dlls](https://learn.microsoft.com/en-us/windows/win32/direct3d9/troubleshooting#debugging) are needed. We had this error 'only' every few days (sometimes weeks), and I wasn't quite motivated for such a long winding deep-dive bug hunt :)

As pointed out by @tsx84 [here](https://github.com/openjdk/jfx/pull/1199#issuecomment-1828503142): This fix is to recover from a device hung situation but does not fix the root cause as why did the device hung.
But the fix itself seems safe, I have no concerns about it. thanks @kevinrushforth for waiting on me.

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

PR Comment: https://git.openjdk.org/jfx/pull/1199#issuecomment-1831297367


More information about the openjfx-dev mailing list