|
|
@@ -40,7 +40,7 @@ namespace Ryujinx.Graphics.Gpu.Shader
|
|
|
/// <summary>
|
|
|
/// Version of the codegen (to be changed when codegen or guest format change).
|
|
|
/// </summary>
|
|
|
- private const ulong ShaderCodeGenVersion = 2972;
|
|
|
+ private const ulong ShaderCodeGenVersion = 3012;
|
|
|
|
|
|
// Progress reporting helpers
|
|
|
private volatile int _shaderCount;
|
|
|
@@ -227,7 +227,8 @@ namespace Ryujinx.Graphics.Gpu.Shader
|
|
|
binaryCode,
|
|
|
binaryCode.Slice(binaryCode.Length - entry.Header.Cb1DataSize),
|
|
|
entry.Header.GpuAccessorHeader,
|
|
|
- entry.TextureDescriptors);
|
|
|
+ entry.TextureDescriptors,
|
|
|
+ null);
|
|
|
|
|
|
var options = new TranslationOptions(TargetLanguage.Glsl, TargetApi.OpenGL, DefaultFlags | TranslationFlags.Compute);
|
|
|
program = Translator.CreateContext(0, gpuAccessor, options).Translate(out shaderProgramInfo);
|
|
|
@@ -251,7 +252,7 @@ namespace Ryujinx.Graphics.Gpu.Shader
|
|
|
|
|
|
// Compile shader and create program as the shader program binary got invalidated.
|
|
|
shader.HostShader = _context.Renderer.CompileShader(ShaderStage.Compute, program.Code);
|
|
|
- hostProgram = _context.Renderer.CreateProgram(new IShader[] { shader.HostShader }, null);
|
|
|
+ hostProgram = _context.Renderer.CreateProgram(new IShader[] { shader.HostShader });
|
|
|
|
|
|
task.OnCompiled(hostProgram, (bool isNewProgramValid, ShaderCompileTask task) =>
|
|
|
{
|
|
|
@@ -293,13 +294,6 @@ namespace Ryujinx.Graphics.Gpu.Shader
|
|
|
|
|
|
TransformFeedbackDescriptor[] tfd = CacheHelper.ReadTransformFeedbackInformation(ref guestProgramReadOnlySpan, fileHeader);
|
|
|
|
|
|
- TranslationFlags flags = DefaultFlags;
|
|
|
-
|
|
|
- if (tfd != null)
|
|
|
- {
|
|
|
- flags |= TranslationFlags.Feedback;
|
|
|
- }
|
|
|
-
|
|
|
TranslationCounts counts = new TranslationCounts();
|
|
|
|
|
|
HostShaderCacheEntry[] hostShaderEntries = null;
|
|
|
@@ -343,15 +337,16 @@ namespace Ryujinx.Graphics.Gpu.Shader
|
|
|
binaryCode,
|
|
|
binaryCode.Slice(binaryCode.Length - entry.Header.Cb1DataSize),
|
|
|
entry.Header.GpuAccessorHeader,
|
|
|
- entry.TextureDescriptors);
|
|
|
+ entry.TextureDescriptors,
|
|
|
+ tfd);
|
|
|
|
|
|
- var options = new TranslationOptions(TargetLanguage.Glsl, TargetApi.OpenGL, flags);
|
|
|
+ var options = new TranslationOptions(TargetLanguage.Glsl, TargetApi.OpenGL, DefaultFlags);
|
|
|
|
|
|
shaderContexts[i + 1] = Translator.CreateContext(0, gpuAccessor, options, counts);
|
|
|
|
|
|
if (entry.Header.SizeA != 0)
|
|
|
{
|
|
|
- var options2 = new TranslationOptions(TargetLanguage.Glsl, TargetApi.OpenGL, flags | TranslationFlags.VertexA);
|
|
|
+ var options2 = new TranslationOptions(TargetLanguage.Glsl, TargetApi.OpenGL, DefaultFlags | TranslationFlags.VertexA);
|
|
|
|
|
|
shaderContexts[0] = Translator.CreateContext((ulong)entry.Header.Size, gpuAccessor, options2, counts);
|
|
|
}
|
|
|
@@ -431,7 +426,7 @@ namespace Ryujinx.Graphics.Gpu.Shader
|
|
|
hostShaders.Add(hostShader);
|
|
|
}
|
|
|
|
|
|
- hostProgram = _context.Renderer.CreateProgram(hostShaders.ToArray(), tfd);
|
|
|
+ hostProgram = _context.Renderer.CreateProgram(hostShaders.ToArray());
|
|
|
|
|
|
task.OnCompiled(hostProgram, (bool isNewProgramValid, ShaderCompileTask task) =>
|
|
|
{
|
|
|
@@ -622,7 +617,7 @@ namespace Ryujinx.Graphics.Gpu.Shader
|
|
|
|
|
|
shader.HostShader = _context.Renderer.CompileShader(ShaderStage.Compute, shader.Program.Code);
|
|
|
|
|
|
- IProgram hostProgram = _context.Renderer.CreateProgram(new IShader[] { shader.HostShader }, null);
|
|
|
+ IProgram hostProgram = _context.Renderer.CreateProgram(new IShader[] { shader.HostShader });
|
|
|
|
|
|
cpShader = new ShaderBundle(hostProgram, shader);
|
|
|
|
|
|
@@ -684,25 +679,20 @@ namespace Ryujinx.Graphics.Gpu.Shader
|
|
|
|
|
|
TransformFeedbackDescriptor[] tfd = GetTransformFeedbackDescriptors(ref state);
|
|
|
|
|
|
- TranslationFlags flags = DefaultFlags;
|
|
|
-
|
|
|
- if (tfd != null)
|
|
|
- {
|
|
|
- flags |= TranslationFlags.Feedback;
|
|
|
- }
|
|
|
+ gas.TransformFeedbackDescriptors = tfd;
|
|
|
|
|
|
TranslationCounts counts = new TranslationCounts();
|
|
|
|
|
|
if (addresses.VertexA != 0)
|
|
|
{
|
|
|
- shaderContexts[0] = DecodeGraphicsShader(channel, gas, counts, flags | TranslationFlags.VertexA, ShaderStage.Vertex, addresses.VertexA);
|
|
|
+ shaderContexts[0] = DecodeGraphicsShader(channel, gas, counts, DefaultFlags | TranslationFlags.VertexA, ShaderStage.Vertex, addresses.VertexA);
|
|
|
}
|
|
|
|
|
|
- shaderContexts[1] = DecodeGraphicsShader(channel, gas, counts, flags, ShaderStage.Vertex, addresses.Vertex);
|
|
|
- shaderContexts[2] = DecodeGraphicsShader(channel, gas, counts, flags, ShaderStage.TessellationControl, addresses.TessControl);
|
|
|
- shaderContexts[3] = DecodeGraphicsShader(channel, gas, counts, flags, ShaderStage.TessellationEvaluation, addresses.TessEvaluation);
|
|
|
- shaderContexts[4] = DecodeGraphicsShader(channel, gas, counts, flags, ShaderStage.Geometry, addresses.Geometry);
|
|
|
- shaderContexts[5] = DecodeGraphicsShader(channel, gas, counts, flags, ShaderStage.Fragment, addresses.Fragment);
|
|
|
+ shaderContexts[1] = DecodeGraphicsShader(channel, gas, counts, DefaultFlags, ShaderStage.Vertex, addresses.Vertex);
|
|
|
+ shaderContexts[2] = DecodeGraphicsShader(channel, gas, counts, DefaultFlags, ShaderStage.TessellationControl, addresses.TessControl);
|
|
|
+ shaderContexts[3] = DecodeGraphicsShader(channel, gas, counts, DefaultFlags, ShaderStage.TessellationEvaluation, addresses.TessEvaluation);
|
|
|
+ shaderContexts[4] = DecodeGraphicsShader(channel, gas, counts, DefaultFlags, ShaderStage.Geometry, addresses.Geometry);
|
|
|
+ shaderContexts[5] = DecodeGraphicsShader(channel, gas, counts, DefaultFlags, ShaderStage.Fragment, addresses.Fragment);
|
|
|
|
|
|
bool isShaderCacheEnabled = _cacheManager != null;
|
|
|
bool isShaderCacheReadOnly = false;
|
|
|
@@ -765,7 +755,7 @@ namespace Ryujinx.Graphics.Gpu.Shader
|
|
|
hostShaders.Add(hostShader);
|
|
|
}
|
|
|
|
|
|
- IProgram hostProgram = _context.Renderer.CreateProgram(hostShaders.ToArray(), tfd);
|
|
|
+ IProgram hostProgram = _context.Renderer.CreateProgram(hostShaders.ToArray());
|
|
|
|
|
|
gpShaders = new ShaderBundle(hostProgram, shaders);
|
|
|
|