A shader preparation transaction took the global writers lock when it was constructed and kept it to its end. ResolveShaderAbi, reached from sceAgcCreateInterpolantMapping and sceAgcLinkShaders, compiled its variants inside such a transaction, so every game thread creating or linking shaders waited behind one compile: Uncharted's stalled frames spent about half a second each in shader registration. The root transaction now takes the lock on its first Read, Edit or Hold. ResolveShaderAbi prepares the variants before reading the prepared state when its ABI was not committed yet. Registry publication holds the lock as before: PublishRegisteredShader holds it, and RegisterShader holds it before the driver mutex, so the lock order is unchanged. Commit takes no lock: a transaction with changes already holds it. |
||
|---|---|---|
| .. | ||
| nid | ||
| prx | ||
| tests | ||
| CMakeLists.txt | ||
| HitLog.hpp | ||
| SceShaders.hpp | ||
| SceTypes.hpp | ||