在过去的几天里一直困在这个问题上。我正在尝试使用Vulkan的调试层,我成功地获取了PFN_vkCreateDebugReportCallbackEXT和PFN_vkDestroyDebugReportCallbackEXT的函数指针。
但是,当创建要用作vkCreateDebugReportCallback参数的结构时,我对结构的pfnCallback部分有问题。
Visual在试图编译时给了我这个错误,并且我尝试了按如下方式进行类型转换:
dbgReportCreateInfo.pfnCallback = (PFN_vkDebugReportCallbackEXT) debugFunction;和
dbgReportCreateInfo.pfnCallback = reinterpret_cast<PFN_vkDebugReportCallbackEXT>(debugFunction);当调用vkCreateDebugReportCallback函数时,这两者都会导致内存访问冲突。
什么应该起作用?
从教科书https://www.packtpub.com/application-development/learning-vulkan和提供的存储库中,结构的PFN_vkDebugReportCallbackEXT pfn部分的正确声明应该如它们的存储库这里所示。
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。
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 存储库中获得
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 = {};// 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);
}
}发布于 2017-03-21 13:04:35
你为什么要选这个函数??你不应该!函数已经必须是必需的类型。
我还在我的示例项目中以编程方式进行调试,并且它可以工作,因此让我们在这里进行比较:
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" );因此,扫描您的代码--我看到了以下问题:
PFN_vkDebugReportCallbackEXT::msgCode是int32_t而不是uint32_tVK_TRUE,除非您知道自己在做什么。*instance和VkInstance&??这没有任何意义。是把手。直接使用VkInstance;没有指针,没有取消引用,也不需要引用。dbgReportCreateInfo.flags,你真的想要VK_DEBUG_REPORT_DEBUG_BIT_EXT吗?考虑到你也不接受INFO,这是一个奇怪的选择。1和2应该可以解决你眼前的问题。
https://stackoverflow.com/questions/42919301
复制相似问题