1 /*-------------------------------------------------------------------------
2 * Vulkan CTS Framework
3 * --------------------
4 *
5 * Copyright (c) 2016 Google Inc.
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 *
19 *//*!
20 * \file
21 * \brief VK_EXT_debug_report utilities
22 *//*--------------------------------------------------------------------*/
23
24 #include "vkDebugReportUtil.hpp"
25 #include "vkRefUtil.hpp"
26 #include "vkQueryUtil.hpp"
27 #include "deArrayUtil.hpp"
28 #include "tcuDefs.hpp"
29
30 namespace vk
31 {
32
33 #ifndef CTS_USES_VULKANSC
34
35 namespace
36 {
37
shortDebugFlagsStr(VkDebugReportFlagsEXT flags)38 tcu::Format::Bitfield<32> shortDebugFlagsStr(VkDebugReportFlagsEXT flags)
39 {
40 static const tcu::Format::BitDesc s_bits[] = {
41 tcu::Format::BitDesc(VK_DEBUG_REPORT_INFORMATION_BIT_EXT, "INFO"),
42 tcu::Format::BitDesc(VK_DEBUG_REPORT_WARNING_BIT_EXT, "WARNING"),
43 tcu::Format::BitDesc(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "PERFORMANCE"),
44 tcu::Format::BitDesc(VK_DEBUG_REPORT_ERROR_BIT_EXT, "ERROR"),
45 tcu::Format::BitDesc(VK_DEBUG_REPORT_DEBUG_BIT_EXT, "DEBUG"),
46 };
47
48 return tcu::Format::Bitfield<32>(flags, DE_ARRAY_BEGIN(s_bits), DE_ARRAY_END(s_bits));
49 }
50
getShortObjectTypeName(VkDebugReportObjectTypeEXT objectType)51 const char *getShortObjectTypeName(VkDebugReportObjectTypeEXT objectType)
52 {
53 switch (objectType)
54 {
55 case VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT:
56 return "Unknown";
57 case VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT:
58 return "Instance";
59 case VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT:
60 return "PhysicalDevice";
61 case VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT:
62 return "Device";
63 case VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT:
64 return "Queue";
65 case VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT:
66 return "Semaphore";
67 case VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT:
68 return "CommandBuffer";
69 case VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT:
70 return "Fence";
71 case VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT:
72 return "DeviceMemory";
73 case VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT:
74 return "Buffer";
75 case VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT:
76 return "Image";
77 case VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT:
78 return "Event";
79 case VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT:
80 return "QueryPool";
81 case VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT:
82 return "BufferView";
83 case VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT:
84 return "ImageView";
85 case VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT:
86 return "ShaderModule";
87 case VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT:
88 return "PipelineCache";
89 case VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT:
90 return "PipelineLayout";
91 case VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT:
92 return "RenderPass";
93 case VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT:
94 return "Pipeline";
95 case VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT:
96 return "DescriptorSetLayout";
97 case VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT:
98 return "Sampler";
99 case VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT:
100 return "DescriptorPool";
101 case VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT:
102 return "DescriptorSet";
103 case VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT:
104 return "Framebuffer";
105 case VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT:
106 return "CommandPool";
107 case VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT:
108 return "SurfaceKHR";
109 case VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT:
110 return "SwapchainKHR";
111 case VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT:
112 return "DebugReportEXT";
113 case VK_DEBUG_REPORT_OBJECT_TYPE_DISPLAY_KHR_EXT:
114 return "DisplayKHR";
115 case VK_DEBUG_REPORT_OBJECT_TYPE_DISPLAY_MODE_KHR_EXT:
116 return "DisplayModeKHR";
117 case VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_KHR_EXT:
118 return "DescriptorUpdateTemplateKHR";
119 default:
120 return DE_NULL;
121 }
122 }
123
shortObjectTypeStr(VkDebugReportObjectTypeEXT objectType)124 tcu::Format::Enum<VkDebugReportObjectTypeEXT> shortObjectTypeStr(VkDebugReportObjectTypeEXT objectType)
125 {
126 return tcu::Format::Enum<VkDebugReportObjectTypeEXT>(getShortObjectTypeName, objectType);
127 }
128
129 } // namespace
130
operator <<(std::ostream & str,const DebugReportMessage & message)131 std::ostream &operator<<(std::ostream &str, const DebugReportMessage &message)
132 {
133 str << shortDebugFlagsStr(message.flags) << ": " << message.message << " (code " << tcu::toHex(message.messageCode);
134
135 if (!message.layerPrefix.empty())
136 str << " from " << message.layerPrefix;
137
138 str << " at " << shortObjectTypeStr(message.objectType) << ":" << message.location << ")";
139
140 return str;
141 }
142
143 namespace
144 {
145
debugReportCallback(VkDebugReportFlagsEXT flags,VkDebugReportObjectTypeEXT objectType,uint64_t object,size_t location,int32_t messageCode,const char * pLayerPrefix,const char * pMessage,void * pUserData)146 VKAPI_ATTR VkBool32 VKAPI_CALL debugReportCallback(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType,
147 uint64_t object, size_t location, int32_t messageCode,
148 const char *pLayerPrefix, const char *pMessage, void *pUserData)
149 {
150 auto recorder = reinterpret_cast<DebugReportRecorder *>(pUserData);
151 auto &messageList = recorder->getMessages();
152 const DebugReportMessage message(flags, objectType, object, location, messageCode, pLayerPrefix, pMessage);
153
154 messageList.append(message);
155
156 if (recorder->errorPrinting() && message.isError())
157 tcu::printError("%s\n", pMessage);
158
159 // Return false to indicate that the call should not return error and should
160 // continue execution normally.
161 return VK_FALSE;
162 }
163
164 } // namespace
165
DebugReportRecorder(bool printValidationErrors)166 DebugReportRecorder::DebugReportRecorder(bool printValidationErrors)
167 : m_messages(1024)
168 , m_print_errors(printValidationErrors)
169 {
170 }
171
~DebugReportRecorder(void)172 DebugReportRecorder::~DebugReportRecorder(void)
173 {
174 }
175
makeCreateInfo(void)176 VkDebugReportCallbackCreateInfoEXT DebugReportRecorder::makeCreateInfo(void)
177 {
178 const VkDebugReportFlagsEXT allFlags = VK_DEBUG_REPORT_INFORMATION_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT |
179 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT | VK_DEBUG_REPORT_ERROR_BIT_EXT |
180 VK_DEBUG_REPORT_DEBUG_BIT_EXT;
181
182 const VkDebugReportCallbackCreateInfoEXT createInfo = {
183 VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT, nullptr, allFlags, debugReportCallback, this,
184 };
185
186 return createInfo;
187 }
188
createCallback(const InstanceInterface & vki,VkInstance instance)189 Move<VkDebugReportCallbackEXT> DebugReportRecorder::createCallback(const InstanceInterface &vki, VkInstance instance)
190 {
191 const auto createInfo = makeCreateInfo();
192 return createDebugReportCallbackEXT(vki, instance, &createInfo);
193 }
194
195 #endif // CTS_USES_VULKANSC
196
isDebugReportSupported(const PlatformInterface & vkp)197 bool isDebugReportSupported(const PlatformInterface &vkp)
198 {
199 #ifndef CTS_USES_VULKANSC
200 return isExtensionStructSupported(enumerateInstanceExtensionProperties(vkp, DE_NULL),
201 RequiredExtension("VK_EXT_debug_report"));
202 #else // CTS_USES_VULKANSC
203 DE_UNREF(vkp);
204 return false;
205 #endif // CTS_USES_VULKANSC
206 }
207
208 } // namespace vk
209