diff --git a/display/composer/cache_manager/cache_manager.h b/display/composer/cache_manager/cache_manager.h index 9143bb3f97b0f69a03243061a0323a22e1ced396..fe02805b9ad59804becb20d1d133d3fbdb64ab98 100644 --- a/display/composer/cache_manager/cache_manager.h +++ b/display/composer/cache_manager/cache_manager.h @@ -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/command_pack/command_data_packer.h b/display/composer/command_pack/command_data_packer.h index 5d7fe40eda37475e1384ee33767cb93938edbbfb..289ffc809e041bade42503432857ee9b5e3f4984 100644 --- a/display/composer/command_pack/command_data_packer.h +++ b/display/composer/command_pack/command_data_packer.h @@ -46,9 +46,17 @@ public: bool Init(size_t size = INIT_DATA_SIZE, bool isAdaptiveGrowth = false) { + writePos_ = 0; + curSecOffset_ = 0; + settingSecLen_ = 0; + curSecLenPos_ = 0; + isAdaptiveGrowth_ = false; packSize_ = size; uint32_t alignedSize = (packSize_ + ALLOC_PAGE_SIZE - 1) & (~(ALLOC_PAGE_SIZE - 1)); - data_ = new char[alignedSize](); + if (data_ != nullptr) { + delete [] data_; + } + data_ = new char[alignedSize]; DISPLAY_CHK_RETURN(data_ == nullptr, false, HDF_LOGE("%{public}s, alloc memory failed", __func__)); packSize_ = alignedSize; 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 e13130850693b8a250525abe15985c7212c9dcd1..b194f3bcf02d8c47a94406ca2f200b47ac75ad3b 100755 --- a/display/composer/v1_0/display_command/display_cmd_requester.h +++ b/display/composer/v1_0/display_command/display_cmd_requester.h @@ -42,8 +42,7 @@ public: : initFlag_(false), hdi_(hdi), request_(nullptr), - reply_(nullptr), - requestPacker_(nullptr) + reply_(nullptr) { } @@ -74,9 +73,7 @@ public: DISPLAY_CHK_RETURN(ret != HDF_SUCCESS, ret, HDF_LOGE("%{public}s: InitCmdRequest failure, ret=%{public}d", __func__, ret)); - requestPacker_ = std::make_shared(); - if (requestPacker_ == nullptr || - requestPacker_->Init(request_->GetSize() * CmdUtils::ELEMENT_SIZE) == false) { + if (requestPacker_.Init(request_->GetSize() << CmdUtils::MOVE_SIZE) == false) { HDF_LOGE("%{public}s: requestPacker init failed", __func__); return HDF_FAILURE; } @@ -102,7 +99,7 @@ public: int32_t ret = CmdUtils::StartSection(REQUEST_CMD_PREPARE_DISPLAY_LAYERS, requestPacker_); DISPLAY_CHECK(ret != HDF_SUCCESS, goto EXIT); - ret = requestPacker_->WriteUint32(devId) ? HDF_SUCCESS : HDF_FAILURE; + ret = requestPacker_.WriteUint32(devId) ? HDF_SUCCESS : HDF_FAILURE; DISPLAY_CHECK(ret != HDF_SUCCESS, goto EXIT); ret = CmdUtils::EndSection(requestPacker_); @@ -133,7 +130,7 @@ EXIT: DISPLAY_CHK_RETURN(ret != HDF_SUCCESS, ret, HDF_LOGE("%{public}s: StartSection failed", __func__)); - bool retBool = requestPacker_->WriteUint32(devId); + bool retBool = requestPacker_.WriteUint32(devId); DISPLAY_CHK_RETURN(retBool == false, HDF_FAILURE, HDF_LOGE("%{public}s: write devId failed", __func__)); @@ -141,7 +138,7 @@ EXIT: DISPLAY_CHK_RETURN(ret != HDF_SUCCESS, ret, HDF_LOGE("%{public}s: BufferHandlePack failed", __func__)); - retBool = requestPacker_->WriteUint32(seqNo); + retBool = requestPacker_.WriteUint32(seqNo); DISPLAY_CHK_RETURN(retBool == false, HDF_FAILURE, HDF_LOGE("%{public}s: write seqNo failed", __func__)); @@ -162,12 +159,12 @@ EXIT: DISPLAY_CHK_RETURN(ret != HDF_SUCCESS, ret, HDF_LOGE("%{public}s: StartSection failed", __func__)); - ret = requestPacker_->WriteUint32(devId) ? HDF_SUCCESS : HDF_FAILURE; + ret = requestPacker_.WriteUint32(devId) ? HDF_SUCCESS : HDF_FAILURE; DISPLAY_CHK_RETURN(ret != HDF_SUCCESS, ret, HDF_LOGE("%{public}s: write devId failed", __func__)); uint32_t vectSize = static_cast(rects.size()); - bool retBool = requestPacker_->WriteUint32(vectSize); + bool retBool = requestPacker_.WriteUint32(vectSize); DISPLAY_CHK_RETURN(retBool == false, HDF_FAILURE, HDF_LOGE("%{public}s: write damage vector size failed", __func__)); @@ -193,7 +190,7 @@ EXIT: int32_t ret = CmdUtils::StartSection(REQUEST_CMD_COMMIT, requestPacker_); DISPLAY_CHECK(ret != HDF_SUCCESS, goto EXIT); - ret = requestPacker_->WriteUint32(devId) ? HDF_SUCCESS : HDF_FAILURE; + ret = requestPacker_.WriteUint32(devId) ? HDF_SUCCESS : HDF_FAILURE; DISPLAY_CHECK(ret != HDF_SUCCESS, goto EXIT); ret = CmdUtils::EndSection(requestPacker_); @@ -227,23 +224,23 @@ EXIT: DISPLAY_CHK_RETURN(ret != HDF_SUCCESS, ret, HDF_LOGE("%{public}s: write devId failed", __func__)); - bool retBool = requestPacker_->WriteBool(alpha.enGlobalAlpha); + bool retBool = requestPacker_.WriteBool(alpha.enGlobalAlpha); DISPLAY_CHK_RETURN(retBool == false, HDF_FAILURE, HDF_LOGE("%{public}s: write enGlobalAlpha failed", __func__)); - retBool = requestPacker_->WriteBool(alpha.enPixelAlpha); + retBool = requestPacker_.WriteBool(alpha.enPixelAlpha); DISPLAY_CHK_RETURN(retBool == false, HDF_FAILURE, HDF_LOGE("%{public}s: write enPixelAlpha failed", __func__)); - retBool = requestPacker_->WriteUint8(alpha.alpha0); + retBool = requestPacker_.WriteUint8(alpha.alpha0); DISPLAY_CHK_RETURN(retBool == false, HDF_FAILURE, HDF_LOGE("%{public}s: write alpha0 failed", __func__)); - retBool = requestPacker_->WriteUint8(alpha.alpha1); + retBool = requestPacker_.WriteUint8(alpha.alpha1); DISPLAY_CHK_RETURN(retBool == false, HDF_FAILURE, HDF_LOGE("%{public}s: write alpha1 failed", __func__)); - retBool = requestPacker_->WriteUint8(alpha.gAlpha); + retBool = requestPacker_.WriteUint8(alpha.gAlpha); DISPLAY_CHK_RETURN(retBool == false, HDF_FAILURE, HDF_LOGE("%{public}s: write gAlpha failed", __func__)); @@ -306,7 +303,7 @@ EXIT: DISPLAY_CHK_RETURN(ret != HDF_SUCCESS, ret, HDF_LOGE("%{public}s: SetupDevice failed", __func__)); - bool retBool = requestPacker_->WriteUint32(zorder); + bool retBool = requestPacker_.WriteUint32(zorder); DISPLAY_CHK_RETURN(retBool == false, HDF_FAILURE, HDF_LOGE("%{public}s: write zorder failed", __func__)); @@ -327,7 +324,7 @@ EXIT: DISPLAY_CHK_RETURN(ret != HDF_SUCCESS, ret, HDF_LOGE("%{public}s: SetupDevice failed", __func__)); - bool retBool = requestPacker_->WriteBool(preMul); + bool retBool = requestPacker_.WriteBool(preMul); DISPLAY_CHK_RETURN(retBool == false, HDF_FAILURE, HDF_LOGE("%{public}s: write preMul failed", __func__)); @@ -348,7 +345,7 @@ EXIT: DISPLAY_CHK_RETURN(ret != HDF_SUCCESS, ret, HDF_LOGE("%{public}s: SetupDevice failed", __func__)); - bool retBool = requestPacker_->WriteInt32(type); + bool retBool = requestPacker_.WriteInt32(type); DISPLAY_CHK_RETURN(retBool == false, HDF_FAILURE, HDF_LOGE("%{public}s: write transform-type failed", __func__)); @@ -370,7 +367,7 @@ EXIT: HDF_LOGE("%{public}s: SetupDevice failed", __func__)); uint32_t vSize = rects.size(); - bool retBool = requestPacker_->WriteUint32(vSize); + bool retBool = requestPacker_.WriteUint32(vSize); DISPLAY_CHK_RETURN(retBool == false, HDF_FAILURE, HDF_LOGE("%{public}s: write vSize failed", __func__)); for (uint32_t i = 0; i < vSize; i++) { @@ -397,7 +394,7 @@ EXIT: HDF_LOGE("%{public}s: SetupDevice failed", __func__)); uint32_t vSize = rects.size(); - bool retBool = requestPacker_->WriteUint32(vSize); + bool retBool = requestPacker_.WriteUint32(vSize); DISPLAY_CHK_RETURN(retBool == false, HDF_FAILURE, HDF_LOGE("%{public}s: write vSize failed", __func__)); for (uint32_t i = 0; i < vSize; i++) { @@ -428,7 +425,7 @@ EXIT: DISPLAY_CHK_RETURN(ret != HDF_SUCCESS, ret, HDF_LOGE("%{public}s: BufferHandlePack failed", __func__)); - bool result = requestPacker_->WriteUint32(seqNo); + bool result = requestPacker_.WriteUint32(seqNo); DISPLAY_CHK_RETURN(result == false, HDF_FAILURE, HDF_LOGE("%{public}s: write seqNo failed", __func__)); @@ -437,12 +434,12 @@ EXIT: HDF_LOGE("%{public}s: FileDescriptorPack failed", __func__)); // write deletingList uint32_t vectSize = static_cast(deletingList.size()); - bool retBool = requestPacker_->WriteUint32(vectSize); + bool 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]); + bool result = requestPacker_.WriteUint32(deletingList[i]); DISPLAY_CHK_RETURN(result == false, HDF_FAILURE, HDF_LOGE("%{public}s: write deletingList failed", __func__)); } @@ -464,7 +461,7 @@ EXIT: DISPLAY_CHK_RETURN(ret != HDF_SUCCESS, ret, HDF_LOGE("%{public}s: SetupDevice failed", __func__)); - int32_t retBool = requestPacker_->WriteInt32(type); + int32_t retBool = requestPacker_.WriteInt32(type); DISPLAY_CHK_RETURN(retBool == false, HDF_FAILURE, HDF_LOGE("%{public}s: write composition type failed", __func__)); @@ -485,7 +482,7 @@ EXIT: DISPLAY_CHK_RETURN(ret != HDF_SUCCESS, ret, HDF_LOGE("%{public}s: SetupDevice failed", __func__)); - bool retBool = requestPacker_->WriteInt32(type); + bool retBool = requestPacker_.WriteInt32(type); DISPLAY_CHK_RETURN(retBool == false, HDF_FAILURE, HDF_LOGE("%{public}s: write blend type failed", __func__)); @@ -506,7 +503,7 @@ EXIT: DISPLAY_CHK_RETURN(ret != HDF_SUCCESS, ret, HDF_LOGE("%{public}s: SetupDevice failed", __func__)); - bool retBool = requestPacker_->WriteUint32(maskInfo); + bool retBool = requestPacker_.WriteUint32(maskInfo); DISPLAY_CHK_RETURN(retBool == false, HDF_FAILURE, HDF_LOGE("%{public}s: write maskInfo failed", __func__)); @@ -547,21 +544,20 @@ EXIT: return HDF_SUCCESS; } protected: - int32_t OnReplySetError( - std::shared_ptr replyUnpacker, std::unordered_map &errMaps) + int32_t OnReplySetError(CommandDataUnpacker& replyUnpacker, std::unordered_map &errMaps) { uint32_t errCnt = 0; - bool retBool = replyUnpacker->ReadUint32(errCnt); + bool retBool = replyUnpacker.ReadUint32(errCnt); DISPLAY_CHK_RETURN(retBool == false, HDF_FAILURE, HDF_LOGE("%{public}s: read err cnt failed", __func__)); int32_t errCmd = -1; int32_t errCode = -1; for (; errCnt > 0; errCnt--) { - retBool = replyUnpacker->ReadInt32(errCmd); + retBool = replyUnpacker.ReadInt32(errCmd); DISPLAY_CHK_RETURN(retBool == false, HDF_FAILURE, HDF_LOGE("%{public}s: read err cmd failed", __func__)); - retBool = replyUnpacker->ReadInt32(errCode); + retBool = replyUnpacker.ReadInt32(errCode); DISPLAY_CHK_RETURN(retBool == false, HDF_FAILURE, HDF_LOGE("%{public}s: read err code failed", __func__)); errMaps.emplace(errCmd, errCode); @@ -570,17 +566,17 @@ protected: return HDF_SUCCESS; } - int32_t OnReplyPrepareDisplayLayers(std::shared_ptr replyUnpacker, bool &needFlushFb) + int32_t OnReplyPrepareDisplayLayers(CommandDataUnpacker& replyUnpacker, bool &needFlushFb) { uint32_t devId = 0; - int32_t retBool = replyUnpacker->ReadUint32(devId); + int32_t retBool = replyUnpacker.ReadUint32(devId); DISPLAY_CHK_RETURN(retBool == false, HDF_FAILURE, HDF_LOGE("%{public}s: read devId failed", __func__)); - retBool = replyUnpacker->ReadBool(needFlushFb); + retBool = replyUnpacker.ReadBool(needFlushFb); DISPLAY_CHK_RETURN(retBool == false, HDF_FAILURE, HDF_LOGE("%{public}s: read needFlushFb failed", __func__)); // unpack layers vector uint32_t vectSize = 0; - retBool = replyUnpacker->ReadUint32(vectSize); + retBool = replyUnpacker.ReadUint32(vectSize); DISPLAY_CHK_RETURN(retBool == false, HDF_FAILURE, HDF_LOGE("%{public}s: read vect size failed", __func__)); if (vectSize > CmdUtils::MAX_MEMORY) { HDF_LOGE("%{public}s: layers vectSize:%{public}u is too large", __func__, vectSize); @@ -589,12 +585,12 @@ protected: compChangeLayers_[devId].resize(vectSize); for (uint32_t i = 0; i < vectSize; i++) { - DISPLAY_CHK_RETURN(replyUnpacker->ReadUint32(compChangeLayers_[devId][i]) == false, HDF_FAILURE, + DISPLAY_CHK_RETURN(replyUnpacker.ReadUint32(compChangeLayers_[devId][i]) == false, HDF_FAILURE, HDF_LOGE("%{public}s: read layer vector failed", __func__)); } // unpack types vector vectSize = 0; - retBool = replyUnpacker->ReadUint32(vectSize); + retBool = replyUnpacker.ReadUint32(vectSize); DISPLAY_CHK_RETURN(retBool == false, HDF_FAILURE, HDF_LOGE("%{public}s: read vect size failed", __func__)); if (vectSize > CmdUtils::MAX_MEMORY) { HDF_LOGE("%{public}s: types vectSize:%{public}u is too large", __func__, vectSize); @@ -603,7 +599,7 @@ protected: compChangeTypes_[devId].resize(vectSize); for (uint32_t i = 0; i < vectSize; i++) { - DISPLAY_CHK_RETURN(replyUnpacker->ReadInt32(compChangeTypes_[devId][i]) == false, HDF_FAILURE, + DISPLAY_CHK_RETURN(replyUnpacker.ReadInt32(compChangeTypes_[devId][i]) == false, HDF_FAILURE, HDF_LOGE("%{public}s: read composition type vector failed", __func__)); } @@ -611,7 +607,7 @@ protected: } int32_t OnReplyCommit( - std::shared_ptr replyUnpacker, std::vector replyFds, int32_t &fenceFd) + CommandDataUnpacker& replyUnpacker, std::vector& replyFds, int32_t &fenceFd) { int32_t ret = CmdUtils::FileDescriptorUnpack(replyUnpacker, replyFds, fenceFd); DISPLAY_CHK_RETURN(ret != HDF_SUCCESS, ret, @@ -619,12 +615,12 @@ protected: return HDF_SUCCESS; } - int32_t ProcessUnpackCmd(std::shared_ptr replyUnpacker, int32_t unpackCmd, - std::vector replyFds, std::function fn) + int32_t ProcessUnpackCmd(CommandDataUnpacker& replyUnpacker, int32_t unpackCmd, + std::vector& replyFds, std::function fn) { int32_t ret = HDF_SUCCESS; - while (replyUnpacker->NextSection()) { - bool retBool = replyUnpacker->BeginSection(unpackCmd); + while (replyUnpacker.NextSection()) { + bool retBool = replyUnpacker.BeginSection(unpackCmd); DISPLAY_CHK_RETURN(retBool == false, HDF_FAILURE, HDF_LOGE("%{public}s: BeginSection failed", __func__)); @@ -668,18 +664,16 @@ protected: return HDF_SUCCESS; } - int32_t DoReplyResults(uint32_t replyEleCnt, std::vector replyFds, std::shared_ptr replyData, + int32_t DoReplyResults(uint32_t replyEleCnt, std::vector& replyFds, std::shared_ptr replyData, std::function fn) { - std::shared_ptr replyUnpacker = std::make_shared(); - DISPLAY_CHK_RETURN(replyUnpacker == nullptr, HDF_FAILURE, - HDF_LOGE("%{public}s: CommandDataUnpacker construct failed", __func__)); - replyUnpacker->Init(replyData.get(), replyEleCnt * CmdUtils::ELEMENT_SIZE); + CommandDataUnpacker replyUnpacker; + replyUnpacker.Init(replyData.get(), replyEleCnt << CmdUtils::MOVE_SIZE); #ifdef DEBUG_DISPLAY_CMD_RAW_DATA - replyUnpacker->Dump(); + replyUnpacker.Dump(); #endif // DEBUG_DISPLAY_CMD_RAW_DATA int32_t unpackCmd = -1; - bool retBool = replyUnpacker->PackBegin(unpackCmd); + bool retBool = replyUnpacker.PackBegin(unpackCmd); DISPLAY_CHK_RETURN(retBool == false, HDF_FAILURE, HDF_LOGE("%{public}s: PackBegin failed", __func__)); DISPLAY_CHK_RETURN(unpackCmd != CONTROL_CMD_REPLY_BEGIN, HDF_FAILURE, @@ -688,7 +682,7 @@ protected: return HDF_FAILURE; } - retBool = replyUnpacker->PackEnd(unpackCmd); + retBool = replyUnpacker.PackEnd(unpackCmd); DISPLAY_CHK_RETURN(retBool == false, HDF_FAILURE, HDF_LOGE("%{public}s: PackEnd failed", __func__)); @@ -702,11 +696,11 @@ protected: int32_t DoRequest(uint32_t &replyEleCnt, std::vector &outFds, std::shared_ptr &replyData) { #ifdef DEBUG_DISPLAY_CMD_RAW_DATA - requestPacker_->Dump(); + requestPacker_.Dump(); #endif // DEBUG_DISPLAY_CMD_RAW_DATA - uint32_t eleCnt = requestPacker_->ValidSize() / CmdUtils::ELEMENT_SIZE; + uint32_t eleCnt = requestPacker_.ValidSize() >> CmdUtils::MOVE_SIZE; int32_t ret = request_->Write( - reinterpret_cast(requestPacker_->GetDataPtr()), eleCnt, CmdUtils::TRANSFER_WAIT_TIME); + reinterpret_cast(requestPacker_.GetDataPtr()), eleCnt, CmdUtils::TRANSFER_WAIT_TIME); DISPLAY_CHK_RETURN(ret != HDF_SUCCESS, ret, HDF_LOGE("%{public}s: CmdRequest write failed", __func__)); @@ -715,7 +709,7 @@ protected: HDF_LOGE("%{public}s: CmdRequest failed", __func__)); if (replyEleCnt != 0) { - replyData.reset(new char[replyEleCnt * CmdUtils::ELEMENT_SIZE], std::default_delete()); + replyData.reset(new char[replyEleCnt << CmdUtils::MOVE_SIZE], std::default_delete()); DISPLAY_CHK_RETURN(replyData == nullptr, HDF_FAILURE, HDF_LOGE("%{public}s: get replyData failed", __func__)); ret = reply_->Read(reinterpret_cast(replyData.get()), replyEleCnt, CmdUtils::TRANSFER_WAIT_TIME); @@ -749,7 +743,7 @@ protected: std::shared_ptr request_; std::shared_ptr reply_; // Period data - std::shared_ptr requestPacker_; + CommandDataPacker requestPacker_; std::vector requestHdiFds_; // Composition layers/types changed std::unordered_map> compChangeLayers_; diff --git a/display/composer/v1_0/display_command/display_cmd_responser.h b/display/composer/v1_0/display_command/display_cmd_responser.h index 4c5ddff6898a25f9f69dddcfc84ff62cc11ccf6d..788f57d32baa33964a22e79be55f1255f5cbf6ed 100755 --- a/display/composer/v1_0/display_command/display_cmd_responser.h +++ b/display/composer/v1_0/display_command/display_cmd_responser.h @@ -77,8 +77,7 @@ public: request_(nullptr), isReplyUpdated_(false), reply_(nullptr), - replyCommandCnt_(0), - replyPacker_(nullptr) {} + replyCommandCnt_(0) {} virtual ~DisplayCmdResponser() { @@ -123,67 +122,29 @@ public: return ret; } - int32_t ProcessRequestCmd(std::shared_ptr unpacker, int32_t cmd, + int32_t ProcessRequestCmd(CommandDataUnpacker& unpacker, int32_t cmd, const std::vector& inFds, std::vector& outFds) { int32_t ret = HDF_SUCCESS; - HDF_LOGD("%{public}s: PackSection, cmd-[%{public}d] = %{public}s", - __func__, cmd, CmdUtils::CommandToString(cmd)); switch (cmd) { - case REQUEST_CMD_PREPARE_DISPLAY_LAYERS: - OnPrepareDisplayLayers(unpacker); - break; - case REQUEST_CMD_SET_DISPLAY_CLIENT_BUFFER: - OnSetDisplayClientBuffer(unpacker, inFds); - break; - case REQUEST_CMD_SET_DISPLAY_CLIENT_DAMAGE: - OnSetDisplayClientDamage(unpacker); - break; - case REQUEST_CMD_COMMIT: - OnCommit(unpacker, outFds); - break; - case REQUEST_CMD_SET_LAYER_ALPHA: - OnSetLayerAlpha(unpacker); - break; - case REQUEST_CMD_SET_LAYER_REGION: - OnSetLayerRegion(unpacker); - break; - case REQUEST_CMD_SET_LAYER_CROP: - OnSetLayerCrop(unpacker); - break; - case REQUEST_CMD_SET_LAYER_ZORDER: - OnSetLayerZorder(unpacker); - break; - case REQUEST_CMD_SET_LAYER_PREMULTI: - OnSetLayerPreMulti(unpacker); - break; - case REQUEST_CMD_SET_LAYER_TRANSFORM_MODE: - OnSetLayerTransformMode(unpacker); - break; - case REQUEST_CMD_SET_LAYER_DIRTY_REGION: - OnSetLayerDirtyRegion(unpacker); - break; - case REQUEST_CMD_SET_LAYER_VISIBLE_REGION: - OnSetLayerVisibleRegion(unpacker); - break; - case REQUEST_CMD_SET_LAYER_BUFFER: - OnSetLayerBuffer(unpacker, inFds); - break; - case REQUEST_CMD_SET_LAYER_COMPOSITION_TYPE: - OnSetLayerCompositionType(unpacker); - break; - case REQUEST_CMD_SET_LAYER_BLEND_TYPE: - OnSetLayerBlendType(unpacker); - break; - case REQUEST_CMD_SET_LAYER_MASK_INFO: - OnSetLayerMaskInfo(unpacker); - break; - case CONTROL_CMD_REQUEST_END: - ret = OnRequestEnd(unpacker); - break; - case REQUEST_CMD_SET_LAYER_COLOR: - OnSetLayerColor(unpacker); - break; + case REQUEST_CMD_PREPARE_DISPLAY_LAYERS: OnPrepareDisplayLayers(unpacker); break; + case REQUEST_CMD_SET_DISPLAY_CLIENT_BUFFER: OnSetDisplayClientBuffer(unpacker, inFds); break; + case REQUEST_CMD_SET_DISPLAY_CLIENT_DAMAGE: OnSetDisplayClientDamage(unpacker); break; + case REQUEST_CMD_COMMIT: OnCommit(unpacker, outFds); break; + case REQUEST_CMD_SET_LAYER_ALPHA: OnSetLayerAlpha(unpacker); break; + case REQUEST_CMD_SET_LAYER_REGION: OnSetLayerRegion(unpacker); break; + case REQUEST_CMD_SET_LAYER_CROP: OnSetLayerCrop(unpacker); break; + case REQUEST_CMD_SET_LAYER_ZORDER: OnSetLayerZorder(unpacker); break; + case REQUEST_CMD_SET_LAYER_PREMULTI: OnSetLayerPreMulti(unpacker); break; + case REQUEST_CMD_SET_LAYER_TRANSFORM_MODE: OnSetLayerTransformMode(unpacker); break; + case REQUEST_CMD_SET_LAYER_DIRTY_REGION: OnSetLayerDirtyRegion(unpacker); break; + case REQUEST_CMD_SET_LAYER_VISIBLE_REGION: OnSetLayerVisibleRegion(unpacker); break; + case REQUEST_CMD_SET_LAYER_BUFFER: OnSetLayerBuffer(unpacker, inFds); break; + case REQUEST_CMD_SET_LAYER_COMPOSITION_TYPE: OnSetLayerCompositionType(unpacker); break; + case REQUEST_CMD_SET_LAYER_BLEND_TYPE: OnSetLayerBlendType(unpacker); break; + case REQUEST_CMD_SET_LAYER_MASK_INFO: OnSetLayerMaskInfo(unpacker); break; + case CONTROL_CMD_REQUEST_END: ret = OnRequestEnd(unpacker); break; + case REQUEST_CMD_SET_LAYER_COLOR: OnSetLayerColor(unpacker); break; default: HDF_LOGE("%{public}s: not support this cmd, unpacked cmd = %{public}d", __func__, cmd); ret = HDF_FAILURE; @@ -203,25 +164,22 @@ public: int32_t ret = request_->Read(reinterpret_cast(requestData.get()), inEleCnt, CmdUtils::TRANSFER_WAIT_TIME); - std::shared_ptr unpacker = std::make_shared(); - DISPLAY_CHK_RETURN(unpacker == nullptr, HDF_FAILURE, - HDF_LOGE("%{public}s: unpacker construct failed", __func__)); - - unpacker->Init(requestData.get(), inEleCnt * CmdUtils::ELEMENT_SIZE); + CommandDataUnpacker unpacker; + unpacker.Init(requestData.get(), inEleCnt << CmdUtils::MOVE_SIZE); #ifdef DEBUG_DISPLAY_CMD_RAW_DATA - unpacker->Dump(); + unpacker.Dump(); #endif // DEBUG_DISPLAY_CMD_RAW_DATA int32_t unpackCmd = -1; - bool retBool = unpacker->PackBegin(unpackCmd); + bool retBool = unpacker.PackBegin(unpackCmd); DISPLAY_CHK_RETURN(retBool == false, HDF_FAILURE, HDF_LOGE("%{public}s: error: Check RequestBegin failed", __func__)); DISPLAY_CHK_RETURN(unpackCmd != CONTROL_CMD_REQUEST_BEGIN, HDF_FAILURE, HDF_LOGI("error: unpacker PackBegin cmd not match, cmd(%{public}d)=%{public}s.", unpackCmd, CmdUtils::CommandToString(unpackCmd))); - while (ret == HDF_SUCCESS && unpacker->NextSection()) { - if (!unpacker->BeginSection(unpackCmd)) { + while (ret == HDF_SUCCESS && unpacker.NextSection()) { + if (!unpacker.BeginSection(unpackCmd)) { HDF_LOGE("error: PackSection failed, unpackCmd=%{public}s.", CmdUtils::CommandToString(unpackCmd)); ret = HDF_FAILURE; @@ -232,17 +190,17 @@ public: DISPLAY_CHK_RETURN(ret != HDF_SUCCESS, ret, HDF_LOGE("%{public}s: ProcessRequestCmd failed", __func__)); /* pack request end commands */ - replyPacker_->PackEnd(CONTROL_CMD_REPLY_END); + replyPacker_.PackEnd(CONTROL_CMD_REPLY_END); #ifdef DEBUG_DISPLAY_CMD_RAW_DATA /* just for debug */ - replyPacker_->Dump(); + replyPacker_.Dump(); HDF_LOGI("CmdReply command cnt=%{public}d", replyCommandCnt_); #endif // DEBUG_DISPLAY_CMD_RAW_DATA /* Write reply pack */ - outEleCnt = replyPacker_->ValidSize() / CmdUtils::ELEMENT_SIZE; - ret = reply_->Write(reinterpret_cast(replyPacker_->GetDataPtr()), outEleCnt, + outEleCnt = replyPacker_.ValidSize() >> CmdUtils::MOVE_SIZE; + ret = reply_->Write(reinterpret_cast(replyPacker_.GetDataPtr()), outEleCnt, CmdUtils::TRANSFER_WAIT_TIME); if (ret != HDF_SUCCESS) { HDF_LOGE("Reply write failure, ret=%{public}d", ret); @@ -264,18 +222,14 @@ protected: DISPLAY_CHK_RETURN(reply_ == nullptr, HDF_FAILURE, HDF_LOGE("%{public}s: reply_ construct failed", __func__)); - replyPacker_ = std::make_shared(); - DISPLAY_CHK_RETURN(replyPacker_ == nullptr, HDF_FAILURE, - HDF_LOGE("%{public}s: replyPacker_ construct failed", __func__)); - - bool retBool = replyPacker_->Init(reply_->GetSize() * CmdUtils::ELEMENT_SIZE); + bool retBool = replyPacker_.Init(reply_->GetSize() << CmdUtils::MOVE_SIZE); DISPLAY_CHK_RETURN(retBool == false, HDF_FAILURE, HDF_LOGE("%{public}s: replyPacker_ init failed", __func__)); return CmdUtils::StartPack(CONTROL_CMD_REPLY_BEGIN, replyPacker_); } - int32_t OnRequestEnd(std::shared_ptr unpacker) + int32_t OnRequestEnd(CommandDataUnpacker& unpacker) { DISPLAY_TRACE; @@ -285,16 +239,16 @@ protected: DISPLAY_CHK_RETURN(ret != HDF_SUCCESS, ret, HDF_LOGE("%{public}s: StartSection failed", __func__)); - bool result = replyPacker_->WriteUint32(errCnt); + bool result = replyPacker_.WriteUint32(errCnt); DISPLAY_CHK_RETURN(result == false, HDF_FAILURE, HDF_LOGE("%{public}s: write errCnt failed", __func__)); for (auto it = errMaps_.begin(); it != errMaps_.end(); ++it) { - result = replyPacker_->WriteInt32(it->first); + result = replyPacker_.WriteInt32(it->first); DISPLAY_CHK_RETURN(result == false, HDF_FAILURE, HDF_LOGE("%{public}s: write err-cmd failed, cmdId:%{public}s", __func__, CmdUtils::CommandToString(it->first))); - result = replyPacker_->WriteInt32(it->second); + result = replyPacker_.WriteInt32(it->second); DISPLAY_CHK_RETURN(result == false, HDF_FAILURE, HDF_LOGE("%{public}s: write errNo failed, errNo:%{public}d", __func__, it->second)); } @@ -306,7 +260,7 @@ protected: return HDF_SUCCESS; } - void OnPrepareDisplayLayers(std::shared_ptr unpacker) + void OnPrepareDisplayLayers(CommandDataUnpacker& unpacker) { DISPLAY_TRACE; @@ -316,7 +270,7 @@ protected: std::vector layers; std::vector types; - int32_t ret = unpacker->ReadUint32(devId) ? HDF_SUCCESS : HDF_FAILURE; + int32_t ret = unpacker.ReadUint32(devId) ? HDF_SUCCESS : HDF_FAILURE; DISPLAY_CHECK(ret != HDF_SUCCESS, goto EXIT); { HdfTrace traceVdi("PrepareDisplayLayers", "HDI:DISP:HARDWARE"); @@ -334,22 +288,22 @@ protected: ret = CmdUtils::StartSection(REPLY_CMD_PREPARE_DISPLAY_LAYERS, replyPacker_); DISPLAY_CHECK(ret != HDF_SUCCESS, goto EXIT); - DISPLAY_CHECK(replyPacker_->WriteUint32(devId) == false, goto EXIT); + DISPLAY_CHECK(replyPacker_.WriteUint32(devId) == false, goto EXIT); - DISPLAY_CHECK(replyPacker_->WriteBool(needFlush) == false, goto EXIT); + DISPLAY_CHECK(replyPacker_.WriteBool(needFlush) == false, goto EXIT); // Write layers vector vectSize = static_cast(layers.size()); - DISPLAY_CHECK(replyPacker_->WriteUint32(vectSize) == false, goto EXIT); + DISPLAY_CHECK(replyPacker_.WriteUint32(vectSize) == false, goto EXIT); for (uint32_t i = 0; i < vectSize; i++) { - DISPLAY_CHECK(replyPacker_->WriteUint32(layers[i]) == false, goto EXIT); + DISPLAY_CHECK(replyPacker_.WriteUint32(layers[i]) == false, goto EXIT); } // Write composer types vector vectSize = static_cast(types.size()); - DISPLAY_CHECK(replyPacker_->WriteUint32(vectSize) == false, goto EXIT); + DISPLAY_CHECK(replyPacker_.WriteUint32(vectSize) == false, goto EXIT); for (uint32_t i = 0; i < vectSize; i++) { - DISPLAY_CHECK(replyPacker_->WriteUint32(types[i]) == false, goto EXIT); + DISPLAY_CHECK(replyPacker_.WriteUint32(types[i]) == false, goto EXIT); } // End this cmd section ret = CmdUtils::EndSection(replyPacker_); @@ -370,10 +324,10 @@ EXIT: bool isValidBuffer; } ClientBufferData; - int32_t UnpackDisplayClientBufferInfo(std::shared_ptr unpacker, - const std::vector& inFds, ClientBufferData &data) + int32_t UnpackDisplayClientBufferInfo(CommandDataUnpacker& unpacker, + const std::vector& inFds, ClientBufferData& data) { - if (!unpacker->ReadUint32(data.devId)) { + if (!unpacker.ReadUint32(data.devId)) { return HDF_FAILURE; } @@ -384,7 +338,7 @@ EXIT: } data.isValidBuffer = true; - if (!unpacker->ReadUint32(data.seqNo)) { + if (!unpacker.ReadUint32(data.seqNo)) { HDF_LOGE("%{public}s, read seqNo error", __func__); return HDF_FAILURE; } @@ -425,7 +379,7 @@ EXIT: return ret; } - void OnSetDisplayClientBuffer(std::shared_ptr unpacker, const std::vector& inFds) + void OnSetDisplayClientBuffer(CommandDataUnpacker& unpacker, const std::vector& inFds) { DISPLAY_TRACE; @@ -458,17 +412,17 @@ EXIT: } } - void OnSetDisplayClientDamage(std::shared_ptr unpacker) + void OnSetDisplayClientDamage(CommandDataUnpacker& unpacker) { DISPLAY_TRACE; uint32_t devId = 0; uint32_t vectSize = 0; bool retBool = true; - DISPLAY_CHK_CONDITION(retBool, true, unpacker->ReadUint32(devId), + DISPLAY_CHK_CONDITION(retBool, true, unpacker.ReadUint32(devId), HDF_LOGE("%{public}s, read devId error", __func__)); - DISPLAY_CHK_CONDITION(retBool, true, unpacker->ReadUint32(vectSize), + DISPLAY_CHK_CONDITION(retBool, true, unpacker.ReadUint32(vectSize), HDF_LOGE("%{public}s, read vectSize error", __func__)); int32_t ret = (retBool ? HDF_SUCCESS : HDF_FAILURE); @@ -492,7 +446,7 @@ EXIT: return; } - void OnCommit(std::shared_ptr unpacker, std::vector& outFds) + void OnCommit(CommandDataUnpacker& unpacker, std::vector& outFds) { DISPLAY_TRACE; @@ -509,7 +463,7 @@ EXIT: } #endif int32_t ret = HDF_SUCCESS; - if (!unpacker->ReadUint32(devId)) { + if (!unpacker.ReadUint32(devId)) { HDF_LOGE("%{public}s, read devId error", __func__); ret = HDF_FAILURE; goto REPLY; @@ -553,7 +507,7 @@ REPLY: return; } - void OnSetLayerAlpha(std::shared_ptr unpacker) + void OnSetLayerAlpha(CommandDataUnpacker& unpacker) { DISPLAY_TRACE; @@ -565,19 +519,19 @@ REPLY: int32_t ret = CmdUtils::SetupDeviceUnpack(unpacker, devId, layerId); DISPLAY_CHECK(ret != HDF_SUCCESS, goto EXIT); - retBool = unpacker->ReadBool(alpha.enGlobalAlpha); + retBool = unpacker.ReadBool(alpha.enGlobalAlpha); DISPLAY_CHECK(retBool == false, goto EXIT); - retBool = unpacker->ReadBool(alpha.enPixelAlpha); + retBool = unpacker.ReadBool(alpha.enPixelAlpha); DISPLAY_CHECK(retBool == false, goto EXIT); - retBool = unpacker->ReadUint8(alpha.alpha0); + retBool = unpacker.ReadUint8(alpha.alpha0); DISPLAY_CHECK(retBool == false, goto EXIT); - retBool = unpacker->ReadUint8(alpha.alpha1); + retBool = unpacker.ReadUint8(alpha.alpha1); DISPLAY_CHECK(retBool == false, goto EXIT); - retBool = unpacker->ReadUint8(alpha.gAlpha); + retBool = unpacker.ReadUint8(alpha.gAlpha); DISPLAY_CHECK(retBool == false, goto EXIT); { @@ -593,7 +547,7 @@ EXIT: return; } - void OnSetLayerRegion(std::shared_ptr unpacker) + void OnSetLayerRegion(CommandDataUnpacker& unpacker) { DISPLAY_TRACE; @@ -619,7 +573,7 @@ EXIT: return; } - void OnSetLayerCrop(std::shared_ptr unpacker) + void OnSetLayerCrop(CommandDataUnpacker& unpacker) { DISPLAY_TRACE; @@ -645,7 +599,7 @@ EXIT: return; } - void OnSetLayerZorder(std::shared_ptr unpacker) + void OnSetLayerZorder(CommandDataUnpacker& unpacker) { DISPLAY_TRACE; @@ -656,7 +610,7 @@ EXIT: int32_t ret = CmdUtils::SetupDeviceUnpack(unpacker, devId, layerId); DISPLAY_CHECK(ret != HDF_SUCCESS, goto EXIT); - ret = unpacker->ReadUint32(zorder) ? HDF_SUCCESS : HDF_FAILURE; + ret = unpacker.ReadUint32(zorder) ? HDF_SUCCESS : HDF_FAILURE; DISPLAY_CHECK(ret != HDF_SUCCESS, goto EXIT); { @@ -671,7 +625,7 @@ EXIT: return; } - void OnSetLayerPreMulti(std::shared_ptr unpacker) + void OnSetLayerPreMulti(CommandDataUnpacker& unpacker) { DISPLAY_TRACE; @@ -682,7 +636,7 @@ EXIT: int32_t ret = CmdUtils::SetupDeviceUnpack(unpacker, devId, layerId); DISPLAY_CHECK(ret != HDF_SUCCESS, goto EXIT); - ret = unpacker->ReadBool(preMulti) ? HDF_SUCCESS : HDF_FAILURE; + ret = unpacker.ReadBool(preMulti) ? HDF_SUCCESS : HDF_FAILURE; DISPLAY_CHECK(ret != HDF_SUCCESS, goto EXIT); { @@ -697,7 +651,7 @@ EXIT: return; } - void OnSetLayerTransformMode(std::shared_ptr unpacker) + void OnSetLayerTransformMode(CommandDataUnpacker& unpacker) { DISPLAY_TRACE; @@ -708,7 +662,7 @@ EXIT: int32_t ret = CmdUtils::SetupDeviceUnpack(unpacker, devId, layerId); DISPLAY_CHECK(ret != HDF_SUCCESS, goto EXIT); - ret = unpacker->ReadInt32(type) ? HDF_SUCCESS : HDF_FAILURE; + ret = unpacker.ReadInt32(type) ? HDF_SUCCESS : HDF_FAILURE; DISPLAY_CHECK(ret != HDF_SUCCESS, goto EXIT); { @@ -724,7 +678,7 @@ EXIT: return; } - void OnSetLayerDirtyRegion(std::shared_ptr unpacker) + void OnSetLayerDirtyRegion(CommandDataUnpacker& unpacker) { DISPLAY_TRACE; @@ -736,7 +690,7 @@ EXIT: DISPLAY_CHK_CONDITION(ret, HDF_SUCCESS, CmdUtils::SetupDeviceUnpack(unpacker, devId, layerId), HDF_LOGE("%{public}s, read devId error", __func__)); - DISPLAY_CHK_CONDITION(ret, HDF_SUCCESS, unpacker->ReadUint32(vectSize) ? HDF_SUCCESS : HDF_FAILURE, + DISPLAY_CHK_CONDITION(ret, HDF_SUCCESS, unpacker.ReadUint32(vectSize) ? HDF_SUCCESS : HDF_FAILURE, HDF_LOGE("%{public}s, read vectSize error", __func__)); std::vector rects(vectSize); @@ -759,7 +713,7 @@ EXIT: return; } - void OnSetLayerVisibleRegion(std::shared_ptr unpacker) + void OnSetLayerVisibleRegion(CommandDataUnpacker& unpacker) { DISPLAY_TRACE; @@ -771,7 +725,7 @@ EXIT: DISPLAY_CHK_CONDITION(ret, HDF_SUCCESS, CmdUtils::SetupDeviceUnpack(unpacker, devId, layerId), HDF_LOGE("%{public}s, read devId error", __func__)); - DISPLAY_CHK_CONDITION(ret, HDF_SUCCESS, unpacker->ReadUint32(vectSize) ? HDF_SUCCESS : HDF_FAILURE, + DISPLAY_CHK_CONDITION(ret, HDF_SUCCESS, unpacker.ReadUint32(vectSize) ? HDF_SUCCESS : HDF_FAILURE, HDF_LOGE("%{public}s, read vectSize error", __func__)); std::vector rects(vectSize); @@ -803,7 +757,7 @@ EXIT: BufferHandle *buffer; } LayerBufferData; - int32_t UnPackLayerBufferInfo(std::shared_ptr unpacker, const std::vector& inFds, + int32_t UnPackLayerBufferInfo(CommandDataUnpacker& unpacker, const std::vector& inFds, struct LayerBufferData *data, std::vector &deletingList) { DISPLAY_CHK_RETURN(HDF_SUCCESS != CmdUtils::SetupDeviceUnpack(unpacker, data->devId, data->layerId), @@ -814,7 +768,7 @@ EXIT: data->isValidBuffer = true; - DISPLAY_CHK_RETURN(true != unpacker->ReadUint32(data->seqNo), HDF_FAILURE, + DISPLAY_CHK_RETURN(true != unpacker.ReadUint32(data->seqNo), HDF_FAILURE, HDF_LOGE("%{public}s, read seqNo error", __func__)); DISPLAY_CHK_RETURN(HDF_SUCCESS != CmdUtils::FileDescriptorUnpack(unpacker, inFds, data->fence), HDF_FAILURE, @@ -822,7 +776,7 @@ EXIT: // unpack deletingList uint32_t vectSize = 0; - DISPLAY_CHK_RETURN(true != unpacker->ReadUint32(vectSize), HDF_FAILURE, + DISPLAY_CHK_RETURN(true != unpacker.ReadUint32(vectSize), HDF_FAILURE, HDF_LOGE("%{public}s, read vectSize error", __func__)); if (vectSize > CmdUtils::MAX_MEMORY) { HDF_LOGE("%{public}s: vectSize:%{public}u is too large", __func__, vectSize); @@ -831,7 +785,7 @@ EXIT: deletingList.resize(vectSize); for (uint32_t i = 0; i < vectSize; i++) { - DISPLAY_CHK_RETURN(true != unpacker->ReadUint32(deletingList[i]), HDF_FAILURE, + DISPLAY_CHK_RETURN(true != unpacker.ReadUint32(deletingList[i]), HDF_FAILURE, HDF_LOGE("%{public}s, read seqNo error, at i = %{public}d", __func__, i)); } return HDF_SUCCESS; @@ -863,7 +817,7 @@ EXIT: return ret; } - void OnSetLayerBuffer(std::shared_ptr unpacker, const std::vector& inFds) + void OnSetLayerBuffer(CommandDataUnpacker& unpacker, const std::vector& inFds) { DISPLAY_TRACE; @@ -900,7 +854,7 @@ EXIT: return; } - void OnSetLayerCompositionType(std::shared_ptr unpacker) + void OnSetLayerCompositionType(CommandDataUnpacker& unpacker) { DISPLAY_TRACE; @@ -910,7 +864,7 @@ EXIT: int32_t ret = CmdUtils::SetupDeviceUnpack(unpacker, devId, layerId); DISPLAY_CHECK(ret != HDF_SUCCESS, goto EXIT); - ret = unpacker->ReadInt32(type) ? HDF_SUCCESS : HDF_FAILURE; + ret = unpacker.ReadInt32(type) ? HDF_SUCCESS : HDF_FAILURE; DISPLAY_CHECK(ret != HDF_SUCCESS, goto EXIT); { @@ -925,7 +879,7 @@ EXIT: return; } - void OnSetLayerBlendType(std::shared_ptr unpacker) + void OnSetLayerBlendType(CommandDataUnpacker& unpacker) { DISPLAY_TRACE; @@ -935,7 +889,7 @@ EXIT: int32_t ret = CmdUtils::SetupDeviceUnpack(unpacker, devId, layerId); DISPLAY_CHECK(ret != HDF_SUCCESS, goto EXIT); - ret = unpacker->ReadInt32(type) ? HDF_SUCCESS : HDF_FAILURE; + ret = unpacker.ReadInt32(type) ? HDF_SUCCESS : HDF_FAILURE; DISPLAY_CHECK(ret != HDF_SUCCESS, goto EXIT); { @@ -950,7 +904,7 @@ EXIT: return; } - void OnSetLayerMaskInfo(std::shared_ptr unpacker) + void OnSetLayerMaskInfo(CommandDataUnpacker& unpacker) { DISPLAY_TRACE; @@ -961,7 +915,7 @@ EXIT: int32_t ret = CmdUtils::SetupDeviceUnpack(unpacker, devId, layerId); DISPLAY_CHECK(ret != HDF_SUCCESS, goto EXIT); - ret = unpacker->ReadUint32(maskInfo) ? HDF_SUCCESS : HDF_FAILURE; + ret = unpacker.ReadUint32(maskInfo) ? HDF_SUCCESS : HDF_FAILURE; DISPLAY_CHECK(ret != HDF_SUCCESS, goto EXIT); { @@ -976,7 +930,7 @@ EXIT: return; } - void OnSetLayerColor(std::shared_ptr unpacker) + void OnSetLayerColor(CommandDataUnpacker& unpacker) { DISPLAY_TRACE; @@ -1137,7 +1091,7 @@ protected: std::shared_ptr reply_; /* period data */ uint32_t replyCommandCnt_; - std::shared_ptr replyPacker_; + CommandDataPacker replyPacker_; std::unordered_map errMaps_; /* fix fd leak */ std::queue delayFreeQueue_; 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..a56e8ad2de816dc6309cf874d00c75c6ed2085db 100644 --- a/display/composer/v1_0/display_command/display_cmd_utils.h +++ b/display/composer/v1_0/display_command/display_cmd_utils.h @@ -38,6 +38,7 @@ class DisplayCmdUtils { public: static constexpr int32_t MAX_INT = 0x7fffffff; static constexpr uint32_t ELEMENT_SIZE = sizeof(int32_t); + static constexpr uint32_t MOVE_SIZE = sizeof(int) / 2; static constexpr uint32_t TRANSFER_WAIT_TIME = 100000000; // ms static constexpr uint32_t INIT_ELEMENT_COUNT = 32 * 1024; static constexpr uint32_t MAX_MEMORY = 10485760; // 10M; @@ -78,33 +79,33 @@ public: } } - static int32_t StartPack(int32_t cmdId, std::shared_ptr packer) + static int32_t StartPack(int32_t cmdId, CommandDataPacker& packer) { - return packer->PackBegin(cmdId) ? HDF_SUCCESS : HDF_FAILURE; + return packer.PackBegin(cmdId) ? HDF_SUCCESS : HDF_FAILURE; } - static int32_t EndPack(std::shared_ptr packer) + static int32_t EndPack(CommandDataPacker& packer) { - return packer->PackEnd(CONTROL_CMD_REQUEST_END) ? HDF_SUCCESS : HDF_FAILURE; + return packer.PackEnd(CONTROL_CMD_REQUEST_END) ? HDF_SUCCESS : HDF_FAILURE; } - static int32_t StartSection(int32_t cmdId, std::shared_ptr packer) + static int32_t StartSection(int32_t cmdId, CommandDataPacker& packer) { - return packer->BeginSection(cmdId) ? HDF_SUCCESS : HDF_FAILURE; + return packer.BeginSection(cmdId) ? HDF_SUCCESS : HDF_FAILURE; } - static int32_t SetupDevice(uint32_t devId, uint32_t layerId, std::shared_ptr packer) + static int32_t SetupDevice(uint32_t devId, uint32_t layerId, CommandDataPacker& packer) { - DISPLAY_CHK_RETURN(packer->WriteUint32(devId) == false, HDF_FAILURE, + DISPLAY_CHK_RETURN(packer.WriteUint32(devId) == false, HDF_FAILURE, HDF_LOGE("%{public}s, write devId error", __func__)); - DISPLAY_CHK_RETURN(packer->WriteUint32(layerId) == false, HDF_FAILURE, + DISPLAY_CHK_RETURN(packer.WriteUint32(layerId) == false, HDF_FAILURE, HDF_LOGE("%{public}s, write layerId error", __func__)); return HDF_SUCCESS; } - static int32_t EndSection(std::shared_ptr packer) + static int32_t EndSection(CommandDataPacker& packer) { - return packer->EndSection() ? HDF_SUCCESS : HDF_FAILURE; + return packer.EndSection() ? HDF_SUCCESS : HDF_FAILURE; } static int32_t GenerateHdifdSeqid() @@ -134,87 +135,96 @@ public: return false; } - static int32_t RectPack(const IRect& rect, std::shared_ptr packer) + static int32_t RectPack(const IRect& rect, CommandDataPacker& packer) { - DISPLAY_CHK_RETURN(packer->WriteInt32(rect.x) == false, HDF_FAILURE, + DISPLAY_CHK_RETURN(packer.WriteInt32(rect.x) == false, HDF_FAILURE, HDF_LOGE("%{public}s, write rect.x error", __func__)); - DISPLAY_CHK_RETURN(packer->WriteInt32(rect.y) == false, HDF_FAILURE, + DISPLAY_CHK_RETURN(packer.WriteInt32(rect.y) == false, HDF_FAILURE, HDF_LOGE("%{public}s, write rect.y error", __func__)); - DISPLAY_CHK_RETURN(packer->WriteInt32(rect.w) == false, HDF_FAILURE, + DISPLAY_CHK_RETURN(packer.WriteInt32(rect.w) == false, HDF_FAILURE, HDF_LOGE("%{public}s, write rect.w error", __func__)); - DISPLAY_CHK_RETURN(packer->WriteInt32(rect.h) == false, HDF_FAILURE, + DISPLAY_CHK_RETURN(packer.WriteInt32(rect.h) == false, HDF_FAILURE, HDF_LOGE("%{public}s, write rect.h error", __func__)); return HDF_SUCCESS; } - static int32_t LayerColorPack(const LayerColor& layerColor, std::shared_ptr packer) + static int32_t LayerColorPack(const LayerColor& layerColor, CommandDataPacker& packer) { - DISPLAY_CHK_RETURN(packer->WriteUint8(layerColor.r) == false, HDF_FAILURE, + DISPLAY_CHK_RETURN(packer.WriteUint8(layerColor.r) == false, HDF_FAILURE, HDF_LOGE("%{public}s, write layerColor.r error", __func__)); - DISPLAY_CHK_RETURN(packer->WriteUint8(layerColor.g) == false, HDF_FAILURE, + DISPLAY_CHK_RETURN(packer.WriteUint8(layerColor.g) == false, HDF_FAILURE, HDF_LOGE("%{public}s, write layerColor.g error", __func__)); - DISPLAY_CHK_RETURN(packer->WriteUint8(layerColor.b) == false, HDF_FAILURE, + DISPLAY_CHK_RETURN(packer.WriteUint8(layerColor.b) == false, HDF_FAILURE, HDF_LOGE("%{public}s, write layerColor.b error", __func__)); - DISPLAY_CHK_RETURN(packer->WriteUint8(layerColor.a) == false, HDF_FAILURE, + DISPLAY_CHK_RETURN(packer.WriteUint8(layerColor.a) == false, HDF_FAILURE, HDF_LOGE("%{public}s, write layerColor.a error", __func__)); return HDF_SUCCESS; } static int32_t FileDescriptorPack( - const int32_t fd, std::shared_ptr packer, std::vector& hdiFds) + const int32_t fd, CommandDataPacker& 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; } - static int32_t BufferHandlePack(const BufferHandle* buffer, std::shared_ptr packer, + static int32_t BufferHandlePack(const BufferHandle* buffer, CommandDataPacker& packer, std::vector& hdiFds) { if (buffer == nullptr) { - DISPLAY_CHK_RETURN(packer->WriteUint32(UINT32_MAX) == false, HDF_FAILURE, + DISPLAY_CHK_RETURN(packer.WriteUint32(UINT32_MAX) == false, HDF_FAILURE, HDF_LOGE("%{public}s, write null buffer reserveFds error", __func__)); - DISPLAY_CHK_RETURN(packer->WriteUint32(UINT32_MAX) == false, HDF_FAILURE, + DISPLAY_CHK_RETURN(packer.WriteUint32(UINT32_MAX) == false, HDF_FAILURE, HDF_LOGE("%{public}s, write null buffer reservceInts error", __func__)); return HDF_SUCCESS; } else { - DISPLAY_CHK_RETURN(packer->WriteUint32(buffer->reserveFds) == false, HDF_FAILURE, + DISPLAY_CHK_RETURN(packer.WriteUint32(buffer->reserveFds) == false, HDF_FAILURE, HDF_LOGE("%{public}s, write buffer->reserveFds error", __func__)); - DISPLAY_CHK_RETURN(packer->WriteUint32(buffer->reserveInts) == false, HDF_FAILURE, + DISPLAY_CHK_RETURN(packer.WriteUint32(buffer->reserveInts) == false, HDF_FAILURE, HDF_LOGE("%{public}s, write buffer->reserveInts error", __func__)); } int32_t ret = FileDescriptorPack(buffer->fd, packer, hdiFds); if (ret != HDF_SUCCESS) { return ret; } - DISPLAY_CHK_RETURN(packer->WriteInt32(buffer->width) == false, HDF_FAILURE, + DISPLAY_CHK_RETURN(packer.WriteInt32(buffer->width) == false, HDF_FAILURE, HDF_LOGE("%{public}s, write buffer->width failed", __func__)); - DISPLAY_CHK_RETURN(packer->WriteInt32(buffer->stride) == false, HDF_FAILURE, + DISPLAY_CHK_RETURN(packer.WriteInt32(buffer->stride) == false, HDF_FAILURE, HDF_LOGE("%{public}s, write buffer->stride failed", __func__)); - DISPLAY_CHK_RETURN(packer->WriteInt32(buffer->height) == false, HDF_FAILURE, + DISPLAY_CHK_RETURN(packer.WriteInt32(buffer->height) == false, HDF_FAILURE, HDF_LOGE("%{public}s, write buffer->height failed", __func__)); - DISPLAY_CHK_RETURN(packer->WriteInt32(buffer->size) == false, HDF_FAILURE, + DISPLAY_CHK_RETURN(packer.WriteInt32(buffer->size) == false, HDF_FAILURE, HDF_LOGE("%{public}s, write buffer->size failed", __func__)); - DISPLAY_CHK_RETURN(packer->WriteInt32(buffer->format) == false, HDF_FAILURE, + DISPLAY_CHK_RETURN(packer.WriteInt32(buffer->format) == false, HDF_FAILURE, HDF_LOGE("%{public}s, write buffer->format failed", __func__)); - DISPLAY_CHK_RETURN(packer->WriteUint64(buffer->usage) == false, HDF_FAILURE, + DISPLAY_CHK_RETURN(packer.WriteUint64(buffer->usage) == false, HDF_FAILURE, HDF_LOGE("%{public}s, write buffer->usage failed", __func__)); - DISPLAY_CHK_RETURN(packer->WriteUint64(buffer->phyAddr) == false, HDF_FAILURE, + DISPLAY_CHK_RETURN(packer.WriteUint64(buffer->phyAddr) == false, HDF_FAILURE, HDF_LOGE("%{public}s, write buffer->phyAddr failed", __func__)); uint32_t i = 0; for (i = 0; i < buffer->reserveFds; i++) { @@ -224,39 +234,39 @@ public: } } for (uint32_t j = 0; j < buffer->reserveInts; j++) { - DISPLAY_CHK_RETURN(packer->WriteInt32(buffer->reserve[i++]) == false, HDF_FAILURE, + DISPLAY_CHK_RETURN(packer.WriteInt32(buffer->reserve[i++]) == false, HDF_FAILURE, HDF_LOGE("%{public}s, write buffer->reserve failed", __func__)); } return HDF_SUCCESS; } - static int32_t SetupDeviceUnpack(std::shared_ptr unpacker, uint32_t& devId, uint32_t& layerId) + static int32_t SetupDeviceUnpack(CommandDataUnpacker& unpacker, uint32_t& devId, uint32_t& layerId) { - DISPLAY_CHK_RETURN(unpacker->ReadUint32(devId) == false, HDF_FAILURE, + DISPLAY_CHK_RETURN(unpacker.ReadUint32(devId) == false, HDF_FAILURE, HDF_LOGE("%{public}s, read devId failed", __func__)); - DISPLAY_CHK_RETURN(unpacker->ReadUint32(layerId) == false, HDF_FAILURE, + DISPLAY_CHK_RETURN(unpacker.ReadUint32(layerId) == false, HDF_FAILURE, HDF_LOGE("%{public}s, read layerId failed", __func__)); return HDF_SUCCESS; } - static int32_t RectUnpack(std::shared_ptr unpacker, IRect& rect) + static int32_t RectUnpack(CommandDataUnpacker& unpacker, IRect& rect) { - DISPLAY_CHK_RETURN(unpacker->ReadInt32(rect.x) == false, HDF_FAILURE, + DISPLAY_CHK_RETURN(unpacker.ReadInt32(rect.x) == false, HDF_FAILURE, HDF_LOGE("%{public}s, read rect.x failed", __func__)); - DISPLAY_CHK_RETURN(unpacker->ReadInt32(rect.y) == false, HDF_FAILURE, + DISPLAY_CHK_RETURN(unpacker.ReadInt32(rect.y) == false, HDF_FAILURE, HDF_LOGE("%{public}s, read rect.y failed", __func__)); - DISPLAY_CHK_RETURN(unpacker->ReadInt32(rect.w) == false, HDF_FAILURE, + DISPLAY_CHK_RETURN(unpacker.ReadInt32(rect.w) == false, HDF_FAILURE, HDF_LOGE("%{public}s, read rect.w failed", __func__)); - DISPLAY_CHK_RETURN(unpacker->ReadInt32(rect.h) == false, HDF_FAILURE, + DISPLAY_CHK_RETURN(unpacker.ReadInt32(rect.h) == false, HDF_FAILURE, HDF_LOGE("%{public}s, read rect.h failed", __func__)); return HDF_SUCCESS; } static int32_t FileDescriptorUnpack( - std::shared_ptr unpacker, const std::vector& hdiFds, int32_t& fd) + CommandDataUnpacker& unpacker, const std::vector& hdiFds, int32_t& fd) { int32_t fdId = -1; - DISPLAY_CHK_RETURN(unpacker->ReadInt32(fdId) == false, HDF_FAILURE, + DISPLAY_CHK_RETURN(unpacker.ReadInt32(fdId) == false, HDF_FAILURE, HDF_LOGE("%{public}s, read fdId failed", __func__)); if (fdId < 0 || MatchHdiFd(fdId, hdiFds, fd) == false) { // If matching failure, the illegal fd is transfered by smq directly, not by binder IPC. @@ -265,29 +275,29 @@ public: return HDF_SUCCESS; } - static bool UnpackBasicInfo(std::shared_ptr unpacker, const std::vector& hdiFds, + static bool UnpackBasicInfo(CommandDataUnpacker& unpacker, const std::vector& hdiFds, BufferHandle *handle) { int32_t ret = FileDescriptorUnpack(unpacker, hdiFds, handle->fd); bool retVal = (ret == HDF_SUCCESS ? true : false); - DISPLAY_CHK_CONDITION(retVal, true, unpacker->ReadInt32(handle->width), + DISPLAY_CHK_CONDITION(retVal, true, unpacker.ReadInt32(handle->width), HDF_LOGE("%{public}s, read handle->width error", __func__)); - DISPLAY_CHK_CONDITION(retVal, true, unpacker->ReadInt32(handle->stride), + DISPLAY_CHK_CONDITION(retVal, true, unpacker.ReadInt32(handle->stride), HDF_LOGE("%{public}s, read handle->stride error", __func__)); - DISPLAY_CHK_CONDITION(retVal, true, unpacker->ReadInt32(handle->height), + DISPLAY_CHK_CONDITION(retVal, true, unpacker.ReadInt32(handle->height), HDF_LOGE("%{public}s, read handle->height error", __func__)); - DISPLAY_CHK_CONDITION(retVal, true, unpacker->ReadInt32(handle->size), + DISPLAY_CHK_CONDITION(retVal, true, unpacker.ReadInt32(handle->size), HDF_LOGE("%{public}s, read handle->size error", __func__)); - DISPLAY_CHK_CONDITION(retVal, true, unpacker->ReadInt32(handle->format), + DISPLAY_CHK_CONDITION(retVal, true, unpacker.ReadInt32(handle->format), HDF_LOGE("%{public}s, read handle->format error", __func__)); - DISPLAY_CHK_CONDITION(retVal, true, unpacker->ReadUint64(handle->usage), + DISPLAY_CHK_CONDITION(retVal, true, unpacker.ReadUint64(handle->usage), HDF_LOGE("%{public}s, read handle->usage error", __func__)); - DISPLAY_CHK_CONDITION(retVal, true, unpacker->ReadUint64(handle->phyAddr), + DISPLAY_CHK_CONDITION(retVal, true, unpacker.ReadUint64(handle->phyAddr), HDF_LOGE("%{public}s, read handle->phyAddr error", __func__)); return retVal; } - static bool UnpackExtraInfo(std::shared_ptr unpacker, const std::vector& hdiFds, + static bool UnpackExtraInfo(CommandDataUnpacker& unpacker, const std::vector& hdiFds, BufferHandle *handle) { bool retVal = true; @@ -300,7 +310,7 @@ public: } } for (uint32_t j = 0; j < handle->reserveInts; j++) { - retVal = unpacker->ReadInt32(handle->reserve[i++]); + retVal = unpacker.ReadInt32(handle->reserve[i++]); if (!retVal) { HDF_LOGE("%{public}s, get reserve data error, i:%{public}u, j:%{public}u", __func__, i, j); @@ -310,14 +320,14 @@ public: return retVal; } - static int32_t BufferHandleUnpack(std::shared_ptr unpacker, + static int32_t BufferHandleUnpack(CommandDataUnpacker& unpacker, const std::vector& hdiFds, BufferHandle*& buffer) { uint32_t fdsNum = 0; uint32_t intsNum = 0; - DISPLAY_CHK_RETURN(unpacker->ReadUint32(fdsNum) == false, HDF_FAILURE, + DISPLAY_CHK_RETURN(unpacker.ReadUint32(fdsNum) == false, HDF_FAILURE, HDF_LOGE("%{public}s, read fdsNum error", __func__)); - DISPLAY_CHK_RETURN(unpacker->ReadUint32(intsNum) == false, HDF_FAILURE, + DISPLAY_CHK_RETURN(unpacker.ReadUint32(intsNum) == false, HDF_FAILURE, HDF_LOGE("%{public}s, read intsNum error", __func__)); if (fdsNum == UINT32_MAX && intsNum == UINT32_MAX) { buffer = nullptr; @@ -342,15 +352,15 @@ public: return retVal ? HDF_SUCCESS : HDF_FAILURE; } - static int32_t LayerColorUnpack(std::shared_ptr unpacker, LayerColor& layerColor) + static int32_t LayerColorUnpack(CommandDataUnpacker& unpacker, LayerColor& layerColor) { - DISPLAY_CHK_RETURN(unpacker->ReadUint8(layerColor.r) == false, HDF_FAILURE, + DISPLAY_CHK_RETURN(unpacker.ReadUint8(layerColor.r) == false, HDF_FAILURE, HDF_LOGE("%{public}s, read layerColor.r failed", __func__)); - DISPLAY_CHK_RETURN(unpacker->ReadUint8(layerColor.g) == false, HDF_FAILURE, + DISPLAY_CHK_RETURN(unpacker.ReadUint8(layerColor.g) == false, HDF_FAILURE, HDF_LOGE("%{public}s, read layerColor.g failed", __func__)); - DISPLAY_CHK_RETURN(unpacker->ReadUint8(layerColor.b) == false, HDF_FAILURE, + DISPLAY_CHK_RETURN(unpacker.ReadUint8(layerColor.b) == false, HDF_FAILURE, HDF_LOGE("%{public}s, read layerColor.b failed", __func__)); - DISPLAY_CHK_RETURN(unpacker->ReadUint8(layerColor.a) == false, HDF_FAILURE, + DISPLAY_CHK_RETURN(unpacker.ReadUint8(layerColor.a) == false, HDF_FAILURE, HDF_LOGE("%{public}s, read layerColor.a 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..db56c166ce9bfc9222b11da688133958c22ff13f 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; @@ -57,10 +57,13 @@ public: int32_t ret = CmdUtils::StartSection(REQUEST_CMD_COMMIT_AND_GET_RELEASE_FENCE, requestPacker_); DISPLAY_CHECK(ret != HDF_SUCCESS, goto EXIT); - ret = requestPacker_->WriteUint32(devId) ? HDF_SUCCESS : HDF_FAILURE; + ret = requestPacker_.WriteUint32(devId) ? HDF_SUCCESS : HDF_FAILURE; DISPLAY_CHECK(ret != HDF_SUCCESS, goto EXIT); - ret = requestPacker_->WriteBool(isSupportSkipValidate) ? HDF_SUCCESS : HDF_FAILURE; + 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_); @@ -97,64 +100,69 @@ EXIT: return PeriodDataReset() == HDF_SUCCESS ? ret : HDF_FAILURE; } - int32_t OnReplyCommitAndGetReleaseFence(std::shared_ptr replyUnpacker, - std::vector replyFds, int32_t &fenceFd, int32_t &skipState, - bool &needFlush, std::vector& layers, std::vector& fences) + int32_t OnReplySkipStateFailed(CommandDataUnpacker& replyUnpacker, bool &needFlush) { uint32_t devId = 0; + int32_t retBool = replyUnpacker.ReadUint32(devId); + DISPLAY_CHK_RETURN(retBool == false, HDF_FAILURE, HDF_LOGE("%{public}s: read devId failed", __func__)); + + retBool = replyUnpacker.ReadBool(needFlush); + DISPLAY_CHK_RETURN(retBool == false, HDF_FAILURE, HDF_LOGE("%{public}s: read needFlush failed", __func__)); + + // unpack layers vector + uint32_t vectSize = 0; + retBool = replyUnpacker.ReadUint32(vectSize); + DISPLAY_CHK_RETURN(retBool == false, HDF_FAILURE, + HDF_LOGE("%{public}s: HDI 1.2 read vect size failed", __func__)); + + compChangeLayers_[devId].resize(vectSize); + for (uint32_t i = 0; i < vectSize; i++) { + DISPLAY_CHK_RETURN(replyUnpacker.ReadUint32(compChangeLayers_[devId][i]) == false, HDF_FAILURE, + HDF_LOGE("%{public}s: HDI 1.2 read layer vector failed", __func__)); + } + // unpack types vector + vectSize = 0; + retBool = replyUnpacker.ReadUint32(vectSize); + DISPLAY_CHK_RETURN(retBool == false, HDF_FAILURE, + HDF_LOGE("%{public}s: HDI 1.2 read vect size failed", __func__)); + + compChangeTypes_[devId].resize(vectSize); + for (uint32_t i = 0; i < vectSize; i++) { + DISPLAY_CHK_RETURN(replyUnpacker.ReadInt32(compChangeTypes_[devId][i]) == false, HDF_FAILURE, + HDF_LOGE("%{public}s: HDI 1.2 read composition type vector failed", __func__)); + } + return HDF_SUCCESS; + } + + int32_t OnReplyCommitAndGetReleaseFence(CommandDataUnpacker& replyUnpacker, + std::vector& replyFds, int32_t& fenceFd, int32_t& skipState, + bool& needFlush, std::vector& layers, std::vector& fences) + { int32_t ret = CmdUtils::FileDescriptorUnpack(replyUnpacker, replyFds, fenceFd); DISPLAY_CHK_RETURN(ret != HDF_SUCCESS, ret, HDF_LOGE("%{public}s: FileDescriptorUnpack failed", __func__)); - int32_t retBool = replyUnpacker->ReadInt32(skipState); + int32_t retBool = replyUnpacker.ReadInt32(skipState); DISPLAY_CHK_RETURN(retBool == false, HDF_FAILURE, HDF_LOGE("%{public}s: read skipValidateState failed", __func__)); if (skipState != HDF_SUCCESS) { - retBool = replyUnpacker->ReadUint32(devId); - DISPLAY_CHK_RETURN(retBool == false, HDF_FAILURE, HDF_LOGE("%{public}s: read devId failed", __func__)); - - retBool = replyUnpacker->ReadBool(needFlush); - DISPLAY_CHK_RETURN(retBool == false, HDF_FAILURE, HDF_LOGE("%{public}s: read needFlush failed", __func__)); - + return OnReplySkipStateFailed(replyUnpacker, needFlush); + } else { // unpack layers vector uint32_t vectSize = 0; - retBool = replyUnpacker->ReadUint32(vectSize); - DISPLAY_CHK_RETURN(retBool == false, HDF_FAILURE, - HDF_LOGE("%{public}s: HDI 1.2 read vect size failed", __func__)); - - compChangeLayers_[devId].resize(vectSize); - for (uint32_t i = 0; i < vectSize; i++) { - DISPLAY_CHK_RETURN(replyUnpacker->ReadUint32(compChangeLayers_[devId][i]) == false, HDF_FAILURE, - HDF_LOGE("%{public}s: HDI 1.2 read layer vector failed", __func__)); - } - // unpack types vector - vectSize = 0; - retBool = replyUnpacker->ReadUint32(vectSize); - DISPLAY_CHK_RETURN(retBool == false, HDF_FAILURE, - HDF_LOGE("%{public}s: HDI 1.2 read vect size failed", __func__)); - - compChangeTypes_[devId].resize(vectSize); - for (uint32_t i = 0; i < vectSize; i++) { - 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 - uint32_t vectSize = 0; - DISPLAY_CHK_RETURN(true != replyUnpacker->ReadUint32(vectSize), HDF_FAILURE, + DISPLAY_CHK_RETURN(true != replyUnpacker.ReadUint32(vectSize), HDF_FAILURE, HDF_LOGE("%{public}s: HDI 1.2 read vect size failed", __func__)); layers.resize(vectSize); for (uint32_t i = 0; i < vectSize; i++) { - DISPLAY_CHK_RETURN(replyUnpacker->ReadUint32(layers[i]) == false, HDF_FAILURE, + DISPLAY_CHK_RETURN(replyUnpacker.ReadUint32(layers[i]) == false, HDF_FAILURE, HDF_LOGE("%{public}s: HDI 1.2 read layer vector failed", __func__)); } // unpack layers vector vectSize = 0; - DISPLAY_CHK_RETURN(true != replyUnpacker->ReadUint32(vectSize), HDF_FAILURE, + DISPLAY_CHK_RETURN(true != replyUnpacker.ReadUint32(vectSize), HDF_FAILURE, HDF_LOGE("%{public}s: HDI 1.2 read vect size failed", __func__)); fences.resize(vectSize); @@ -163,15 +171,17 @@ EXIT: DISPLAY_CHK_RETURN(ret != HDF_SUCCESS, ret, HDF_LOGE("%{public}s: HDI 1.2 FileDescriptorUnpack failed", __func__)); } + } + return HDF_SUCCESS; } - int32_t ProcessUnpackCmd(std::shared_ptr replyUnpacker, int32_t unpackCmd, - std::vector replyFds, std::function fn) + int32_t ProcessUnpackCmd(CommandDataUnpacker& replyUnpacker, int32_t unpackCmd, + std::vector& replyFds, std::function fn) { int32_t ret = HDF_SUCCESS; - while (replyUnpacker->NextSection()) { - bool retBool = replyUnpacker->BeginSection(unpackCmd); + while (replyUnpacker.NextSection()) { + bool retBool = replyUnpacker.BeginSection(unpackCmd); DISPLAY_CHK_RETURN(retBool == false, HDF_FAILURE, HDF_LOGE("%{public}s: BeginSection failed", __func__)); @@ -199,18 +209,16 @@ EXIT: return HDF_SUCCESS; } - int32_t DoReplyResults(uint32_t replyEleCnt, std::vector replyFds, std::shared_ptr replyData, + int32_t DoReplyResults(uint32_t replyEleCnt, std::vector& replyFds, std::shared_ptr replyData, std::function fn) { - std::shared_ptr replyUnpacker = std::make_shared(); - DISPLAY_CHK_RETURN(replyUnpacker == nullptr, HDF_FAILURE, - HDF_LOGE("%{public}s: HDI 1.2 CommandDataUnpacker construct failed", __func__)); - replyUnpacker->Init(replyData.get(), replyEleCnt * CmdUtils::ELEMENT_SIZE); + CommandDataUnpacker replyUnpacker; + replyUnpacker.Init(replyData.get(), replyEleCnt << CmdUtils::MOVE_SIZE); #ifdef DEBUG_DISPLAY_CMD_RAW_DATA - replyUnpacker->Dump(); + replyUnpacker.Dump(); #endif // DEBUG_DISPLAY_CMD_RAW_DATA int32_t unpackCmd = -1; - bool retBool = replyUnpacker->PackBegin(unpackCmd); + bool retBool = replyUnpacker.PackBegin(unpackCmd); DISPLAY_CHK_RETURN(retBool == false, HDF_FAILURE, HDF_LOGE("%{public}s: PackBegin failed", __func__)); DISPLAY_CHK_RETURN(unpackCmd != CONTROL_CMD_REPLY_BEGIN, HDF_FAILURE, @@ -219,7 +227,7 @@ EXIT: return HDF_FAILURE; } - retBool = replyUnpacker->PackEnd(unpackCmd); + retBool = replyUnpacker.PackEnd(unpackCmd); DISPLAY_CHK_RETURN(retBool == false, HDF_FAILURE, HDF_LOGE("%{public}s: PackEnd failed", __func__)); @@ -237,19 +245,19 @@ EXIT: DISPLAY_CHK_RETURN(ret != HDF_SUCCESS, ret, HDF_LOGE("%{public}s: StartSection failed", __func__)); - bool retBool = requestPacker_->WriteUint32(devId); + bool retBool = requestPacker_.WriteUint32(devId); DISPLAY_CHK_RETURN(retBool == false, HDF_FAILURE, HDF_LOGE("%{public}s: write devId failed", __func__)); - retBool = requestPacker_->WriteUint64(frameID); + retBool = requestPacker_.WriteUint64(frameID); DISPLAY_CHK_RETURN(retBool == false, HDF_FAILURE, HDF_LOGE("%{public}s: write frameID failed", __func__)); - retBool = requestPacker_->WriteUint64(ns); + retBool = requestPacker_.WriteUint64(ns); DISPLAY_CHK_RETURN(retBool == false, HDF_FAILURE, HDF_LOGE("%{public}s: write ns failed", __func__)); - retBool = requestPacker_->WriteUint32(type); + retBool = requestPacker_.WriteUint32(type); DISPLAY_CHK_RETURN(retBool == false, HDF_FAILURE, HDF_LOGE("%{public}s: write type failed", __func__)); 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..c2141f01eed4dc0cbc06dddfb897a037c6712637 100644 --- a/display/composer/v1_2/display_command/display_cmd_responser.h +++ b/display/composer/v1_2/display_command/display_cmd_responser.h @@ -71,7 +71,7 @@ public: virtual ~DisplayCmdResponser() {} - int32_t ProcessRequestCmd(std::shared_ptr& unpacker, int32_t cmd, + int32_t ProcessRequestCmd(CommandDataUnpacker& unpacker, int32_t cmd, const std::vector& inFds, std::vector& outFds) { HDF_LOGD("%{public}s: HDI 1.2 PackSection, cmd-[%{public}d] = %{public}s", @@ -88,28 +88,28 @@ public: void ReplyNotSkipInfo(uint32_t& devId, CommitInfo& commitInfo) { - DISPLAY_CHECK(replyPacker_->WriteUint32(devId) == false, + DISPLAY_CHECK(replyPacker_.WriteUint32(devId) == false, HDF_LOGE("%{public}s, write devId error", __func__)); - DISPLAY_CHECK(replyPacker_->WriteBool(commitInfo.needFlush) == false, + DISPLAY_CHECK(replyPacker_.WriteBool(commitInfo.needFlush) == false, HDF_LOGE("%{public}s, write needFlush error", __func__)); // Write compLayers vector uint32_t vectSize = static_cast(commitInfo.compLayers.size()); - DISPLAY_CHECK(replyPacker_->WriteUint32(vectSize) == false, + DISPLAY_CHECK(replyPacker_.WriteUint32(vectSize) == false, HDF_LOGE("%{public}s, write compLayers.size error", __func__)); for (uint32_t i = 0; i < vectSize; i++) { - DISPLAY_CHECK(replyPacker_->WriteUint32(commitInfo.compLayers[i]) == false, + DISPLAY_CHECK(replyPacker_.WriteUint32(commitInfo.compLayers[i]) == false, HDF_LOGE("%{public}s, write compLayers error", __func__)); } // Write compTypes vector vectSize = static_cast(commitInfo.compTypes.size()); - DISPLAY_CHECK(replyPacker_->WriteUint32(vectSize) == false, + DISPLAY_CHECK(replyPacker_.WriteUint32(vectSize) == false, HDF_LOGE("%{public}s, write compTypes.size error", __func__)); for (uint32_t i = 0; i < vectSize; i++) { - DISPLAY_CHECK(replyPacker_->WriteUint32(commitInfo.compTypes[i]) == false, + DISPLAY_CHECK(replyPacker_.WriteUint32(commitInfo.compTypes[i]) == false, HDF_LOGE("%{public}s, write compTypes error", __func__)); } } @@ -127,30 +127,30 @@ public: DISPLAY_CHK_CONDITION(ret, HDF_SUCCESS, CmdUtils::FileDescriptorPack(fdParcel.GetFd(), replyPacker_, outFds), HDF_LOGE("%{public}s, FileDescriptorPack error", __func__)); - DISPLAY_CHECK(replyPacker_->WriteInt32(commitInfo.skipRet) == false, + DISPLAY_CHECK(replyPacker_.WriteInt32(commitInfo.skipRet) == false, HDF_LOGE("%{public}s, write skip validate return value error", __func__)); if (commitInfo.skipRet != HDF_SUCCESS) { ReplyNotSkipInfo(devId, commitInfo); - } - + } 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__)); + 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__)); - } + 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__)); + 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_), @@ -181,12 +181,12 @@ public: #endif } - void OnCommitAndGetReleaseFence(std::shared_ptr& unpacker, - std::vector& outFds) + void OnCommitAndGetReleaseFence(CommandDataUnpacker& unpacker, std::vector& outFds) { DISPLAY_TRACE; uint32_t devId = 0; bool isSupportSkipValidate = false; + bool isValidated = false; int32_t ret = HDF_SUCCESS; CommitInfo commitInfo; commitInfo.fence = -1; @@ -194,49 +194,43 @@ public: commitInfo.needFlush = false; CommitInfoDump(); - if (!unpacker->ReadUint32(devId)) { + if (!unpacker.ReadUint32(devId)) { HDF_LOGE("%{public}s, read devId error", __func__); - ret = HDF_FAILURE; goto REPLY; } - if (!unpacker->ReadBool(isSupportSkipValidate)) { + 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); } - DISPLAY_CHECK(ret != HDF_SUCCESS, goto REPLY); - - { + if (ret == HDF_SUCCESS) { HdfTrace traceVdi("GetDisplayCompChange", "HDI:DISP:HARDWARE"); 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 ret = %{public}d", __func__, ret); + } } + 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; } int32_t CmdRequest(uint32_t inEleCnt, const std::vector& inFds, uint32_t& outEleCnt, @@ -246,25 +240,22 @@ REPLY: int32_t ret = request_->Read(reinterpret_cast(requestData.get()), inEleCnt, CmdUtils::TRANSFER_WAIT_TIME); - std::shared_ptr unpacker = std::make_shared(); - DISPLAY_CHK_RETURN(unpacker == nullptr, HDF_FAILURE, - HDF_LOGE("%{public}s: unpacker construct failed", __func__)); - - unpacker->Init(requestData.get(), inEleCnt * CmdUtils::ELEMENT_SIZE); + CommandDataUnpacker unpacker; + unpacker.Init(requestData.get(), inEleCnt << CmdUtils::MOVE_SIZE); #ifdef DEBUG_DISPLAY_CMD_RAW_DATA - unpacker->Dump(); + unpacker.Dump(); #endif // DEBUG_DISPLAY_CMD_RAW_DATA int32_t unpackCmd = -1; - bool retBool = unpacker->PackBegin(unpackCmd); + bool retBool = unpacker.PackBegin(unpackCmd); DISPLAY_CHK_RETURN(retBool == false, HDF_FAILURE, HDF_LOGE("%{public}s: error: Check RequestBegin failed", __func__)); DISPLAY_CHK_RETURN(unpackCmd != CONTROL_CMD_REQUEST_BEGIN, HDF_FAILURE, HDF_LOGI("error: unpacker PackBegin cmd not match, cmd(%{public}d)=%{public}s.", unpackCmd, CmdUtils::CommandToString(unpackCmd))); - while (ret == HDF_SUCCESS && unpacker->NextSection()) { - if (!unpacker->BeginSection(unpackCmd)) { + while (ret == HDF_SUCCESS && unpacker.NextSection()) { + if (!unpacker.BeginSection(unpackCmd)) { HDF_LOGE("error: PackSection failed, unpackCmd=%{public}s.", CmdUtils::CommandToString(unpackCmd)); ret = HDF_FAILURE; @@ -275,17 +266,17 @@ REPLY: DISPLAY_CHK_RETURN(ret != HDF_SUCCESS, ret, HDF_LOGE("%{public}s: ProcessRequestCmd failed", __func__)); /* pack request end commands */ - replyPacker_->PackEnd(CONTROL_CMD_REPLY_END); + replyPacker_.PackEnd(CONTROL_CMD_REPLY_END); #ifdef DEBUG_DISPLAY_CMD_RAW_DATA /* just for debug */ - replyPacker_->Dump(); + replyPacker_.Dump(); HDF_LOGI("CmdReply command cnt=%{public}d", replyCommandCnt_); #endif // DEBUG_DISPLAY_CMD_RAW_DATA /* Write reply pack */ - outEleCnt = replyPacker_->ValidSize() / CmdUtils::ELEMENT_SIZE; - ret = reply_->Write(reinterpret_cast(replyPacker_->GetDataPtr()), outEleCnt, + outEleCnt = replyPacker_.ValidSize() >> CmdUtils::MOVE_SIZE; + ret = reply_->Write(reinterpret_cast(replyPacker_.GetDataPtr()), outEleCnt, CmdUtils::TRANSFER_WAIT_TIME); if (ret != HDF_SUCCESS) { HDF_LOGE("Reply write failure, ret=%{public}d", ret); @@ -295,7 +286,7 @@ REPLY: return (ret == HDF_SUCCESS ? ec : ret); } - int32_t OnSetDisplayConstraint(std::shared_ptr unpacker) + int32_t OnSetDisplayConstraint(CommandDataUnpacker& unpacker) { DISPLAY_TRACE; uint32_t devId = 0; @@ -303,16 +294,16 @@ REPLY: uint64_t ns = 0; uint32_t type = 0; - int32_t ret = unpacker->ReadUint32(devId) ? HDF_SUCCESS : HDF_FAILURE; + int32_t ret = unpacker.ReadUint32(devId) ? HDF_SUCCESS : HDF_FAILURE; DISPLAY_CHECK(ret != HDF_SUCCESS, goto EXIT); - ret = unpacker->ReadUint64(frameID) ? HDF_SUCCESS : HDF_FAILURE; + ret = unpacker.ReadUint64(frameID) ? HDF_SUCCESS : HDF_FAILURE; DISPLAY_CHECK(ret != HDF_SUCCESS, goto EXIT); - ret = unpacker->ReadUint64(ns) ? HDF_SUCCESS : HDF_FAILURE; + ret = unpacker.ReadUint64(ns) ? HDF_SUCCESS : HDF_FAILURE; DISPLAY_CHECK(ret != HDF_SUCCESS, goto EXIT); - ret = unpacker->ReadUint32(type) ? HDF_SUCCESS : HDF_FAILURE; + ret = unpacker.ReadUint32(type) ? HDF_SUCCESS : HDF_FAILURE; DISPLAY_CHECK(ret != HDF_SUCCESS, goto EXIT); if (vdiImpl1_1_ != nullptr) { ret = vdiImpl1_1_->SetDisplayConstraint(devId, frameID, ns, type); 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..f1abc3d0b6a788b2f64717398c004ea165997e11 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 @@ -68,13 +68,13 @@ 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 + virtual int32_t CommitAndGetReleaseFence(uint32_t devId, int32_t& fence, int32_t& skipState, 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;