diff options
| author | gdkchan <gab.dark.100@gmail.com> | 2023-11-22 20:51:51 -0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-11-23 00:51:51 +0100 |
| commit | 21cd4c0c00e4a06e399c93419c8f9eff0e663bfb (patch) | |
| tree | 77ae9bb6df2d406ff2ec5fb886c8b12d7655809f /src/Ryujinx.Graphics.Shader | |
| parent | 70d65d3d8e77e66226ebab7f23d9b6e8c271319f (diff) | |
Extend bindless elimination to see through shuffle (#5958)
* Extend bindless elimination to see through shuffle
* Shader cache version bump
Diffstat (limited to 'src/Ryujinx.Graphics.Shader')
| -rw-r--r-- | src/Ryujinx.Graphics.Shader/Translation/Optimizations/BindlessElimination.cs | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/src/Ryujinx.Graphics.Shader/Translation/Optimizations/BindlessElimination.cs b/src/Ryujinx.Graphics.Shader/Translation/Optimizations/BindlessElimination.cs index c955f5b5..6706053e 100644 --- a/src/Ryujinx.Graphics.Shader/Translation/Optimizations/BindlessElimination.cs +++ b/src/Ryujinx.Graphics.Shader/Translation/Optimizations/BindlessElimination.cs @@ -29,7 +29,16 @@ namespace Ryujinx.Graphics.Shader.Translation.Optimizations if (texOp.Inst == Instruction.TextureSample || texOp.Inst.IsTextureQuery()) { - Operand bindlessHandle = Utils.FindLastOperation(texOp.GetSource(0), block); + Operand bindlessHandle = texOp.GetSource(0); + + // In some cases the compiler uses a shuffle operation to get the handle, + // for some textureGrad implementations. In those cases, we can skip the shuffle. + if (bindlessHandle.AsgOp is Operation shuffleOp && shuffleOp.Inst == Instruction.Shuffle) + { + bindlessHandle = shuffleOp.GetSource(0); + } + + bindlessHandle = Utils.FindLastOperation(bindlessHandle, block); // Some instructions do not encode an accurate sampler type: // - Most instructions uses the same type for 1D and Buffer. |
