Jen*_*iss 5 go vulkan validation-layers
我目前正在使用 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)
}
Run Code Online (Sandbox Code Playgroud)
我的 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
}
Run Code Online (Sandbox Code Playgroud)
以及显示可用层的日志
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
Run Code Online (Sandbox Code Playgroud)
VK_LAYER_PATH希望这与缺少环境变量无关。图层概述
尝试下面的 C++ 片段中的简短代码:
std::vector<char*> enabledInstanceExtensions;
enabledInstanceLayers.push_back("VK_LAYER_KHRONOS_validation");
pCreateInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
pCreateInfo.enabledLayerCount = static_cast<uint32_t>(enabledInstanceLayers.size());
pCreateInfo.ppEnabledLayerNames = &enabledInstanceLayers[0];
vkCreateInstance(&pCreateInfo, pAllocator, &pInstance)
Run Code Online (Sandbox Code Playgroud)
请填写pCreateInfo的其他成员并尝试创建实例是否成功。抱歉,我不知道 golang。
| 归档时间: |
|
| 查看次数: |
4164 次 |
| 最近记录: |