From: Egon Elbre <egonelbre@gmail.com>
Signed-off-by: Egon Elbre <egonelbre@gmail.com>
---
internal/cmd/convertshaders/main.go | 67 +++++++++++++++++++++--------
1 file changed, 49 insertions(+), 18 deletions(-)
diff --git a/internal/cmd/convertshaders/main.go b/internal/cmd/convertshaders/main.go
index 1f481a1..5f36738 100644
--- a/internal/cmd/convertshaders/main.go
+++ b/internal/cmd/convertshaders/main.go
@@ -102,18 +102,21 @@ func generateComputeShader(tmp string, out io.Writer, shader string) error {
return err
}
var src backend.ShaderSources
- glsl310es, err := convertComputeShader(tmp, glslangValidator, spirv_cross, shader)
+ shaders, err := convertComputeShader(tmp, glslangValidator, spirv_cross, shader)
if err != nil {
return err
}
src.Name = filepath.Base(shader)
- src.GLSL310ES = glsl310es
+ src.GLSL310ES = shaders.glsl310es
+
name := filepath.Base(shader)
name = strings.ReplaceAll(name, ".", "_")
fmt.Fprintf(out, "\tshader_%s = ", name)
fmt.Fprintf(out, "backend.ShaderSources{\n")
fmt.Fprintf(out, "Name: %#v,\n", src.Name)
fmt.Fprintf(out, "GLSL310ES: %#v,\n", src.GLSL310ES)
+ fmt.Fprintf(out, "/*\n%s\n*/\n", shaders.hlslSrc)
+ fmt.Fprintf(out, "HLSL: %#v,\n", shaders.hlsl)
fmt.Fprintf(out, "}")
fmt.Fprintf(out, "\n")
return nil
@@ -449,9 +452,6 @@ func convertShader(tmp, glslcc, path, lang, profile string, args *shaderArgs, fl
case ".frag":
progFlag = "--frag"
progSuffix = "fs"
- case ".comp":
- progFlag = "--compute"
- progSuffix = "cs"
default:
return "", nil, fmt.Errorf("unrecognized shader type: %s", path)
}
@@ -493,7 +493,13 @@ func convertShader(tmp, glslcc, path, lang, profile string, args *shaderArgs, fl
return string(src), reflect, nil
}
-func convertComputeShader(tmp, glslangValidator, spirv_cross, path string) (string, error) {
+type computeShaders struct {
+ glsl310es string
+ hlslSrc string
+ hlsl []byte
+}
+
+func convertComputeShader(tmp, glslangValidator, spirv_cross, path string) (computeShaders, error) {
spvFile := filepath.Join(tmp, "shader.spv")
cmd := exec.Command(glslangValidator,
"-G100", // OpenGL ES 3.1.
@@ -505,18 +511,43 @@ func convertComputeShader(tmp, glslangValidator, spirv_cross, path string) (stri
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
if err := cmd.Run(); err != nil {
- return "", fmt.Errorf("%s: %v", strings.Join(cmd.Args, " "), err)
+ return computeShaders{}, fmt.Errorf("%s: %v", strings.Join(cmd.Args, " "), err)
}
- cmd = exec.Command(spirv_cross,
- "--es",
- "--version", "310",
- spvFile,
- )
- var shaderDump bytes.Buffer
- cmd.Stdout = &shaderDump
- cmd.Stderr = os.Stderr
- if err := cmd.Run(); err != nil {
- return "", fmt.Errorf("%s: %v", strings.Join(cmd.Args, " "), err)
+
+ var output computeShaders
+ {
+ cmd = exec.Command(spirv_cross,
+ "--es",
+ "--version", "310",
+ spvFile,
+ )
+ var shaderDump bytes.Buffer
+ cmd.Stdout = &shaderDump
+ cmd.Stderr = os.Stderr
+ if err := cmd.Run(); err != nil {
+ return output, fmt.Errorf("%s: %v", strings.Join(cmd.Args, " "), err)
+ }
+ output.glsl310es = shaderDump.String()
+ }
+ {
+ cmd = exec.Command(spirv_cross,
+ "--hlsl",
+ "--shader-model", "50",
+ spvFile,
+ )
+ var shaderDump bytes.Buffer
+ cmd.Stdout = &shaderDump
+ cmd.Stderr = os.Stderr
+ if err := cmd.Run(); err != nil {
+ return output, fmt.Errorf("%s: %v", strings.Join(cmd.Args, " "), err)
+ }
+ output.hlslSrc = shaderDump.String()
+
+ var err error
+ output.hlsl, err = compileHLSL(tmp, path, output.hlslSrc, "main", "cs_5_0")
+ if err != nil {
+ return output, err
+ }
}
- return shaderDump.String(), nil
+ return output, nil
}
--
2.30.1