xref: /aosp_15_r20/external/deqp/external/vulkancts/framework/vulkan/vkDebugReportUtil.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
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