diff options
| author | gdkchan <gab.dark.100@gmail.com> | 2020-07-03 20:48:44 -0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-07-04 01:48:44 +0200 |
| commit | e13154c83d52d9e1c26c55bc5655a5df641e26a9 (patch) | |
| tree | 302fcc3171027124bec9cc154ef482fd491cf7e9 /Ryujinx.Graphics.Shader/Translation/Optimizations | |
| parent | 76e5af967a39879187214f0973d226eba126e93f (diff) | |
Implement shader LEA instruction and improve bindless image load/store (#1355)
Diffstat (limited to 'Ryujinx.Graphics.Shader/Translation/Optimizations')
| -rw-r--r-- | Ryujinx.Graphics.Shader/Translation/Optimizations/BindlessElimination.cs | 45 | ||||
| -rw-r--r-- | Ryujinx.Graphics.Shader/Translation/Optimizations/Optimizer.cs | 2 |
2 files changed, 31 insertions, 16 deletions
diff --git a/Ryujinx.Graphics.Shader/Translation/Optimizations/BindlessElimination.cs b/Ryujinx.Graphics.Shader/Translation/Optimizations/BindlessElimination.cs index 9515c349..a26c81c9 100644 --- a/Ryujinx.Graphics.Shader/Translation/Optimizations/BindlessElimination.cs +++ b/Ryujinx.Graphics.Shader/Translation/Optimizations/BindlessElimination.cs @@ -5,7 +5,9 @@ namespace Ryujinx.Graphics.Shader.Translation.Optimizations { class BindlessElimination { - public static void RunPass(BasicBlock block) + private const int NvnTextureBufferSlot = 2; + + public static void RunPass(BasicBlock block, ShaderConfig config) { // We can turn a bindless into regular access by recognizing the pattern // produced by the compiler for separate texture and sampler. @@ -24,26 +26,39 @@ namespace Ryujinx.Graphics.Shader.Translation.Optimizations continue; } - if (!(texOp.GetSource(0).AsgOp is Operation handleCombineOp)) + if (texOp.Inst == Instruction.TextureSample) { - continue; - } + if (!(texOp.GetSource(0).AsgOp is Operation handleCombineOp)) + { + continue; + } - if (handleCombineOp.Inst != Instruction.BitwiseOr) - { - continue; - } + if (handleCombineOp.Inst != Instruction.BitwiseOr) + { + continue; + } - Operand src0 = handleCombineOp.GetSource(0); - Operand src1 = handleCombineOp.GetSource(1); + Operand src0 = handleCombineOp.GetSource(0); + Operand src1 = handleCombineOp.GetSource(1); - if (src0.Type != OperandType.ConstantBuffer || src0.GetCbufSlot() != 2 || - src1.Type != OperandType.ConstantBuffer || src1.GetCbufSlot() != 2) - { - continue; + if (src0.Type != OperandType.ConstantBuffer || src0.GetCbufSlot() != NvnTextureBufferSlot || + src1.Type != OperandType.ConstantBuffer || src1.GetCbufSlot() != NvnTextureBufferSlot) + { + continue; + } + + texOp.SetHandle(src0.GetCbufOffset() | (src1.GetCbufOffset() << 16)); } + else if (texOp.Inst == Instruction.ImageLoad || texOp.Inst == Instruction.ImageStore) + { + Operand src0 = texOp.GetSource(0); - texOp.SetHandle(src0.GetCbufOffset() | (src1.GetCbufOffset() << 16)); + if (src0.Type == OperandType.ConstantBuffer && src0.GetCbufSlot() == NvnTextureBufferSlot) + { + texOp.SetHandle(src0.GetCbufOffset()); + texOp.Format = config.GetTextureFormat(texOp.Handle); + } + } } } } diff --git a/Ryujinx.Graphics.Shader/Translation/Optimizations/Optimizer.cs b/Ryujinx.Graphics.Shader/Translation/Optimizations/Optimizer.cs index 10a0e780..286574cf 100644 --- a/Ryujinx.Graphics.Shader/Translation/Optimizations/Optimizer.cs +++ b/Ryujinx.Graphics.Shader/Translation/Optimizations/Optimizer.cs @@ -89,7 +89,7 @@ namespace Ryujinx.Graphics.Shader.Translation.Optimizations for (int blkIndex = 0; blkIndex < blocks.Length; blkIndex++) { BindlessToIndexed.RunPass(blocks[blkIndex]); - BindlessElimination.RunPass(blocks[blkIndex]); + BindlessElimination.RunPass(blocks[blkIndex], config); // Try to eliminate any operations that are now unused. LinkedListNode<INode> node = blocks[blkIndex].Operations.First; |
