|
|
@@ -125,19 +125,28 @@ namespace Ryujinx.Graphics.Gpu.Shader
|
|
|
|
|
|
ShaderCodeHolder[] shaders = new ShaderCodeHolder[Constants.ShaderStages];
|
|
|
|
|
|
+ var tfd = GetTransformFeedbackDescriptors(state);
|
|
|
+
|
|
|
+ TranslationFlags flags = DefaultFlags;
|
|
|
+
|
|
|
+ if (tfd != null)
|
|
|
+ {
|
|
|
+ flags |= TranslationFlags.Feedback;
|
|
|
+ }
|
|
|
+
|
|
|
if (addresses.VertexA != 0)
|
|
|
{
|
|
|
- shaders[0] = TranslateGraphicsShader(state, ShaderStage.Vertex, addresses.Vertex, addresses.VertexA);
|
|
|
+ shaders[0] = TranslateGraphicsShader(state, flags, ShaderStage.Vertex, addresses.Vertex, addresses.VertexA);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- shaders[0] = TranslateGraphicsShader(state, ShaderStage.Vertex, addresses.Vertex);
|
|
|
+ shaders[0] = TranslateGraphicsShader(state, flags, ShaderStage.Vertex, addresses.Vertex);
|
|
|
}
|
|
|
|
|
|
- shaders[1] = TranslateGraphicsShader(state, ShaderStage.TessellationControl, addresses.TessControl);
|
|
|
- shaders[2] = TranslateGraphicsShader(state, ShaderStage.TessellationEvaluation, addresses.TessEvaluation);
|
|
|
- shaders[3] = TranslateGraphicsShader(state, ShaderStage.Geometry, addresses.Geometry);
|
|
|
- shaders[4] = TranslateGraphicsShader(state, ShaderStage.Fragment, addresses.Fragment);
|
|
|
+ shaders[1] = TranslateGraphicsShader(state, flags, ShaderStage.TessellationControl, addresses.TessControl);
|
|
|
+ shaders[2] = TranslateGraphicsShader(state, flags, ShaderStage.TessellationEvaluation, addresses.TessEvaluation);
|
|
|
+ shaders[3] = TranslateGraphicsShader(state, flags, ShaderStage.Geometry, addresses.Geometry);
|
|
|
+ shaders[4] = TranslateGraphicsShader(state, flags, ShaderStage.Fragment, addresses.Fragment);
|
|
|
|
|
|
List<IShader> hostShaders = new List<IShader>();
|
|
|
|
|
|
@@ -150,8 +159,6 @@ namespace Ryujinx.Graphics.Gpu.Shader
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- var tfd = GetTransformFeedbackDescriptors(state);
|
|
|
-
|
|
|
IShader hostShader = _context.Renderer.CompileShader(program);
|
|
|
|
|
|
shaders[stage].HostShader = hostShader;
|
|
|
@@ -159,7 +166,7 @@ namespace Ryujinx.Graphics.Gpu.Shader
|
|
|
hostShaders.Add(hostShader);
|
|
|
}
|
|
|
|
|
|
- IProgram hostProgram = _context.Renderer.CreateProgram(hostShaders.ToArray(), GetTransformFeedbackDescriptors(state));
|
|
|
+ IProgram hostProgram = _context.Renderer.CreateProgram(hostShaders.ToArray(), tfd);
|
|
|
|
|
|
ShaderBundle gpShaders = new ShaderBundle(hostProgram, shaders);
|
|
|
|
|
|
@@ -327,11 +334,12 @@ namespace Ryujinx.Graphics.Gpu.Shader
|
|
|
/// This will combine the "Vertex A" and "Vertex B" shader stages, if specified, into one shader.
|
|
|
/// </remarks>
|
|
|
/// <param name="state">Current GPU state</param>
|
|
|
+ /// <param name="flags">Flags that controls shader translation</param>
|
|
|
/// <param name="stage">Shader stage</param>
|
|
|
/// <param name="gpuVa">GPU virtual address of the shader code</param>
|
|
|
/// <param name="gpuVaA">Optional GPU virtual address of the "Vertex A" shader code</param>
|
|
|
/// <returns>Compiled graphics shader code</returns>
|
|
|
- private ShaderCodeHolder TranslateGraphicsShader(GpuState state, ShaderStage stage, ulong gpuVa, ulong gpuVaA = 0)
|
|
|
+ private ShaderCodeHolder TranslateGraphicsShader(GpuState state, TranslationFlags flags, ShaderStage stage, ulong gpuVa, ulong gpuVaA = 0)
|
|
|
{
|
|
|
if (gpuVa == 0)
|
|
|
{
|
|
|
@@ -342,7 +350,7 @@ namespace Ryujinx.Graphics.Gpu.Shader
|
|
|
|
|
|
if (gpuVaA != 0)
|
|
|
{
|
|
|
- ShaderProgram program = Translator.Translate(gpuVaA, gpuVa, gpuAccessor, DefaultFlags);
|
|
|
+ ShaderProgram program = Translator.Translate(gpuVaA, gpuVa, gpuAccessor, flags);
|
|
|
|
|
|
byte[] codeA = _context.MemoryManager.GetSpan(gpuVaA, program.SizeA).ToArray();
|
|
|
byte[] codeB = _context.MemoryManager.GetSpan(gpuVa, program.Size).ToArray();
|
|
|
@@ -362,7 +370,7 @@ namespace Ryujinx.Graphics.Gpu.Shader
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- ShaderProgram program = Translator.Translate(gpuVa, gpuAccessor, DefaultFlags);
|
|
|
+ ShaderProgram program = Translator.Translate(gpuVa, gpuAccessor, flags);
|
|
|
|
|
|
byte[] code = _context.MemoryManager.GetSpan(gpuVa, program.Size).ToArray();
|
|
|
|