diff options
author | Jason Macnak <natsu@google.com> | 2021-02-08 08:25:02 -0800 |
---|---|---|
committer | Jason Macnak <natsu@google.com> | 2021-02-08 08:25:02 -0800 |
commit | 216152bef03a75f47c680c8b89aa517f9ab37bd5 (patch) | |
tree | b173eeead83d72303233699bd1e88f425741dac9 /cros_gralloc | |
parent | a32d973aa856aeffb9158e13dca2ea9a982ed653 (diff) | |
parent | 3dc366e2eb1397e9110131d2a1d18ba576b59fae (diff) | |
download | minigbm-216152bef03a75f47c680c8b89aa517f9ab37bd5.tar.gz |
Merge remote-tracking branch 'aosp/upstream-main' into aosp/master
... to pull in http://crrev.com/c/2679144 for Cuttlefish.
Bug: b/179446728
Test: vts -m VtsHalGraphicsMapperV4_0Target
Change-Id: Ibcd8ebcf65a74d11cf226e52b32fbd2a45d2b1fa
Diffstat (limited to 'cros_gralloc')
-rw-r--r-- | cros_gralloc/gralloc4/CrosGralloc4Mapper.cc | 57 | ||||
-rw-r--r-- | cros_gralloc/gralloc4/CrosGralloc4Mapper.h | 3 |
2 files changed, 55 insertions, 5 deletions
diff --git a/cros_gralloc/gralloc4/CrosGralloc4Mapper.cc b/cros_gralloc/gralloc4/CrosGralloc4Mapper.cc index c328f4f..1bfd442 100644 --- a/cros_gralloc/gralloc4/CrosGralloc4Mapper.cc +++ b/cros_gralloc/gralloc4/CrosGralloc4Mapper.cc @@ -31,11 +31,60 @@ using android::hardware::graphics::common::V1_2::PixelFormat; using android::hardware::graphics::mapper::V4_0::Error; using android::hardware::graphics::mapper::V4_0::IMapper; -CrosGralloc4Mapper::CrosGralloc4Mapper() : mDriver(std::make_unique<cros_gralloc_driver>()) { - if (mDriver->init()) { - drv_log("Failed to initialize driver.\n"); - mDriver = nullptr; +namespace { + +// Provides a single instance of cros_gralloc_driver to all active instances of +// CrosGralloc4Mapper in a single process while destroying the cros_gralloc_driver +// when there are no active instances of CrosGralloc4Mapper. +class DriverProvider { + public: + static DriverProvider* Get() { + static DriverProvider* instance = new DriverProvider(); + return instance; + } + + cros_gralloc_driver* GetAndReferenceDriver() { + std::lock_guard<std::mutex> lock(mMutex); + if (!mDriver) { + mDriver = std::make_unique<cros_gralloc_driver>(); + if (mDriver->init()) { + drv_log("Failed to initialize driver.\n"); + mDriver.reset(); + return nullptr; + } + } + + ++mReferenceCount; + return mDriver.get(); + } + + void UnreferenceDriver() { + std::lock_guard<std::mutex> lock(mMutex); + + --mReferenceCount; + + if (mReferenceCount == 0) { + mDriver.reset(); + } } + + private: + DriverProvider() = default; + + std::mutex mMutex; + std::unique_ptr<cros_gralloc_driver> mDriver; + std::size_t mReferenceCount = 0; +}; + +} // namespace + +CrosGralloc4Mapper::CrosGralloc4Mapper() { + mDriver = DriverProvider::Get()->GetAndReferenceDriver(); +} + +CrosGralloc4Mapper::~CrosGralloc4Mapper() { + mDriver = nullptr; + DriverProvider::Get()->UnreferenceDriver(); } Return<void> CrosGralloc4Mapper::createDescriptor(const BufferDescriptorInfo& description, diff --git a/cros_gralloc/gralloc4/CrosGralloc4Mapper.h b/cros_gralloc/gralloc4/CrosGralloc4Mapper.h index b318930..3c159a2 100644 --- a/cros_gralloc/gralloc4/CrosGralloc4Mapper.h +++ b/cros_gralloc/gralloc4/CrosGralloc4Mapper.h @@ -12,6 +12,7 @@ class CrosGralloc4Mapper : public android::hardware::graphics::mapper::V4_0::IMapper { public: CrosGralloc4Mapper(); + ~CrosGralloc4Mapper(); android::hardware::Return<void> createDescriptor(const BufferDescriptorInfo& description, createDescriptor_cb hidlCb) override; @@ -74,7 +75,7 @@ class CrosGralloc4Mapper : public android::hardware::graphics::mapper::V4_0::IMa int getResolvedDrmFormat(android::hardware::graphics::common::V1_2::PixelFormat pixelFormat, uint64_t bufferUsage, uint32_t* outDrmFormat); - std::unique_ptr<cros_gralloc_driver> mDriver; + cros_gralloc_driver* mDriver = nullptr; }; extern "C" android::hardware::graphics::mapper::V4_0::IMapper* HIDL_FETCH_IMapper(const char* name); |