libvulkan: Update global layer loading rules
* Look for layers in /data/local/debug/vulkan instead of
/data/local/tmp/vulkan.
* Only enumerate global layers in debuggable processes.
* Only allow force-enabling layers and callbacks in debuggable
processes.
Change-Id: I1f41a03ecbb0cc159e7dbb0b424005559996c196
(cherry picked from commit e784c114bbdc32361096cce8f59eb9513390e2d6)
diff --git a/vulkan/libvulkan/loader.cpp b/vulkan/libvulkan/loader.cpp
index 222e2e3..cd3503f 100644
--- a/vulkan/libvulkan/loader.cpp
+++ b/vulkan/libvulkan/loader.cpp
@@ -25,6 +25,7 @@
#include <pthread.h>
#include <stdlib.h>
#include <string.h>
+#include <sys/prctl.h>
// standard C++ headers
#include <algorithm>
#include <mutex>
@@ -305,11 +306,9 @@
void FindLayersInDirectory(Instance& instance, const String& dir_name) {
DIR* directory = opendir(dir_name.c_str());
if (!directory) {
- android_LogPriority log_priority =
- (errno == ENOENT) ? ANDROID_LOG_VERBOSE : ANDROID_LOG_ERROR;
- LOG_PRI(log_priority, LOG_TAG,
- "failed to open layer directory '%s': %s (%d)",
- dir_name.c_str(), strerror(errno), errno);
+ int err = errno;
+ ALOGW_IF(err != ENOENT, "failed to open layer directory '%s': %s (%d)",
+ dir_name.c_str(), strerror(err), err);
return;
}
@@ -443,7 +442,7 @@
"Cannot activate layers for unknown object %p", object);
CallbackAllocator<char> string_allocator(instance->alloc);
// Load system layers
- {
+ if (prctl(PR_GET_DUMPABLE, 0, 0, 0, 0)) {
char layer_prop[PROPERTY_VALUE_MAX];
property_get("debug.vulkan.layers", layer_prop, "");
String layer_name(string_allocator);
@@ -1010,9 +1009,9 @@
// Scan layers
CallbackAllocator<char> string_allocator(instance->alloc);
-
- String dir_name("/data/local/tmp/vulkan/", string_allocator);
- FindLayersInDirectory(*instance, dir_name);
+ String dir_name("/data/local/debug/vulkan/", string_allocator);
+ if (prctl(PR_GET_DUMPABLE, 0, 0, 0, 0))
+ FindLayersInDirectory(*instance, dir_name);
const std::string& path = LoaderData::GetInstance().layer_path;
dir_name.assign(path.c_str(), path.size());
dir_name.append("/");
@@ -1068,13 +1067,16 @@
}
// Force enable callback extension if required
- bool enable_callback =
- property_get_bool("debug.vulkan.enable_callback", false);
- bool enable_logging = enable_callback;
- const char* extension_name = "DEBUG_REPORT";
- if (enable_callback) {
- enable_callback = AddExtensionToCreateInfo(
- local_create_info, extension_name, instance->alloc);
+ bool enable_callback = false;
+ bool enable_logging = false;
+ if (prctl(PR_GET_DUMPABLE, 0, 0, 0, 0)) {
+ enable_callback =
+ property_get_bool("debug.vulkan.enable_callback", false);
+ enable_logging = enable_callback;
+ if (enable_callback) {
+ enable_callback = AddExtensionToCreateInfo(
+ local_create_info, "DEBUG_REPORT", instance->alloc);
+ }
}
*out_instance = instance;