zworld-demo/engine/render/vulkan/instance/instance.go

87 lines
2.1 KiB
Go
Raw Normal View History

2023-12-22 22:04:27 +08:00
package instance
2024-01-08 22:01:42 +08:00
//#cgo LDFLAGS: -LF:/Coding/GoModule/cgo -lvulkan
import "C"
2023-12-22 22:04:27 +08:00
import (
"github.com/vkngwrapper/core/v2"
"github.com/vkngwrapper/core/v2/common"
"github.com/vkngwrapper/core/v2/core1_0"
2024-01-09 00:02:30 +08:00
"github.com/vkngwrapper/extensions/v2/khr_surface"
"github.com/vkngwrapper/extensions/v2/khr_swapchain"
2024-01-08 22:01:42 +08:00
"zworld/engine/window"
2023-12-22 22:04:27 +08:00
)
type T interface {
EnumeratePhysicalDevices() []core1_0.PhysicalDevice
Destroy()
2024-01-09 00:02:30 +08:00
Init() error
2023-12-22 22:04:27 +08:00
Ptr() core1_0.Instance
}
2024-01-08 22:01:42 +08:00
type FLoaderCreate func() *core.VulkanLoader
2023-12-23 18:01:28 +08:00
type FInstance struct {
2024-01-09 00:02:30 +08:00
loader *core.VulkanLoader
win *window.FSDLWindow
ptr core1_0.Instance
surface khr_surface.Surface
physicalDevice core1_0.PhysicalDevice
device core1_0.Device
graphicsQueue core1_0.Queue
presentQueue core1_0.Queue
swapchainExtension khr_swapchain.Extension
swapchain khr_swapchain.Swapchain
swapchainImages []core1_0.Image
swapchainImageFormat core1_0.Format
swapchainExtent core1_0.Extent2D
swapchainImageViews []core1_0.ImageView
swapchainFramebuffers []core1_0.Framebuffer
2023-12-22 22:04:27 +08:00
}
2024-01-08 22:01:42 +08:00
func New(appName string, win *window.FSDLWindow, LoaderCreate FLoaderCreate) T {
loader := LoaderCreate()
instanceOptions := &core1_0.InstanceCreateInfo{
APIVersion: common.APIVersion(common.CreateVersion(1, 1, 0)),
ApplicationName: appName,
ApplicationVersion: common.CreateVersion(0, 1, 0),
2024-01-09 00:02:30 +08:00
EngineName: engineName,
2024-01-08 22:01:42 +08:00
EngineVersion: common.CreateVersion(0, 2, 1),
2023-12-22 22:04:27 +08:00
}
2024-01-09 00:02:30 +08:00
err := help.getCreateInstanceExtension(instanceOptions, loader, win)
if err != nil {
return nil
}
err = help.getCreateInstanceLayer(instanceOptions, loader, win)
if err != nil {
return nil
}
2024-01-08 22:01:42 +08:00
handle, _, err := loader.CreateInstance(nil, *instanceOptions)
2023-12-22 22:04:27 +08:00
if err != nil {
panic(err)
}
2023-12-23 18:01:28 +08:00
return &FInstance{
2024-01-09 00:02:30 +08:00
ptr: handle,
loader: loader,
win: win,
2023-12-22 22:04:27 +08:00
}
}
2024-01-09 00:02:30 +08:00
func (e *FInstance) Ptr() core1_0.Instance {
return e.ptr
2023-12-22 22:04:27 +08:00
}
2024-01-09 00:02:30 +08:00
func (e *FInstance) Destroy() {
e.ptr.Destroy(nil)
e.ptr = nil
2023-12-22 22:04:27 +08:00
}
2024-01-09 00:02:30 +08:00
func (e *FInstance) EnumeratePhysicalDevices() []core1_0.PhysicalDevice {
r, _, err := e.ptr.EnumeratePhysicalDevices()
2023-12-22 22:04:27 +08:00
if err != nil {
panic(err)
}
return r
}