diff options
author | Mary <me@thog.eu> | 2021-03-19 20:07:37 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-03-19 20:07:37 +0100 |
commit | aef25980a7e934a08577ccd09d2fd333488ee132 (patch) | |
tree | 50e1942f86573b4ea8077d70e9aa3c3fb461469f /Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs | |
parent | 9b7335a63bd921d38866090e8c53f35b8e050939 (diff) |
Salieri: Detect and avoid caching shaders using bindless textures (#2097)
* Salieri: Add blacklist system and blacklist shaders using bindless
Currently the shader cache doesn't have the right format to support
bindless textures correctly and may cache shaders that it cannot rebuild
after host invalidation.
This PR address the issue by blacklisting shaders using bindless
textures.
THis also support detection of already cached broken shader and handle removal
of those.
* Move to a feature flags design to avoid intrusive changes in the translator
This remove the auto correct behaviour
* Reduce diff on TranslationFlags
* Reduce comma on last entry of TranslationFlags
* Fix inverted logic and remove leftovers
* remove debug edits oops
Diffstat (limited to 'Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs')
-rw-r--r-- | Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs b/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs index 768a58e7..a085936a 100644 --- a/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs +++ b/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs @@ -195,7 +195,7 @@ namespace Ryujinx.Graphics.Gpu.Shader if (tfd != null) { - flags = TranslationFlags.Feedback; + flags |= TranslationFlags.Feedback; } TranslationCounts counts = new TranslationCounts(); @@ -426,6 +426,8 @@ namespace Ryujinx.Graphics.Gpu.Shader // The shader isn't currently cached, translate it and compile it. ShaderCodeHolder shader = TranslateShader(shaderContexts[0]); + bool isDiskShaderCacheIncompatible = shaderContexts[0].UsedFeatures.HasFlag(FeatureFlags.Bindless); + shader.HostShader = _context.Renderer.CompileShader(ShaderStage.Compute, shader.Program.Code); IProgram hostProgram = _context.Renderer.CreateProgram(new IShader[] { shader.HostShader }, null); @@ -434,7 +436,7 @@ namespace Ryujinx.Graphics.Gpu.Shader cpShader = new ShaderBundle(hostProgram, shader); - if (isShaderCacheEnabled) + if (isShaderCacheEnabled && !isDiskShaderCacheIncompatible) { _cpProgramsDiskCache.Add(programCodeHash, cpShader); @@ -540,6 +542,17 @@ namespace Ryujinx.Graphics.Gpu.Shader shaders[3] = TranslateShader(shaderContexts[4]); shaders[4] = TranslateShader(shaderContexts[5]); + bool isDiskShaderCacheIncompatible = false; + + for (int i = 0; i < shaderContexts.Length; i++) + { + if (shaderContexts[i] != null && shaderContexts[i].UsedFeatures.HasFlag(FeatureFlags.Bindless)) + { + isDiskShaderCacheIncompatible = true; + break; + } + } + List<IShader> hostShaders = new List<IShader>(); for (int stage = 0; stage < Constants.ShaderStages; stage++) @@ -564,7 +577,7 @@ namespace Ryujinx.Graphics.Gpu.Shader gpShaders = new ShaderBundle(hostProgram, shaders); - if (isShaderCacheEnabled) + if (isShaderCacheEnabled && !isDiskShaderCacheIncompatible) { _gpProgramsDiskCache.Add(programCodeHash, gpShaders); |