From 2296cda4b5e7fe4ae6544cbef565c005986e520d Mon Sep 17 00:00:00 2001 From: ouczbs Date: Mon, 8 Jan 2024 22:01:42 +0800 Subject: [PATCH] create instance --- cmd/main.go | 14 +++-- engine/render/vulkan/instance/ext_windows.go | 1 + engine/render/vulkan/instance/instance.go | 33 +++++------ engine/render/vulkan/instance/type.go | 5 ++ engine/render/vulkan/instance/vulkan_help.go | 58 ++++++++++++++++++++ engine/window/sdl.go | 20 +++++++ 6 files changed, 111 insertions(+), 20 deletions(-) create mode 100644 engine/render/vulkan/instance/type.go create mode 100644 engine/render/vulkan/instance/vulkan_help.go diff --git a/cmd/main.go b/cmd/main.go index 74e3077..689663f 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -5,6 +5,7 @@ import ( "zworld/engine/core/zlog" "zworld/engine/render/vulkan/instance" "zworld/engine/rule" + "zworld/engine/window" "zworld/plugin/objloader" ) @@ -13,11 +14,16 @@ func main() { engine.FTimeRuleOption(&rule.FTimeRule{}), engine.FActorRuleOption(&rule.FActorRule{}), engine.FRenderRuleOption(&rule.FRenderRule{})) + err, mesh := objloader.LoadObj("asset/model/sphere.obj") + zlog.Infof("err", err, len(mesh.Positions)) + win := window.NewSDLWindow(640, 720) + err = win.CreateWindow() + if err != nil { + zlog.Infof("err", err) + } + vulkan := instance.New("test", win, window.CreateLoaderFromSDL) + vulkan.EnumeratePhysicalDevices() for i := 1; i < 100; i++ { w.Tick() } - err, mesh := objloader.LoadObj("asset/model/sphere.obj") - zlog.Infof("err", err, len(mesh.Positions)) - vulkan := instance.New("test") - vulkan.EnumeratePhysicalDevices() } diff --git a/engine/render/vulkan/instance/ext_windows.go b/engine/render/vulkan/instance/ext_windows.go index 3ed00f0..b9d5645 100644 --- a/engine/render/vulkan/instance/ext_windows.go +++ b/engine/render/vulkan/instance/ext_windows.go @@ -6,6 +6,7 @@ import ( "github.com/vkngwrapper/extensions/v2/khr_surface" ) +var validationLayers = []string{"VK_LAYER_KHRONOS_validation"} var extensions = []string{ khr_surface.ExtensionName, ext_debug_utils.ExtensionName, diff --git a/engine/render/vulkan/instance/instance.go b/engine/render/vulkan/instance/instance.go index 51b43ae..bd9040e 100644 --- a/engine/render/vulkan/instance/instance.go +++ b/engine/render/vulkan/instance/instance.go @@ -1,10 +1,13 @@ package instance +//#cgo LDFLAGS: -LF:/Coding/GoModule/cgo -lvulkan +import "C" + import ( - "github.com/go-gl/glfw/v3.3/glfw" "github.com/vkngwrapper/core/v2" "github.com/vkngwrapper/core/v2/common" "github.com/vkngwrapper/core/v2/core1_0" + "zworld/engine/window" ) var ( @@ -20,25 +23,23 @@ type T interface { Destroy() Ptr() core1_0.Instance } - +type FLoaderCreate func() *core.VulkanLoader type FInstance struct { - ptr core1_0.Instance + loader *core.VulkanLoader + ptr core1_0.Instance } -func New(appName string) T { - loader, err := core.CreateLoaderFromProcAddr(glfw.GetVulkanGetInstanceProcAddress()) - if err != nil { - panic(err) +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), + EngineName: "goworld", + EngineVersion: common.CreateVersion(0, 2, 1), } - handle, _, err := loader.CreateInstance(nil, core1_0.InstanceCreateInfo{ - APIVersion: common.APIVersion(common.CreateVersion(1, 1, 0)), - ApplicationName: appName, - ApplicationVersion: common.CreateVersion(0, 1, 0), - EngineName: "goworld", - EngineVersion: common.CreateVersion(0, 2, 1), - EnabledLayerNames: layers, - EnabledExtensionNames: extensions, - }) + help.getCreateInstanceExtension(instanceOptions, loader, win) + handle, _, err := loader.CreateInstance(nil, *instanceOptions) if err != nil { panic(err) } diff --git a/engine/render/vulkan/instance/type.go b/engine/render/vulkan/instance/type.go new file mode 100644 index 0000000..2d6dd43 --- /dev/null +++ b/engine/render/vulkan/instance/type.go @@ -0,0 +1,5 @@ +package instance + +const enableValidationLayers = true + +var help FVulkanHelp diff --git a/engine/render/vulkan/instance/vulkan_help.go b/engine/render/vulkan/instance/vulkan_help.go new file mode 100644 index 0000000..0d80c87 --- /dev/null +++ b/engine/render/vulkan/instance/vulkan_help.go @@ -0,0 +1,58 @@ +package instance + +import ( + "github.com/vkngwrapper/core/v2" + "github.com/vkngwrapper/core/v2/core1_0" + "github.com/vkngwrapper/extensions/v2/ext_debug_utils" + "github.com/vkngwrapper/extensions/v2/khr_portability_enumeration" + "zworld/engine/window" +) + +type FVulkanHelp struct{} + +func (h *FVulkanHelp) getCreateInstanceExtension(instanceOptions *core1_0.InstanceCreateInfo, loader *core.VulkanLoader, win *window.FSDLWindow) error { + // Add extensions + sdlExtensions := win.GetInstance().VulkanGetInstanceExtensions() + extensions, _, err := loader.AvailableExtensions() + if err != nil { + return err + } + + for _, ext := range sdlExtensions { + _, hasExt := extensions[ext] + if !hasExt { + return nil + } + instanceOptions.EnabledExtensionNames = append(instanceOptions.EnabledExtensionNames, ext) + } + + if enableValidationLayers { + instanceOptions.EnabledExtensionNames = append(instanceOptions.EnabledExtensionNames, ext_debug_utils.ExtensionName) + } + + _, enumerationSupported := extensions[khr_portability_enumeration.ExtensionName] + if enumerationSupported { + instanceOptions.EnabledExtensionNames = append(instanceOptions.EnabledExtensionNames, khr_portability_enumeration.ExtensionName) + instanceOptions.Flags |= khr_portability_enumeration.InstanceCreateEnumeratePortability + } + return nil +} + +func (h *FVulkanHelp) getCreateInstanceLayer(instanceOptions *core1_0.InstanceCreateInfo, loader *core.VulkanLoader, win *window.FSDLWindow) error { + // Add extensions + layers, _, err := loader.AvailableLayers() + if err != nil { + return err + } + + if enableValidationLayers { + for _, layer := range validationLayers { + _, hasValidation := layers[layer] + if !hasValidation { + return nil + } + instanceOptions.EnabledLayerNames = append(instanceOptions.EnabledLayerNames, layer) + } + } + return nil +} diff --git a/engine/window/sdl.go b/engine/window/sdl.go index cc6814a..b9f9e73 100644 --- a/engine/window/sdl.go +++ b/engine/window/sdl.go @@ -1,5 +1,9 @@ package window +//#cgo CFLAGS: -IF:/Coding/GoModule/cgo +//#cgo LDFLAGS: -LF:/Coding/GoModule/cgo -lsdl2 +// +import "C" import ( "github.com/veandco/go-sdl2/sdl" "github.com/vkngwrapper/core/v2" @@ -12,6 +16,19 @@ type FSDLWindow struct { height int32 } +func NewSDLWindow(width, height int32) *FSDLWindow { + return &FSDLWindow{ + width: width, + height: height, + } +} +func CreateLoaderFromSDL() *core.VulkanLoader { + loader, err := core.CreateLoaderFromProcAddr(sdl.VulkanGetVkGetInstanceProcAddr()) + if err != nil { + panic(err) + } + return loader +} func (w *FSDLWindow) CreateWindow() error { if err := sdl.Init(sdl.INIT_VIDEO); err != nil { return err @@ -23,3 +40,6 @@ func (w *FSDLWindow) CreateWindow() error { w.window = window return nil } +func (w *FSDLWindow) GetInstance() *sdl.Window { + return w.window +}