VeldridSpirvNative.cs 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. using System.Runtime.InteropServices;
  2. using NativeLibraryLoader;
  3. using NativeLibrary = NativeLibraryLoader.NativeLoader;
  4. namespace Veldrid.SPIRV
  5. {
  6. internal unsafe class VeldridSpirvNative
  7. {
  8. NativeLibraryLoader.NativeLoader loader;
  9. private VeldridSpirvNative()
  10. {
  11. string[] names;
  12. if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
  13. {
  14. names = new[] { "libveldrid-spirv.dll" };
  15. }
  16. else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
  17. {
  18. names = new[]
  19. {
  20. "libveldrid-spirv.so",
  21. };
  22. }
  23. else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
  24. {
  25. names = new[]
  26. {
  27. "libveldrid-spirv.dylib"
  28. };
  29. }
  30. else
  31. {
  32. names = new[] { "libveldrid-spirv.dll" };
  33. }
  34. loader = new NativeLibrary("libveldrid-spirv");
  35. }
  36. static VeldridSpirvNative()
  37. {
  38. }
  39. private delegate CompilationResult* CrossCompileDelegate(CrossCompileInfo* info);
  40. private delegate CompilationResult* CompileGlslToSpirvDelegate(GlslCompileInfo* info);
  41. private delegate void FreeResultDelegate(CompilationResult* result);
  42. private CrossCompileDelegate crossCompileDelegate;
  43. private CompileGlslToSpirvDelegate compileGlslToSpirvDelegate;
  44. private FreeResultDelegate freeResultDelegate;
  45. public CompilationResult* CrossCompile(CrossCompileInfo* info)
  46. {
  47. if(crossCompileDelegate==null)
  48. {
  49. crossCompileDelegate = loader.LoadFunction<CrossCompileDelegate>(nameof(CrossCompile));
  50. }
  51. return crossCompileDelegate(info);
  52. }
  53. public CompilationResult* CompileGlslToSpirv(GlslCompileInfo* info)
  54. {
  55. if(compileGlslToSpirvDelegate==null)
  56. {
  57. compileGlslToSpirvDelegate = loader.LoadFunction<CompileGlslToSpirvDelegate>(nameof(CompileGlslToSpirv));
  58. }
  59. return compileGlslToSpirvDelegate(info);
  60. }
  61. public void FreeResult(CompilationResult* result)
  62. {
  63. if(freeResultDelegate ==null)
  64. {
  65. freeResultDelegate = loader.LoadFunction<FreeResultDelegate>(nameof(FreeResult));
  66. }
  67. freeResultDelegate(result);
  68. }
  69. public static VeldridSpirvNative Default { get; } = new VeldridSpirvNative();
  70. }
  71. }