good morning!!!!

Skip to content
Snippets Groups Projects
Commit 703a0fba authored by Garet Halliday's avatar Garet Halliday
Browse files

perf and fix fragment shader opt

parent 8e311782
No related branches found
Tags v0.2.0
No related merge requests found
......@@ -6,71 +6,98 @@ import (
"errors"
"github.com/bytecodealliance/wasmtime-go"
"os"
"runtime"
"strings"
)
//go:embed glsl-optimizer.wasm
var glslOptimizer []byte
var engine *wasmtime.Engine
var store *wasmtime.Store
var module *wasmtime.Module
var instance *wasmtime.Instance
var optimizeGLSL *wasmtime.Func
var memory *wasmtime.Memory
func Optimize(input, output string) error {
engine := wasmtime.NewEngine()
store := wasmtime.NewStore(engine)
if engine == nil {
engine = wasmtime.NewEngine()
}
if store == nil {
store = wasmtime.NewStore(engine)
}
module, err := wasmtime.NewModule(engine, glslOptimizer)
if err != nil {
return err
if module == nil {
var err error
module, err = wasmtime.NewModule(engine, glslOptimizer)
if err != nil {
return err
}
}
var instance *wasmtime.Instance
instance, err = wasmtime.NewInstance(store, module, []wasmtime.AsExtern{
wasmtime.WrapFunc(store, func(int32, int32, int32, int32) int32 { // fd_write
return 0
}),
wasmtime.WrapFunc(store, func(int32, int32, int32, int32) int32 { // fd_read
return 0
}),
wasmtime.WrapFunc(store, func(int32, int64, int32, int32) int32 { // fd_seek
return 0
}),
wasmtime.WrapFunc(store, func(int32) int32 { // fd_close
return 0
}),
wasmtime.WrapFunc(store, func(int32) { // proc_exit
return
}),
})
if err != nil {
return err
if instance == nil {
var err error
instance, err = wasmtime.NewInstance(store, module, []wasmtime.AsExtern{
wasmtime.WrapFunc(store, func(int32, int32, int32, int32) int32 { // fd_write
return 0
}),
wasmtime.WrapFunc(store, func(int32, int32, int32, int32) int32 { // fd_read
return 0
}),
wasmtime.WrapFunc(store, func(int32, int64, int32, int32) int32 { // fd_seek
return 0
}),
wasmtime.WrapFunc(store, func(int32) int32 { // fd_close
return 0
}),
wasmtime.WrapFunc(store, func(int32) { // proc_exit
return
}),
})
if err != nil {
return err
}
initialize := instance.GetExport(store, "_initialize")
if initialize == nil {
return errors.New("can't find _initialize func")
}
_, err = initialize.Func().Call(store)
if err != nil {
return err
}
}
optimizeGLSL := instance.GetExport(store, "optimize_glsl")
if optimizeGLSL == nil {
return errors.New("can't find optimize_glsl func")
opt := instance.GetExport(store, "optimize_glsl")
if opt == nil {
return errors.New("can't find optimize_glsl func")
}
optimizeGLSL = opt.Func()
}
memory := instance.GetExport(store, "memory")
if memory == nil {
return errors.New("can't find memory func")
}
initialize := instance.GetExport(store, "_initialize")
if initialize == nil {
return errors.New("can't find _initialize func")
}
_, err = initialize.Func().Call(store)
if err != nil {
return err
mem := instance.GetExport(store, "memory")
if mem == nil {
return errors.New("can't find memory func")
}
memory = mem.Memory()
}
var src []byte
src, err = os.ReadFile(input)
src, err := os.ReadFile(input)
if err != nil {
return err
}
data := memory.Memory().UnsafeData(store)
data := memory.UnsafeData(store)
ptr := len(data) - len(src) - 1
copy(data[ptr:], src)
data[ptr+len(src)] = 0
var ty int32
if strings.HasSuffix(input, ".vert") {
ty = 1
}
var res any
res, err = optimizeGLSL.Func().Call(store, int32(ptr), int32(3), int32(1) /* vs */)
res, err = optimizeGLSL.Call(store, int32(ptr), int32(3), ty)
if err != nil {
return err
}
......@@ -84,8 +111,5 @@ func Optimize(input, output string) error {
i++
}
runtime.KeepAlive(memory)
runtime.KeepAlive(store)
return os.WriteFile(output, out.Bytes(), 0777)
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment