Loading vulkan/include/hardware/hwvulkan.h +3 −2 Original line number Diff line number Diff line Loading @@ -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; Loading vulkan/libvulkan/api.cpp +12 −17 Original line number Diff line number Diff line Loading @@ -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, []() { if (driver::OpenHAL()) { initialized = true; } }); std::lock_guard<std::mutex> lock(init_lock); if (init_attempted_for_pid == getpid()) return initialized; { static pid_t pid = getpid() + 1; static std::mutex layer_lock; std::lock_guard<std::mutex> lock(layer_lock); if (pid != getpid()) { pid = getpid(); init_attempted_for_pid = getpid(); if (driver::OpenHAL()) { DiscoverLayers(); } initialized = true; } return initialized; Loading vulkan/libvulkan/driver.cpp +40 −1 Original line number Diff line number Diff line Loading @@ -84,6 +84,8 @@ class Hal { Hal(const Hal&) = delete; Hal& operator=(const Hal&) = delete; bool ShouldUnloadBuiltinDriver(); void UnloadBuiltinDriver(); bool InitDebugReportIndex(); static Hal hal_; Loading Loading @@ -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; Loading Loading @@ -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 Loading
vulkan/include/hardware/hwvulkan.h +3 −2 Original line number Diff line number Diff line Loading @@ -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; Loading
vulkan/libvulkan/api.cpp +12 −17 Original line number Diff line number Diff line Loading @@ -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, []() { if (driver::OpenHAL()) { initialized = true; } }); std::lock_guard<std::mutex> lock(init_lock); if (init_attempted_for_pid == getpid()) return initialized; { static pid_t pid = getpid() + 1; static std::mutex layer_lock; std::lock_guard<std::mutex> lock(layer_lock); if (pid != getpid()) { pid = getpid(); init_attempted_for_pid = getpid(); if (driver::OpenHAL()) { DiscoverLayers(); } initialized = true; } return initialized; Loading
vulkan/libvulkan/driver.cpp +40 −1 Original line number Diff line number Diff line Loading @@ -84,6 +84,8 @@ class Hal { Hal(const Hal&) = delete; Hal& operator=(const Hal&) = delete; bool ShouldUnloadBuiltinDriver(); void UnloadBuiltinDriver(); bool InitDebugReportIndex(); static Hal hal_; Loading Loading @@ -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; Loading Loading @@ -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