Merge "Vulkan: unload builtin driver to reload updated driver if needed"
This commit is contained in:
commit
f4785c6db2
3 changed files with 53 additions and 18 deletions
|
@ -54,8 +54,9 @@ typedef union {
|
|||
/* A hwvulkan_device_t corresponds to an ICD on other systems. Currently there
|
||||
* can only be one on a system (HWVULKAN_DEVICE_0). It is opened once per
|
||||
* process when the Vulkan API is first used; the hw_device_t::close() function
|
||||
* is never called. Any non-trivial resource allocation should be done when
|
||||
* the VkInstance is created rather than when the hwvulkan_device_t is opened.
|
||||
* is called upon driver unloading. Any non-trivial resource allocation should
|
||||
* be done when the VkInstance is created rather than when the hwvulkan_device_t
|
||||
* is opened.
|
||||
*/
|
||||
typedef struct hwvulkan_device_t {
|
||||
struct hw_device_t common;
|
||||
|
|
|
@ -1174,23 +1174,18 @@ const LayerChain::ActiveLayer* LayerChain::GetActiveLayers(
|
|||
// ----------------------------------------------------------------------------
|
||||
|
||||
bool EnsureInitialized() {
|
||||
static std::once_flag once_flag;
|
||||
static bool initialized;
|
||||
static bool initialized = false;
|
||||
static pid_t init_attempted_for_pid = 0;
|
||||
static std::mutex init_lock;
|
||||
|
||||
std::call_once(once_flag, []() {
|
||||
std::lock_guard<std::mutex> lock(init_lock);
|
||||
if (init_attempted_for_pid == getpid())
|
||||
return initialized;
|
||||
|
||||
init_attempted_for_pid = getpid();
|
||||
if (driver::OpenHAL()) {
|
||||
initialized = true;
|
||||
}
|
||||
});
|
||||
|
||||
{
|
||||
static pid_t pid = getpid() + 1;
|
||||
static std::mutex layer_lock;
|
||||
std::lock_guard<std::mutex> lock(layer_lock);
|
||||
if (pid != getpid()) {
|
||||
pid = getpid();
|
||||
DiscoverLayers();
|
||||
}
|
||||
initialized = true;
|
||||
}
|
||||
|
||||
return initialized;
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
Loading…
Reference in a new issue