OGLShaderProgram.cs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. using OpenTK.Graphics.OpenGL;
  2. using System;
  3. using System.Collections.Generic;
  4. namespace Ryujinx.Graphics.Gal.OpenGL
  5. {
  6. struct OGLShaderProgram
  7. {
  8. public OGLShaderStage Vertex;
  9. public OGLShaderStage TessControl;
  10. public OGLShaderStage TessEvaluation;
  11. public OGLShaderStage Geometry;
  12. public OGLShaderStage Fragment;
  13. }
  14. class OGLShaderStage : IDisposable
  15. {
  16. public int Handle { get; private set; }
  17. public bool IsCompiled { get; private set; }
  18. public GalShaderType Type { get; private set; }
  19. public string Code { get; private set; }
  20. public IEnumerable<ShaderDeclInfo> ConstBufferUsage { get; private set; }
  21. public IEnumerable<ShaderDeclInfo> TextureUsage { get; private set; }
  22. public OGLShaderStage(
  23. GalShaderType Type,
  24. string Code,
  25. IEnumerable<ShaderDeclInfo> ConstBufferUsage,
  26. IEnumerable<ShaderDeclInfo> TextureUsage)
  27. {
  28. this.Type = Type;
  29. this.Code = Code;
  30. this.ConstBufferUsage = ConstBufferUsage;
  31. this.TextureUsage = TextureUsage;
  32. }
  33. public void Compile()
  34. {
  35. if (Handle == 0)
  36. {
  37. Handle = GL.CreateShader(OGLEnumConverter.GetShaderType(Type));
  38. CompileAndCheck(Handle, Code);
  39. }
  40. }
  41. public void Dispose()
  42. {
  43. Dispose(true);
  44. }
  45. protected virtual void Dispose(bool Disposing)
  46. {
  47. if (Disposing && Handle != 0)
  48. {
  49. GL.DeleteShader(Handle);
  50. Handle = 0;
  51. }
  52. }
  53. public static void CompileAndCheck(int Handle, string Code)
  54. {
  55. GL.ShaderSource(Handle, Code);
  56. GL.CompileShader(Handle);
  57. CheckCompilation(Handle);
  58. }
  59. private static void CheckCompilation(int Handle)
  60. {
  61. int Status = 0;
  62. GL.GetShader(Handle, ShaderParameter.CompileStatus, out Status);
  63. if (Status == 0)
  64. {
  65. throw new ShaderException(GL.GetShaderInfoLog(Handle));
  66. }
  67. }
  68. }
  69. }