From e4d161a7bc87068d32e4c50623b6a20a16aecb7a Mon Sep 17 00:00:00 2001 From: yongyuan Date: Tue, 26 Sep 2023 15:43:17 +0800 Subject: [PATCH] =?UTF-8?q?SetDisplayClientBuffer=E6=96=B0=E5=A2=9Edeletin?= =?UTF-8?q?gList=E5=BD=A2=E5=8F=82=E8=A7=A3=E5=86=B3=E5=88=86=E8=BE=A8?= =?UTF-8?q?=E7=8E=87=E5=88=87=E6=8D=A2=E5=9C=BA=E6=99=AF=E4=B8=8B=E5=86=85?= =?UTF-8?q?=E5=AD=98=E6=B3=84=E9=9C=B2=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yongyuan --- .../v1_0/cache_manager/device_cache.cpp | 9 ++++++++- .../composer/v1_0/cache_manager/device_cache.h | 2 +- .../display_command/display_cmd_requester.h | 13 ++++++++++++- .../display_command/display_cmd_responser.h | 18 ++++++++++++++++-- .../v1_0/hdi_impl/display_composer_hdi_impl.h | 4 ++-- .../v1_0/include/idisplay_composer_interface.h | 2 +- 6 files changed, 40 insertions(+), 8 deletions(-) mode change 100755 => 100644 display/composer/v1_0/display_command/display_cmd_requester.h mode change 100755 => 100644 display/composer/v1_0/display_command/display_cmd_responser.h diff --git a/display/composer/v1_0/cache_manager/device_cache.cpp b/display/composer/v1_0/cache_manager/device_cache.cpp index e33928a4..655f989e 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 cce2ac74..fe15310f 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 bf7d48e6..98e58643 --- 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 8bb56c8d..f35a8548 --- 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 268188a9..3980f00f 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 a02447fe..9ef20623 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. -- Gitee