diff --git a/display/composer/v1_0/cache_manager/device_cache.cpp b/display/composer/v1_0/cache_manager/device_cache.cpp index e33928a4961a083efcb15ea25ccc375ef7a7aa96..655f989ea7cc6fb8de1c3ba2094220ed509e6996 100644 --- a/display/composer/v1_0/cache_manager/device_cache.cpp +++ b/display/composer/v1_0/cache_manager/device_cache.cpp @@ -99,8 +99,15 @@ int32_t DeviceCache::RemoveLayerCache(uint32_t id) } int32_t DeviceCache::SetDisplayClientBuffer(const BufferHandle* buffer, uint32_t seqNo, - std::function realFunc) + const std::vector &deletingList, std::function realFunc) { + bool result = HDF_SUCCESS; + for (auto num : deletingList) { + result = clientBufferCaches_->EraseCache(num); + DISPLAY_CHECK((result != true), + HDF_LOGE("%{public}s: warning, erase clientbuffer cache fail, num: %{public}u", __func__, num)); + } + BufferHandle* handle = BufferCacheUtils::NativeBufferCache(clientBufferCaches_, const_cast(buffer), seqNo, deviceId_); DISPLAY_CHK_RETURN(handle == nullptr, HDF_FAILURE, diff --git a/display/composer/v1_0/cache_manager/device_cache.h b/display/composer/v1_0/cache_manager/device_cache.h index cce2ac74b291a66ef46b54938d7776dc4d361eb0..fe15310f89b56cbb75507aaf674fe433fd614858 100644 --- a/display/composer/v1_0/cache_manager/device_cache.h +++ b/display/composer/v1_0/cache_manager/device_cache.h @@ -45,7 +45,7 @@ public: int32_t AddLayerCache(uint32_t id, uint32_t bufferCacheCount); int32_t RemoveLayerCache(uint32_t id); int32_t SetDisplayClientBuffer(const BufferHandle* buffer, uint32_t seqNo, - std::function realFunc); + const std::vector &deletingList, std::function realFunc); int32_t SetVirtualDisplayBuffer(const BufferHandle* buffer, uint32_t seqNo, std::function realFunc); DeviceType CacheType() const; diff --git a/display/composer/v1_0/display_command/display_cmd_requester.h b/display/composer/v1_0/display_command/display_cmd_requester.h old mode 100755 new mode 100644 index bf7d48e6e39e42a2725762da319de5e0740dfe26..98e5864396abc97b262d933b8c6fa68221e31a4b --- a/display/composer/v1_0/display_command/display_cmd_requester.h +++ b/display/composer/v1_0/display_command/display_cmd_requester.h @@ -127,7 +127,7 @@ EXIT: } int32_t SetDisplayClientBuffer(uint32_t devId, const BufferHandle* buffer, uint32_t seqNo, - int32_t fence) + int32_t fence, const std::vector& deletingList) { int32_t ret = CmdUtils::StartSection(REQUEST_CMD_SET_DISPLAY_CLIENT_BUFFER, requestPacker_); DISPLAY_CHK_RETURN(ret != HDF_SUCCESS, ret, @@ -149,6 +149,17 @@ EXIT: DISPLAY_CHK_RETURN(ret != HDF_SUCCESS, ret, HDF_LOGE("%{public}s: FileDescriptorPack failed", __func__)); + uint32_t vectSize = static_cast(deletingList.size()); + retBool = requestPacker_->WriteUint32(vectSize); + DISPLAY_CHK_RETURN(retBool == false, HDF_FAILURE, + HDF_LOGE("%{public}s: write vector size failed", __func__)); + + for (uint32_t i = 0; i < vectSize; i++) { + bool result = requestPacker_->WriteUint32(deletingList[i]); + DISPLAY_CHK_RETURN(result == false, HDF_FAILURE, + HDF_LOGE("%{public}s: write deletingList failed", __func__)); + } + ret = CmdUtils::EndSection(requestPacker_); DISPLAY_CHK_RETURN(ret != HDF_SUCCESS, ret, HDF_LOGE("%{public}s: EndSection failed", __func__)); diff --git a/display/composer/v1_0/display_command/display_cmd_responser.h b/display/composer/v1_0/display_command/display_cmd_responser.h old mode 100755 new mode 100644 index 8bb56c8de39f66a842da05737ecaae6d295bd738..f35a854898db7b32b7cddc09eb06e69423aa41c8 --- a/display/composer/v1_0/display_command/display_cmd_responser.h +++ b/display/composer/v1_0/display_command/display_cmd_responser.h @@ -338,7 +338,6 @@ EXIT: void OnSetDisplayClientBuffer(std::shared_ptr unpacker, const std::vector& inFds) { DISPLAY_TRACE; - uint32_t devId = 0; int32_t ret = unpacker->ReadUint32(devId) ? HDF_SUCCESS : HDF_FAILURE; @@ -356,7 +355,21 @@ EXIT: int32_t fence = -1; DISPLAY_CHK_CONDITION(ret, HDF_SUCCESS, CmdUtils::FileDescriptorUnpack(unpacker, inFds, fence), HDF_LOGE("%{public}s, FileDescriptorUnpack error", __func__)); + HdifdParcelable fdParcel(fence); + uint32_t vectSize = 0; + DISPLAY_CHK_CONDITION(result, ret == HDF_SUCCESS, unpacker->ReadUint32(vectSize), + HDF_LOGE("%{public}s, read vectSize error", __func__)); + + std::vector deletingList(vectSize); + for (uint32_t i = 0; i < vectSize; i++) { + DISPLAY_CHK_CONDITION(result, true, unpacker->ReadUint32(deletingList[i]), + HDF_LOGE("%{public}s, read seqNo error, at i = %{public}d", __func__, i)); + if (result != true) { + break; + } + } + ret = result ? HDF_SUCCESS : HDF_FAILURE; { if (cacheMgr_ == nullptr) { ret = HDF_FAILURE; @@ -372,7 +385,8 @@ EXIT: goto EXIT; } - ret = devCache->SetDisplayClientBuffer(buffer, seqNo, [&](const BufferHandle& handle)->int32_t { + ret = devCache->SetDisplayClientBuffer(buffer, seqNo, deletingList, + [&](const BufferHandle& handle)->int32_t { int rc = impl_->SetDisplayClientBuffer(devId, handle, fdParcel.GetFd()); DISPLAY_CHK_RETURN(rc != HDF_SUCCESS, HDF_FAILURE, HDF_LOGE(" fail")); return HDF_SUCCESS; diff --git a/display/composer/v1_0/hdi_impl/display_composer_hdi_impl.h b/display/composer/v1_0/hdi_impl/display_composer_hdi_impl.h index 268188a9dd93c0104d640311b8bc31cf01ead0b3..3980f00ff70f742b1dad418902cbce746cb9dce8 100644 --- a/display/composer/v1_0/hdi_impl/display_composer_hdi_impl.h +++ b/display/composer/v1_0/hdi_impl/display_composer_hdi_impl.h @@ -198,10 +198,10 @@ public: } virtual int32_t SetDisplayClientBuffer(uint32_t devId, const BufferHandle* buffer, uint32_t seqNo, - int32_t fence) override + int32_t fence, const std::vector& deletingList = {}) override { COMPOSER_CHECK_NULLPTR(req_); - return ToDispErrCode(req_->SetDisplayClientBuffer(devId, buffer, seqNo, fence)); + return ToDispErrCode(req_->SetDisplayClientBuffer(devId, buffer, seqNo, fence, deletingList)); } virtual int32_t SetDisplayClientDamage(uint32_t devId, std::vector& rects) override diff --git a/display/composer/v1_0/include/idisplay_composer_interface.h b/display/composer/v1_0/include/idisplay_composer_interface.h index a02447fe8c995ca68470eed943e7cb14ccac8a97..9ef20623db9713fdae21d951e5aff07eaa63e51b 100644 --- a/display/composer/v1_0/include/idisplay_composer_interface.h +++ b/display/composer/v1_0/include/idisplay_composer_interface.h @@ -269,7 +269,7 @@ public: * @version 1.0 */ virtual int32_t SetDisplayClientBuffer(uint32_t devId, const BufferHandle* buffer, uint32_t seqNo, - int32_t fence) = 0; + int32_t fence, const std::vector& deletingList = {}) = 0; /** * @brief Sets the dirty region for a display device.