diff --git a/display/composer/cache_manager/cache_manager.h b/display/composer/cache_manager/cache_manager.h index b72db9a38ac62e138532db8b37331f6697fa9464..d57111ec89cef05cffd3665d9a9c4b9e8547ce14 100644 --- a/display/composer/cache_manager/cache_manager.h +++ b/display/composer/cache_manager/cache_manager.h @@ -113,6 +113,13 @@ public: return true; } + bool ClearCache() + { + std::lock_guard lock(mutex_); + caches_.clear(); + return true; + } + CacheType* SearchCache(IdType id) { std::lock_guard lock(mutex_); diff --git a/display/composer/cache_manager/device_cache.cpp b/display/composer/cache_manager/device_cache.cpp index 88231ce71dcf3e3438196c6ced320e90f062e3d0..2103208583b802fe07b037a4665135107bbafe17 100644 --- a/display/composer/cache_manager/device_cache.cpp +++ b/display/composer/cache_manager/device_cache.cpp @@ -119,6 +119,11 @@ int32_t DeviceCache::SetDisplayClientBuffer(BufferHandle*& buffer, uint32_t seqN return ret; } +int32_t DeviceCache::ClearClientBuffer(uint32_t devId) +{ + return clientBufferCaches_->ClearCache(devId);; +} + int32_t DeviceCache::SetVirtualDisplayBuffer(BufferHandle*& buffer, uint32_t seqNo, bool &needFreeBuffer, std::function realFunc) { diff --git a/display/composer/cache_manager/device_cache.h b/display/composer/cache_manager/device_cache.h index 99e77d86f129ac544dd67244d215607d32b08ee5..480e01e2fa2c74022e4879b6a0e261e1ff9c4aa9 100644 --- a/display/composer/cache_manager/device_cache.h +++ b/display/composer/cache_manager/device_cache.h @@ -45,6 +45,7 @@ public: int32_t RemoveLayerCache(uint32_t id); int32_t SetDisplayClientBuffer(BufferHandle*& buffer, uint32_t seqNo, bool &needFreeBuffer, std::function realFunc); + int32_t ClearClientBuffer(uint32_t devId); int32_t SetVirtualDisplayBuffer(BufferHandle*& buffer, uint32_t seqNo, bool &needFreeBuffer, std::function realFunc); DeviceType CacheType() const; diff --git a/display/composer/cache_manager/layer_cache.cpp b/display/composer/cache_manager/layer_cache.cpp index 38177cfbe615a0b4868b4796f5ce531054eff1e1..c37f29b53438da3f3031ef99bf7d8dec1c6f3d96 100644 --- a/display/composer/cache_manager/layer_cache.cpp +++ b/display/composer/cache_manager/layer_cache.cpp @@ -88,6 +88,11 @@ int32_t LayerCache::SetLayerBuffer(BufferHandle*& buffer, uint32_t seqNo, bool & return HDF_SUCCESS; } +int32_t DeviceCache::ClearLayerBuffer(uint32_t devId) +{ + return bufferCaches_->ClearCache(devId);; +} + void LayerCache::NativeBufferInit(std::unique_ptr& buffer) { #ifdef DISPLAY_COMUNITY diff --git a/display/composer/cache_manager/layer_cache.h b/display/composer/cache_manager/layer_cache.h index 6756e1639ef9f35529ccf71603470e1803e36b47..e013ba7c73a91b27effa75df927258bf5c5777e7 100644 --- a/display/composer/cache_manager/layer_cache.h +++ b/display/composer/cache_manager/layer_cache.h @@ -35,6 +35,7 @@ public: static LayerCache* Create(uint32_t id); int32_t SetLayerBuffer(BufferHandle*& buffer, uint32_t seqNo, bool &needFreeBuffer, const std::vector& deletingList, std::function realFunc); + int32_t ClearLayerBuffer(uint32_t devId); int32_t SetBufferCacheMaxCount(uint32_t cacheCount); void Dump() const; static void NativeBufferInit(std::unique_ptr& buffer); diff --git a/display/composer/v1_0/display_command/display_cmd_requester.h b/display/composer/v1_0/display_command/display_cmd_requester.h index b194f3bcf02d8c47a94406ca2f200b47ac75ad3b..d312e50f01b628612ad2007b4a9786cc75bea40e 100755 --- a/display/composer/v1_0/display_command/display_cmd_requester.h +++ b/display/composer/v1_0/display_command/display_cmd_requester.h @@ -535,6 +535,66 @@ EXIT: return HDF_SUCCESS; } + int32_t ClearClientBuffer(uint32_t devId) + { + int32_t ret = CmdUtils::StartSection(REQUEST_CMD_CLEAR_CLIENT_BUFFER, requestPacker_); + DISPLAY_CHK_RETURN(ret != HDF_SUCCESS, ret, + HDF_LOGE("%{public}s: StartSection failed", __func__)); + + bool retBool = requestPacker_.WriteUint32(devId); + DISPLAY_CHK_RETURN(retBool == false, HDF_FAILURE, + HDF_LOGE("%{public}s: write maskInfo failed", __func__)); + + ret = CmdUtils::EndSection(requestPacker_); + + ret = CmdUtils::EndPack(requestPacker_); + DISPLAY_CHECK(ret != HDF_SUCCESS, goto EXIT); + + ret = DoRequest(replyEleCnt, outFds, replyData); + DISPLAY_CHECK(ret != HDF_SUCCESS, goto EXIT); + + ret = DoReplyResults(replyEleCnt, outFds, replyData, [&](void *data) -> int32_t { + needFlushFb = *(reinterpret_cast(data)); + return HDF_SUCCESS; + }); + if (ret != HDF_SUCCESS) { + HDF_LOGE("DoReplyResults failure, ret=%{public}d", ret); + } + + EXIT: + return PeriodDataReset() == HDF_SUCCESS ? ret : HDF_FAILURE; + } + + int32_t ClearLayerBuffer(uint32_t devId) + { + int32_t ret = CmdUtils::StartSection(REQUEST_CMD_CLEAR_CLIENT_BUFFER, requestPacker_); + DISPLAY_CHK_RETURN(ret != HDF_SUCCESS, ret, + HDF_LOGE("%{public}s: StartSection failed", __func__)); + + bool retBool = requestPacker_.WriteUint32(devId); + DISPLAY_CHK_RETURN(retBool == false, HDF_FAILURE, + HDF_LOGE("%{public}s: write maskInfo failed", __func__)); + + ret = CmdUtils::EndSection(requestPacker_); + + ret = CmdUtils::EndPack(requestPacker_); + DISPLAY_CHECK(ret != HDF_SUCCESS, goto EXIT); + + ret = DoRequest(replyEleCnt, outFds, replyData); + DISPLAY_CHECK(ret != HDF_SUCCESS, goto EXIT); + + ret = DoReplyResults(replyEleCnt, outFds, replyData, [&](void *data) -> int32_t { + needFlushFb = *(reinterpret_cast(data)); + return HDF_SUCCESS; + }); + if (ret != HDF_SUCCESS) { + HDF_LOGE("DoReplyResults failure, ret=%{public}d", ret); + } + + EXIT: + return PeriodDataReset() == HDF_SUCCESS ? ret : HDF_FAILURE; + } + int32_t GetDisplayCompChange(uint32_t devId, std::vector& layers, std::vector& types) { layers = compChangeLayers_[devId]; @@ -615,6 +675,8 @@ protected: return HDF_SUCCESS; } + static constexpr int32_t REPLY_CLEAR_CLIENT_BUFFER = 515; + static constexpr int32_t REPLY_CLEAR_LAYER_BUFFER = 516; int32_t ProcessUnpackCmd(CommandDataUnpacker& replyUnpacker, int32_t unpackCmd, std::vector& replyFds, std::function fn) { @@ -649,6 +711,28 @@ protected: HDF_LOGE("%{public}s: return fence fd error, unpackCmd=%{public}s", __func__, CmdUtils::CommandToString(unpackCmd))); break; + case REPLY_CLEAR_CLIENT_BUFFER: + ret = OnReplyClearClientBuffer(replyUnpacker, replyFds, fenceFd); + DISPLAY_CHK_RETURN(ret != HDF_SUCCESS, ret, + HDF_LOGE("%{public}s: OnReplyCommit failed unpackCmd=%{public}s", + __func__, CmdUtils::CommandToString(unpackCmd))); + + ret = fn(&fenceFd); + DISPLAY_CHK_RETURN(ret != HDF_SUCCESS, ret, + HDF_LOGE("%{public}s: return fence fd error, unpackCmd=%{public}s", + __func__, CmdUtils::CommandToString(unpackCmd))); + break; + case REPLY_CLEAR_LAYER_BUFFER: + ret = OnReplyClearLayerBuffer(replyUnpacker, replyFds, fenceFd); + DISPLAY_CHK_RETURN(ret != HDF_SUCCESS, ret, + HDF_LOGE("%{public}s: OnReplyCommit failed unpackCmd=%{public}s", + __func__, CmdUtils::CommandToString(unpackCmd))); + + ret = fn(&fenceFd); + DISPLAY_CHK_RETURN(ret != HDF_SUCCESS, ret, + HDF_LOGE("%{public}s: return fence fd error, unpackCmd=%{public}s", + __func__, CmdUtils::CommandToString(unpackCmd))); + break; case REPLY_CMD_SET_ERROR: ret = OnReplySetError(replyUnpacker, errMaps); DISPLAY_CHK_RETURN(ret != HDF_SUCCESS, ret, diff --git a/display/composer/v1_2/display_command/display_cmd_responser.h b/display/composer/v1_2/display_command/display_cmd_responser.h index c2141f01eed4dc0cbc06dddfb897a037c6712637..485725307539c381b38f16dd6cdeddcdf6debc50 100644 --- a/display/composer/v1_2/display_command/display_cmd_responser.h +++ b/display/composer/v1_2/display_command/display_cmd_responser.h @@ -80,6 +80,10 @@ public: OnCommitAndGetReleaseFence(unpacker, outFds); } else if (cmd == REQUEST_CMD_SET_DISPLAY_CONSTRAINT) { OnSetDisplayConstraint(unpacker); + } else if (cmd == REQUEST_CMD_CLEAR_CLIENT_BUFFER) { + OnClearClientBuffer(unpacker); + } else if (cmd == REQUEST_CMD_CLEAR_LAYER_BUFFER) { + OnClearLayerBuffer(unpacker); } else { return V1_0::DisplayCmdResponser::ProcessRequestCmd(unpacker, cmd, inFds, outFds); } @@ -316,6 +320,74 @@ EXIT: return ret; } + void OnClearClientBuffer(CommandDataUnpacker& unpacker) + { + DISPLAY_TRACE; + + uint32_t devId = 0; + + int32_t ret = unpacker.ReadUint32(devId) ? HDF_SUCCESS : HDF_FAILURE; + DISPLAY_CHECK(ret != HDF_SUCCESS, goto EXIT); + + if (cacheMgr_ == nullptr) { + HDF_LOGE("%{public}s, get cache manager error", __func__); + return HDF_FAILURE; + } + std::lock_guard lock(cacheMgr_->GetCacheMgrMutex()); + + DeviceCache* devCache = cacheMgr_->DeviceCacheInstance(data.devId); + if (devCache == nullptr) { + HDF_LOGE("%{public}s, get device cache error", __func__); + return HDF_FAILURE; + } + + int32_t ret = devCache->ClearClientBuffer(devId); + + // End this cmd section + ret = CmdUtils::EndSection(replyPacker_); + DISPLAY_CHECK(ret != HDF_SUCCESS, goto EXIT); + replyCommandCnt_++; +EXIT: + if (ret != HDF_SUCCESS) { + errMaps_.emplace(REQUEST_CMD_PREPARE_DISPLAY_LAYERS, ret); + } + return; + } + + void OnClearLayerBuffer(CommandDataUnpacker& unpacker) + { + DISPLAY_TRACE; + + uint32_t devId = 0; + + int32_t ret = unpacker.ReadUint32(devId) ? HDF_SUCCESS : HDF_FAILURE; + DISPLAY_CHECK(ret != HDF_SUCCESS, goto EXIT); + + if (cacheMgr_ == nullptr) { + HDF_LOGE("%{public}s, get cache manager error", __func__); + return HDF_FAILURE; + } + std::lock_guard lock(cacheMgr_->GetCacheMgrMutex()); + + DeviceCache* devCache = cacheMgr_->DeviceCacheInstance(data.devId); + if (devCache == nullptr) { + HDF_LOGE("%{public}s, get device cache error", __func__); + return HDF_FAILURE; + } + + int32_t ret = devCache->ClearLayerBuffer(devId); + + // End this cmd section + ret = CmdUtils::EndSection(replyPacker_); + DISPLAY_CHECK(ret != HDF_SUCCESS, goto EXIT); + replyCommandCnt_++; +EXIT: + if (ret != HDF_SUCCESS) { + errMaps_.emplace(REQUEST_CMD_PREPARE_DISPLAY_LAYERS, ret); + } + return; + } + private: using BaseType1_1 = V1_1::DisplayCmdResponser; using BaseType1_1::replyPacker_;