diff --git a/Directory.Packages.props b/Directory.Packages.props index 301024cf8..30ab7df56 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -37,8 +37,8 @@ - + diff --git a/src/Ryujinx.Graphics.Vulkan/Ryujinx.Graphics.Vulkan.csproj b/src/Ryujinx.Graphics.Vulkan/Ryujinx.Graphics.Vulkan.csproj index f6a7be91e..bee450a7e 100644 --- a/src/Ryujinx.Graphics.Vulkan/Ryujinx.Graphics.Vulkan.csproj +++ b/src/Ryujinx.Graphics.Vulkan/Ryujinx.Graphics.Vulkan.csproj @@ -51,7 +51,7 @@ - + diff --git a/src/Ryujinx.Graphics.Vulkan/Shader.cs b/src/Ryujinx.Graphics.Vulkan/Shader.cs index 1c8caffd9..ac072e865 100644 --- a/src/Ryujinx.Graphics.Vulkan/Shader.cs +++ b/src/Ryujinx.Graphics.Vulkan/Shader.cs @@ -1,7 +1,7 @@ using Ryujinx.Common.Logging; using Ryujinx.Graphics.GAL; using Ryujinx.Graphics.Shader; -using shaderc; +using Silk.NET.Shaderc; using Silk.NET.Vulkan; using System; using System.Runtime.InteropServices; @@ -11,10 +11,6 @@ namespace Ryujinx.Graphics.Vulkan { class Shader : IDisposable { - // The shaderc.net dependency's Options constructor and dispose are not thread safe. - // Take this lock when using them. - private static readonly object _shaderOptionsLock = new(); - private static readonly IntPtr _ptrMainEntryPointName = Marshal.StringToHGlobalAnsi("main"); private readonly Vk _api; @@ -73,38 +69,33 @@ namespace Ryujinx.Graphics.Vulkan private unsafe static byte[] GlslToSpirv(string glsl, ShaderStage stage) { - Options options; + var api = Shaderc.GetApi(); + var compiler = api.CompilerInitialize(); + var options = api.CompileOptionsInitialize(); - lock (_shaderOptionsLock) + api.CompileOptionsSetSourceLanguage(options, SourceLanguage.Glsl); + api.CompileOptionsSetTargetSpirv(options, SpirvVersion.Shaderc15); + api.CompileOptionsSetTargetEnv(options, TargetEnv.Vulkan, Vk.Version12); + + var scr = api.CompileIntoSpv(compiler, glsl, (nuint)glsl.Length, GetShaderCShaderStage(stage), "Ryu", "main", options); + + var status = api.ResultGetCompilationStatus(scr); + + if (status != CompilationStatus.Success) { - options = new Options(false) - { - SourceLanguage = SourceLanguage.Glsl, - TargetSpirVVersion = new SpirVVersion(1, 5), - }; - } - - options.SetTargetEnvironment(TargetEnvironment.Vulkan, EnvironmentVersion.Vulkan_1_2); - Compiler compiler = new(options); - var scr = compiler.Compile(glsl, "Ryu", GetShaderCShaderStage(stage)); - - lock (_shaderOptionsLock) - { - options.Dispose(); - } - - if (scr.Status != Status.Success) - { - Logger.Error?.Print(LogClass.Gpu, $"Shader compilation error: {scr.Status} {scr.ErrorMessage}"); + Logger.Error?.Print(LogClass.Gpu, $"Shader compilation error: {status} {api.ResultGetErrorMessageS(scr)}"); return null; } - var spirvBytes = new Span((void*)scr.CodePointer, (int)scr.CodeLength); + var spirvBytes = new Span(api.ResultGetBytes(scr), (int)api.ResultGetLength(scr)); - byte[] code = new byte[(scr.CodeLength + 3) & ~3]; + byte[] code = new byte[(spirvBytes.Length + 3) & ~3]; - spirvBytes.CopyTo(code.AsSpan()[..(int)scr.CodeLength]); + spirvBytes.CopyTo(code.AsSpan()[..spirvBytes.Length]); + + api.CompilerRelease(compiler); + api.CompileOptionsRelease(options); return code; }