glslvalidate.go raw
1 // SPDX-License-Identifier: Unlicense OR MIT
2
3 package main
4
5 import (
6 "bytes"
7 "fmt"
8 "io/ioutil"
9 "os/exec"
10 "path/filepath"
11 )
12
13 // GLSLValidator is OpenGL reference compiler.
14 type GLSLValidator struct {
15 Bin string
16 WorkDir WorkDir
17 }
18
19 func NewGLSLValidator() *GLSLValidator { return &GLSLValidator{Bin: "glslangValidator"} }
20
21 // Convert converts a glsl shader to spirv.
22 func (glsl *GLSLValidator) Convert(path, variant string, hlsl bool, input []byte) ([]byte, error) {
23 base := glsl.WorkDir.Path(filepath.Base(path), variant)
24 pathout := base + ".out"
25
26 cmd := exec.Command(glsl.Bin,
27 "--stdin",
28 "-I"+filepath.Dir(path),
29 "-V", // OpenGL ES 3.1.
30 "-w", // Suppress warnings.
31 "-S", filepath.Ext(path)[1:],
32 "-o", pathout,
33 )
34 if hlsl {
35 cmd.Args = append(cmd.Args, "-DHLSL")
36 }
37 cmd.Stdin = bytes.NewBuffer(input)
38
39 out, err := cmd.Output()
40 if err != nil {
41 return nil, fmt.Errorf("%s\nfailed to run %v: %w", out, cmd.Args, err)
42 }
43
44 compiled, err := ioutil.ReadFile(pathout)
45 if err != nil {
46 return nil, fmt.Errorf("unable to read output %q: %w", pathout, err)
47 }
48
49 return compiled, nil
50 }
51