87 lines
2.0 KiB
Go
87 lines
2.0 KiB
Go
package cache
|
|
|
|
import (
|
|
"zworld/engine/renderapi/buffer"
|
|
"zworld/engine/renderapi/command"
|
|
"zworld/engine/renderapi/device"
|
|
"zworld/engine/renderapi/texture"
|
|
|
|
"github.com/vkngwrapper/core/v2/core1_0"
|
|
)
|
|
|
|
type TextureCache T[texture.Ref, texture.T]
|
|
|
|
func NewTextureCache(device device.T, worker command.Worker) TextureCache {
|
|
return New[texture.Ref, texture.T](&textures{
|
|
device: device,
|
|
worker: worker,
|
|
})
|
|
}
|
|
|
|
type textures struct {
|
|
device device.T
|
|
worker command.Worker
|
|
}
|
|
|
|
func (t *textures) Instantiate(ref texture.Ref, callback func(texture.T)) {
|
|
var stage buffer.T
|
|
var tex texture.T
|
|
|
|
// transfer data to texture buffer
|
|
t.worker.Queue(func(cmd command.Buffer) {
|
|
// load image data
|
|
img := ref.ImageData()
|
|
|
|
// args & defaults
|
|
args := ref.TextureArgs()
|
|
|
|
// allocate texture
|
|
var err error
|
|
tex, err = texture.New(t.device, ref.Key(), img.Width, img.Height, img.Format, args)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
// allocate staging buffer
|
|
stage = buffer.NewShared(t.device, "staging:texture", len(img.Buffer))
|
|
|
|
// write to staging buffer
|
|
stage.Write(0, img.Buffer)
|
|
stage.Flush()
|
|
|
|
cmd.CmdImageBarrier(
|
|
core1_0.PipelineStageTopOfPipe,
|
|
core1_0.PipelineStageTransfer,
|
|
tex.Image(),
|
|
core1_0.ImageLayoutUndefined,
|
|
core1_0.ImageLayoutTransferDstOptimal,
|
|
core1_0.ImageAspectColor)
|
|
cmd.CmdCopyBufferToImage(stage, tex.Image(), core1_0.ImageLayoutTransferDstOptimal)
|
|
cmd.CmdImageBarrier(
|
|
core1_0.PipelineStageTransfer,
|
|
core1_0.PipelineStageFragmentShader,
|
|
tex.Image(),
|
|
core1_0.ImageLayoutTransferDstOptimal,
|
|
core1_0.ImageLayoutShaderReadOnlyOptimal,
|
|
core1_0.ImageAspectColor)
|
|
})
|
|
t.worker.Submit(command.SubmitInfo{
|
|
Marker: "TextureUpload",
|
|
Callback: func() {
|
|
stage.Destroy()
|
|
callback(tex)
|
|
},
|
|
})
|
|
}
|
|
|
|
func (t *textures) Delete(tex texture.T) {
|
|
tex.Destroy()
|
|
}
|
|
|
|
func (t *textures) Destroy() {
|
|
|
|
}
|
|
|
|
func (t *textures) Name() string { return "TextureCache" }
|
|
func (t *textures) String() string { return "TextureCache" }
|