diff options
Diffstat (limited to 'vulkan/libvulkan/api.cpp')
-rw-r--r-- | vulkan/libvulkan/api.cpp | 54 |
1 files changed, 32 insertions, 22 deletions
diff --git a/vulkan/libvulkan/api.cpp b/vulkan/libvulkan/api.cpp index 5b9affd03a..9aaac5f1d6 100644 --- a/vulkan/libvulkan/api.cpp +++ b/vulkan/libvulkan/api.cpp @@ -33,6 +33,7 @@ #include <unordered_set> #include <utility> +#include <android-base/properties.h> #include <android-base/strings.h> #include <cutils/properties.h> #include <log/log.h> @@ -134,7 +135,7 @@ class OverrideLayerNames { // If no layers specified via Settings, check legacy properties if (implicit_layers_.count <= 0) { ParseDebugVulkanLayers(); - property_list(ParseDebugVulkanLayer, this); + ParseDebugVulkanLayer(); // sort by priorities auto& arr = implicit_layers_; @@ -181,30 +182,39 @@ class OverrideLayerNames { AddImplicitLayer(prio, p, strlen(p)); } - static void ParseDebugVulkanLayer(const char* key, - const char* val, - void* user_data) { + void ParseDebugVulkanLayer() { + // Checks for consecutive debug.vulkan.layer.<priority> system + // properties after always checking an initial fixed range. static const char prefix[] = "debug.vulkan.layer."; - const size_t prefix_len = sizeof(prefix) - 1; - - if (strncmp(key, prefix, prefix_len) || val[0] == '\0') - return; - key += prefix_len; - - // debug.vulkan.layer.<priority> - int priority = -1; - if (key[0] >= '0' && key[0] <= '9') - priority = atoi(key); + static constexpr int kFixedRangeBeginInclusive = 0; + static constexpr int kFixedRangeEndInclusive = 9; + + bool logged = false; + + int priority = kFixedRangeBeginInclusive; + while (true) { + const std::string prop_key = + std::string(prefix) + std::to_string(priority); + const std::string prop_val = + android::base::GetProperty(prop_key, ""); + + if (!prop_val.empty()) { + if (!logged) { + ALOGI( + "Detected Vulkan layers configured with " + "debug.vulkan.layer.<priority>. Checking for " + "debug.vulkan.layer.<priority> in the range [%d, %d] " + "followed by a consecutive scan.", + kFixedRangeBeginInclusive, kFixedRangeEndInclusive); + logged = true; + } + AddImplicitLayer(priority, prop_val.c_str(), prop_val.length()); + } else if (priority >= kFixedRangeEndInclusive) { + return; + } - if (priority < 0) { - ALOGW("Ignored implicit layer %s with invalid priority %s", val, - key); - return; + ++priority; } - - OverrideLayerNames& override_layers = - *reinterpret_cast<OverrideLayerNames*>(user_data); - override_layers.AddImplicitLayer(priority, val, strlen(val)); } void AddImplicitLayer(int priority, const char* name, size_t len) { |