Files
aego/gpu/webgl2/layout.go
T
sanspie 5eb1832907
ci-platforms / darwin amd64 smoke (push) Skipped
ci / build (amd64, linux, ubuntu-24.04) (push) Failing after 15m28s
ci / release (push) Skipped
ci-platforms / windows amd64 smoke (push) Skipped
ci-platforms / darwin arm64 smoke (push) Skipped
ci / checks (push) Successful in 7m47s
Complete Stage 12 for v0.12.0
2026-11-05 11:46:53 +03:00

55 lines
1.5 KiB
Go

//go:build js
package webgl2
import (
"strconv"
"strings"
"syscall/js"
"aego/core/errs"
"aego/core/handle"
"aego/gpu"
)
func (d *Device) UniformBlockLayout(h gpu.ShaderHandle, slot int) (gpu.UniformBlockLayout, bool, error) {
s, ok := d.shaders.Get(handle.Cast[glShader](h))
if !ok {
return gpu.UniformBlockLayout{}, false, errs.New(errs.GPUInvalidHandle, "uniform layout: invalid shader")
}
program := d.obj.get(s.program)
block := d.call(d.f.GetUniformBlockIndex, program, "ub"+strconv.Itoa(slot))
if block.Type() != js.TypeNumber || block.Float() == 4294967295 {
return gpu.UniformBlockLayout{}, false, nil
}
idx := block.Int()
out := gpu.UniformBlockLayout{Size: num(d.call(d.f.GetActiveUniformBlockParameter, program, idx, 0x8A40))}
indices := d.call(d.f.GetActiveUniformBlockParameter, program, idx, 0x8A43)
offsets := d.call(d.f.GetActiveUniforms, program, indices, 0x8A3B)
for i := 0; i < indices.Length(); i++ {
info := d.call(d.f.GetActiveUniform, program, indices.Index(i))
out.Members = append(out.Members, gpu.UniformMember{Name: strings.TrimSuffix(info.Get("name").String(), "[0]"), Type: uniformType(uint32(num(info.Get("type")))), Offset: num(offsets.Index(i))})
}
return out, true, nil
}
func uniformType(t uint32) string {
switch t {
case 0x1406:
return "float"
case 0x1404:
return "int"
case 0x8B56:
return "bool"
case 0x8B50:
return "vec2"
case 0x8B51:
return "vec3"
case 0x8B52:
return "vec4"
case 0x8B5C:
return "mat4"
}
return "unknown"
}