首页 > 解决方案 > Vulkan VK_ERROR_LAYER_NOT_PRESENT

问题描述

我目前正在使用 golang 学习 vulkan,并且在创建具有验证层的 vulkan 实例时遇到了问题。我正在尝试使用VK_LAYER_KHRONOS_validation,它在我调用时显示为可用图层EnumerateInstanceLayerProperties,但是当我将图层名称传递给我的InstanceCreateInfo.PpEnabledLayerNames, 并调用CreateInstance时,我得到了ErrorLayerNotPresent

我尝试更改将层传递[]stringInstanceCreateInfo结构的方式,并尝试测试以查看使用不同的层是否有效,但我不断遇到相同的错误。

这是我的主要功能

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

标签: govulkanvalidation-layers

解决方案


希望这与缺少VK_LAYER_PATHenv var 无关。图层概述

试试下面的 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)

请填写 pCreateInfo 的其他成员并尝试创建实例是否有效。对不起,我不知道 golang。


推荐阅读