首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Vulkan API调试函数指针类型错误

Vulkan API调试函数指针类型错误
EN

Stack Overflow用户
提问于 2017-03-21 05:47:27
回答 1查看 639关注 0票数 1

在过去的几天里一直困在这个问题上。我正在尝试使用Vulkan的调试层,我成功地获取了PFN_vkCreateDebugReportCallbackEXTPFN_vkDestroyDebugReportCallbackEXT的函数指针。

但是,当创建要用作vkCreateDebugReportCallback参数的结构时,我对结构的pfnCallback部分有问题。

Visual在试图编译时给了我这个错误,并且我尝试了按如下方式进行类型转换:

代码语言:javascript
复制
dbgReportCreateInfo.pfnCallback = (PFN_vkDebugReportCallbackEXT) debugFunction;

代码语言:javascript
复制
dbgReportCreateInfo.pfnCallback = reinterpret_cast<PFN_vkDebugReportCallbackEXT>(debugFunction);

当调用vkCreateDebugReportCallback函数时,这两者都会导致内存访问冲突。

什么应该起作用?

从教科书https://www.packtpub.com/application-development/learning-vulkan和提供的存储库中,结构的PFN_vkDebugReportCallbackEXT pfn部分的正确声明应该如它们的存储库这里所示。

代码语言:javascript
复制
VKAPI_ATTR VkBool32 VKAPI_CALL debugFunction(
    VkFlags                    msgFlags, 
    VkDebugReportObjectTypeEXT objType, 
    uint64_t                   srcObject, 
    size_t                     location, 
    uint32_t                   msgCode, 
    const char *               layerPrefix, 
    const char *               msg, 
    void *                     userData);

Vulkan头文件

,这与Vulkan头文件中的定义相同,即vulkan.h。

代码语言:javascript
复制
typdef uint32_t VkBool32;

typedef VkBool32 (VKAPI_PTR *PFN_vkDebugReportCallbackEXT)(
    VkDebugReportFlagsEXT                       flags,
    VkDebugReportObjectTypeEXT                  objectType,
    uint64_t                                    object,
    size_t                                      location,
    int32_t                                     messageCode,
    const char*                                 pLayerPrefix,
    const char*                                 pMessage,
    void*                                       pUserData);


typedef struct VkDebugReportCallbackCreateInfoEXT {
    VkStructureType                 sType;
    const void*                     pNext;
    VkDebugReportFlagsEXT           flags;
    PFN_vkDebugReportCallbackEXT    pfnCallback;
    void*                           pUserData;
} VkDebugReportCallbackCreateInfoEXT;

错误

严重程度代码描述项目文件行源抑制状态错误C2440 '=':无法从'VkBool32 (__cdecl *)(VkDebugReportFlagsEXT、VkDebugReportObjectTypeEXT、uint64_t、std::size_t、uint32_t、const char *、const char *、void *‘)转换为'PFN_vkDebugReportCallbackEXT’vulkanproject VkBool32 287构建

我的代码

完整的项目可在我的Github 存储库中获得

VulkanLayerAndExtension.h

