summaryrefslogtreecommitdiff
path: root/vulkan/libvulkan/driver.cpp
diff options
context:
space:
mode:
author Yiwei Zhang <zzyiwei@google.com> 2020-07-31 13:18:49 -0700
committer Yiwei Zhang <zzyiwei@google.com> 2020-08-03 08:27:40 -0700
commit901f8ee258dbfff2090dc45badf3446266f0ae16 (patch)
treecbdcde67e88af8de2a1c104f25885fd117782b7b /vulkan/libvulkan/driver.cpp
parentd5dc0406513d1d6a5fde91a0963b2edf9de498ac (diff)
Vulkan: unload builtin driver to reload updated driver if needed
Android historically preloads GL driver in Zygote to speed up app launch time and avoid the duplicate extra memory for each process loading the graphics driver. In Android 10, we landed GL driver unloading mechanism to ship updatable driver and ANGLE without perf overhead on the rest of the system. To get prepared for the HWUI Vulkan backend being turned on as the default renderer for UI componments, this CL will do the same to the Vulkan driver to preload it in Zygote and unload so to reload updated driver if needed. Bug: 135536511 Test: atest CtsUiRenderingTestCases no regression on VK backend Change-Id: I2909f6ecc4f011b1f3670aacdf817ed3b6e9a487
Diffstat (limited to 'vulkan/libvulkan/driver.cpp')
-rw-r--r--vulkan/libvulkan/driver.cpp41
1 files changed, 40 insertions, 1 deletions
diff --git a/vulkan/libvulkan/driver.cpp b/vulkan/libvulkan/driver.cpp
index e3fc67e35f..8deca47c66 100644
--- a/vulkan/libvulkan/driver.cpp
+++ b/vulkan/libvulkan/driver.cpp
@@ -84,6 +84,8 @@ class Hal {
Hal(const Hal&) = delete;
Hal& operator=(const Hal&) = delete;
+ bool ShouldUnloadBuiltinDriver();
+ void UnloadBuiltinDriver();
bool InitDebugReportIndex();
static Hal hal_;
@@ -243,7 +245,12 @@ bool Hal::Open() {
const nsecs_t openTime = systemTime();
- ALOG_ASSERT(!hal_.dev_, "OpenHAL called more than once");
+ if (hal_.ShouldUnloadBuiltinDriver()) {
+ hal_.UnloadBuiltinDriver();
+ }
+
+ if (hal_.dev_)
+ return true;
// Use a stub device unless we successfully open a real HAL device.
hal_.dev_ = &stubhal::kDevice;
@@ -288,6 +295,38 @@ bool Hal::Open() {
return true;
}
+bool Hal::ShouldUnloadBuiltinDriver() {
+ // Should not unload since the driver was not loaded
+ if (!hal_.dev_)
+ return false;
+
+ // Should not unload if stubhal is used on the device
+ if (hal_.dev_ == &stubhal::kDevice)
+ return false;
+
+ // Unload the driver if updated driver is chosen
+ if (android::GraphicsEnv::getInstance().getDriverNamespace())
+ return true;
+
+ return false;
+}
+
+void Hal::UnloadBuiltinDriver() {
+ ATRACE_CALL();
+
+ ALOGD("Unload builtin Vulkan driver.");
+
+ // Close the opened device
+ ALOG_ASSERT(!hal_.dev_->common.close(hal_.dev_->common),
+ "hw_device_t::close() failed.");
+
+ // Close the opened shared library in the hw_module_t
+ dlclose(hal_.dev_->common.module->dso);
+
+ hal_.dev_ = nullptr;
+ hal_.debug_report_index_ = -1;
+}
+
bool Hal::InitDebugReportIndex() {
ATRACE_CALL();