aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.Shader/Translation
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2020-11-08 08:10:00 -0300
committerGitHub <noreply@github.com>2020-11-08 12:10:00 +0100
commit8d168574eb04ae1e7026ac2b058e3b184f068fae (patch)
tree6e0f79447276619af980055419874f5e99595b58 /Ryujinx.Graphics.Shader/Translation
parent5561a3b95e9c980e3354366570e7896a213b95ae (diff)
Use explicit buffer and texture bindings on shaders (#1666)
* Use explicit buffer and texture bindings on shaders * More XML docs and other nits
Diffstat (limited to 'Ryujinx.Graphics.Shader/Translation')
-rw-r--r--Ryujinx.Graphics.Shader/Translation/ShaderConfig.cs8
-rw-r--r--Ryujinx.Graphics.Shader/Translation/TranslationCounts.cs30
-rw-r--r--Ryujinx.Graphics.Shader/Translation/Translator.cs34
3 files changed, 62 insertions, 10 deletions
diff --git a/Ryujinx.Graphics.Shader/Translation/ShaderConfig.cs b/Ryujinx.Graphics.Shader/Translation/ShaderConfig.cs
index 7b1587ae..08e7df3b 100644
--- a/Ryujinx.Graphics.Shader/Translation/ShaderConfig.cs
+++ b/Ryujinx.Graphics.Shader/Translation/ShaderConfig.cs
@@ -20,11 +20,13 @@ namespace Ryujinx.Graphics.Shader.Translation
public TranslationFlags Flags { get; }
+ public TranslationCounts Counts { get; }
+
public int Size { get; private set; }
public FeatureFlags UsedFeatures { get; private set; }
- public ShaderConfig(IGpuAccessor gpuAccessor, TranslationFlags flags)
+ public ShaderConfig(IGpuAccessor gpuAccessor, TranslationFlags flags, TranslationCounts counts)
{
Stage = ShaderStage.Compute;
OutputTopology = OutputTopology.PointList;
@@ -38,9 +40,10 @@ namespace Ryujinx.Graphics.Shader.Translation
Flags = flags;
Size = 0;
UsedFeatures = FeatureFlags.None;
+ Counts = counts;
}
- public ShaderConfig(ShaderHeader header, IGpuAccessor gpuAccessor, TranslationFlags flags)
+ public ShaderConfig(ShaderHeader header, IGpuAccessor gpuAccessor, TranslationFlags flags, TranslationCounts counts)
{
Stage = header.Stage;
OutputTopology = header.OutputTopology;
@@ -54,6 +57,7 @@ namespace Ryujinx.Graphics.Shader.Translation
Flags = flags;
Size = 0;
UsedFeatures = FeatureFlags.None;
+ Counts = counts;
}
public int GetDepthRegister()
diff --git a/Ryujinx.Graphics.Shader/Translation/TranslationCounts.cs b/Ryujinx.Graphics.Shader/Translation/TranslationCounts.cs
new file mode 100644
index 00000000..18f4725d
--- /dev/null
+++ b/Ryujinx.Graphics.Shader/Translation/TranslationCounts.cs
@@ -0,0 +1,30 @@
+namespace Ryujinx.Graphics.Shader.Translation
+{
+ public class TranslationCounts
+ {
+ public int UniformBuffersCount { get; private set; }
+ public int StorageBuffersCount { get; private set; }
+ public int TexturesCount { get; private set; }
+ public int ImagesCount { get; private set; }
+
+ internal int IncrementUniformBuffersCount()
+ {
+ return UniformBuffersCount++;
+ }
+
+ internal int IncrementStorageBuffersCount()
+ {
+ return StorageBuffersCount++;
+ }
+
+ internal int IncrementTexturesCount()
+ {
+ return TexturesCount++;
+ }
+
+ internal int IncrementImagesCount()
+ {
+ return ImagesCount++;
+ }
+ }
+}
diff --git a/Ryujinx.Graphics.Shader/Translation/Translator.cs b/Ryujinx.Graphics.Shader/Translation/Translator.cs
index f8093c84..f86b6964 100644
--- a/Ryujinx.Graphics.Shader/Translation/Translator.cs
+++ b/Ryujinx.Graphics.Shader/Translation/Translator.cs
@@ -24,15 +24,28 @@ namespace Ryujinx.Graphics.Shader.Translation
}
}
- public static ShaderProgram Translate(ulong address, IGpuAccessor gpuAccessor, TranslationFlags flags)
+ public static ShaderProgram Translate(
+ ulong address,
+ IGpuAccessor gpuAccessor,
+ TranslationFlags flags,
+ TranslationCounts counts = null)
{
- return Translate(DecodeShader(address, gpuAccessor, flags, out ShaderConfig config), config);
+ counts ??= new TranslationCounts();
+
+ return Translate(DecodeShader(address, gpuAccessor, flags, counts, out ShaderConfig config), config);
}
- public static ShaderProgram Translate(ulong addressA, ulong addressB, IGpuAccessor gpuAccessor, TranslationFlags flags)
+ public static ShaderProgram Translate(
+ ulong addressA,
+ ulong addressB,
+ IGpuAccessor gpuAccessor,
+ TranslationFlags flags,
+ TranslationCounts counts = null)
{
- FunctionCode[] funcA = DecodeShader(addressA, gpuAccessor, flags | TranslationFlags.VertexA, out ShaderConfig configA);
- FunctionCode[] funcB = DecodeShader(addressB, gpuAccessor, flags, out ShaderConfig config);
+ counts ??= new TranslationCounts();
+
+ FunctionCode[] funcA = DecodeShader(addressA, gpuAccessor, flags | TranslationFlags.VertexA, counts, out ShaderConfig configA);
+ FunctionCode[] funcB = DecodeShader(addressB, gpuAccessor, flags, counts, out ShaderConfig config);
config.SetUsedFeature(configA.UsedFeatures);
@@ -105,19 +118,24 @@ namespace Ryujinx.Graphics.Shader.Translation
return new ShaderProgram(spInfo, config.Stage, glslCode, config.Size, sizeA);
}
- private static FunctionCode[] DecodeShader(ulong address, IGpuAccessor gpuAccessor, TranslationFlags flags, out ShaderConfig config)
+ private static FunctionCode[] DecodeShader(
+ ulong address,
+ IGpuAccessor gpuAccessor,
+ TranslationFlags flags,
+ TranslationCounts counts,
+ out ShaderConfig config)
{
Block[][] cfg;
if ((flags & TranslationFlags.Compute) != 0)
{
- config = new ShaderConfig(gpuAccessor, flags);
+ config = new ShaderConfig(gpuAccessor, flags, counts);
cfg = Decoder.Decode(gpuAccessor, address);
}
else
{
- config = new ShaderConfig(new ShaderHeader(gpuAccessor, address), gpuAccessor, flags);
+ config = new ShaderConfig(new ShaderHeader(gpuAccessor, address), gpuAccessor, flags, counts);
cfg = Decoder.Decode(gpuAccessor, address + HeaderSize);
}