我使用vulkan-go绑定来使用vulkan。我成功地枚举了验证层,并确认VK_LAYER_KHRONOS_validation在该列表中。然后我将其作为验证层(也是唯一的验证层)传递给我的create示例调用。它返回VK_ERROR_LAYER_NOT_PRESENT。
我已经验证了我的注册表是正确的,所有的层都有正确的条目。我已经验证了条目中的文件存在。我在写这篇文章的时候使用的是LunarG的最新SDK(1.1.114.0)我正在使用vulkan-go的go绑定,但这似乎不是问题,因为它是对C的调用,返回错误,错误是一个vulkan响应代码。也发生在枚举层属性中返回的任何其他层扩展工作正常,使用相同的枚举策略等
枚举(输出12层,包括问题中提到的一层):
// FindAvailableInstanceValidationLayers returns a list of available validation layers on your device
func (vkctx *VulkanContext) FindAvailableInstanceValidationLayers() ([]string, error) {
var count uint32
if res := vk.EnumerateInstanceLayerProperties(&count, nil); res != vk.Success {
dbg.Error("Failed to get instance validation layer count!")
return nil, errors.New("failed to get instance validation layer count")
}
properties := make([]vk.LayerProperties, count, count)
if res := vk.EnumerateInstanceLayerProperties(&count, properties); res != vk.Success {
dbg.Error("Failed to enumerate instance validation layers!")
return nil, errors.New("failed to get instance validation layer count")
}
var layers []string
for _, prop := range properties {
prop.Deref()
name := string(bytes.Trim(prop.LayerName[:], "\x00"))
layers = append(layers, name)
}
return layers, nil
}
// returns => [VK_LAYER_NV_optimus VK_LAYER_VALVE_steam_overlay VK_LAYER_VALVE_steam_fossilize VK_LAYER_LUNARG_api_dump VK_LAYER_LUNARG_assistant_layer VK_LAYER_LUNARG_core_validation VK_LAYER_LUNARG_device_simulation VK_LAYER_KHRONOS_validation VK_LAYER_LUNARG_monitor VK_LAYER_LUNARG_object_tracker VK_LAYER_LUNARG_screenshot VK_LAYER_LUNARG_standard_validation VK_LAYER_LUNARG_parameter_validation VK_LAYER_GOOGLE_threading VK_LAYER_GOOGLE_unique_objects VK_LAYER_LUNARG_vktrace]
字符串
创建示例调用:
// declare app info
appinfo := &vk.ApplicationInfo{
SType: vk.StructureTypeApplicationInfo,
PApplicationName: "Stack Overflow Example",
ApplicationVersion: vk.MakeVersion(1, 0, 0),
PEngineName: "no engine",
EngineVersion: vk.MakeVersion(1, 0, 0),
ApiVersion: vk.ApiVersion11,
}
// declare create info (supported layers contains correct string)
createinfo := &vk.InstanceCreateInfo{
SType: vk.StructureTypeInstanceCreateInfo,
PApplicationInfo: appinfo,
EnabledExtensionCount: uint32(2),
PpEnabledExtensionNames: []string{ "VK_KHR_surface", "VK_KHR_win32_surface" },
EnabledLayerCount: uint32(1),
PpEnabledLayerNames: []string{ "VK_LAYER_KHRONOS_validation" },
}
// create the instance
inst := new(vk.Instance)
if result := vk.CreateInstance(createinfo, nil, inst); result != vk.Success {
// result => vk.ErrorLayerNotPresent
dbg.Error("Failed to create vulkan instance!")
return nil, errors.New("vulkan instance creation failed")
}
型
我希望你能通过(或由于其他原因失败),而是进入if语句,并将“result”变量设置为VK_ERROR_LAYER_NOT_PRESENT。它使用可用层列表中的相同字符串,所以毫无疑问是一样的。这是唯一的一层。如果我用其他层(比如说VK_LAYER_LUNARG_core_validation),那么它将得到相同的结果。无论枚举中列出的层是什么。
2条答案
按热度按时间f8rj6qna1#
今天我自己也遇到了同样的问题,由于这是Google中这个问题的顶级结果,没有提供答案,我将分享我的发现。
Vulkan希望在ppEnabledLayerNames和ppEnabledExtensionNames(以及一般情况下)中提供给它的字符串都以null结尾,这在使用vulkan-go时目前必须手动完成。
在您的代码示例中,您通过使用以下命令从Vulkan提供的字符串中删除所有NULL字节,从而隐藏了问题
字符串
值得一提的是,vulkan-go提供了一个函数来进行上述转换,ToString(),但它也有同样的问题。如果你想在使用String Instance或类似的方法之前测试字符串,你必须保留至少一个NULL字节:
型
或者简单地比较没有null终止符的字符串,然后记住在比较后添加它。
fae0ux8s2#
我刚刚在Linux(我的应用程序是C++)上遇到了这个奇怪的错误,层是
1.3.261.1
。问题是dlopen无法加载
libVkLayer_khronos_validation.so
,因为没有定义pthread_create
。解决办法很简单:
字符串
这就解决了问题