summaryrefslogtreecommitdiff
path: root/cros_gralloc
diff options
context:
space:
mode:
authorJason Macnak <natsu@google.com>2021-02-08 08:25:02 -0800
committerJason Macnak <natsu@google.com>2021-02-08 08:25:02 -0800
commit216152bef03a75f47c680c8b89aa517f9ab37bd5 (patch)
treeb173eeead83d72303233699bd1e88f425741dac9 /cros_gralloc
parenta32d973aa856aeffb9158e13dca2ea9a982ed653 (diff)
parent3dc366e2eb1397e9110131d2a1d18ba576b59fae (diff)
downloadminigbm-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.cc57
-rw-r--r--cros_gralloc/gralloc4/CrosGralloc4Mapper.h3
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);