aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.Shader/Translation
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.Graphics.Shader/Translation')
-rw-r--r--Ryujinx.Graphics.Shader/Translation/AttributeConsts.cs1
-rw-r--r--Ryujinx.Graphics.Shader/Translation/AttributeInfo.cs1
-rw-r--r--Ryujinx.Graphics.Shader/Translation/FeatureFlags.cs11
-rw-r--r--Ryujinx.Graphics.Shader/Translation/Rewriter.cs70
-rw-r--r--Ryujinx.Graphics.Shader/Translation/Translator.cs1
5 files changed, 79 insertions, 5 deletions
diff --git a/Ryujinx.Graphics.Shader/Translation/AttributeConsts.cs b/Ryujinx.Graphics.Shader/Translation/AttributeConsts.cs
index 47367f89..863e19a0 100644
--- a/Ryujinx.Graphics.Shader/Translation/AttributeConsts.cs
+++ b/Ryujinx.Graphics.Shader/Translation/AttributeConsts.cs
@@ -100,5 +100,6 @@ namespace Ryujinx.Graphics.Shader.Translation
public const int BaseVertex = 0x2000054;
public const int InstanceIndex = 0x2000058;
public const int VertexIndex = 0x200005c;
+ public const int DrawIndex = 0x2000060;
}
} \ No newline at end of file
diff --git a/Ryujinx.Graphics.Shader/Translation/AttributeInfo.cs b/Ryujinx.Graphics.Shader/Translation/AttributeInfo.cs
index 6e95722f..839edbe9 100644
--- a/Ryujinx.Graphics.Shader/Translation/AttributeInfo.cs
+++ b/Ryujinx.Graphics.Shader/Translation/AttributeInfo.cs
@@ -31,6 +31,7 @@ namespace Ryujinx.Graphics.Shader.Translation
{ AttributeConsts.BaseVertex, new AttributeInfo(AttributeConsts.BaseVertex, 0, 1, AggregateType.S32) },
{ AttributeConsts.InstanceIndex, new AttributeInfo(AttributeConsts.InstanceIndex, 0, 1, AggregateType.S32) },
{ AttributeConsts.VertexIndex, new AttributeInfo(AttributeConsts.VertexIndex, 0, 1, AggregateType.S32) },
+ { AttributeConsts.DrawIndex, new AttributeInfo(AttributeConsts.DrawIndex, 0, 1, AggregateType.S32) },
{ AttributeConsts.FrontFacing, new AttributeInfo(AttributeConsts.FrontFacing, 0, 1, AggregateType.Bool) },
// Special.
diff --git a/Ryujinx.Graphics.Shader/Translation/FeatureFlags.cs b/Ryujinx.Graphics.Shader/Translation/FeatureFlags.cs
index a2363fcb..c035f212 100644
--- a/Ryujinx.Graphics.Shader/Translation/FeatureFlags.cs
+++ b/Ryujinx.Graphics.Shader/Translation/FeatureFlags.cs
@@ -17,10 +17,11 @@ namespace Ryujinx.Graphics.Shader.Translation
Bindless = 1 << 2,
InstanceId = 1 << 3,
- RtLayer = 1 << 4,
- CbIndexing = 1 << 5,
- IaIndexing = 1 << 6,
- OaIndexing = 1 << 7,
- FixedFuncAttr = 1 << 8
+ DrawParameters = 1 << 4,
+ RtLayer = 1 << 5,
+ CbIndexing = 1 << 6,
+ IaIndexing = 1 << 7,
+ OaIndexing = 1 << 8,
+ FixedFuncAttr = 1 << 9
}
}
diff --git a/Ryujinx.Graphics.Shader/Translation/Rewriter.cs b/Ryujinx.Graphics.Shader/Translation/Rewriter.cs
index 4d66597f..640717f9 100644
--- a/Ryujinx.Graphics.Shader/Translation/Rewriter.cs
+++ b/Ryujinx.Graphics.Shader/Translation/Rewriter.cs
@@ -12,6 +12,9 @@ namespace Ryujinx.Graphics.Shader.Translation
{
public static void RunPass(BasicBlock[] blocks, ShaderConfig config)
{
+ bool isVertexShader = config.Stage == ShaderStage.Vertex;
+ bool hasConstantBufferDrawParameters = config.GpuAccessor.QueryHasConstantBufferDrawParameters();
+
for (int blkIndex = 0; blkIndex < blocks.Length; blkIndex++)
{
BasicBlock block = blocks[blkIndex];
@@ -23,6 +26,21 @@ namespace Ryujinx.Graphics.Shader.Translation
continue;
}
+ if (isVertexShader)
+ {
+ if (hasConstantBufferDrawParameters)
+ {
+ if (ReplaceConstantBufferWithDrawParameters(operation))
+ {
+ config.SetUsedFeature(FeatureFlags.DrawParameters);
+ }
+ }
+ else if (HasConstantBufferDrawParameters(operation))
+ {
+ config.SetUsedFeature(FeatureFlags.DrawParameters);
+ }
+ }
+
if (UsesGlobalMemory(operation.Inst))
{
node = RewriteGlobalAccess(node, config);
@@ -528,5 +546,57 @@ namespace Ryujinx.Graphics.Shader.Translation
return node;
}
+
+ private static bool ReplaceConstantBufferWithDrawParameters(Operation operation)
+ {
+ bool modified = false;
+
+ for (int srcIndex = 0; srcIndex < operation.SourcesCount; srcIndex++)
+ {
+ Operand src = operation.GetSource(srcIndex);
+
+ if (src.Type == OperandType.ConstantBuffer && src.GetCbufSlot() == 0)
+ {
+ switch (src.GetCbufOffset())
+ {
+ case Constants.NvnBaseVertexByteOffset / 4:
+ operation.SetSource(srcIndex, Attribute(AttributeConsts.BaseVertex));
+ modified = true;
+ break;
+ case Constants.NvnBaseInstanceByteOffset / 4:
+ operation.SetSource(srcIndex, Attribute(AttributeConsts.BaseInstance));
+ modified = true;
+ break;
+ case Constants.NvnDrawIndexByteOffset / 4:
+ operation.SetSource(srcIndex, Attribute(AttributeConsts.DrawIndex));
+ modified = true;
+ break;
+ }
+ }
+ }
+
+ return modified;
+ }
+
+ private static bool HasConstantBufferDrawParameters(Operation operation)
+ {
+ for (int srcIndex = 0; srcIndex < operation.SourcesCount; srcIndex++)
+ {
+ Operand src = operation.GetSource(srcIndex);
+
+ if (src.Type == OperandType.ConstantBuffer && src.GetCbufSlot() == 0)
+ {
+ switch (src.GetCbufOffset())
+ {
+ case Constants.NvnBaseVertexByteOffset / 4:
+ case Constants.NvnBaseInstanceByteOffset / 4:
+ case Constants.NvnDrawIndexByteOffset / 4:
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
}
} \ No newline at end of file
diff --git a/Ryujinx.Graphics.Shader/Translation/Translator.cs b/Ryujinx.Graphics.Shader/Translation/Translator.cs
index 8741f848..58a934c7 100644
--- a/Ryujinx.Graphics.Shader/Translation/Translator.cs
+++ b/Ryujinx.Graphics.Shader/Translation/Translator.cs
@@ -86,6 +86,7 @@ namespace Ryujinx.Graphics.Shader.Translation
config.GetImageDescriptors(),
config.Stage,
config.UsedFeatures.HasFlag(FeatureFlags.InstanceId),
+ config.UsedFeatures.HasFlag(FeatureFlags.DrawParameters),
config.UsedFeatures.HasFlag(FeatureFlags.RtLayer),
config.ClipDistancesWritten,
config.OmapTargets);