blob: 63274e93034aaaeca2a4e88b9307c5588dd48f35 [file] [log] [blame]
Mark Lobodzinski288e4f72016-02-02 15:55:36 -07001/* Copyright (c) 2015-2016 The Khronos Group Inc.
2 * Copyright (c) 2015-2016 Valve Corporation
3 * Copyright (c) 2015-2016 LunarG, Inc.
Courtney Goeltzenleuchter41fa5b02015-06-11 15:58:51 -06004 *
Mark Lobodzinski288e4f72016-02-02 15:55:36 -07005 * Permission is hereby granted, free of charge, to any person obtaining a copy
6 * of this software and/or associated documentation files (the "Materials"), to
7 * deal in the Materials without restriction, including without limitation the
8 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
9 * sell copies of the Materials, and to permit persons to whom the Materials
10 * are furnished to do so, subject to the following conditions:
Courtney Goeltzenleuchter41fa5b02015-06-11 15:58:51 -060011 *
Mark Lobodzinski288e4f72016-02-02 15:55:36 -070012 * The above copyright notice(s) and this permission notice shall be included
13 * in all copies or substantial portions of the Materials.
Courtney Goeltzenleuchter41fa5b02015-06-11 15:58:51 -060014 *
Mark Lobodzinski288e4f72016-02-02 15:55:36 -070015 * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Courtney Goeltzenleuchter41fa5b02015-06-11 15:58:51 -060016 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Mark Lobodzinski288e4f72016-02-02 15:55:36 -070017 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18 *
19 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
20 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
21 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE
22 * USE OR OTHER DEALINGS IN THE MATERIALS
Courtney Goeltzenleuchter41fa5b02015-06-11 15:58:51 -060023 *
Courtney Goeltzenleuchter96cd7952015-10-30 11:14:30 -060024 * Author: Courtney Goeltzenleuchter <courtney@LunarG.com>
25 * Author: Tobin Ehlis <tobin@lunarg.com>
26 *
Courtney Goeltzenleuchter41fa5b02015-06-11 15:58:51 -060027 */
28
29#ifndef LAYER_LOGGING_H
30#define LAYER_LOGGING_H
31
32#include <stdio.h>
Courtney Goeltzenleuchter3e19bf62015-06-14 09:50:18 -060033#include <stdarg.h>
Courtney Goeltzenleuchter41fa5b02015-06-11 15:58:51 -060034#include <stdbool.h>
35#include <unordered_map>
Tobin Ehlis1dce5f12015-07-07 10:42:20 -060036#include <inttypes.h>
Tobin Ehlisc8d75932015-11-02 15:45:19 -070037#include "vk_loader_platform.h"
David Pinedo329ca9e2015-11-06 12:54:48 -070038#include "vulkan/vk_layer.h"
Tobin Ehlis56d204a2015-07-03 10:15:26 -060039#include "vk_layer_data.h"
40#include "vk_layer_table.h"
Courtney Goeltzenleuchter41fa5b02015-06-11 15:58:51 -060041
Courtney Goeltzenleuchter1f1fbbd2015-06-14 12:03:26 -060042typedef struct _debug_report_data {
Courtney Goeltzenleuchter41fa5b02015-06-11 15:58:51 -060043 VkLayerDbgFunctionNode *g_pDbgFunctionHead;
Courtney Goeltzenleuchter3e19bf62015-06-14 09:50:18 -060044 VkFlags active_flags;
Courtney Goeltzenleuchter41fa5b02015-06-11 15:58:51 -060045 bool g_DEBUG_REPORT;
Courtney Goeltzenleuchter1f1fbbd2015-06-14 12:03:26 -060046} debug_report_data;
Courtney Goeltzenleuchter41fa5b02015-06-11 15:58:51 -060047
Jon Ashburn491a3cd2016-03-08 17:48:44 -070048template debug_report_data *get_my_data_ptr<debug_report_data>(void *data_key,
49 std::unordered_map<void *, debug_report_data *> &data_map);
Courtney Goeltzenleuchter41fa5b02015-06-11 15:58:51 -060050
51// Utility function to handle reporting
Dustin Gravese3319182016-04-05 09:41:17 -060052static inline bool debug_report_log_msg(debug_report_data *debug_data, VkFlags msgFlags, VkDebugReportObjectTypeEXT objectType,
53 uint64_t srcObject, size_t location, int32_t msgCode, const char *pLayerPrefix,
54 const char *pMsg) {
55 bool bail = false;
Courtney Goeltzenleuchter41fa5b02015-06-11 15:58:51 -060056 VkLayerDbgFunctionNode *pTrav = debug_data->g_pDbgFunctionHead;
57 while (pTrav) {
58 if (pTrav->msgFlags & msgFlags) {
Jon Ashburn491a3cd2016-03-08 17:48:44 -070059 if (pTrav->pfnMsgCallback(msgFlags, objectType, srcObject, location, msgCode, pLayerPrefix, pMsg, pTrav->pUserData)) {
Courtney Goeltzenleuchter0d6857f2015-09-04 13:52:24 -060060 bail = true;
61 }
Courtney Goeltzenleuchter41fa5b02015-06-11 15:58:51 -060062 }
63 pTrav = pTrav->pNext;
64 }
Courtney Goeltzenleuchter0d6857f2015-09-04 13:52:24 -060065
66 return bail;
Courtney Goeltzenleuchter41fa5b02015-06-11 15:58:51 -060067}
68
Jon Ashburn491a3cd2016-03-08 17:48:44 -070069static inline debug_report_data *
70debug_report_create_instance(VkLayerInstanceDispatchTable *table, VkInstance inst, uint32_t extension_count,
71 const char *const *ppEnabledExtensions) // layer or extension name to be enabled
Courtney Goeltzenleuchter41fa5b02015-06-11 15:58:51 -060072{
Jon Ashburn491a3cd2016-03-08 17:48:44 -070073 debug_report_data *debug_data;
Courtney Goeltzenleuchter1f1fbbd2015-06-14 12:03:26 -060074 PFN_vkGetInstanceProcAddr gpa = table->GetInstanceProcAddr;
Courtney Goeltzenleuchter41fa5b02015-06-11 15:58:51 -060075
Jon Ashburn491a3cd2016-03-08 17:48:44 -070076 table->CreateDebugReportCallbackEXT = (PFN_vkCreateDebugReportCallbackEXT)gpa(inst, "vkCreateDebugReportCallbackEXT");
77 table->DestroyDebugReportCallbackEXT = (PFN_vkDestroyDebugReportCallbackEXT)gpa(inst, "vkDestroyDebugReportCallbackEXT");
78 table->DebugReportMessageEXT = (PFN_vkDebugReportMessageEXT)gpa(inst, "vkDebugReportMessageEXT");
Courtney Goeltzenleuchter1f1fbbd2015-06-14 12:03:26 -060079
Jon Ashburn491a3cd2016-03-08 17:48:44 -070080 debug_data = (debug_report_data *)malloc(sizeof(debug_report_data));
81 if (!debug_data)
82 return NULL;
Courtney Goeltzenleuchter1f1fbbd2015-06-14 12:03:26 -060083
84 memset(debug_data, 0, sizeof(debug_report_data));
Courtney Goeltzenleuchter41fa5b02015-06-11 15:58:51 -060085 for (uint32_t i = 0; i < extension_count; i++) {
86 /* TODO: Check other property fields */
Courtney Goeltzenleuchteracb13592015-12-09 15:48:16 -070087 if (strcmp(ppEnabledExtensions[i], VK_EXT_DEBUG_REPORT_EXTENSION_NAME) == 0) {
Courtney Goeltzenleuchter41fa5b02015-06-11 15:58:51 -060088 debug_data->g_DEBUG_REPORT = true;
89 }
90 }
Courtney Goeltzenleuchter1f1fbbd2015-06-14 12:03:26 -060091 return debug_data;
Courtney Goeltzenleuchter41fa5b02015-06-11 15:58:51 -060092}
93
Jon Ashburn491a3cd2016-03-08 17:48:44 -070094static inline void layer_debug_report_destroy_instance(debug_report_data *debug_data) {
Courtney Goeltzenleuchter2d034fd2015-06-28 13:01:17 -060095 VkLayerDbgFunctionNode *pTrav;
Courtney Goeltzenleuchter41fa5b02015-06-11 15:58:51 -060096 VkLayerDbgFunctionNode *pTravNext;
97
Courtney Goeltzenleuchter2d034fd2015-06-28 13:01:17 -060098 if (!debug_data) {
99 return;
100 }
101
102 pTrav = debug_data->g_pDbgFunctionHead;
Courtney Goeltzenleuchter41fa5b02015-06-11 15:58:51 -0600103 /* Clear out any leftover callbacks */
104 while (pTrav) {
105 pTravNext = pTrav->pNext;
106
Jon Ashburn491a3cd2016-03-08 17:48:44 -0700107 debug_report_log_msg(debug_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT,
108 (uint64_t)pTrav->msgCallback, 0, VK_DEBUG_REPORT_ERROR_CALLBACK_REF_EXT, "DebugReport",
109 "Debug Report callbacks not removed before DestroyInstance");
Courtney Goeltzenleuchter41fa5b02015-06-11 15:58:51 -0600110
111 free(pTrav);
112 pTrav = pTravNext;
113 }
114 debug_data->g_pDbgFunctionHead = NULL;
Courtney Goeltzenleuchter1f1fbbd2015-06-14 12:03:26 -0600115
116 free(debug_data);
Courtney Goeltzenleuchter41fa5b02015-06-11 15:58:51 -0600117}
118
Jon Ashburn491a3cd2016-03-08 17:48:44 -0700119static inline debug_report_data *layer_debug_report_create_device(debug_report_data *instance_debug_data, VkDevice device) {
Courtney Goeltzenleuchter7ad921d2015-06-14 11:29:24 -0600120 /* DEBUG_REPORT shares data between Instance and Device,
121 * so just return instance's data pointer */
Courtney Goeltzenleuchter3e19bf62015-06-14 09:50:18 -0600122 return instance_debug_data;
Courtney Goeltzenleuchter41fa5b02015-06-11 15:58:51 -0600123}
124
Jon Ashburn491a3cd2016-03-08 17:48:44 -0700125static inline void layer_debug_report_destroy_device(VkDevice device) { /* Nothing to do since we're using instance data record */ }
Courtney Goeltzenleuchter41fa5b02015-06-11 15:58:51 -0600126
Jon Ashburn491a3cd2016-03-08 17:48:44 -0700127static inline VkResult layer_create_msg_callback(debug_report_data *debug_data,
128 const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
129 const VkAllocationCallbacks *pAllocator, VkDebugReportCallbackEXT *pCallback) {
Courtney Goeltzenleuchterf6a6e222015-11-30 12:13:14 -0700130 /* TODO: Use app allocator */
Jon Ashburn491a3cd2016-03-08 17:48:44 -0700131 VkLayerDbgFunctionNode *pNewDbgFuncNode = (VkLayerDbgFunctionNode *)malloc(sizeof(VkLayerDbgFunctionNode));
Courtney Goeltzenleuchter41fa5b02015-06-11 15:58:51 -0600132 if (!pNewDbgFuncNode)
133 return VK_ERROR_OUT_OF_HOST_MEMORY;
134
Tobin Ehlis44f667b2015-09-21 09:36:47 -0600135 // Handle of 0 is logging_callback so use allocated Node address as unique handle
Courtney Goeltzenleuchterf6a6e222015-11-30 12:13:14 -0700136 if (!(*pCallback))
Jon Ashburn491a3cd2016-03-08 17:48:44 -0700137 *pCallback = (VkDebugReportCallbackEXT)pNewDbgFuncNode;
Courtney Goeltzenleuchterf6a6e222015-11-30 12:13:14 -0700138 pNewDbgFuncNode->msgCallback = *pCallback;
139 pNewDbgFuncNode->pfnMsgCallback = pCreateInfo->pfnCallback;
140 pNewDbgFuncNode->msgFlags = pCreateInfo->flags;
141 pNewDbgFuncNode->pUserData = pCreateInfo->pUserData;
Courtney Goeltzenleuchter1f1fbbd2015-06-14 12:03:26 -0600142 pNewDbgFuncNode->pNext = debug_data->g_pDbgFunctionHead;
Courtney Goeltzenleuchter41fa5b02015-06-11 15:58:51 -0600143
Courtney Goeltzenleuchter1f1fbbd2015-06-14 12:03:26 -0600144 debug_data->g_pDbgFunctionHead = pNewDbgFuncNode;
Courtney Goeltzenleuchterf6a6e222015-11-30 12:13:14 -0700145 debug_data->active_flags |= pCreateInfo->flags;
Courtney Goeltzenleuchter41fa5b02015-06-11 15:58:51 -0600146
Jon Ashburn491a3cd2016-03-08 17:48:44 -0700147 debug_report_log_msg(debug_data, VK_DEBUG_REPORT_DEBUG_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT,
148 (uint64_t)*pCallback, 0, VK_DEBUG_REPORT_ERROR_CALLBACK_REF_EXT, "DebugReport", "Added callback");
Courtney Goeltzenleuchter1f1fbbd2015-06-14 12:03:26 -0600149 return VK_SUCCESS;
Courtney Goeltzenleuchter41fa5b02015-06-11 15:58:51 -0600150}
151
Jon Ashburn491a3cd2016-03-08 17:48:44 -0700152static inline void layer_destroy_msg_callback(debug_report_data *debug_data, VkDebugReportCallbackEXT callback,
153 const VkAllocationCallbacks *pAllocator) {
Courtney Goeltzenleuchter41fa5b02015-06-11 15:58:51 -0600154 VkLayerDbgFunctionNode *pTrav = debug_data->g_pDbgFunctionHead;
155 VkLayerDbgFunctionNode *pPrev = pTrav;
Mike Stroyan0a78bcc2015-07-31 16:20:39 -0600156 bool matched;
Courtney Goeltzenleuchter41fa5b02015-06-11 15:58:51 -0600157
Courtney Goeltzenleuchter3e19bf62015-06-14 09:50:18 -0600158 debug_data->active_flags = 0;
Courtney Goeltzenleuchter41fa5b02015-06-11 15:58:51 -0600159 while (pTrav) {
Courtney Goeltzenleuchterf6a6e222015-11-30 12:13:14 -0700160 if (pTrav->msgCallback == callback) {
Mike Stroyan0a78bcc2015-07-31 16:20:39 -0600161 matched = true;
Courtney Goeltzenleuchter41fa5b02015-06-11 15:58:51 -0600162 pPrev->pNext = pTrav->pNext;
163 if (debug_data->g_pDbgFunctionHead == pTrav) {
164 debug_data->g_pDbgFunctionHead = pTrav->pNext;
165 }
Jon Ashburn491a3cd2016-03-08 17:48:44 -0700166 debug_report_log_msg(debug_data, VK_DEBUG_REPORT_DEBUG_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT,
167 (uint64_t)pTrav->msgCallback, 0, VK_DEBUG_REPORT_ERROR_CALLBACK_REF_EXT, "DebugReport",
168 "Destroyed callback");
Mike Stroyan0a78bcc2015-07-31 16:20:39 -0600169 } else {
170 matched = false;
Mike Stroyanf8155e42015-08-10 16:14:18 -0600171 debug_data->active_flags |= pTrav->msgFlags;
Courtney Goeltzenleuchter41fa5b02015-06-11 15:58:51 -0600172 }
173 pPrev = pTrav;
174 pTrav = pTrav->pNext;
Mike Stroyan0a78bcc2015-07-31 16:20:39 -0600175 if (matched) {
Courtney Goeltzenleuchterf6a6e222015-11-30 12:13:14 -0700176 /* TODO: Use pAllocator */
Mike Stroyan0a78bcc2015-07-31 16:20:39 -0600177 free(pPrev);
178 }
Courtney Goeltzenleuchter41fa5b02015-06-11 15:58:51 -0600179 }
Courtney Goeltzenleuchter41fa5b02015-06-11 15:58:51 -0600180}
181
Jon Ashburn491a3cd2016-03-08 17:48:44 -0700182static inline PFN_vkVoidFunction debug_report_get_instance_proc_addr(debug_report_data *debug_data, const char *funcName) {
Courtney Goeltzenleuchter1f1fbbd2015-06-14 12:03:26 -0600183 if (!debug_data || !debug_data->g_DEBUG_REPORT) {
Courtney Goeltzenleuchter41fa5b02015-06-11 15:58:51 -0600184 return NULL;
185 }
186
Courtney Goeltzenleuchteracb13592015-12-09 15:48:16 -0700187 if (!strcmp(funcName, "vkCreateDebugReportCallbackEXT")) {
Jon Ashburn491a3cd2016-03-08 17:48:44 -0700188 return (PFN_vkVoidFunction)vkCreateDebugReportCallbackEXT;
Courtney Goeltzenleuchter41fa5b02015-06-11 15:58:51 -0600189 }
Courtney Goeltzenleuchteracb13592015-12-09 15:48:16 -0700190 if (!strcmp(funcName, "vkDestroyDebugReportCallbackEXT")) {
Jon Ashburn491a3cd2016-03-08 17:48:44 -0700191 return (PFN_vkVoidFunction)vkDestroyDebugReportCallbackEXT;
Courtney Goeltzenleuchter41fa5b02015-06-11 15:58:51 -0600192 }
193
Courtney Goeltzenleuchteracb13592015-12-09 15:48:16 -0700194 if (!strcmp(funcName, "vkDebugReportMessageEXT")) {
Jon Ashburn491a3cd2016-03-08 17:48:44 -0700195 return (PFN_vkVoidFunction)vkDebugReportMessageEXT;
Courtney Goeltzenleuchter6175e4b2015-11-30 15:28:25 -0700196 }
197
Courtney Goeltzenleuchter41fa5b02015-06-11 15:58:51 -0600198 return NULL;
199}
200
201/*
Courtney Goeltzenleuchteree8d5812015-09-18 16:30:24 -0600202 * Checks if the message will get logged.
203 * Allows layer to defer collecting & formating data if the
204 * message will be discarded.
205 */
Dustin Gravese3319182016-04-05 09:41:17 -0600206static inline bool will_log_msg(debug_report_data *debug_data, VkFlags msgFlags) {
Courtney Goeltzenleuchteree8d5812015-09-18 16:30:24 -0600207 if (!debug_data || !(debug_data->active_flags & msgFlags)) {
208 /* message is not wanted */
209 return false;
210 }
211
212 return true;
213}
214
Chris Forbes16058d12016-03-24 12:06:35 +1300215#ifdef WIN32
216static inline int vasprintf(char **strp, char const *fmt, va_list ap) {
217 *strp = nullptr;
218 int size = _vscprintf(fmt, ap);
219 if (size >= 0) {
220 *strp = (char *)malloc(size+1);
221 if (!*strp) {
222 return -1;
223 }
224 _vsnprintf(*strp, size+1, fmt, ap);
225 }
226 return size;
227}
228#endif
229
Courtney Goeltzenleuchteree8d5812015-09-18 16:30:24 -0600230/*
Courtney Goeltzenleuchter3e19bf62015-06-14 09:50:18 -0600231 * Output log message via DEBUG_REPORT
232 * Takes format and variable arg list so that output string
233 * is only computed if a message needs to be logged
Courtney Goeltzenleuchter41fa5b02015-06-11 15:58:51 -0600234 */
Michael Lentinecbc4a5e2015-11-03 16:19:46 -0800235#ifndef WIN32
Dustin Gravese3319182016-04-05 09:41:17 -0600236static inline bool log_msg(debug_report_data *debug_data, VkFlags msgFlags, VkDebugReportObjectTypeEXT objectType,
237 uint64_t srcObject, size_t location, int32_t msgCode, const char *pLayerPrefix, const char *format, ...)
238 __attribute__((format(printf, 8, 9)));
Michael Lentinecbc4a5e2015-11-03 16:19:46 -0800239#endif
Dustin Gravese3319182016-04-05 09:41:17 -0600240static inline bool log_msg(debug_report_data *debug_data, VkFlags msgFlags, VkDebugReportObjectTypeEXT objectType,
241 uint64_t srcObject, size_t location, int32_t msgCode, const char *pLayerPrefix, const char *format,
242 ...) {
Courtney Goeltzenleuchter59140192015-06-26 15:14:50 -0600243 if (!debug_data || !(debug_data->active_flags & msgFlags)) {
Courtney Goeltzenleuchter3e19bf62015-06-14 09:50:18 -0600244 /* message is not wanted */
Courtney Goeltzenleuchter0d6857f2015-09-04 13:52:24 -0600245 return false;
Courtney Goeltzenleuchter3e19bf62015-06-14 09:50:18 -0600246 }
Courtney Goeltzenleuchter41fa5b02015-06-11 15:58:51 -0600247
Courtney Goeltzenleuchter3e19bf62015-06-14 09:50:18 -0600248 va_list argptr;
249 va_start(argptr, format);
Chris Forbes16058d12016-03-24 12:06:35 +1300250 char *str;
251 vasprintf(&str, format, argptr);
Courtney Goeltzenleuchter3e19bf62015-06-14 09:50:18 -0600252 va_end(argptr);
Dustin Gravese3319182016-04-05 09:41:17 -0600253 bool result = debug_report_log_msg(debug_data, msgFlags, objectType, srcObject, location, msgCode, pLayerPrefix, str);
Chris Forbes16058d12016-03-24 12:06:35 +1300254 free(str);
255 return result;
Courtney Goeltzenleuchter41fa5b02015-06-11 15:58:51 -0600256}
257
Jon Ashburn491a3cd2016-03-08 17:48:44 -0700258static inline VKAPI_ATTR VkBool32 VKAPI_CALL log_callback(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
259 size_t location, int32_t msgCode, const char *pLayerPrefix,
260 const char *pMsg, void *pUserData) {
Courtney Goeltzenleuchter7ad921d2015-06-14 11:29:24 -0600261 char msg_flags[30];
Courtney Goeltzenleuchter41fa5b02015-06-11 15:58:51 -0600262
Courtney Goeltzenleuchter7ad921d2015-06-14 11:29:24 -0600263 print_msg_flags(msgFlags, msg_flags);
264
Jon Ashburn491a3cd2016-03-08 17:48:44 -0700265 fprintf((FILE *)pUserData, "%s(%s): object: %#" PRIx64 " type: %d location: %lu msgCode: %d: %s\n", pLayerPrefix, msg_flags,
266 srcObject, objType, (unsigned long)location, msgCode, pMsg);
267 fflush((FILE *)pUserData);
Courtney Goeltzenleuchter0d6857f2015-09-04 13:52:24 -0600268
269 return false;
Courtney Goeltzenleuchter7ad921d2015-06-14 11:29:24 -0600270}
Courtney Goeltzenleuchterb94f0512015-10-05 14:41:34 -0600271
Jon Ashburn491a3cd2016-03-08 17:48:44 -0700272static inline VKAPI_ATTR VkBool32 VKAPI_CALL win32_debug_output_msg(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType,
273 uint64_t srcObject, size_t location, int32_t msgCode,
274 const char *pLayerPrefix, const char *pMsg, void *pUserData) {
Courtney Goeltzenleuchterb94f0512015-10-05 14:41:34 -0600275#ifdef WIN32
276 char msg_flags[30];
277 char buf[2048];
278
279 print_msg_flags(msgFlags, msg_flags);
Jon Ashburn491a3cd2016-03-08 17:48:44 -0700280 _snprintf(buf, sizeof(buf) - 1,
281 "%s (%s): object: 0x%" PRIxPTR " type: %d location: " PRINTF_SIZE_T_SPECIFIER " msgCode: %d: %s\n", pLayerPrefix,
282 msg_flags, (size_t)srcObject, objType, location, msgCode, pMsg);
Courtney Goeltzenleuchterb94f0512015-10-05 14:41:34 -0600283
284 OutputDebugString(buf);
285#endif
286
287 return false;
288}
289
Courtney Goeltzenleuchter7ad921d2015-06-14 11:29:24 -0600290#endif // LAYER_LOGGING_H