util.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. // SPDX-License-Identifier: Unlicense OR MIT
  2. package gl
  3. import (
  4. "errors"
  5. "fmt"
  6. "strings"
  7. )
  8. func CreateProgram(ctx *Functions, vsSrc, fsSrc string, attribs []string) (Program, error) {
  9. vs, err := CreateShader(ctx, VERTEX_SHADER, vsSrc)
  10. if err != nil {
  11. return Program{}, err
  12. }
  13. defer ctx.DeleteShader(vs)
  14. fs, err := CreateShader(ctx, FRAGMENT_SHADER, fsSrc)
  15. if err != nil {
  16. return Program{}, err
  17. }
  18. defer ctx.DeleteShader(fs)
  19. prog := ctx.CreateProgram()
  20. if !prog.Valid() {
  21. return Program{}, errors.New("glCreateProgram failed")
  22. }
  23. ctx.AttachShader(prog, vs)
  24. ctx.AttachShader(prog, fs)
  25. for i, a := range attribs {
  26. ctx.BindAttribLocation(prog, Attrib(i), a)
  27. }
  28. ctx.LinkProgram(prog)
  29. if ctx.GetProgrami(prog, LINK_STATUS) == 0 {
  30. log := ctx.GetProgramInfoLog(prog)
  31. ctx.DeleteProgram(prog)
  32. return Program{}, fmt.Errorf("program link failed: %s", strings.TrimSpace(log))
  33. }
  34. return prog, nil
  35. }
  36. func CreateComputeProgram(ctx *Functions, src string) (Program, error) {
  37. cs, err := CreateShader(ctx, COMPUTE_SHADER, src)
  38. if err != nil {
  39. return Program{}, err
  40. }
  41. defer ctx.DeleteShader(cs)
  42. prog := ctx.CreateProgram()
  43. if !prog.Valid() {
  44. return Program{}, errors.New("glCreateProgram failed")
  45. }
  46. ctx.AttachShader(prog, cs)
  47. ctx.LinkProgram(prog)
  48. if ctx.GetProgrami(prog, LINK_STATUS) == 0 {
  49. log := ctx.GetProgramInfoLog(prog)
  50. ctx.DeleteProgram(prog)
  51. return Program{}, fmt.Errorf("program link failed: %s", strings.TrimSpace(log))
  52. }
  53. return prog, nil
  54. }
  55. func CreateShader(ctx *Functions, typ Enum, src string) (Shader, error) {
  56. sh := ctx.CreateShader(typ)
  57. if !sh.Valid() {
  58. return Shader{}, errors.New("glCreateShader failed")
  59. }
  60. ctx.ShaderSource(sh, src)
  61. ctx.CompileShader(sh)
  62. if ctx.GetShaderi(sh, COMPILE_STATUS) == 0 {
  63. log := ctx.GetShaderInfoLog(sh)
  64. ctx.DeleteShader(sh)
  65. return Shader{}, fmt.Errorf("shader compilation failed: %s", strings.TrimSpace(log))
  66. }
  67. return sh, nil
  68. }
  69. func ParseGLVersion(glVer string) (version [2]int, gles bool, err error) {
  70. var ver [2]int
  71. if _, err := fmt.Sscanf(glVer, "OpenGL ES %d.%d", &ver[0], &ver[1]); err == nil {
  72. return ver, true, nil
  73. } else if _, err := fmt.Sscanf(glVer, "WebGL %d.%d", &ver[0], &ver[1]); err == nil {
  74. // WebGL major version v corresponds to OpenGL ES version v + 1
  75. ver[0]++
  76. return ver, true, nil
  77. } else if _, err := fmt.Sscanf(glVer, "%d.%d", &ver[0], &ver[1]); err == nil {
  78. return ver, false, nil
  79. }
  80. return ver, false, fmt.Errorf("failed to parse OpenGL ES version (%s)", glVer)
  81. }