diff options
Diffstat (limited to 'vulkan/libvulkan/driver.cpp')
| -rw-r--r-- | vulkan/libvulkan/driver.cpp | 41 |
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(); |