From 638496f6eba53ef366cef3e0e8550e7693fb8ad6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A2=81=E9=B9=8F=E8=BE=89?= Date: Thu, 18 Jul 2024 15:00:19 +0800 Subject: [PATCH 1/2] change MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 梁鹏辉 --- .../composer/cache_manager/cache_manager.h | 7 ++ .../composer/cache_manager/device_cache.cpp | 5 ++ display/composer/cache_manager/device_cache.h | 1 + .../display_command/display_cmd_requester.h | 71 +++++++++++++++++++ .../display_command/display_cmd_responser.h | 38 ++++++++++ 5 files changed, 122 insertions(+) diff --git a/display/composer/cache_manager/cache_manager.h b/display/composer/cache_manager/cache_manager.h index b72db9a3..d57111ec 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 88231ce7..21032085 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 99e77d86..39b8726e 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 DeviceCache::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/v1_0/display_command/display_cmd_requester.h b/display/composer/v1_0/display_command/display_cmd_requester.h index b194f3bc..a3f9af20 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]; @@ -649,6 +709,17 @@ protected: HDF_LOGE("%{public}s: return fence fd error, unpackCmd=%{public}s", __func__, CmdUtils::CommandToString(unpackCmd))); break; + case REPLY_CLEAR_CLIENT_BUFFER: + ret = OnReplyCommit(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 c2141f01..ff2723a8 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,40 @@ 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; + } + private: using BaseType1_1 = V1_1::DisplayCmdResponser; using BaseType1_1::replyPacker_; -- Gitee From 1a18230a6bd5cc2ffa2710168988a14ad079f8d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A2=81=E9=B9=8F=E8=BE=89?= Date: Thu, 18 Jul 2024 15:15:18 +0800 Subject: [PATCH 2/2] change MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 梁鹏辉 --- display/composer/cache_manager/device_cache.h | 2 +- .../composer/cache_manager/layer_cache.cpp | 5 +++ display/composer/cache_manager/layer_cache.h | 1 + .../display_command/display_cmd_requester.h | 15 +++++++- .../display_command/display_cmd_responser.h | 34 +++++++++++++++++++ 5 files changed, 55 insertions(+), 2 deletions(-) diff --git a/display/composer/cache_manager/device_cache.h b/display/composer/cache_manager/device_cache.h index 39b8726e..480e01e2 100644 --- a/display/composer/cache_manager/device_cache.h +++ b/display/composer/cache_manager/device_cache.h @@ -45,7 +45,7 @@ public: int32_t RemoveLayerCache(uint32_t id); int32_t SetDisplayClientBuffer(BufferHandle*& buffer, uint32_t seqNo, bool &needFreeBuffer, std::function realFunc); - int32_t DeviceCache::ClearClientBuffer(uint32_t devId); + 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 38177cfb..c37f29b5 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 6756e163..e013ba7c 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 a3f9af20..d312e50f 100755 --- a/display/composer/v1_0/display_command/display_cmd_requester.h +++ b/display/composer/v1_0/display_command/display_cmd_requester.h @@ -675,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) { @@ -710,7 +712,18 @@ protected: __func__, CmdUtils::CommandToString(unpackCmd))); break; case REPLY_CLEAR_CLIENT_BUFFER: - ret = OnReplyCommit(replyUnpacker, replyFds, fenceFd); + 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))); 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 ff2723a8..48572530 100644 --- a/display/composer/v1_2/display_command/display_cmd_responser.h +++ b/display/composer/v1_2/display_command/display_cmd_responser.h @@ -354,6 +354,40 @@ EXIT: 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_; -- Gitee