The task isn't required for loading compute binary.

This commit is contained in:
riperiperi 2021-04-04 14:01:33 +01:00
parent a0aa09912c
commit 35eac315ab

View file

@ -114,7 +114,7 @@ namespace Ryujinx.Graphics.Gpu.Shader
// This thread dispatches tasks to do shader translation, and creates programs that OpenGL will link in the background. // This thread dispatches tasks to do shader translation, and creates programs that OpenGL will link in the background.
// The program link status is checked in a non-blocking manner so that multiple shaders can be compiled at once. // The program link status is checked in a non-blocking manner so that multiple shaders can be compiled at once.
while (programIndex < guestProgramList.Length || activeTasks.Count > 0) while (programIndex < guestProgramList.Length || activeTasks.Count > 0)
{ {
if (activeTasks.Count < maxTaskCount && programIndex < guestProgramList.Length) if (activeTasks.Count < maxTaskCount && programIndex < guestProgramList.Length)
@ -168,29 +168,34 @@ namespace Ryujinx.Graphics.Gpu.Shader
ShaderProgram program = null; ShaderProgram program = null;
ShaderProgramInfo shaderProgramInfo = null; ShaderProgramInfo shaderProgramInfo = null;
Task compileTask = Task.Run(() => if (isHostProgramValid)
{ {
// Reconstruct code holder. // Reconstruct code holder.
if (isHostProgramValid)
{ program = new ShaderProgram(entry.Header.Stage, "");
program = new ShaderProgram(entry.Header.Stage, ""); shaderProgramInfo = hostShaderEntries[0].ToShaderProgramInfo();
shaderProgramInfo = hostShaderEntries[0].ToShaderProgramInfo();
} ShaderCodeHolder shader = new ShaderCodeHolder(program, shaderProgramInfo, entry.Code);
else
_cpProgramsDiskCache.Add(key, new ShaderBundle(hostProgram, shader));
return true;
}
else
{
// If the host program was rejected by the gpu driver or isn't in cache, try to build from program sources again.
Task compileTask = Task.Run(() =>
{ {
IGpuAccessor gpuAccessor = new CachedGpuAccessor(_context, entry.Code, entry.Header.GpuAccessorHeader, entry.TextureDescriptors); IGpuAccessor gpuAccessor = new CachedGpuAccessor(_context, entry.Code, entry.Header.GpuAccessorHeader, entry.TextureDescriptors);
program = Translator.CreateContext(0, gpuAccessor, DefaultFlags | TranslationFlags.Compute).Translate(out shaderProgramInfo); program = Translator.CreateContext(0, gpuAccessor, DefaultFlags | TranslationFlags.Compute).Translate(out shaderProgramInfo);
} });
});
task.OnTask(compileTask, (bool _, ShaderCompileTask task) => task.OnTask(compileTask, (bool _, ShaderCompileTask task) =>
{
ShaderCodeHolder shader = new ShaderCodeHolder(program, shaderProgramInfo, entry.Code);
// If the host program was rejected by the gpu driver or isn't in cache, try to build from program sources again.
if (!isHostProgramValid)
{ {
ShaderCodeHolder shader = new ShaderCodeHolder(program, shaderProgramInfo, entry.Code);
Logger.Info?.Print(LogClass.Gpu, $"Host shader {key} got invalidated, rebuilding from guest..."); Logger.Info?.Print(LogClass.Gpu, $"Host shader {key} got invalidated, rebuilding from guest...");
// Compile shader and create program as the shader program binary got invalidated. // Compile shader and create program as the shader program binary got invalidated.
@ -222,18 +227,12 @@ namespace Ryujinx.Graphics.Gpu.Shader
}); });
return false; // Not finished: still need to compile the host program. return false; // Not finished: still need to compile the host program.
} });
else
{
_cpProgramsDiskCache.Add(key, new ShaderBundle(hostProgram, shader));
return true; return false; // Not finished: translating the program.
} }
});
return false; // Not finished: translating the shaders.
}); });
} }
else else
{ {
@ -394,7 +393,7 @@ namespace Ryujinx.Graphics.Gpu.Shader
} }
}); });
return false; // Not finished: translating the shaders. return false; // Not finished: translating the program.
}); });
} }