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) } }