Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 03b11cfc authored by Nick Desaulniers's avatar Nick Desaulniers
Browse files

Revert "[frameworks][native][vulkan] fix -Walloca"



This reverts commit a7044719.

Test: atest CtsGpuToolsHostTestCases:android.gputools.cts.CtsRootlessGpuDebugHostTest#testDebugLayerLoadExternalVulkan
Bug: 139945549
Bug: 142475221
Bug: 143156243
Change-Id: Ie8b3fbddf63c8a4505f7fb196082c58a530d4993
Signed-off-by: default avatarNick Desaulniers <ndesaulniers@google.com>
parent c864a049
Loading
Loading
Loading
Loading
+9 −7
Original line number Diff line number Diff line
@@ -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;
        }
+32 −13
Original line number Diff line number Diff line
@@ -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())))
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;
    return GetTrampoline((std::string {"vk"}.append(gpa_name)).c_str());
}

// ----------------------------------------------------------------------------
@@ -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;
}