aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Graphics.Shader/Translation/Translator.cs
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2023-08-29 21:10:34 -0300
committerGitHub <noreply@github.com>2023-08-29 21:10:34 -0300
commitf09bba82b9366e5912b639a610ae89cbb1cf352c (patch)
tree4811ffa52206eed7cf8aa200c64deb7410e5c56b /src/Ryujinx.Graphics.Shader/Translation/Translator.cs
parent93d78f9ac4a37a50f0cc2e57addd330d072af742 (diff)
Geometry shader emulation for macOS (#5551)1.1.1002
* Implement vertex and geometry shader conversion to compute * Call InitializeReservedCounts for compute too * PR feedback * Set clip distance mask for geometry and tessellation shaders too * Transform feedback emulation only for vertex
Diffstat (limited to 'src/Ryujinx.Graphics.Shader/Translation/Translator.cs')
-rw-r--r--src/Ryujinx.Graphics.Shader/Translation/Translator.cs41
1 files changed, 24 insertions, 17 deletions
diff --git a/src/Ryujinx.Graphics.Shader/Translation/Translator.cs b/src/Ryujinx.Graphics.Shader/Translation/Translator.cs
index 93a70ace..6a31ea2e 100644
--- a/src/Ryujinx.Graphics.Shader/Translation/Translator.cs
+++ b/src/Ryujinx.Graphics.Shader/Translation/Translator.cs
@@ -78,11 +78,31 @@ namespace Ryujinx.Graphics.Shader.Translation
private static ShaderDefinitions CreateGraphicsDefinitions(IGpuAccessor gpuAccessor, ShaderHeader header)
{
+ TransformFeedbackOutput[] transformFeedbackOutputs = GetTransformFeedbackOutputs(gpuAccessor, out ulong transformFeedbackVecMap);
+
+ return new ShaderDefinitions(
+ header.Stage,
+ gpuAccessor.QueryGraphicsState(),
+ header.Stage == ShaderStage.Geometry && header.GpPassthrough,
+ header.ThreadsPerInputPrimitive,
+ header.OutputTopology,
+ header.MaxOutputVertexCount,
+ header.ImapTypes,
+ header.OmapTargets,
+ header.OmapSampleMask,
+ header.OmapDepth,
+ gpuAccessor.QueryHostSupportsScaledVertexFormats(),
+ transformFeedbackVecMap,
+ transformFeedbackOutputs);
+ }
+
+ internal static TransformFeedbackOutput[] GetTransformFeedbackOutputs(IGpuAccessor gpuAccessor, out ulong transformFeedbackVecMap)
+ {
bool transformFeedbackEnabled =
gpuAccessor.QueryTransformFeedbackEnabled() &&
gpuAccessor.QueryHostSupportsTransformFeedback();
TransformFeedbackOutput[] transformFeedbackOutputs = null;
- ulong transformFeedbackVecMap = 0UL;
+ transformFeedbackVecMap = 0UL;
if (transformFeedbackEnabled)
{
@@ -105,21 +125,7 @@ namespace Ryujinx.Graphics.Shader.Translation
}
}
- return new ShaderDefinitions(
- header.Stage,
- gpuAccessor.QueryGraphicsState(),
- header.Stage == ShaderStage.Geometry && header.GpPassthrough,
- header.ThreadsPerInputPrimitive,
- header.OutputTopology,
- header.MaxOutputVertexCount,
- header.ImapTypes,
- header.OmapTargets,
- header.OmapSampleMask,
- header.OmapDepth,
- gpuAccessor.QueryHostSupportsScaledVertexFormats(),
- transformFeedbackEnabled,
- transformFeedbackVecMap,
- transformFeedbackOutputs);
+ return transformFeedbackOutputs;
}
private static int GetLocalMemorySize(ShaderHeader header)
@@ -131,6 +137,7 @@ namespace Ryujinx.Graphics.Shader.Translation
TranslatorContext translatorContext,
ResourceManager resourceManager,
DecodedProgram program,
+ bool vertexAsCompute,
bool initializeOutputs,
out int initializationOperations)
{
@@ -147,7 +154,7 @@ namespace Ryujinx.Graphics.Shader.Translation
for (int index = 0; index < functions.Length; index++)
{
- EmitterContext context = new(translatorContext, resourceManager, program, index != 0);
+ EmitterContext context = new(translatorContext, resourceManager, program, vertexAsCompute, index != 0);
if (initializeOutputs && index == 0)
{