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>
diff --git a/vulkan/libvulkan/driver.cpp b/vulkan/libvulkan/driver.cpp
index d92f35a..a544bc5 100644
--- a/vulkan/libvulkan/driver.cpp
+++ b/vulkan/libvulkan/driver.cpp
@@ -151,12 +151,15 @@
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 @@
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 758ab25..2f33fee 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 @@
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 @@
}
// 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 @@
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 @@
}
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 @@
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;
}