diff --git a/display/composer/cache_manager/cache_manager.h b/display/composer/cache_manager/cache_manager.h index 9143bb3f97b0f69a03243061a0323a22e1ced396..6855aa40d8559fe49cde9a0881c0797176532aa8 100644 --- a/display/composer/cache_manager/cache_manager.h +++ b/display/composer/cache_manager/cache_manager.h @@ -90,7 +90,7 @@ public: } caches_[id] = std::move(std::unique_ptr(cache)); } - if (initFunc_) { + if (initFunc_ && cache != nullptr) { initFunc_(caches_[id]); } return true; @@ -100,12 +100,12 @@ public: { std::lock_guard lock(mutex_); auto cacheItem = caches_.find(id); - if (cacheItem == caches_.end() || cacheItem->second == nullptr) { + if (cacheItem == caches_.end()) { HDF_LOGE("%{public}s: Cache %{public}d is not existing\n", __func__, id); return false; } - if (cleanUpFunc_) { + if (cleanUpFunc_ && cacheItem->second != nullptr) { cleanUpFunc_(cacheItem->second); } diff --git a/display/composer/v1_0/display_command/display_cmd_utils.h b/display/composer/v1_0/display_command/display_cmd_utils.h index d87dbfe68c98588bd6ce8788603459adbb3b9fda..8818cc3c0e5c0d7c9fe470141b2c7d4b821e6c99 100644 --- a/display/composer/v1_0/display_command/display_cmd_utils.h +++ b/display/composer/v1_0/display_command/display_cmd_utils.h @@ -161,25 +161,33 @@ public: } static int32_t FileDescriptorPack( - const int32_t fd, std::shared_ptr packer, std::vector& hdiFds) + const int32_t fd, std::shared_ptr packer, std::vector& hdiFds, bool dupFd = true) { + if (fd < 0) { + DISPLAY_CHK_RETURN(packer->WriteInt32(fd) == false, HDF_FAILURE, + HDF_LOGE("%{public}s, write fd error", __func__)); + return HDF_SUCCESS; + } + HdifdInfo hdifdInfo; hdifdInfo.id = GenerateHdifdSeqid(); - hdifdInfo.hdiFd = new HdifdParcelable(); - DISPLAY_CHK_RETURN(hdifdInfo.hdiFd == nullptr, HDF_FAILURE, - HDF_LOGE("%{public}s, new HdifdParcelable failed", __func__)); - if (fd >= 0) { + if (dupFd) { + hdifdInfo.hdiFd = new HdifdParcelable(); + DISPLAY_CHK_RETURN(hdifdInfo.hdiFd == nullptr, HDF_FAILURE, + HDF_LOGE("%{public}s, new HdifdParcelable failed", __func__)); // A normal fd is transfered by binder, here just write id for unpacking to match fd. DISPLAY_CHK_RETURN(hdifdInfo.hdiFd->Init(fd) == false, HDF_FAILURE, HDF_LOGE("%{public}s, hdiFd init failed, fd:%{public}d", __func__, fd)); - hdiFds.push_back(hdifdInfo); - DISPLAY_CHK_RETURN(packer->WriteInt32(hdifdInfo.id) == false, HDF_FAILURE, - HDF_LOGE("%{public}s, write hdifdInfo.id failed", __func__)); } else { - // A illegal fd is transfered by smq directly. - DISPLAY_CHK_RETURN(packer->WriteInt32(fd) == false, HDF_FAILURE, - HDF_LOGE("%{public}s, write fd error", __func__)); + hdifdInfo.hdiFd = new HdifdParcelable(fd); + DISPLAY_CHK_RETURN(hdifdInfo.hdiFd == nullptr, HDF_FAILURE, + HDF_LOGE("%{public}s, new HdifdParcelable failed", __func__)); + hdifdInfo.hdiFd->Move(); } + + hdiFds.push_back(hdifdInfo); + DISPLAY_CHK_RETURN(packer->WriteInt32(hdifdInfo.id) == false, HDF_FAILURE, + HDF_LOGE("%{public}s, write hdifdInfo.id failed", __func__)); return HDF_SUCCESS; } diff --git a/display/composer/v1_2/display_command/display_cmd_requester.h b/display/composer/v1_2/display_command/display_cmd_requester.h index 6e5dadbd45ed6f5f155be6dcb364330d95fd3a13..82b0f40eb4d7b4ddd1ecd93328522f7162be58be 100644 --- a/display/composer/v1_2/display_command/display_cmd_requester.h +++ b/display/composer/v1_2/display_command/display_cmd_requester.h @@ -47,8 +47,8 @@ public: return requester; } - int32_t CommitAndGetReleaseFence(uint32_t devId, int32_t &fence, bool isSupportSkipValidate, - int32_t &skipState, bool &needFlush, std::vector& layers, std::vector& fences) + int32_t CommitAndGetReleaseFence(uint32_t devId, int32_t &fence, bool isSupportSkipValidate, int32_t &skipState, + bool &needFlush, std::vector& layers, std::vector& fences, bool isValidated) { uint32_t replyEleCnt = 0; std::vector outFds; @@ -63,6 +63,9 @@ public: ret = requestPacker_->WriteBool(isSupportSkipValidate) ? HDF_SUCCESS : HDF_FAILURE; DISPLAY_CHECK(ret != HDF_SUCCESS, goto EXIT); + ret = requestPacker_->WriteBool(isValidated) ? HDF_SUCCESS : HDF_FAILURE; + DISPLAY_CHECK(ret != HDF_SUCCESS, goto EXIT); + ret = CmdUtils::EndSection(requestPacker_); DISPLAY_CHECK(ret != HDF_SUCCESS, goto EXIT); @@ -139,9 +142,8 @@ EXIT: DISPLAY_CHK_RETURN(replyUnpacker->ReadInt32(compChangeTypes_[devId][i]) == false, HDF_FAILURE, HDF_LOGE("%{public}s: HDI 1.2 read composition type vector failed", __func__)); } - } - - // unpack layers vector + } else { + // unpack layers vector uint32_t vectSize = 0; DISPLAY_CHK_RETURN(true != replyUnpacker->ReadUint32(vectSize), HDF_FAILURE, HDF_LOGE("%{public}s: HDI 1.2 read vect size failed", __func__)); @@ -163,6 +165,7 @@ EXIT: DISPLAY_CHK_RETURN(ret != HDF_SUCCESS, ret, HDF_LOGE("%{public}s: HDI 1.2 FileDescriptorUnpack failed", __func__)); } + } return HDF_SUCCESS; } 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 66fd47ad57e238102a6fd5174c798cb9798bae4e..cbd6390d75002671d918c65b6b72fc1529ff5435 100644 --- a/display/composer/v1_2/display_command/display_cmd_responser.h +++ b/display/composer/v1_2/display_command/display_cmd_responser.h @@ -131,26 +131,26 @@ public: HDF_LOGE("%{public}s, write skip validate return value error", __func__)); if (commitInfo.skipRet != HDF_SUCCESS) { ReplyNotSkipInfo(devId, commitInfo); - } - - // Write layers vector - vectSize = static_cast(commitInfo.layers.size()); - DISPLAY_CHECK(replyPacker_->WriteUint32(vectSize) == false, - HDF_LOGE("%{public}s, write layers.size error", __func__)); - - for (uint32_t i = 0; i < vectSize; i++) { - DISPLAY_CHECK(replyPacker_->WriteUint32(commitInfo.layers[i]) == false, - HDF_LOGE("%{public}s, write layers error", __func__)); - } + } else { + // Write layers vector + vectSize = static_cast(commitInfo.layers.size()); + DISPLAY_CHECK(replyPacker_->WriteUint32(vectSize) == false, + HDF_LOGE("%{public}s, write layers.size error", __func__)); + + for (uint32_t i = 0; i < vectSize; i++) { + DISPLAY_CHECK(replyPacker_->WriteUint32(commitInfo.layers[i]) == false, + HDF_LOGE("%{public}s, write layers error", __func__)); + } - // Write fences vector - vectSize = static_cast(commitInfo.fences.size()); - DISPLAY_CHECK(replyPacker_->WriteUint32(vectSize) == false, - HDF_LOGE("%{public}s, write fences.size error", __func__)); + // Write fences vector + vectSize = static_cast(commitInfo.fences.size()); + DISPLAY_CHECK(replyPacker_->WriteUint32(vectSize) == false, + HDF_LOGE("%{public}s, write fences.size error", __func__)); - for (uint32_t i = 0; i < vectSize; i++) { - ret = CmdUtils::FileDescriptorPack(commitInfo.fences[i], replyPacker_, outFds); - DISPLAY_CHECK(ret != HDF_SUCCESS, HDF_LOGE("%{public}s, write fences error", __func__)); + for (uint32_t i = 0; i < vectSize; i++) { + ret = CmdUtils::FileDescriptorPack(commitInfo.fences[i], replyPacker_, outFds, false); + DISPLAY_CHECK(ret != HDF_SUCCESS, HDF_LOGE("%{public}s, write fences error", __func__)); + } } DISPLAY_CHK_CONDITION(ret, HDF_SUCCESS, CmdUtils::EndSection(replyPacker_), @@ -187,6 +187,7 @@ public: DISPLAY_TRACE; uint32_t devId = 0; bool isSupportSkipValidate = false; + bool isValidated = false; int32_t ret = HDF_SUCCESS; CommitInfo commitInfo; commitInfo.fence = -1; @@ -196,20 +197,21 @@ public: CommitInfoDump(); if (!unpacker->ReadUint32(devId)) { HDF_LOGE("%{public}s, read devId error", __func__); - ret = HDF_FAILURE; goto REPLY; } if (!unpacker->ReadBool(isSupportSkipValidate)) { HDF_LOGE("%{public}s, read isSupportSkipValidate error", __func__); - ret = HDF_FAILURE; goto REPLY; } - - if (isSupportSkipValidate) { + if (!unpacker->ReadBool(isValidated)) { + HDF_LOGE("%{public}s, read isValidated error", __func__); + goto REPLY; + } + if (isSupportSkipValidate || isValidated) { HdfTrace traceVdi("Commit", "HDI:DISP:HARDWARE"); commitInfo.skipRet = impl_->Commit(devId, commitInfo.fence); } - if (commitInfo.skipRet != HDF_SUCCESS) { + if (commitInfo.skipRet != HDF_SUCCESS && isValidated == false) { { HdfTrace traceVdi("PrepareDisplayLayers", "HDI:DISP:HARDWARE"); ret = impl_->PrepareDisplayLayers(devId, commitInfo.needFlush); @@ -221,19 +223,15 @@ public: ret = impl_->GetDisplayCompChange(devId, commitInfo.compLayers, commitInfo.compTypes); } DISPLAY_CHECK(ret != HDF_SUCCESS, goto REPLY); - } - - HDF_LOGD("%{public}s, first commit with skipRet = %{public}d, fence = %{public}d, needFlush = %{public}d", - __func__, commitInfo.skipRet, commitInfo.fence, commitInfo.needFlush); - - { + } else { HdfTrace traceVdi("GetDisplayReleaseFence", "HDI:DISP:HARDWARE"); - ret = impl_->GetDisplayReleaseFence(devId, commitInfo.layers, commitInfo.fences); - } - - if (ret != HDF_SUCCESS) { - HDF_LOGE("%{public}s, GetDisplayReleaseFence failed with ret = %{public}d", __func__, ret); + if (impl_->GetDisplayReleaseFence(devId, commitInfo.layers, commitInfo.fences) != HDF_SUCCESS) { + HDF_LOGE("%{public}s, GetDisplayReleaseFence failed with devId = %{public}u", __func__, devId); + } } + + HDF_LOGD("skipRet:%{public}d, fence:%{public}d, needFlush:%{public}d, ssv:%{public}d, iv:%{public}d", + commitInfo.skipRet, commitInfo.fence, commitInfo.needFlush, isSupportSkipValidate, isValidated); REPLY: ReplyCommitAndGetReleaseFence(outFds, devId, commitInfo); return; diff --git a/display/composer/v1_2/hdi_impl/display_composer_hdi_impl.h b/display/composer/v1_2/hdi_impl/display_composer_hdi_impl.h index a013518f40f04aa3e938f4170d6bac0409ffe202..3282488d534b6df95010200a4bf20954fbb17256 100644 --- a/display/composer/v1_2/hdi_impl/display_composer_hdi_impl.h +++ b/display/composer/v1_2/hdi_impl/display_composer_hdi_impl.h @@ -69,12 +69,12 @@ public: virtual ~DisplayComposerHdiImpl() {} virtual int32_t CommitAndGetReleaseFence(uint32_t devId, int32_t& fence, int32_t& skipState, - bool& needFlush, std::vector& layers, std::vector& fences) override + bool& needFlush, std::vector& layers, std::vector& fences, bool isValidated) override { COMPOSER_CHECK_NULLPTR_RETURN(req_v1_2_); bool isSupportSkipValidate = (isSupportSkipValidate_ == 1) ? 1 : 0; return ToDispErrCode(req_v1_2_->CommitAndGetReleaseFence(devId, fence, - isSupportSkipValidate, skipState, needFlush, layers, fences)); + isSupportSkipValidate, skipState, needFlush, layers, fences, isValidated)); } virtual int32_t GetDisplayProperty(uint32_t devId, uint32_t id, uint64_t& value) override diff --git a/display/composer/v1_2/include/idisplay_composer_interface.h b/display/composer/v1_2/include/idisplay_composer_interface.h index 9eb5fe952b07a711029a79829dde778df45abb8a..3c53e1eeba9c0985972f1bcefc4fe1112cc17981 100644 --- a/display/composer/v1_2/include/idisplay_composer_interface.h +++ b/display/composer/v1_2/include/idisplay_composer_interface.h @@ -55,8 +55,8 @@ public: * @since 5.0 * @version 1.2 */ - virtual int32_t CommitAndGetReleaseFence(uint32_t devId, int32_t& fence, - int32_t& skipState, bool& needFlush, std::vector& layers, std::vector& fences) = 0; + virtual int32_t CommitAndGetReleaseFence(uint32_t devId, int32_t& fence, int32_t& skipState, + bool& needFlush, std::vector& layers, std::vector& fences, bool isValidated) = 0; virtual int32_t RegDisplayVBlankIdleCallback(VBlankIdleCallback cb, void* data) = 0;