mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2025-02-05 07:24:30 +01:00
parent
de1ef0bec8
commit
848e30e0e7
@ -30,8 +30,16 @@ import (
|
|||||||
|
|
||||||
"golang.org/x/tools/go/ast/inspector"
|
"golang.org/x/tools/go/ast/inspector"
|
||||||
"golang.org/x/tools/go/packages"
|
"golang.org/x/tools/go/packages"
|
||||||
|
|
||||||
|
"github.com/hajimehoshi/ebiten/v2/internal/graphics"
|
||||||
|
"github.com/hajimehoshi/ebiten/v2/internal/shaderir/glsl"
|
||||||
|
"github.com/hajimehoshi/ebiten/v2/internal/shaderir/hlsl"
|
||||||
|
"github.com/hajimehoshi/ebiten/v2/internal/shaderir/msl"
|
||||||
|
"github.com/hajimehoshi/ebiten/v2/internal/shaderir/pssl"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var flagTarget = flag.String("target", "", "shader compilation targets separated by comma (e.g. 'glsl,glsles,hlsl,msl')")
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
if err := xmain(); err != nil {
|
if err := xmain(); err != nil {
|
||||||
fmt.Fprintln(os.Stderr, err)
|
fmt.Fprintln(os.Stderr, err)
|
||||||
@ -43,11 +51,40 @@ type Shader struct {
|
|||||||
Package string
|
Package string
|
||||||
File string
|
File string
|
||||||
Source string
|
Source string
|
||||||
|
GLSL *GLSL `json:",omitempty"`
|
||||||
|
GLSLES *GLSLES `json:",omitempty"`
|
||||||
|
HLSL *HLSL `json:",omitempty"`
|
||||||
|
MSL *MSL `json:",omitempty"`
|
||||||
|
PSSL *PSSL `json:",omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type GLSL struct {
|
||||||
|
Vertex string
|
||||||
|
Fragment string
|
||||||
|
}
|
||||||
|
|
||||||
|
type GLSLES struct {
|
||||||
|
Vertex string
|
||||||
|
Fragment string
|
||||||
|
}
|
||||||
|
|
||||||
|
type HLSL struct {
|
||||||
|
Vertex string
|
||||||
|
Pixel string
|
||||||
|
}
|
||||||
|
|
||||||
|
type MSL struct {
|
||||||
|
Shader string
|
||||||
|
}
|
||||||
|
|
||||||
|
type PSSL struct {
|
||||||
|
Vertex string
|
||||||
|
Pixel string
|
||||||
}
|
}
|
||||||
|
|
||||||
func xmain() error {
|
func xmain() error {
|
||||||
flag.Usage = func() {
|
flag.Usage = func() {
|
||||||
fmt.Fprintln(os.Stderr, "shaderlister [package]")
|
fmt.Fprintln(os.Stderr, "shaderlister [-target=TARGET] [package]")
|
||||||
os.Exit(2)
|
os.Exit(2)
|
||||||
}
|
}
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
@ -62,10 +99,16 @@ func xmain() error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
targets := strings.Split(*flagTarget, ",")
|
||||||
|
for i := range targets {
|
||||||
|
targets[i] = strings.TrimSpace(targets[i])
|
||||||
|
}
|
||||||
|
|
||||||
// Collect shader information.
|
// Collect shader information.
|
||||||
// Even if no shader is found, the output should be a JSON array. Start with an empty slice, not nil.
|
// Even if no shader is found, the output should be a JSON array. Start with an empty slice, not nil.
|
||||||
shaders := []Shader{}
|
shaders := []Shader{}
|
||||||
|
|
||||||
|
var visitErr error
|
||||||
packages.Visit(pkgs, func(pkg *packages.Package) bool {
|
packages.Visit(pkgs, func(pkg *packages.Package) bool {
|
||||||
path := pkg.PkgPath
|
path := pkg.PkgPath
|
||||||
// A standard library should not have a directive for shaders. Skip them.
|
// A standard library should not have a directive for shaders. Skip them.
|
||||||
@ -76,9 +119,61 @@ func xmain() error {
|
|||||||
if strings.HasPrefix(path, "golang.org/x/") {
|
if strings.HasPrefix(path, "golang.org/x/") {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
origN := len(shaders)
|
||||||
shaders = appendShaderSources(shaders, pkg)
|
shaders = appendShaderSources(shaders, pkg)
|
||||||
|
|
||||||
|
// Compile shaders.
|
||||||
|
for i, shader := range shaders[origN:] {
|
||||||
|
ir, err := graphics.CompileShader([]byte(shader.Source))
|
||||||
|
if err != nil {
|
||||||
|
visitErr = fmt.Errorf("compiling shader failed: %w", err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, target := range targets {
|
||||||
|
switch target {
|
||||||
|
case "glsl":
|
||||||
|
vs, fs := glsl.Compile(ir, glsl.GLSLVersionDefault)
|
||||||
|
shaders[origN+i].GLSL = &GLSL{
|
||||||
|
Vertex: vs,
|
||||||
|
Fragment: fs,
|
||||||
|
}
|
||||||
|
case "glsles":
|
||||||
|
vs, fs := glsl.Compile(ir, glsl.GLSLVersionES300)
|
||||||
|
shaders[origN+i].GLSLES = &GLSLES{
|
||||||
|
Vertex: vs,
|
||||||
|
Fragment: fs,
|
||||||
|
}
|
||||||
|
case "hlsl":
|
||||||
|
vs, ps, _ := hlsl.Compile(ir)
|
||||||
|
shaders[origN+i].HLSL = &HLSL{
|
||||||
|
Vertex: vs,
|
||||||
|
Pixel: ps,
|
||||||
|
}
|
||||||
|
case "msl":
|
||||||
|
s := msl.Compile(ir)
|
||||||
|
shaders[origN+i].MSL = &MSL{
|
||||||
|
Shader: s,
|
||||||
|
}
|
||||||
|
case "pssl":
|
||||||
|
vs, ps := pssl.Compile(ir)
|
||||||
|
shaders[origN+i].PSSL = &PSSL{
|
||||||
|
Vertex: vs,
|
||||||
|
Pixel: ps,
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
visitErr = fmt.Errorf("unsupported target: %s", target)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return true
|
return true
|
||||||
}, nil)
|
}, nil)
|
||||||
|
if visitErr != nil {
|
||||||
|
return visitErr
|
||||||
|
}
|
||||||
|
|
||||||
w := bufio.NewWriter(os.Stdout)
|
w := bufio.NewWriter(os.Stdout)
|
||||||
enc := json.NewEncoder(w)
|
enc := json.NewEncoder(w)
|
||||||
|
Loading…
Reference in New Issue
Block a user