package vulkan import ( "fmt" "zworld/engine/renderapi/command" "zworld/engine/renderapi/device" "zworld/engine/renderapi/image" "zworld/engine/renderapi/swapchain" "github.com/vkngwrapper/core/v2/core1_0" ) // the renderapi target interfaces & implementations probably dont belong in this package long-term type TargetSize struct { Width int Height int Frames int Scale float32 } type Target interface { Size() TargetSize Scale() float32 Width() int Height() int Frames() int Surfaces() []image.T SurfaceFormat() core1_0.Format Aquire() (*swapchain.Context, error) Present(command.Worker, *swapchain.Context) Destroy() } type renderTarget struct { size TargetSize format core1_0.Format usage core1_0.ImageUsageFlags surfaces []image.T context *swapchain.Context } func NewDepthTarget(device device.T, key string, size TargetSize) Target { format := device.GetDepthFormat() usage := core1_0.ImageUsageSampled | core1_0.ImageUsageDepthStencilAttachment | core1_0.ImageUsageInputAttachment target, err := NewRenderTarget(device, key, format, usage, size) if err != nil { panic(err) } return target } func NewColorTarget(device device.T, key string, format core1_0.Format, size TargetSize) Target { usage := core1_0.ImageUsageSampled | core1_0.ImageUsageColorAttachment | core1_0.ImageUsageInputAttachment | core1_0.ImageUsageTransferSrc target, err := NewRenderTarget(device, key, format, usage, size) if err != nil { panic(err) } return target } func NewRenderTarget(device device.T, key string, format core1_0.Format, usage core1_0.ImageUsageFlags, size TargetSize) (Target, error) { var err error outputs := make([]image.T, size.Frames) for i := 0; i < size.Frames; i++ { outputs[i], err = image.New2D(device, fmt.Sprintf("%s:%d", key, i), size.Width, size.Height, format, usage) if err != nil { return nil, err } } return &renderTarget{ size: size, format: format, usage: usage, surfaces: outputs, context: swapchain.DummyContext(), }, nil } func (r *renderTarget) Frames() int { return len(r.surfaces) } func (r *renderTarget) Width() int { return r.size.Width } func (r *renderTarget) Height() int { return r.size.Height } func (r *renderTarget) Scale() float32 { return r.size.Scale } func (r *renderTarget) Size() TargetSize { return r.size } func (r *renderTarget) Destroy() { for _, output := range r.surfaces { output.Destroy() } r.surfaces = nil } func (i *renderTarget) Surfaces() []image.T { return i.surfaces } func (i *renderTarget) SurfaceFormat() core1_0.Format { return i.format } func (i *renderTarget) Aquire() (*swapchain.Context, error) { i.context.Aquire() return i.context, nil } func (b *renderTarget) Present(command.Worker, *swapchain.Context) { }