Add default callbacks in the loader.
Change-Id: I23d7945efb0fd372e614f895278fc86a853fe429
(cherry picked from commit 9b9938127d1c68cda9b709524aea44ffb0de77b9)
diff --git a/vulkan/libvulkan/loader.cpp b/vulkan/libvulkan/loader.cpp
index 694d8fd..ca33be1 100644
--- a/vulkan/libvulkan/loader.cpp
+++ b/vulkan/libvulkan/loader.cpp
@@ -34,6 +34,7 @@
#include <cutils/properties.h>
#include <hardware/hwvulkan.h>
#include <log/log.h>
+#include <vulkan/vk_debug_report_lunarg.h>
using namespace vulkan;
@@ -136,6 +137,7 @@
VkPhysicalDevice physical_devices[kMaxPhysicalDevices];
Vector<std::pair<String, SharedLibraryHandle> > active_layers;
+ VkDbgMsgCallback message;
struct Driver {
// Pointers to driver entry points. Used explicitly by the loader; not
@@ -331,6 +333,21 @@
(*instance_layers_pair->layers)[layer_name_str]);
}
+void LogDebugMessageCallback(VkFlags message_flags,
+ VkDbgObjectType /*obj_type*/,
+ uint64_t /*src_object*/,
+ size_t /*location*/,
+ int32_t message_code,
+ const char* layer_prefix,
+ const char* message,
+ void* /*user_data*/) {
+ if (message_flags & VK_DBG_REPORT_ERROR_BIT) {
+ ALOGE("[%s] Code %d : %s", layer_prefix, message_code, message);
+ } else if (message_flags & VK_DBG_REPORT_WARN_BIT) {
+ ALOGW("[%s] Code %d : %s", layer_prefix, message_code, message);
+ }
+}
+
// -----------------------------------------------------------------------------
// "Bottom" functions. These are called at the end of the instance dispatch
// chain.
@@ -345,6 +362,12 @@
for (auto& layer : instance->active_layers) {
dlclose(layer.second);
}
+ if (instance->message) {
+ PFN_vkDbgDestroyMsgCallback DebugDestroyMessageCallback;
+ DebugDestroyMessageCallback = reinterpret_cast<PFN_vkDbgDestroyMsgCallback>(
+ vkGetInstanceProcAddr(instance, "vkDbgDestroyMsgCallback"));
+ DebugDestroyMessageCallback(instance, instance->message);
+ }
const VkAllocCallbacks* alloc = instance->alloc;
instance->~VkInstance_T();
alloc->pfnFree(alloc->pUserData, instance);
@@ -727,6 +750,7 @@
instance->vtbl_storage = kBottomInstanceFunctions;
instance->vtbl_storage.instance = instance;
+ instance->message = VK_NULL_HANDLE;
// Scan layers
// TODO: Add more directories to scan
@@ -817,6 +841,7 @@
// Force enable callback extension if required
bool enable_callback =
property_get_bool("debug.vulkan.enable_layer_callback", false);
+ bool enable_logging = enable_callback;
const char* callback_name = "DEBUG_REPORT";
if (enable_callback) {
for (uint32_t i = 0; i < create_info->extensionCount; ++i) {
@@ -872,6 +897,15 @@
// already gone at this point. Nothing to do.
}
+ if (enable_logging) {
+ PFN_vkDbgCreateMsgCallback DebugCreateMessageCallback;
+ DebugCreateMessageCallback = reinterpret_cast<PFN_vkDbgCreateMsgCallback>(
+ vkGetInstanceProcAddr(instance, "vkDbgCreateMsgCallback"));
+ DebugCreateMessageCallback(instance,
+ VK_DBG_REPORT_ERROR_BIT | VK_DBG_REPORT_WARN_BIT,
+ LogDebugMessageCallback, NULL, &instance->message);
+ }
+
return result;
}