我进入了Vulkan,偶然发现了我的第一个问题。当尝试创建调试报告回调(验证层和调试扩展在我的英特尔hd驱动程序上可用,至少它这么说),它无法告诉我vkCreateDebugReportCallbackEXT是一个未解决的符号。当尝试获取函数指针时,它失败了,告诉我vkCreateDebugReportCallbackEXT已经定义了。
这就是,在Vulkan的头版。我可以设置VK_NO_PROTOTYPES,但是那样的话,我就必须手工加载所有的东西。有办法绕道吗?仅仅为函数指针使用不同的名称是行不通的,因为我使用的是Vulkan,它使用的是vkCreateDebugReportCallbackEXT。这是一个驱动程序错误,告诉我调试扩展是可用的,但没有吗?
顺便说一下,我在使用VS2015。
谢谢你的帮助
发布于 2016-08-23 18:47:07
这很正常。vulkan.h将它们定义为全局函数。但是加载程序命令显然返回函数指针。
通常你只会用另一个你喜欢的名字。但我也喜欢有规范的名字..。
我通过自己定义函数(使用来自vulkan.h的声明)来解决这个问题,然后调用加载的指针:
VKAPI_ATTR VkResult VKAPI_CALL vkCommandEXT( /*...*/ ){
return fpCommandEXT( /*...*/ );
}(无耻的自我推销)像这样:
Triangle/blob/8227220/ErrorHandling.h#L181
我在第一次使用时命令自动加载--如果您不喜欢,在旧的提交中,我有更传统的加载程序:
Triangle/blob/699ab57/HelloTriangle.cpp#L731
PS:
Khronos自己刚刚添加了加载程序代码,很好地说明了这一点:
如果您处理多个VkInstance或VkDevices,则必须将加载的函数分派到正确的实例或设备。例如,我在这里这样做(可能效率很低):
发布于 2021-04-01 12:39:49
我也有同样的问题,无法找到解决办法,所以我用这种方式解决了(可能是错的,但我只是想分享一下,以防它会帮助到别人)
struct DebugDispatch {
//KHRONOS
PFN_vkCreateDebugReportCallbackEXT vkCreateDebugReportCallbackEXT = 0;
PFN_vkDestroyDebugReportCallbackEXT vkDestroyDebugReportCallbackEXT = 0;
//LUNARG
PFN_vkCreateDebugUtilsMessengerEXT vkCreateDebugUtilsMessengerEXT = 0;
PFN_vkDestroyDebugUtilsMessengerEXT vkDestroyDebugUtilsMessengerEXT = 0;
}
VKAPI_ATTR vk::Bool32 VKAPI_CALL debugReportCallback(...){...}
VKAPI_ATTR vk::Bool32 VKAPI_CALL debugUtilsMessengerCallback(...){...}
enum class ValidationFlagsBits : unsigned int {
NONE = 0,
KHRONOS = 1,
LUNARG = 1 << 1
};
typedef vk::Flags<ValidationFlagsBits> ValidationFlags;
void Example(){
...
vk::Instance instance;
instance = vk::createInstance(...);
DebugDispatch debug_dispatch;
vk::DebugReportCallbackEXT debug_report_callback;
vk::DebugUtilsMessengerEXT debug_utils_messenger;
if(validation_flags & ValidationFlagsBits::KHRONOS){
debug_dispatch.vkCreateDebugReportCallbackEXT =
(PFN_vkCreateDebugReportCallbackEXT)instance.getProcAddr("vkCreateDebugReportCallbackEXT");
debug_dispatch.vkDestroyDebugReportCallbackEXT =
(PFN_vkDestroyDebugReportCallbackEXT)instance.getProcAddr("vkDestroyDebugReportCallbackEXT");
vk::DebugUtilsMessengerCreateInfoEXT create_info{};
create_info.messageSeverity = ...;
create_info.messageType = ...;
create_info.pfnUserCallback = reinterpret_cast<PFN_vkDebugUtilsMessengerCallbackEXT>(&debugUtilsMessengerCallback);
debug_utils_messenger = instance.createDebugUtilsMessengerEXT(create_info, nullptr, debug_dispatch);
}
if(validation_flags & ValidationFlagsBits::LUNARG){
debug_dispatch.vkCreateDebugUtilsMessengerEXT =
(PFN_vkCreateDebugUtilsMessengerEXT)instance.getProcAddr("vkCreateDebugUtilsMessengerEXT");
debug_dispatch.vkDestroyDebugUtilsMessengerEXT =
(PFN_vkDestroyDebugUtilsMessengerEXT)instance.getProcAddr("vkDestroyDebugUtilsMessengerEXT");
vk::DebugReportCallbackCreateInfoEXT create_info{};
create_info.flags = ...;
create_info.pfnCallback = reinterpret_cast<PFN_vkDebugReportCallbackEXT>(&debugReportCallback);
debug_report_callback = instance.createDebugReportCallbackEXT(create_info, nullptr, debug_dispatch);
}
...
if(validation_flags & ValidationFlagsBits::KHRONOS){
instance.destroyDebugUtilsMessengerEXT(debug_utils_messenger, nullptr, debug_dispatch);
}
if(validation_flags & ValidationFlagsBits::LUNARG){
instance.destroyDebugReportCallbackEXT(debug_report_callback, nullptr, debug_dispatch);
}
instance.destroy();
}https://stackoverflow.com/questions/39106564
复制相似问题