Files

65 lines
1.7 KiB
Go

//go:build js
package webgl2
import (
"syscall/js"
"aego/core/handle"
"aego/core/log"
)
func (d *Device) restore() {
d.lost = false
d.cache.Invalidate()
d.initState()
for k, fbo := range d.fbos {
d.obj.drop(fbo)
delete(d.fbos, k)
}
d.obj.drop(d.bb.fbo)
d.obj.drop(d.bb.color)
d.obj.drop(d.bb.depth)
d.bb = backbuffer{}
d.buffers.Each(func(_ handle.Handle[glBuffer], b *glBuffer) {
d.obj.reuse(b.id, d.call(d.f.CreateBuffer))
d.uploadBuffer(b, b.shadow)
})
d.textures.Each(func(_ handle.Handle[glTexture], t *glTexture) {
d.obj.reuse(t.id, d.call(d.f.CreateTexture))
d.uploadTexture(t)
})
d.samplers.Each(func(_ handle.Handle[glSampler], s *glSampler) {
d.obj.reuse(s.id, d.call(d.f.CreateSampler))
d.applySampler(s.id, s.desc)
})
failed := 0
d.shaders.Each(func(_ handle.Handle[glShader], s *glShader) {
prog, err := d.link(s.desc)
if err != nil {
failed++
d.log.Error("shader cannot be rebuilt after the context loss", log.F("label", s.desc.Label), log.F("err", err.Error()))
d.obj.reuse(s.program, js.Null())
return
}
d.obj.reuse(s.program, prog)
d.bindProgramSlots(prog, s.program, s.desc.Label)
})
d.pipelines.Each(func(_ handle.Handle[glPipeline], p *glPipeline) {
d.obj.reuse(p.vao, d.call(d.f.CreateVertexArray))
p.bind.Invalidate()
d.setupVAO(p)
})
d.queries.Each(func(_ handle.Handle[glQuery], q *glQuery) {
d.obj.reuse(q.id, d.call(d.f.CreateQuery))
q.active = false
})
d.activeQuery = 0
if err := d.initOutput(); err != nil {
d.log.Error("the output pass cannot be rebuilt", log.F("err", err.Error()))
}
d.cache.Invalidate()
d.restores++
d.log.Info("WebGL context restored", log.F("buffers", d.buffers.Len()), log.F("textures", d.textures.Len()), log.F("shaders_failed", failed))
}