diff options
| author | gdkchan <gab.dark.100@gmail.com> | 2022-11-12 20:20:40 -0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-11-12 20:20:40 -0300 |
| commit | 9daf029f356898336de1ad0c63b6c36e261e4f9b (patch) | |
| tree | d8e6c2edffa5babbb1486801b081cd367cec5c4b /Ryujinx.Graphics.Shader/StructuredIr | |
| parent | 51a27032f01826e0cec56c53da4359fd2c38c8f3 (diff) | |
Use vector transform feedback outputs if possible (#3832)
Diffstat (limited to 'Ryujinx.Graphics.Shader/StructuredIr')
| -rw-r--r-- | Ryujinx.Graphics.Shader/StructuredIr/StructuredProgram.cs | 6 | ||||
| -rw-r--r-- | Ryujinx.Graphics.Shader/StructuredIr/StructuredProgramInfo.cs | 35 |
2 files changed, 38 insertions, 3 deletions
diff --git a/Ryujinx.Graphics.Shader/StructuredIr/StructuredProgram.cs b/Ryujinx.Graphics.Shader/StructuredIr/StructuredProgram.cs index 85049abb..7678a4bf 100644 --- a/Ryujinx.Graphics.Shader/StructuredIr/StructuredProgram.cs +++ b/Ryujinx.Graphics.Shader/StructuredIr/StructuredProgram.cs @@ -71,12 +71,12 @@ namespace Ryujinx.Graphics.Shader.StructuredIr var locations = config.GpuAccessor.QueryTransformFeedbackVaryingLocations(tfbIndex); var stride = config.GpuAccessor.QueryTransformFeedbackStride(tfbIndex); - for (int j = 0; j < locations.Length; j++) + for (int i = 0; i < locations.Length; i++) { - byte location = locations[j]; + byte location = locations[i]; if (location < 0xc0) { - context.Info.TransformFeedbackOutputs[location] = new TransformFeedbackOutput(tfbIndex, j * 4, stride); + context.Info.TransformFeedbackOutputs[location] = new TransformFeedbackOutput(tfbIndex, i * 4, stride); } } } diff --git a/Ryujinx.Graphics.Shader/StructuredIr/StructuredProgramInfo.cs b/Ryujinx.Graphics.Shader/StructuredIr/StructuredProgramInfo.cs index 43bdfaba..57253148 100644 --- a/Ryujinx.Graphics.Shader/StructuredIr/StructuredProgramInfo.cs +++ b/Ryujinx.Graphics.Shader/StructuredIr/StructuredProgramInfo.cs @@ -42,5 +42,40 @@ namespace Ryujinx.Graphics.Shader.StructuredIr TransformFeedbackOutputs = new TransformFeedbackOutput[0xc0]; } + + public TransformFeedbackOutput GetTransformFeedbackOutput(int attr) + { + int index = attr / 4; + return TransformFeedbackOutputs[index]; + } + + public int GetTransformFeedbackOutputComponents(int attr) + { + int index = attr / 4; + int baseIndex = index & ~3; + + int count = 1; + + for (; count < 4; count++) + { + ref var prev = ref TransformFeedbackOutputs[baseIndex + count - 1]; + ref var curr = ref TransformFeedbackOutputs[baseIndex + count]; + + int prevOffset = prev.Offset; + int currOffset = curr.Offset; + + if (!prev.Valid || !curr.Valid || prevOffset + 4 != currOffset) + { + break; + } + } + + if (baseIndex + count <= index) + { + return 1; + } + + return count; + } } }
\ No newline at end of file |
