From 3279688dd6b09816ed72f747f82bf4afe48a7270 Mon Sep 17 00:00:00 2001 From: Hajime Hoshi Date: Sun, 26 May 2024 21:29:28 +0900 Subject: [PATCH] Revert "shaderprecomp: accept an ID instead of source to register" This reverts commit ecc3f29af1cdbf475f6637b12d368be18b586eab. Reason: we are considering to remove ShaderSourceID Updates #2861 Updates #2999 --- examples/shaderprecomp/fxc/gen.go | 2 +- examples/shaderprecomp/register_darwin.go | 39 +++++----------- examples/shaderprecomp/register_windows.go | 52 +++++++++------------- internal/shaderir/program.go | 14 ------ shaderprecomp/shaderprecomp.go | 9 ---- shaderprecomp/shaderprecomp_darwin.go | 6 +-- shaderprecomp/shaderprecomp_windows.go | 6 +-- 7 files changed, 41 insertions(+), 87 deletions(-) diff --git a/examples/shaderprecomp/fxc/gen.go b/examples/shaderprecomp/fxc/gen.go index 8f4670d3b..7a6457469 100644 --- a/examples/shaderprecomp/fxc/gen.go +++ b/examples/shaderprecomp/fxc/gen.go @@ -40,7 +40,7 @@ func run() error { if errors.Is(err, exec.ErrNotFound) { fmt.Fprintln(os.Stderr, "fxc.exe not found. Please install Windows SDK.") fmt.Fprintln(os.Stderr, "See https://learn.microsoft.com/en-us/windows/win32/direct3dtools/fxc for more details.") - fmt.Fprintln(os.Stderr, "HINT: On PowerShell, you can add a path to the PATH environment variable temporarily like:") + fmt.Fprintln(os.Stderr, "On PowerShell, you can add a path to the PATH environment variable temporarily like:") fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, ` & (Get-Process -Id $PID).Path { $env:PATH="C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x64;"+$env:PATH; go generate .\examples\shaderprecomp\fxc\ }`) fmt.Fprintln(os.Stderr) diff --git a/examples/shaderprecomp/register_darwin.go b/examples/shaderprecomp/register_darwin.go index 5f00b0120..b5b250cfd 100644 --- a/examples/shaderprecomp/register_darwin.go +++ b/examples/shaderprecomp/register_darwin.go @@ -16,9 +16,10 @@ package main import ( "embed" + "errors" "fmt" + "io/fs" "os" - "strings" "github.com/hajimehoshi/ebiten/v2/shaderprecomp" ) @@ -27,40 +28,24 @@ import ( var metallibs embed.FS func registerPrecompiledShaders() error { - ents, err := metallibs.ReadDir("metallib") + srcs := shaderprecomp.AppendBuildinShaderSources(nil) + defaultShaderSource, err := shaderprecomp.NewShaderSource(defaultShaderSourceBytes) if err != nil { return err } + srcs = append(srcs, defaultShaderSource) - var registered bool - for _, ent := range ents { - if ent.IsDir() { - continue - } - - const suffix = ".metallib" - name := ent.Name() - if !strings.HasSuffix(name, suffix) { - continue - } - - id := name[:len(name)-len(suffix)] - srcID, err := shaderprecomp.ParseSourceID(id) - if err != nil { - continue - } - + for _, src := range srcs { + name := src.ID().String() + ".metallib" lib, err := metallibs.ReadFile("metallib/" + name) if err != nil { + if errors.Is(err, fs.ErrNotExist) { + fmt.Fprintf(os.Stderr, "precompiled Metal library %s was not found. Run 'go generate' for 'metallib' directory to generate them.\n", name) + continue + } return err } - - shaderprecomp.RegisterMetalLibrary(srcID, lib) - registered = true - } - - if !registered { - fmt.Fprintln(os.Stderr, "precompiled Metal libraries were not found. Run 'go generate' for 'metallib' directory to generate them.") + shaderprecomp.RegisterMetalLibrary(src, lib) } return nil diff --git a/examples/shaderprecomp/register_windows.go b/examples/shaderprecomp/register_windows.go index 85a739b5c..34ac7437a 100644 --- a/examples/shaderprecomp/register_windows.go +++ b/examples/shaderprecomp/register_windows.go @@ -16,9 +16,10 @@ package main import ( "embed" + "errors" "fmt" + "io/fs" "os" - "strings" "github.com/hajimehoshi/ebiten/v2/shaderprecomp" ) @@ -29,44 +30,35 @@ import ( var fxcs embed.FS func registerPrecompiledShaders() error { - ents, err := fxcs.ReadDir("fxc") + srcs := shaderprecomp.AppendBuildinShaderSources(nil) + defaultShaderSource, err := shaderprecomp.NewShaderSource(defaultShaderSourceBytes) if err != nil { return err } + srcs = append(srcs, defaultShaderSource) - var registered bool - for _, ent := range ents { - if ent.IsDir() { - continue - } - - const suffix = "_vs.fxc" - name := ent.Name() - if !strings.HasSuffix(name, suffix) { - continue - } - - id := name[:len(name)-len(suffix)] - srcID, err := shaderprecomp.ParseSourceID(id) - if err != nil { - continue - } - - vs, err := fxcs.ReadFile("fxc/" + id + "_vs.fxc") - if err != nil { - return err - } - ps, err := fxcs.ReadFile("fxc/" + id + "_ps.fxc") + for _, src := range srcs { + vsname := src.ID().String() + "_vs.fxc" + vs, err := fxcs.ReadFile("fxc/" + vsname) if err != nil { + if errors.Is(err, fs.ErrNotExist) { + fmt.Fprintf(os.Stderr, "precompiled HLSL library %s was not found. Run 'go generate' for 'fxc' directory to generate them.\n", vsname) + continue + } return err } - shaderprecomp.RegisterFXCs(srcID, vs, ps) - registered = true - } + psname := src.ID().String() + "_ps.fxc" + ps, err := fxcs.ReadFile("fxc/" + psname) + if err != nil { + if errors.Is(err, fs.ErrNotExist) { + fmt.Fprintf(os.Stderr, "precompiled HLSL library %s was not found. Run 'go generate' for 'fxc' directory to generate them.\n", psname) + continue + } + return err + } - if !registered { - fmt.Fprintln(os.Stderr, "precompiled HLSL libraries were not found. Run 'go generate' for 'fxc' directory to generate them.") + shaderprecomp.RegisterFXCs(src, vs, ps) } return nil diff --git a/internal/shaderir/program.go b/internal/shaderir/program.go index f50725622..8688057cb 100644 --- a/internal/shaderir/program.go +++ b/internal/shaderir/program.go @@ -17,7 +17,6 @@ package shaderir import ( "encoding/hex" - "fmt" "go/constant" "go/token" "hash/fnv" @@ -43,19 +42,6 @@ func CalcSourceHash(source []byte) SourceHash { return hash } -func ParseSourceHash(s string) (SourceHash, error) { - bs, err := hex.DecodeString(s) - if err != nil { - return SourceHash{}, err - } - var hash SourceHash - if len(bs) != len(hash) { - return SourceHash{}, fmt.Errorf("shaderir: invalid size hash: %s", s) - } - copy(hash[:], bs) - return hash, nil -} - func (s SourceHash) String() string { return hex.EncodeToString(s[:]) } diff --git a/shaderprecomp/shaderprecomp.go b/shaderprecomp/shaderprecomp.go index f761d695e..650ebc1b5 100644 --- a/shaderprecomp/shaderprecomp.go +++ b/shaderprecomp/shaderprecomp.go @@ -64,15 +64,6 @@ func (s *ShaderSource) ID() ShaderSourceID { // ShaderSourceID is a uniuqe identifier for a shader source. type ShaderSourceID [16]byte -// ParseSourceID parses a string representation of the shader source ID. -func ParseSourceID(s string) (ShaderSourceID, error) { - h, err := shaderir.ParseSourceHash(s) - if err != nil { - return ShaderSourceID{}, err - } - return ShaderSourceID(h), nil -} - // String returns a string representation of the shader source ID. func (s ShaderSourceID) String() string { return shaderir.SourceHash(s).String() diff --git a/shaderprecomp/shaderprecomp_darwin.go b/shaderprecomp/shaderprecomp_darwin.go index 796efb690..b795ba685 100644 --- a/shaderprecomp/shaderprecomp_darwin.go +++ b/shaderprecomp/shaderprecomp_darwin.go @@ -39,11 +39,11 @@ func CompileToMSL(w io.Writer, source *ShaderSource) error { return nil } -// RegisterMetalLibrary registers a precompiled Metal library for a shader source ID. +// RegisterMetalLibrary registers a precompiled Metal library for a shader source. // library must be the content of a .metallib file. // For more details, see https://developer.apple.com/documentation/metal/shader_libraries/building_a_shader_library_by_precompiling_source_files. // // RegisterMetalLibrary is concurrent-safe. -func RegisterMetalLibrary(id ShaderSourceID, library []byte) { - metal.RegisterPrecompiledLibrary(shaderir.SourceHash(id), library) +func RegisterMetalLibrary(source *ShaderSource, library []byte) { + metal.RegisterPrecompiledLibrary(shaderir.SourceHash(source.ID()), library) } diff --git a/shaderprecomp/shaderprecomp_windows.go b/shaderprecomp/shaderprecomp_windows.go index 7bdea4a48..27c9de404 100644 --- a/shaderprecomp/shaderprecomp_windows.go +++ b/shaderprecomp/shaderprecomp_windows.go @@ -57,11 +57,11 @@ func CompileToHLSL(vertexWriter, pixelWriter io.Writer, source *ShaderSource) er return nil } -// RegisterFXCs registers a precompiled HLSL (FXC) for a shader source ID. +// RegisterFXCs registers a precompiled HLSL (FXC) for a shader source. // vertexFXC and pixelFXC must be the content of .fxc files generated by `fxc` command. // For more details, see https://learn.microsoft.com/en-us/windows/win32/direct3dtools/dx-graphics-tools-fxc-using. // // RegisterFXCs is concurrent-safe. -func RegisterFXCs(id ShaderSourceID, vertexFXC, pixelFXC []byte) { - directx.RegisterPrecompiledFXCs(shaderir.SourceHash(id), vertexFXC, pixelFXC) +func RegisterFXCs(source *ShaderSource, vertexFXC, pixelFXC []byte) { + directx.RegisterPrecompiledFXCs(shaderir.SourceHash(source.ID()), vertexFXC, pixelFXC) }