diff options
author | 2019-10-25 11:23:08 -0700 | |
---|---|---|
committer | 2019-10-25 11:24:55 -0700 | |
commit | 03b11cfca168df1e6b37790a7672a27ae280c9d1 (patch) | |
tree | b327d5586e77c330a295b41843acf89d8257acd9 | |
parent | c864a0495f9256314c0a76d4bfc9ff394fce7a17 (diff) |
Revert "[frameworks][native][vulkan] fix -Walloca"
This reverts commit a70447192bd04c77f4380a37f5a56a94d41488b5.
Test: atest CtsGpuToolsHostTestCases:android.gputools.cts.CtsRootlessGpuDebugHostTest#testDebugLayerLoadExternalVulkan
Bug: 139945549
Bug: 142475221
Bug: 143156243
Change-Id: Ie8b3fbddf63c8a4505f7fb196082c58a530d4993
Signed-off-by: Nick Desaulniers <ndesaulniers@google.com>
-rw-r--r-- | vulkan/libvulkan/driver.cpp | 16 | ||||
-rw-r--r-- | vulkan/libvulkan/layers_extensions.cpp | 45 |
2 files changed, 41 insertions, 20 deletions
diff --git a/vulkan/libvulkan/driver.cpp b/vulkan/libvulkan/driver.cpp index d92f35ac23..a544bc5ff8 100644 --- a/vulkan/libvulkan/driver.cpp +++ b/vulkan/libvulkan/driver.cpp @@ -151,12 +151,15 @@ class CreateInfoWrapper { Hal Hal::hal_; void* LoadLibrary(const android_dlextinfo& dlextinfo, - const std::string_view subname) { + const char* subname, + int subname_len) { ATRACE_CALL(); - std::stringstream ss; - ss << "vulkan." << subname << ".so"; - return android_dlopen_ext(ss.str().c_str(), RTLD_LOCAL | RTLD_NOW, &dlextinfo); + const char kLibFormat[] = "vulkan.%*s.so"; + char* name = static_cast<char*>( + alloca(sizeof(kLibFormat) + static_cast<size_t>(subname_len))); + sprintf(name, kLibFormat, subname_len, subname); + return android_dlopen_ext(name, RTLD_LOCAL | RTLD_NOW, &dlextinfo); } const std::array<const char*, 2> HAL_SUBNAME_KEY_PROPERTIES = {{ @@ -176,9 +179,8 @@ int LoadDriver(android_namespace_t* library_namespace, char prop[PROPERTY_VALUE_MAX]; for (auto key : HAL_SUBNAME_KEY_PROPERTIES) { int prop_len = property_get(key, prop, nullptr); - if (prop_len > 0 && prop_len <= UINT_MAX) { - std::string_view lib_name(prop, static_cast<unsigned int>(prop_len)); - so = LoadLibrary(dlextinfo, lib_name); + if (prop_len > 0) { + so = LoadLibrary(dlextinfo, prop, prop_len); if (so) break; } diff --git a/vulkan/libvulkan/layers_extensions.cpp b/vulkan/libvulkan/layers_extensions.cpp index 758ab25885..2f33fee8ac 100644 --- a/vulkan/libvulkan/layers_extensions.cpp +++ b/vulkan/libvulkan/layers_extensions.cpp @@ -24,7 +24,6 @@ #include <string.h> #include <sys/prctl.h> -#include <memory> #include <mutex> #include <string> #include <vector> @@ -96,7 +95,9 @@ class LayerLibrary { bool EnumerateLayers(size_t library_idx, std::vector<Layer>& instance_layers) const; - void* GetGPA(const Layer& layer, const std::string_view gpa_name) const; + void* GetGPA(const Layer& layer, + const char* gpa_name, + size_t gpa_name_len) const; const std::string GetFilename() { return filename_; } @@ -219,10 +220,17 @@ bool LayerLibrary::EnumerateLayers(size_t library_idx, } // get layer properties - auto properties = std::make_unique<VkLayerProperties[]>(num_instance_layers + num_device_layers); + VkLayerProperties* properties = static_cast<VkLayerProperties*>(alloca( + (num_instance_layers + num_device_layers) * sizeof(VkLayerProperties))); + result = enumerate_instance_layers(&num_instance_layers, properties); + if (result != VK_SUCCESS) { + ALOGE("vkEnumerateInstanceLayerProperties failed for library '%s': %d", + path_.c_str(), result); + return false; + } if (num_device_layers > 0) { result = enumerate_device_layers(VK_NULL_HANDLE, &num_device_layers, - properties.get() + num_instance_layers); + properties + num_instance_layers); if (result != VK_SUCCESS) { ALOGE( "vkEnumerateDeviceLayerProperties failed for library '%s': %d", @@ -307,11 +315,21 @@ bool LayerLibrary::EnumerateLayers(size_t library_idx, return true; } -void* LayerLibrary::GetGPA(const Layer& layer, const std::string_view gpa_name) const { - std::string layer_name { layer.properties.layerName }; - if (void* gpa = GetTrampoline((layer_name.append(gpa_name).c_str()))) - return gpa; - return GetTrampoline((std::string {"vk"}.append(gpa_name)).c_str()); +void* LayerLibrary::GetGPA(const Layer& layer, + const char* gpa_name, + size_t gpa_name_len) const { + void* gpa; + size_t layer_name_len = + std::max(size_t{2}, strlen(layer.properties.layerName)); + char* name = static_cast<char*>(alloca(layer_name_len + gpa_name_len + 1)); + strcpy(name, layer.properties.layerName); + strcpy(name + layer_name_len, gpa_name); + if (!(gpa = GetTrampoline(name))) { + strcpy(name, "vk"); + strcpy(name + 2, gpa_name); + gpa = GetTrampoline(name); + } + return gpa; } // ---------------------------------------------------------------------------- @@ -446,9 +464,10 @@ const VkExtensionProperties* FindExtension( } void* GetLayerGetProcAddr(const Layer& layer, - const std::string_view gpa_name) { + const char* gpa_name, + size_t gpa_name_len) { const LayerLibrary& library = g_layer_libraries[layer.library_idx]; - return library.GetGPA(layer, gpa_name); + return library.GetGPA(layer, gpa_name, gpa_name_len); } } // anonymous namespace @@ -531,13 +550,13 @@ LayerRef::LayerRef(LayerRef&& other) noexcept : layer_(other.layer_) { PFN_vkGetInstanceProcAddr LayerRef::GetGetInstanceProcAddr() const { return layer_ ? reinterpret_cast<PFN_vkGetInstanceProcAddr>( - GetLayerGetProcAddr(*layer_, "GetInstanceProcAddr")) + GetLayerGetProcAddr(*layer_, "GetInstanceProcAddr", 19)) : nullptr; } PFN_vkGetDeviceProcAddr LayerRef::GetGetDeviceProcAddr() const { return layer_ ? reinterpret_cast<PFN_vkGetDeviceProcAddr>( - GetLayerGetProcAddr(*layer_, "GetDeviceProcAddr")) + GetLayerGetProcAddr(*layer_, "GetDeviceProcAddr", 17)) : nullptr; } |