From a5d5ca06357e2fe1ee2cf880460109ce9da5fe4e Mon Sep 17 00:00:00 2001 From: mageven <62494521+mageven@users.noreply.github.com> Date: Sat, 27 Mar 2021 05:20:26 +0530 Subject: Shader Cache: Move bindless checking from translation to decode (#2145) --- Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs | 33 ++++++++++++++++-------------- 1 file changed, 18 insertions(+), 15 deletions(-) (limited to 'Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs') diff --git a/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs b/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs index d99a402b..d4ced7c8 100644 --- a/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs +++ b/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs @@ -426,6 +426,12 @@ namespace Ryujinx.Graphics.Gpu.Shader Hash128 programCodeHash = default; GuestShaderCacheEntry[] shaderCacheEntries = null; + // Current shader cache doesn't support bindless textures + if (shaderContexts[0].UsedFeatures.HasFlag(FeatureFlags.Bindless)) + { + isShaderCacheEnabled = false; + } + if (isShaderCacheEnabled) { isShaderCacheReadOnly = _cacheManager.IsReadOnly; @@ -448,8 +454,6 @@ 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); @@ -458,7 +462,7 @@ namespace Ryujinx.Graphics.Gpu.Shader cpShader = new ShaderBundle(hostProgram, shader); - if (isShaderCacheEnabled && !isDiskShaderCacheIncompatible) + if (isShaderCacheEnabled) { _cpProgramsDiskCache.Add(programCodeHash, cpShader); @@ -536,6 +540,16 @@ namespace Ryujinx.Graphics.Gpu.Shader Hash128 programCodeHash = default; GuestShaderCacheEntry[] shaderCacheEntries = null; + // Current shader cache doesn't support bindless textures + for (int i = 0; i < shaderContexts.Length; i++) + { + if (shaderContexts[i] != null && shaderContexts[i].UsedFeatures.HasFlag(FeatureFlags.Bindless)) + { + isShaderCacheEnabled = false; + break; + } + } + if (isShaderCacheEnabled) { isShaderCacheReadOnly = _cacheManager.IsReadOnly; @@ -564,17 +578,6 @@ 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 hostShaders = new List(); for (int stage = 0; stage < Constants.ShaderStages; stage++) @@ -599,7 +602,7 @@ namespace Ryujinx.Graphics.Gpu.Shader gpShaders = new ShaderBundle(hostProgram, shaders); - if (isShaderCacheEnabled && !isDiskShaderCacheIncompatible) + if (isShaderCacheEnabled) { _gpProgramsDiskCache.Add(programCodeHash, gpShaders); -- cgit v1.2.3