On Sat, 5 Aug 2023 12:28:16 GMT, Thorsten Fischer <d...@openjdk.org> wrote:

> Hi,
> 
> I did open the bug report. Some notes to this PR:
> 
> My colleagues and I are able to reproduce this bug regularly, even though it 
> takes sometimes up to 3 or 4 weeks until the D3DERR_DEVICEHUNG error shows 
> up. We are currently evaluating two versions of fixes, but until now we do 
> not have any results. I will post them as soon as I got them.
> 
> Version 1 (this version): Based on the observation, that the 
> TestCooperativeLevel/CheckDeviceState method returns D3D_OK again after about 
> 20 - 60 seconds, the reinitialize is called after the first time the state is 
> returning D3D_OK. The 'isHung' flag stores the information until then.
> 
> Version 2: calls reinitialize directly after D3DERR_DEVICEHUNG has been 
> returned. Basically
> if (hr == D3DERR_DEVICEREMOVED || hr == D3DERR_DEVICEHUNG  ) { .. }
> 
> I did not modify the validatePresent method, as for our workaround (see 
> ticket) it was not necessary. At least the native call swapchain->present 
> dows not return that error code 
> (https://learn.microsoft.com/en-us/windows/win32/api/d3d9/nf-d3d9-idirect3dswapchain9-present).
>  I did not look decisively into all the native calls behind 
> D3DRTTexture#readPixels.
> 
> As I said I will post the results (prism.verbose output) for the 2 versions 
> later as a base for discussions.

I have put this in D3DContext.java, a slight variation of the suggested fix. 
Just wondering if I should just reinitialize directly and not wait loop: in 
testLostState in D3DContext.java
       if (hr == D3DERR_DEVICEHUNG || hr == D3DERR_DEVICEREMOVED) {
            setLost();

            long retryMillis = TimeUnit.MINUTES.toMillis(5);
            long sleepMillis = TimeUnit.SECONDS.toMillis(1);

            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.");
        }

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

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

Reply via email to