我目前正在使用 golang 学习 vulkan,并且在创建具有验证层的 vulkan 实例时遇到了问题。我正在尝试使用VK_LAYER_KHRONOS_validation
,它在我调用时显示为可用图层EnumerateInstanceLayerProperties
,但是当我将图层名称传递给我的InstanceCreateInfo.PpEnabledLayerNames
, 并调用CreateInstance
时,我得到了ErrorLayerNotPresent
我尝试更改将层传递[]string
给InstanceCreateInfo
结构的方式,并尝试测试以查看使用不同的层是否有效,但我不断遇到相同的错误。
这是我的主要功能
func main() {
logger := initLogger()
logger.Println("initializing glfw window...")
window, err := initWindow()
if err != nil {
fatalError(
"unable to initialize glfw window",
err,
logger,
)
}
vk.SetGetInstanceProcAddr(glfw.GetVulkanGetInstanceProcAddress())
vk.Init()
logger.Println("initializing vulkan instance")
instance, err := initVulkan(window, logger)
if err != nil {
fatalError(
"unable to initialize vulkan instance",
err,
logger,
)
}
mainLoop(window)
cleanup(instance)
}
我的 vulkan 初始化代码
const enableValidationLayers = true
func getValidationLayers() []string {
return []string{
"VK_LAYER_KHRONOS_validation",
}
}
func initVulkan(window *glfw.Window, logger *log.Logger) (vk.Instance, error) {
if enableValidationLayers && !checkValidationLayerSupport(logger) {
return nil, errors.New("validation layer requested but not supported")
}
var appInfo = vk.ApplicationInfo{
SType: vk.StructureTypeApplicationInfo,
PNext: nil,
PApplicationName: "Hello Triangle",
ApplicationVersion: vk.MakeVersion(1, 0, 0),
PEngineName: "No Engine",
EngineVersion: vk.MakeVersion(1, 0, 0),
ApiVersion: vk.ApiVersion10,
}
glfwExtensions := window.GetRequiredInstanceExtensions()
var createInfo = vk.InstanceCreateInfo{
SType: vk.StructureTypeInstanceCreateInfo,
PNext: nil,
Flags: 0,
PApplicationInfo: &appInfo,
EnabledLayerCount: 0,
PpEnabledLayerNames: nil,
EnabledExtensionCount: uint32(len(glfwExtensions)),
PpEnabledExtensionNames: glfwExtensions,
}
layers := getValidationLayers()
if enableValidationLayers {
createInfo.EnabledLayerCount = uint32(len(layers))
createInfo.PpEnabledLayerNames = make([]string, createInfo.EnabledLayerCount)
createInfo.PpEnabledLayerNames = layers
} else {
createInfo.EnabledLayerCount = 0
}
var instance = new(vk.Instance)
if result := vk.CreateInstance(
&createInfo,
nil,
instance,
); result != vk.Success {
switch result {
case vk.ErrorLayerNotPresent:
return nil, errors.New("unable to create vk instance: layer not present")
default:
return nil, fmt.Errorf("unable to create vk instance: %v", result)
}
}
return *instance, nil
}
func checkValidationLayerSupport(logger *log.Logger) bool {
var layerCount uint32
vk.EnumerateInstanceLayerProperties(&layerCount, nil)
var availableLayers = make([]vk.LayerProperties, layerCount)
vk.EnumerateInstanceLayerProperties(&layerCount, availableLayers)
logger.Println("available layers:")
for i := 0; i < int(layerCount); i++ {
availableLayers[i].Deref()
logger.Printf("\t%v\n", readLayerName(availableLayers[i].LayerName))
}
for _, layerName := range getValidationLayers() {
var layerFound bool = false
for i := 0; i < int(layerCount); i++ {
availableLayerName := readLayerName(availableLayers[i].LayerName)
if layerName == availableLayerName {
layerFound = true
break
}
}
if !layerFound {
return false
}
}
return true
}
以及显示可用层的日志
vulkan: main.go:48: initializing glfw window...
vulkan: main.go:61: initializing vulkan instance
vulkan: vulkan.go:81: available layers:
vulkan: vulkan.go:84: VK_LAYER_NV_optimus
vulkan: vulkan.go:84: VK_LAYER_MESA_device_select
vulkan: vulkan.go:84: VK_LAYER_VALVE_steam_fossilize_32
vulkan: vulkan.go:84: VK_LAYER_VALVE_steam_overlay_32
vulkan: vulkan.go:84: VK_LAYER_VALVE_steam_fossilize_64
vulkan: vulkan.go:84: VK_LAYER_VALVE_steam_overlay_64
vulkan: vulkan.go:84: VK_LAYER_LUNARG_gfxreconstruct
vulkan: vulkan.go:84: VK_LAYER_MESA_overlay
vulkan: vulkan.go:84: VK_LAYER_LUNARG_screenshot
vulkan: vulkan.go:84: VK_LAYER_KHRONOS_synchronization2
vulkan: vulkan.go:84: VK_LAYER_LUNARG_device_simulation
vulkan: vulkan.go:84: VK_LAYER_KHRONOS_validation
vulkan: vulkan.go:84: VK_LAYER_LUNARG_monitor
vulkan: vulkan.go:84: VK_LAYER_LUNARG_api_dump
vulkan: main.go:77: unable to initialize vulkan instance:
unable to create vk instance: layer not present