diff options
author | 2023-11-16 09:22:26 +0000 | |
---|---|---|
committer | 2023-11-16 09:22:26 +0000 | |
commit | fb5b86d1542ea14b128cc8287a38c988ce8be9c0 (patch) | |
tree | f3fd9923401b38713394816228998733ad02ab96 /vulkan/libvulkan/driver.cpp | |
parent | 8f36308096e60ae35fc0371d4145d6eb20387192 (diff) | |
parent | 3093fae8e823da011ab022c68c5bde9b5091b0ef (diff) |
Merge "Load vulkan driver from an apex when ro.vulkan.apex is set" into main am: a4f2d92c23 am: 1a18312ba9 am: 3093fae8e8
Original change: https://android-review.googlesource.com/c/platform/frameworks/native/+/2818498
Change-Id: I61f92db0772295c0355e3ece91d8964b356aa1ae
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
Diffstat (limited to 'vulkan/libvulkan/driver.cpp')
-rw-r--r-- | vulkan/libvulkan/driver.cpp | 35 |
1 files changed, 29 insertions, 6 deletions
diff --git a/vulkan/libvulkan/driver.cpp b/vulkan/libvulkan/driver.cpp index cae51a5ba8..0e45d2d8c4 100644 --- a/vulkan/libvulkan/driver.cpp +++ b/vulkan/libvulkan/driver.cpp @@ -46,6 +46,8 @@ using namespace android::hardware::configstore; using namespace android::hardware::configstore::V1_0; +extern "C" android_namespace_t* android_get_exported_namespace(const char*); + // #define ENABLE_ALLOC_CALLSTACKS 1 #if ENABLE_ALLOC_CALLSTACKS #include <utils/CallStack.h> @@ -159,6 +161,7 @@ const std::array<const char*, 2> HAL_SUBNAME_KEY_PROPERTIES = {{ "ro.board.platform", }}; constexpr int LIB_DL_FLAGS = RTLD_LOCAL | RTLD_NOW; +constexpr char RO_VULKAN_APEX_PROPERTY[] = "ro.vulkan.apex"; // LoadDriver returns: // * 0 when succeed, or @@ -166,6 +169,7 @@ constexpr int LIB_DL_FLAGS = RTLD_LOCAL | RTLD_NOW; // * -EINVAL when fail to find HAL_MODULE_INFO_SYM_AS_STR or // HWVULKAN_HARDWARE_MODULE_ID in the library. int LoadDriver(android_namespace_t* library_namespace, + const char* ns_name, const hwvulkan_module_t** module) { ATRACE_CALL(); @@ -184,10 +188,8 @@ int LoadDriver(android_namespace_t* library_namespace, }; so = android_dlopen_ext(lib_name.c_str(), LIB_DL_FLAGS, &dlextinfo); if (!so) { - ALOGE( - "Could not load %s from updatable gfx driver namespace: " - "%s.", - lib_name.c_str(), dlerror()); + ALOGE("Could not load %s from %s namespace: %s.", + lib_name.c_str(), ns_name, dlerror()); } } else { // load built-in driver @@ -215,12 +217,30 @@ int LoadDriver(android_namespace_t* library_namespace, return 0; } +int LoadDriverFromApex(const hwvulkan_module_t** module) { + ATRACE_CALL(); + + auto apex_name = android::base::GetProperty(RO_VULKAN_APEX_PROPERTY, ""); + if (apex_name == "") { + return -ENOENT; + } + // Get linker namespace for Vulkan APEX + std::replace(apex_name.begin(), apex_name.end(), '.', '_'); + auto ns = android_get_exported_namespace(apex_name.c_str()); + if (!ns) { + return -ENOENT; + } + android::GraphicsEnv::getInstance().setDriverToLoad( + android::GpuStatsInfo::Driver::VULKAN); + return LoadDriver(ns, apex_name.c_str(), module); +} + int LoadBuiltinDriver(const hwvulkan_module_t** module) { ATRACE_CALL(); android::GraphicsEnv::getInstance().setDriverToLoad( android::GpuStatsInfo::Driver::VULKAN); - return LoadDriver(nullptr, module); + return LoadDriver(nullptr, nullptr, module); } int LoadUpdatedDriver(const hwvulkan_module_t** module) { @@ -231,7 +251,7 @@ int LoadUpdatedDriver(const hwvulkan_module_t** module) { return -ENOENT; android::GraphicsEnv::getInstance().setDriverToLoad( android::GpuStatsInfo::Driver::VULKAN_UPDATED); - int result = LoadDriver(ns, module); + int result = LoadDriver(ns, "updatable gfx driver", module); if (result != 0) { LOG_ALWAYS_FATAL( "couldn't find an updated Vulkan implementation from %s", @@ -260,6 +280,9 @@ bool Hal::Open() { result = LoadUpdatedDriver(&module); if (result == -ENOENT) { + result = LoadDriverFromApex(&module); + } + if (result == -ENOENT) { result = LoadBuiltinDriver(&module); } if (result != 0) { |