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
|
2024-01-09 21:43:28 +08:00
|
|
|
DrawFrame() error
|
2023-12-22 22:04:27 +08:00
|
|
|
Ptr() core1_0.Instance
|
2024-01-09 21:43:28 +08:00
|
|
|
WaitIdle() (common.VkResult, error)
|
2023-12-22 22:04:27 +08:00
|
|
|
}
|
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
|
2024-01-09 21:43:28 +08:00
|
|
|
|
|
|
|
|
renderPass core1_0.RenderPass
|
|
|
|
|
pipelineLayout core1_0.PipelineLayout
|
|
|
|
|
graphicsPipeline core1_0.Pipeline
|
|
|
|
|
|
|
|
|
|
commandPool core1_0.CommandPool
|
|
|
|
|
commandBuffers []core1_0.CommandBuffer
|
|
|
|
|
|
|
|
|
|
imageAvailableSemaphore []core1_0.Semaphore
|
|
|
|
|
renderFinishedSemaphore []core1_0.Semaphore
|
|
|
|
|
inFlightFence []core1_0.Fence
|
|
|
|
|
imagesInFlight []core1_0.Fence
|
|
|
|
|
currentFrame int
|
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
|
|
|
|
|
}
|
2024-01-09 21:43:28 +08:00
|
|
|
func (e *FInstance) WaitIdle() (common.VkResult, error) {
|
|
|
|
|
return e.device.WaitIdle()
|
|
|
|
|
}
|
|
|
|
|
func (e *FInstance) DrawFrame() error {
|
|
|
|
|
fences := []core1_0.Fence{e.inFlightFence[e.currentFrame]}
|
|
|
|
|
|
|
|
|
|
_, err := e.device.WaitForFences(true, common.NoTimeout, fences)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
imageIndex, _, err := e.swapchain.AcquireNextImage(common.NoTimeout, e.imageAvailableSemaphore[e.currentFrame], nil)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if e.imagesInFlight[imageIndex] != nil {
|
|
|
|
|
_, err := e.device.WaitForFences(true, common.NoTimeout, []core1_0.Fence{e.imagesInFlight[imageIndex]})
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
e.imagesInFlight[imageIndex] = e.inFlightFence[e.currentFrame]
|
|
|
|
|
|
|
|
|
|
_, err = e.device.ResetFences(fences)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_, err = e.graphicsQueue.Submit(e.inFlightFence[e.currentFrame], []core1_0.SubmitInfo{
|
|
|
|
|
{
|
|
|
|
|
WaitSemaphores: []core1_0.Semaphore{e.imageAvailableSemaphore[e.currentFrame]},
|
|
|
|
|
WaitDstStageMask: []core1_0.PipelineStageFlags{core1_0.PipelineStageColorAttachmentOutput},
|
|
|
|
|
CommandBuffers: []core1_0.CommandBuffer{e.commandBuffers[imageIndex]},
|
|
|
|
|
SignalSemaphores: []core1_0.Semaphore{e.renderFinishedSemaphore[e.currentFrame]},
|
|
|
|
|
},
|
|
|
|
|
})
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_, err = e.swapchainExtension.QueuePresent(e.presentQueue, khr_swapchain.PresentInfo{
|
|
|
|
|
WaitSemaphores: []core1_0.Semaphore{e.renderFinishedSemaphore[e.currentFrame]},
|
|
|
|
|
Swapchains: []khr_swapchain.Swapchain{e.swapchain},
|
|
|
|
|
ImageIndices: []int{imageIndex},
|
|
|
|
|
})
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
e.currentFrame = (e.currentFrame + 1) % MaxFramesInFlight
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|