111 lines
2.7 KiB
Go
111 lines
2.7 KiB
Go
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) {
|
|
|
|
}
|