zvulkan/zvulkan-go/steps/01_instance_creation/main.go
2023-09-17 21:01:13 +08:00

129 lines
2.8 KiB
Go

package main
import (
"github.com/pkg/errors"
"github.com/veandco/go-sdl2/sdl"
"github.com/vkngwrapper/core/v2"
"github.com/vkngwrapper/core/v2/common"
"github.com/vkngwrapper/core/v2/core1_0"
"github.com/vkngwrapper/extensions/v2/khr_portability_enumeration"
"log"
)
type HelloTriangleApplication struct {
loader core.Loader
window *sdl.Window
instance core1_0.Instance
}
func (app *HelloTriangleApplication) Run() error {
err := app.initWindow()
if err != nil {
return err
}
err = app.initVulkan()
if err != nil {
return err
}
defer app.cleanup()
return app.mainLoop()
}
func (app *HelloTriangleApplication) initWindow() error {
if err := sdl.Init(sdl.INIT_VIDEO); err != nil {
return err
}
window, err := sdl.CreateWindow("Vulkan", sdl.WINDOWPOS_UNDEFINED, sdl.WINDOWPOS_UNDEFINED, 800, 600, sdl.WINDOW_SHOWN|sdl.WINDOW_VULKAN)
if err != nil {
return err
}
app.window = window
app.loader, err = core.CreateSystemLoader()
if err != nil {
return err
}
return nil
}
func (app *HelloTriangleApplication) initVulkan() error {
return app.createInstance()
}
func (app *HelloTriangleApplication) mainLoop() error {
appLoop:
for true {
for event := sdl.PollEvent(); event != nil; event = sdl.PollEvent() {
switch event.(type) {
case *sdl.QuitEvent:
break appLoop
}
}
}
return nil
}
func (app *HelloTriangleApplication) cleanup() {
if app.instance != nil {
app.instance.Destroy(nil)
}
if app.window != nil {
app.window.Destroy()
}
sdl.Quit()
}
func (app *HelloTriangleApplication) createInstance() error {
instanceOptions := core1_0.InstanceCreateInfo{
ApplicationName: "Hello Triangle",
ApplicationVersion: common.CreateVersion(1, 0, 0),
EngineName: "No Engine",
EngineVersion: common.CreateVersion(1, 0, 0),
APIVersion: common.Vulkan1_2,
}
// Add extensions
sdlExtensions := app.window.VulkanGetInstanceExtensions()
extensions, _, err := app.loader.AvailableExtensions()
if err != nil {
return err
}
for _, ext := range sdlExtensions {
_, hasExt := extensions[ext]
if !hasExt {
return errors.Errorf("createinstance: cannot initialize sdl: missing extension %s", ext)
}
instanceOptions.EnabledExtensionNames = append(instanceOptions.EnabledExtensionNames, ext)
}
_, enumerationSupported := extensions[khr_portability_enumeration.ExtensionName]
if enumerationSupported {
instanceOptions.EnabledExtensionNames = append(instanceOptions.EnabledExtensionNames, khr_portability_enumeration.ExtensionName)
instanceOptions.Flags |= khr_portability_enumeration.InstanceCreateEnumeratePortability
}
app.instance, _, err = app.loader.CreateInstance(nil, instanceOptions)
if err != nil {
return err
}
return nil
}
func main() {
app := &HelloTriangleApplication{}
err := app.Run()
if err != nil {
log.Fatalf("%+v\n", err)
}
}