zworld/engine/render/pass/deferred_cache.go

96 lines
2.2 KiB
Go
Raw Permalink Normal View History

2024-01-14 22:56:06 +08:00
package pass
import (
"github.com/vkngwrapper/core/v2/core1_0"
"zworld/engine/render/uniform"
"zworld/engine/renderapi/cache"
"zworld/engine/renderapi/descriptor"
"zworld/engine/renderapi/material"
"zworld/engine/renderapi/renderpass"
"zworld/engine/renderapi/shader"
"zworld/engine/renderapi/vertex"
"zworld/engine/renderapi/vulkan"
)
type DeferredMatCache struct {
app vulkan.App
pass renderpass.T
frames int
}
func NewDeferredMaterialCache(app vulkan.App, pass renderpass.T, frames int) MaterialCache {
return cache.New[*material.Def, []Material](&DeferredMatCache{
app: app,
pass: pass,
frames: frames,
})
}
func (m *DeferredMatCache) Name() string { return "DeferredMaterials" }
func (m *DeferredMatCache) Instantiate(def *material.Def, callback func([]Material)) {
if def == nil {
def = material.StandardDeferred()
}
desc := &DeferredDescriptors{
Camera: &descriptor.Uniform[uniform.Camera]{
Stages: core1_0.StageAll,
},
Objects: &descriptor.Storage[uniform.Object]{
Stages: core1_0.StageAll,
Size: 2000,
},
Textures: &descriptor.SamplerArray{
Stages: core1_0.StageFragment,
Count: 100,
},
}
// read vertex pointers from vertex format
pointers := vertex.ParsePointers(def.VertexFormat)
// fetch shader from cache
shader := m.app.Shaders().Fetch(shader.NewRef(def.Shader))
// create material
mat := material.New(
m.app.Device(),
material.Args{
Shader: shader,
Pass: m.pass,
Subpass: MainSubpass,
Pointers: pointers,
DepthTest: def.DepthTest,
DepthWrite: def.DepthWrite,
DepthClamp: def.DepthClamp,
DepthFunc: def.DepthFunc,
Primitive: def.Primitive,
CullMode: def.CullMode,
},
desc)
instances := make([]Material, m.frames)
for i := range instances {
instance := mat.Instantiate(m.app.Pool())
textures := cache.NewSamplerCache(m.app.Textures(), instance.Descriptors().Textures)
instances[i] = &DeferredMaterial{
id: def.Hash(),
Instance: instance,
Objects: NewObjectBuffer(instance.Descriptors().Objects.Size),
Textures: textures,
Meshes: m.app.Meshes(),
}
}
callback(instances)
}
func (m *DeferredMatCache) Destroy() {
}
func (m *DeferredMatCache) Delete(mat []Material) {
mat[0].Destroy()
}