Vulkan-Hpp
CreateDebugUtilsMessenger.cpp
Go to the documentation of this file.
1 // Copyright(c) 2019, NVIDIA CORPORATION. All rights reserved.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 //
15 // VulkanHpp Samples : CreateDebugReportMessenger
16 // Draw a cube
17 
18 #include <iostream>
19 #include <sstream>
20 #include <vulkan/vulkan.hpp>
22 
23 static char const * AppName = "CreateDebugReportMessenger";
24 static char const * EngineName = "Vulkan.hpp";
25 
28 
29 VKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugUtilsMessengerEXT( VkInstance instance,
30  const VkDebugUtilsMessengerCreateInfoEXT * pCreateInfo,
31  const VkAllocationCallbacks * pAllocator,
32  VkDebugUtilsMessengerEXT * pMessenger )
33 {
34  return pfnVkCreateDebugUtilsMessengerEXT( instance, pCreateInfo, pAllocator, pMessenger );
35 }
36 
37 VKAPI_ATTR void VKAPI_CALL vkDestroyDebugUtilsMessengerEXT( VkInstance instance, VkDebugUtilsMessengerEXT messenger, VkAllocationCallbacks const * pAllocator )
38 {
39  return pfnVkDestroyDebugUtilsMessengerEXT( instance, messenger, pAllocator );
40 }
41 
42 VKAPI_ATTR VkBool32 VKAPI_CALL debugMessageFunc( VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
44  VkDebugUtilsMessengerCallbackDataEXT const * pCallbackData,
45  void * /*pUserData*/ )
46 {
47  std::ostringstream message;
48 
49  message << vk::to_string( static_cast<vk::DebugUtilsMessageSeverityFlagBitsEXT>( messageSeverity ) ) << ": "
50  << vk::to_string( static_cast<vk::DebugUtilsMessageTypeFlagsEXT>( messageTypes ) ) << ":\n";
51  message << std::string( "\t" ) << "messageIDName = <" << pCallbackData->pMessageIdName << ">\n";
52  message << std::string( "\t" ) << "messageIdNumber = " << pCallbackData->messageIdNumber << "\n";
53  message << std::string( "\t" ) << "message = <" << pCallbackData->pMessage << ">\n";
54  if ( 0 < pCallbackData->queueLabelCount )
55  {
56  message << std::string( "\t" ) << "Queue Labels:\n";
57  for ( uint32_t i = 0; i < pCallbackData->queueLabelCount; i++ )
58  {
59  message << std::string( "\t\t" ) << "labelName = <" << pCallbackData->pQueueLabels[i].pLabelName << ">\n";
60  }
61  }
62  if ( 0 < pCallbackData->cmdBufLabelCount )
63  {
64  message << std::string( "\t" ) << "CommandBuffer Labels:\n";
65  for ( uint32_t i = 0; i < pCallbackData->cmdBufLabelCount; i++ )
66  {
67  message << std::string( "\t\t" ) << "labelName = <" << pCallbackData->pCmdBufLabels[i].pLabelName << ">\n";
68  }
69  }
70  if ( 0 < pCallbackData->objectCount )
71  {
72  message << std::string( "\t" ) << "Objects:\n";
73  for ( uint32_t i = 0; i < pCallbackData->objectCount; i++ )
74  {
75  message << std::string( "\t\t" ) << "Object " << i << "\n";
76  message << std::string( "\t\t\t" ) << "objectType = " << vk::to_string( static_cast<vk::ObjectType>( pCallbackData->pObjects[i].objectType ) ) << "\n";
77  message << std::string( "\t\t\t" ) << "objectHandle = " << pCallbackData->pObjects[i].objectHandle << "\n";
78  if ( pCallbackData->pObjects[i].pObjectName )
79  {
80  message << std::string( "\t\t\t" ) << "objectName = <" << pCallbackData->pObjects[i].pObjectName << ">\n";
81  }
82  }
83  }
84 
85 #ifdef _WIN32
86  MessageBox( NULL, message.str().c_str(), "Alert", MB_OK );
87 #else
88  std::cout << message.str() << std::endl;
89 #endif
90 
91  return false;
92 }
93 
94 int main( int /*argc*/, char ** /*argv*/ )
95 {
96  try
97  {
98  /* VULKAN_KEY_START */
99 
100  std::vector<vk::ExtensionProperties> props = vk::enumerateInstanceExtensionProperties();
101 
102  auto propertyIterator = std::find_if(
103  props.begin(), props.end(), []( vk::ExtensionProperties const & ep ) { return strcmp( ep.extensionName, VK_EXT_DEBUG_UTILS_EXTENSION_NAME ) == 0; } );
104  if ( propertyIterator == props.end() )
105  {
106  std::cout << "Something went very wrong, cannot find " << VK_EXT_DEBUG_UTILS_EXTENSION_NAME << " extension" << std::endl;
107  exit( 1 );
108  }
109 
110  vk::ApplicationInfo applicationInfo( AppName, 1, EngineName, 1, VK_API_VERSION_1_1 );
111  const char * extensionName = VK_EXT_DEBUG_UTILS_EXTENSION_NAME;
112  vk::Instance instance = vk::createInstance( vk::InstanceCreateInfo( vk::InstanceCreateFlags(), &applicationInfo, {}, extensionName ) );
113 
114  pfnVkCreateDebugUtilsMessengerEXT = reinterpret_cast<PFN_vkCreateDebugUtilsMessengerEXT>( instance.getProcAddr( "vkCreateDebugUtilsMessengerEXT" ) );
116  {
117  std::cout << "GetInstanceProcAddr: Unable to find pfnVkCreateDebugUtilsMessengerEXT function." << std::endl;
118  exit( 1 );
119  }
120 
121  pfnVkDestroyDebugUtilsMessengerEXT = reinterpret_cast<PFN_vkDestroyDebugUtilsMessengerEXT>( instance.getProcAddr( "vkDestroyDebugUtilsMessengerEXT" ) );
123  {
124  std::cout << "GetInstanceProcAddr: Unable to find pfnVkDestroyDebugUtilsMessengerEXT function." << std::endl;
125  exit( 1 );
126  }
127 
132  vk::DebugUtilsMessengerEXT debugUtilsMessenger =
133  instance.createDebugUtilsMessengerEXT( vk::DebugUtilsMessengerCreateInfoEXT( {}, severityFlags, messageTypeFlags, &debugMessageFunc ) );
134 
135  instance.destroyDebugUtilsMessengerEXT( debugUtilsMessenger );
136  instance.destroy();
137 
138  /* VULKAN_KEY_END */
139  }
140  catch ( vk::SystemError & err )
141  {
142  std::cout << "vk::SystemError: " << err.what() << std::endl;
143  exit( -1 );
144  }
145  catch ( std::exception & err )
146  {
147  std::cout << "std::exception: " << err.what() << std::endl;
148  exit( -1 );
149  }
150  catch ( ... )
151  {
152  std::cout << "unknown error\n";
153  exit( -1 );
154  }
155  return 0;
156 }
int main(int, char **)
PFN_vkCreateDebugUtilsMessengerEXT pfnVkCreateDebugUtilsMessengerEXT
VKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugUtilsMessengerEXT(VkInstance instance, const VkDebugUtilsMessengerCreateInfoEXT *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkDebugUtilsMessengerEXT *pMessenger)
VKAPI_ATTR VkBool32 VKAPI_CALL debugMessageFunc(VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, VkDebugUtilsMessageTypeFlagsEXT messageTypes, VkDebugUtilsMessengerCallbackDataEXT const *pCallbackData, void *)
PFN_vkDestroyDebugUtilsMessengerEXT pfnVkDestroyDebugUtilsMessengerEXT
VKAPI_ATTR void VKAPI_CALL vkDestroyDebugUtilsMessengerEXT(VkInstance instance, VkDebugUtilsMessengerEXT messenger, VkAllocationCallbacks const *pAllocator)
void cout(vk::SurfaceCapabilitiesKHR const &surfaceCapabilities)
VULKAN_HPP_NODISCARD Result createDebugUtilsMessengerEXT(const vk::DebugUtilsMessengerCreateInfoEXT *pCreateInfo, const vk::AllocationCallbacks *pAllocator, vk::DebugUtilsMessengerEXT *pMessenger, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
void destroy(const vk::AllocationCallbacks *pAllocator, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
PFN_vkVoidFunction getProcAddr(const char *pName, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
void destroyDebugUtilsMessengerEXT(vk::DebugUtilsMessengerEXT messenger, const vk::AllocationCallbacks *pAllocator, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
virtual const char * what() const VULKAN_HPP_NOEXCEPT
Definition: vulkan.hpp:6206
VULKAN_HPP_INLINE std::string to_string(FormatFeatureFlags value)
VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result enumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pPropertyCount, vk::ExtensionProperties *pProperties, Dispatch const &d) VULKAN_HPP_NOEXCEPT
VULKAN_HPP_NODISCARD VULKAN_HPP_INLINE Result createInstance(const vk::InstanceCreateInfo *pCreateInfo, const vk::AllocationCallbacks *pAllocator, vk::Instance *pInstance, Dispatch const &d) VULKAN_HPP_NOEXCEPT
const char * pLabelName
const VkDebugUtilsLabelEXT * pCmdBufLabels
const VkDebugUtilsLabelEXT * pQueueLabels
const VkDebugUtilsObjectNameInfoEXT * pObjects
VkResult(* PFN_vkCreateDebugUtilsMessengerEXT)(VkInstance instance, const VkDebugUtilsMessengerCreateInfoEXT *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkDebugUtilsMessengerEXT *pMessenger)
struct VkInstance_T * VkInstance
Definition: vulkan_core.h:101
VkFlags VkDebugUtilsMessageTypeFlagsEXT
#define VK_EXT_DEBUG_UTILS_EXTENSION_NAME
uint64_t VkDebugUtilsMessengerEXT
VkResult
Definition: vulkan_core.h:140
void(* PFN_vkDestroyDebugUtilsMessengerEXT)(VkInstance instance, VkDebugUtilsMessengerEXT messenger, const VkAllocationCallbacks *pAllocator)
uint32_t VkBool32
Definition: vulkan_core.h:94
#define VK_API_VERSION_1_1
Definition: vulkan_core.h:4854
VkDebugUtilsMessageSeverityFlagBitsEXT