diff --git a/graphics/mapper/2.0/utils/hal/include/mapper-hal/2.0/Mapper.h b/graphics/mapper/2.0/utils/hal/include/mapper-hal/2.0/Mapper.h index 5ad2a6564c..81341742c7 100644 --- a/graphics/mapper/2.0/utils/hal/include/mapper-hal/2.0/Mapper.h +++ b/graphics/mapper/2.0/utils/hal/include/mapper-hal/2.0/Mapper.h @@ -80,17 +80,21 @@ class MapperImpl : public Interface { } Return freeBuffer(void* buffer) override { - native_handle_t* bufferHandle = removeImportedBuffer(buffer); + native_handle_t* bufferHandle = getImportedBuffer(buffer); if (!bufferHandle) { return Error::BAD_BUFFER; } - return mHal->freeBuffer(bufferHandle); + Error error = mHal->freeBuffer(bufferHandle); + if (error == Error::NONE) { + removeImportedBuffer(buffer); + } + return error; } Return lock(void* buffer, uint64_t cpuUsage, const V2_0::IMapper::Rect& accessRegion, const hidl_handle& acquireFence, IMapper::lock_cb hidl_cb) override { - const native_handle_t* bufferHandle = getImportedBuffer(buffer); + const native_handle_t* bufferHandle = getConstImportedBuffer(buffer); if (!bufferHandle) { hidl_cb(Error::BAD_BUFFER, nullptr); return Void(); @@ -112,7 +116,7 @@ class MapperImpl : public Interface { Return lockYCbCr(void* buffer, uint64_t cpuUsage, const V2_0::IMapper::Rect& accessRegion, const hidl_handle& acquireFence, IMapper::lockYCbCr_cb hidl_cb) override { - const native_handle_t* bufferHandle = getImportedBuffer(buffer); + const native_handle_t* bufferHandle = getConstImportedBuffer(buffer); if (!bufferHandle) { hidl_cb(Error::BAD_BUFFER, YCbCrLayout{}); return Void(); @@ -132,7 +136,7 @@ class MapperImpl : public Interface { } Return unlock(void* buffer, IMapper::unlock_cb hidl_cb) override { - const native_handle_t* bufferHandle = getImportedBuffer(buffer); + const native_handle_t* bufferHandle = getConstImportedBuffer(buffer); if (!bufferHandle) { hidl_cb(Error::BAD_BUFFER, nullptr); return Void(); @@ -160,7 +164,11 @@ class MapperImpl : public Interface { return static_cast(buffer); } - virtual const native_handle_t* getImportedBuffer(void* buffer) const { + virtual native_handle_t* getImportedBuffer(void* buffer) const { + return static_cast(buffer); + } + + virtual const native_handle_t* getConstImportedBuffer(void* buffer) const { return static_cast(buffer); } diff --git a/graphics/mapper/2.0/utils/passthrough/include/mapper-passthrough/2.0/GrallocLoader.h b/graphics/mapper/2.0/utils/passthrough/include/mapper-passthrough/2.0/GrallocLoader.h index e8b1b4b837..85a91c3ada 100644 --- a/graphics/mapper/2.0/utils/passthrough/include/mapper-passthrough/2.0/GrallocLoader.h +++ b/graphics/mapper/2.0/utils/passthrough/include/mapper-passthrough/2.0/GrallocLoader.h @@ -68,7 +68,14 @@ class GrallocImportedBufferPool { return mBufferHandles.erase(bufferHandle) == 1 ? bufferHandle : nullptr; } - const native_handle_t* get(void* buffer) { + native_handle_t* get(void* buffer) { + auto bufferHandle = static_cast(buffer); + + std::lock_guard lock(mMutex); + return mBufferHandles.count(bufferHandle) == 1 ? bufferHandle : nullptr; + } + + const native_handle_t* getConst(void* buffer) { auto bufferHandle = static_cast(buffer); std::lock_guard lock(mMutex); @@ -92,9 +99,13 @@ class GrallocMapper : public T { return GrallocImportedBufferPool::getInstance().remove(buffer); } - const native_handle_t* getImportedBuffer(void* buffer) const override { + native_handle_t* getImportedBuffer(void* buffer) const override { return GrallocImportedBufferPool::getInstance().get(buffer); } + + const native_handle_t* getConstImportedBuffer(void* buffer) const override { + return GrallocImportedBufferPool::getInstance().getConst(buffer); + } }; class GrallocLoader {