zworld/engine/renderapi/renderpass/attachment/image.go
2024-01-14 22:56:06 +08:00

106 lines
1.9 KiB
Go

package attachment
import (
"errors"
"fmt"
"log"
"zworld/engine/renderapi/device"
"zworld/engine/renderapi/image"
"github.com/vkngwrapper/core/v2/core1_0"
)
var ErrArrayExhausted = errors.New("image array allocator exhausted")
type Image interface {
Format() core1_0.Format
Next(device device.T, name string, width, height int) (image.T, bool, error)
}
type alloc struct {
key string
format core1_0.Format
usage core1_0.ImageUsageFlags
}
var _ Image = &alloc{}
func (im *alloc) Format() core1_0.Format {
return im.format
}
func (im *alloc) Next(
device device.T,
name string,
width, height int,
) (image.T, bool, error) {
key := fmt.Sprintf("%s-%s", name, im.key)
log.Println("attachment alloc", key)
img, err := image.New2D(
device,
key,
width, height,
im.format, im.usage,
)
return img, true, err
}
func NewImage(key string, format core1_0.Format, usage core1_0.ImageUsageFlags) Image {
return &alloc{
key: key,
format: format,
usage: usage,
}
}
type imageArray struct {
images []image.T
next int
}
func (im *imageArray) Format() core1_0.Format {
return im.images[0].Format()
}
func (im *imageArray) Next(
device device.T,
name string,
width, height int,
) (image.T, bool, error) {
if im.next >= len(im.images) {
return nil, false, ErrArrayExhausted
}
img := im.images[im.next]
im.next++
return img, false, nil
}
func FromImageArray(images []image.T) Image {
return &imageArray{
images: images,
next: 0,
}
}
// FromImage returns an allocator that always returns a reference to the provided image.
func FromImage(img image.T) Image {
return &imageRef{image: img}
}
type imageRef struct {
image image.T
}
func (im *imageRef) Format() core1_0.Format {
return im.image.Format()
}
func (im *imageRef) Next(
device device.T,
name string,
width, height int,
) (image.T, bool, error) {
return im.image, false, nil
}