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

Vulkan负载vkCreateDebugReportCallbackEXT
EN

Stack Overflow用户
提问于 2016-08-23 16:38:30
回答 2查看 2.9K关注 0票数 3

我进入了Vulkan,偶然发现了我的第一个问题。当尝试创建调试报告回调(验证层和调试扩展在我的英特尔hd驱动程序上可用,至少它这么说),它无法告诉我vkCreateDebugReportCallbackEXT是一个未解决的符号。当尝试获取函数指针时,它失败了,告诉我vkCreateDebugReportCallbackEXT已经定义了。

这就是,在Vulkan的头版。我可以设置VK_NO_PROTOTYPES,但是那样的话,我就必须手工加载所有的东西。有办法绕道吗?仅仅为函数指针使用不同的名称是行不通的,因为我使用的是Vulkan,它使用的是vkCreateDebugReportCallbackEXT。这是一个驱动程序错误,告诉我调试扩展是可用的,但没有吗?

顺便说一下,我在使用VS2015。

谢谢你的帮助

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-23 18:47:07

这很正常。vulkan.h将它们定义为全局函数。但是加载程序命令显然返回函数指针

通常你只会用另一个你喜欢的名字。但我也喜欢有规范的名字..。

我通过自己定义函数(使用来自vulkan.h的声明)来解决这个问题,然后调用加载的指针:

代码语言:javascript
复制
VKAPI_ATTR VkResult VKAPI_CALL vkCommandEXT( /*...*/ ){
    return fpCommandEXT( /*...*/ );
}

(无耻的自我推销)像这样:

Triangle/blob/8227220/ErrorHandling.h#L181

我在第一次使用时命令自动加载--如果您不喜欢,在旧的提交中,我有更传统的加载程序:

Triangle/blob/699ab57/HelloTriangle.cpp#L731

PS:

Khronos自己刚刚添加了加载程序代码,很好地说明了这一点:

ext.c

如果您处理多个VkInstanceVkDevices,则必须将加载的函数分派到正确的实例或设备。例如,我在这里这样做(可能效率很低):

Triangle/blob/a691de5/ExtensionLoader.h

票数 4
EN

Stack Overflow用户

发布于 2021-04-01 12:39:49

我也有同样的问题,无法找到解决办法,所以我用这种方式解决了(可能是错的,但我只是想分享一下,以防它会帮助到别人)

代码语言:javascript
复制
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();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39106564

复制
相关文章

相似问题

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