代码语言:javascript
复制
class VulkanLayerAndExtension {
    // Some stuff before
    VkResult createDebugReportCallback();
    void destroyDebugReportCallback();
    static VKAPI_ATTR VkBool32 VKAPI_CALL debugFunction(VkDebugReportFlagsEXT msgFlags,
        VkDebugReportObjectTypeEXT objType,
        uint64_t srcObject,
        size_t location,
        uint32_t msgCode,
        const char * layerPrefix,
        const char * msg,
        void * userData);

private:
    PFN_vkCreateDebugReportCallbackEXT dbgCreateDebugReportCallback;
    PFN_vkDestroyDebugReportCallbackEXT dbgDestroyDebugReportCallback;
    VkDebugReportCallbackEXT debugReportCallback;
public:
    VkDebugReportCallbackCreateInfoEXT dbgReportCreateInfo = {};

VulkanLayerAndExtension.cpp

代码语言:javascript
复制
// stuff before

VKAPI_ATTR VkBool32 VKAPI_CALL
VulkanLayerAndExtension::debugFunction(VkDebugReportFlagsEXT msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject, size_t location, uint32_t msgCode, const char * layerPrefix, const char * msg, void * userData)
{
    std::cout << "[VK_DEBUG_REPORT] ";
    if (msgFlags & VK_DEBUG_REPORT_ERROR_BIT_EXT) {
        std::cout << "ERROR";
    }
    else if (msgFlags & VK_DEBUG_REPORT_WARNING_BIT_EXT) {
        std::cout << "WARNING";
    }
    else if (msgFlags & VK_DEBUG_REPORT_INFORMATION_BIT_EXT) {
        std::cout << "INFORMATION";
    }
    else if (msgFlags & VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT) {
        std::cout << "PERFORMANCE";
    }
    else if (msgFlags & VK_DEBUG_REPORT_DEBUG_BIT_EXT) {
        std::cout << "DEBUG";
    }
    else {
        return VK_FALSE;
    }
    std::cout << ": [" << layerPrefix << "] Code" << msgCode << ":" << msg << std::endl;
    return VK_TRUE;
}

VkResult VulkanLayerAndExtension::createDebugReportCallback()
{
    VkResult result;

    VulkanApplication * appObj = VulkanApplication::GetInstance();
    VkInstance* instance = &appObj->instanceObj.instance;

    // Get vkCreateDebugReportCallbackEXT API
    dbgCreateDebugReportCallback = (PFN_vkCreateDebugReportCallbackEXT) vkGetInstanceProcAddr(*instance, "vkCreateDebugReportCallbackEXT");
    if (!dbgCreateDebugReportCallback) {
        std::cout << "Error: GetInstanceProcAddr unable to locate vkCreateDebugReportCallbackEXT function.\n";
        return VK_ERROR_INITIALIZATION_FAILED;
    }
    std::cout << "GetInstanceProcAddr loaded dbgCreateDebugReportCallback function.\n";

    // Get vkDestroyDebugReportCallbackEXT API
    dbgDestroyDebugReportCallback = (PFN_vkDestroyDebugReportCallbackEXT)vkGetInstanceProcAddr(*instance, "vkDestroyDebugReportCallbackEXT");
    if (!dbgDestroyDebugReportCallback) {
        std::cout << "Error: GetInstanceProcAddr unable to locate vkDestroyDebugReportCallbackEXT function.\n";
        return VK_ERROR_INITIALIZATION_FAILED;
    }
    std::cout << "GetInstanceProcAddr loaded dbgDestroyDebugReportCallback function.\n";

    dbgReportCreateInfo.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT;
    // Type error occurs on this line below
    dbgReportCreateInfo.pfnCallback =   VulkanLayerAndExtension::debugFunction;
    dbgReportCreateInfo.pUserData =     NULL;
    dbgReportCreateInfo.pNext =         NULL;
    dbgReportCreateInfo.flags =         VK_DEBUG_REPORT_WARNING_BIT_EXT |
                                        VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT |
                                        VK_DEBUG_REPORT_ERROR_BIT_EXT |
                                        VK_DEBUG_REPORT_DEBUG_BIT_EXT;

    // Create the debug report callback object
    result = dbgCreateDebugReportCallback(*instance, &dbgReportCreateInfo, NULL, &debugReportCallback);
    if (result == VK_SUCCESS) {
        std::cout << "Debug report callback object created successfully.\n";
    }

    return result;
}

void VulkanLayerAndExtension::destroyDebugReportCallback()
{
    VulkanApplication * appObj = VulkanApplication::GetInstance();
    VkInstance & instance = appObj->instanceObj.instance;
    if (debugReportCallback) {
        dbgDestroyDebugReportCallback(instance, debugReportCallback, NULL);
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-21 13:04:35

你为什么要选这个函数??你不应该!函数已经必须是必需的类型。

我还在我的示例项目中以编程方式进行调试,并且它可以工作,因此让我们在这里进行比较:

代码语言:javascript
复制
VKAPI_ATTR VkBool32 VKAPI_CALL genericDebugCallback(
    VkDebugReportFlagsEXT msgFlags,
    VkDebugReportObjectTypeEXT objType,
    uint64_t srcObject,
    size_t /*location*/,
    int32_t msgCode,
    const char* pLayerPrefix,
    const char* pMsg,
    void* /*pUserData*/
){
    // just print everything
    return VK_FALSE;
}

//// elsewhere
VkDebugReportCallbackCreateInfoEXT debugCreateInfo{
    VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT,
    nullptr,
    debugAmount,
    genericDebugCallback,
    nullptr
};

VkDebugReportCallbackEXT debug;
VkResult errorCode = vkCreateDebugReportCallbackEXT( instance, &debugCreateInfo, nullptr, &debug );
RESULT_HANDLER( errorCode, "vkCreateDebugReportCallbackEXT" );

因此,扫描您的代码--我看到了以下问题:

  1. 你是铸造函数类型。
  2. PFN_vkDebugReportCallbackEXT::msgCodeint32_t而不是uint32_t
  3. 您可能不应该从回调返回VK_TRUE,除非您知道自己在做什么。
  4. 为什么会有*instanceVkInstance&??这没有任何意义。是把手。直接使用VkInstance;没有指针,没有取消引用,也不需要引用。
  5. dbgReportCreateInfo.flags,你真的想要VK_DEBUG_REPORT_DEBUG_BIT_EXT吗?考虑到你也不接受INFO,这是一个奇怪的选择。

1和2应该可以解决你眼前的问题。

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

https://stackoverflow.com/questions/42919301

复制
相关文章

相似问题

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