Bug 1036

Summary: Fix NVidia's Windows Driver Threaded optimization bug workaround
Product: [JogAmp] Jogl Reporter: Sven Gothel <sgothel>
Component: windowsAssignee: Sven Gothel <sgothel>
Severity: major CC: askinner
Priority: ---    
Version: 2   
Hardware: pc_all   
OS: windows   
Type: --- SCM Refs:
007f120cd8d33e4231ef4d207b85ed156d1e0c82 70c6a54fa2b8dec880b5808d87b31f4afb09dd3b 3ad880dfe3d5eb1eaa9db9860acdf24a3f159a58 adf8e6e40aa9513036864489642cfef252804d08 6cd0a28ff2cb3f1e249b524622abf411536be716
Workaround: ---

Description Sven Gothel 2014-07-27 23:31:08 CEST
Commit 5166d6a6b617ccb15c40fcb8d4eac2800527aa7b added a workaround for
NVidia's Windows Driver Threaded optimization bug
existing in NVidia driver 260.99 for Window from 2010-12-11.

[1] The workaround sets a process affinity while JOGL initialization
to mitigate NVidia driver's 'Threaded optimization := On' race conditions.
The process affinity is reset reset after initialization.

[2] The process affinity reset code had a bug, i.e. instead to restore the
original process's affinity mask, we restored the system's default affinity mask.

[3] Further more, there seem to be issues with changing a process affinity mask
regarding the process group.

This patch:
    - Solves issue [2] by using the original process affinity mask

    - Solves issue [3] by allowing a custom
    affinity mode via the property 'jogl.debug.windows.cpu_affinity_mode':

        - 0 - none (default, no affinity required for 
              Windows NV driver >= 266.58 from 2011-01-24)

        - 1 - process affinity (was required w/ 
              Windows NV driver 260.99 from 2010-12-11)

        - 2 - thread affinity (experimental)

    Hence the workaround is disabled by default,
    since the crash as documented in 
    commit 5166d6a6b617ccb15c40fcb8d4eac2800527aa7b
    could not be reproduced with NV driver 266.58 from 2011-01-24.
Comment 1 Sven Gothel 2014-07-27 23:32:03 CEST
Fixed as described in commit 007f120cd8d33e4231ef4d207b85ed156d1e0c82
Comment 2 Sven Gothel 2014-07-29 05:43:48 CEST
Re-enabled workaround w/ commit 70c6a54fa2b8dec880b5808d87b31f4afb09dd3b:

Commit 5166d6a6b617ccb15c40fcb8d4eac2800527aa7b added a workaround for
NVidia's Windows Driver Threaded optimization bug
existing in NVidia driver 260.99 for Window from 2010-12-11.

Commit 007f120cd8d33e4231ef4d207b85ed156d1e0c82
fixed the workaround and made it optional, default: turned off!

Rational of turning the workaround off was due to testing 
against the original test-case 'Applet and Webstart'
with drivers >= 266.58 from 2011-01-24,
which did not reproduce this issue.

However, our unit tests reproduced the issue,
e.g. test: com.jogamp.opengl.test.junit.jogl.caps.TestTranslucencyNEWT

Hence we have to re-enable the workaround per default.

Added the following documentation of the issue:


Since NV driver 260.99 from 2010-12-11 a 'Threaded optimization' feature has been introduced.
The driver spawns off a dedicated thread to off-load certain OpenGL tasks from the calling thread
to perform them async and off-thread.

If 'Threaded optimization' is manually enabled 'on', the driver may crash with JOGL's consistent
multi-threaded usage - this is a driver bug.

If 'Threaded optimization' is manually disabled 'off', the driver always works correctly.

'Threaded optimization' default setting is 'auto' and the driver may crash without this workaround.

If setting the process affinity to '1' (1st CPU) while initialization and launching
the  SharedResourceRunner, the driver does not crash anymore in 'auto' mode.
This might be either because the driver does not enable 'Threaded optimization'
or because the driver's worker thread is bound to the same CPU.

Property integer value <code>jogl.debug.windows.cpu_affinity_mode</code>:
  0 - none (no affinity, may cause driver crash with 'Threaded optimization' = ['auto', 'on'])
  1 - process affinity (default, workaround for driver crash for 'Threaded optimization' = 'auto', still crashes if set to 'on')


Note: WindowsThreadAffinity does _not_ work.
Comment 3 Sven Gothel 2014-07-30 16:21:45 CEST

Alternative affinity mask setting on all threads of process - Didn't work (disabled)
Comment 4 Sven Gothel 2014-08-04 14:43:38 CEST
  Renamed property to switch off NVidia Windows workaround 'jogl.windows.cpu_affinity_mode' (dropping '.debug')