首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Vulkan VK_ERROR_LAYER_NOT_PRESENT

Vulkan VK_ERROR_LAYER_NOT_PRESENT
EN

Stack Overflow用户
提问于 2021-03-30 03:41:12
回答 1查看 598关注 0票数 1

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

我已经尝试改变将层[]string传递给InstanceCreateInfo结构的方式,并尝试测试使用不同的层是否可以工作,但我总是遇到相同的错误。

下面是我的main函数

代码语言:javascript
复制
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初始化代码

代码语言:javascript
复制
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
}

以及显示可用图层的日志

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2021-03-31 13:34:39

希望这与缺少VK_LAYER_PATH环境变量无关。Layers Overview

尝试以下C++代码片段中的简短代码:

代码语言:javascript
复制
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的其他成员,并尝试创建实例是否正常。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66860612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档