From d1afda9c6b27a981738341afd4fafaaca40af618 Mon Sep 17 00:00:00 2001 From: hanamaru Date: Thu, 6 Feb 2025 14:39:15 +0800 Subject: [PATCH] add overlaymanager Signed-off-by: hanamaru --- bundle.json | 3 +- graphic_config.gni | 5 + rosen/modules/render_service/BUILD.gn | 4 + .../rs_display_render_node_drawable.cpp | 6 + .../rs_overlay_display_manager.cpp | 150 ++++++++++++++++++ .../rs_overlay_display_manager.h | 61 +++++++ .../render_thread/rs_uni_render_util.cpp | 7 + .../core/pipeline/rs_main_thread.cpp | 21 ++- .../pipeline/rs_render_service_connection.cpp | 11 ++ .../pipeline/rs_render_service_connection.h | 4 + .../core/pipeline/rs_uni_render_visitor.cpp | 7 + ...ion_ipc_interface_code_access_verifier.cpp | 6 + .../rs_render_service_connection_stub.cpp | 16 ++ .../ohos/rs_irender_service_connection.h | 4 + ...er_service_connection_ipc_interface_code.h | 3 + .../transaction/rs_render_service_client.h | 5 + .../ohos/rs_render_service_client.cpp | 11 ++ .../rs_render_service_connection_proxy.cpp | 27 ++++ .../ohos/rs_render_service_connection_proxy.h | 4 + .../windows/rs_render_service_client.cpp | 7 + .../core/transaction/rs_interfaces.cpp | 8 + .../core/transaction/rs_interfaces.h | 4 + .../rsrenderserviceconnection_fuzzer.cpp | 15 ++ .../rsrenderserviceconnectionproxy_fuzzer.cpp | 27 ++++ .../rsinterfaces_fuzzer.cpp | 25 +++ .../transaction/rs_interfaces_test.cpp | 24 +++ 26 files changed, 462 insertions(+), 3 deletions(-) create mode 100644 rosen/modules/render_service/core/feature/overlay_display/rs_overlay_display_manager.cpp create mode 100644 rosen/modules/render_service/core/feature/overlay_display/rs_overlay_display_manager.h diff --git a/bundle.json b/bundle.json index 3ca76b7b73..e45815274f 100644 --- a/bundle.json +++ b/bundle.json @@ -56,7 +56,8 @@ "graphic_2d_feature_use_aps_igameservice_func", "graphic_2d_feature_use_igraphics_extend_hooks", "graphic_2d_feature_vkqueue_priority_enable", - "graphic_2d_feature_bootanimation_ext_enable" + "graphic_2d_feature_bootanimation_ext_enable", + "graphic_2d_feature_overlay_display_enable" ], "rom": "10000KB", "ram": "10000KB", diff --git a/graphic_config.gni b/graphic_config.gni index 94846bfd60..62c34ce2ff 100644 --- a/graphic_config.gni +++ b/graphic_config.gni @@ -50,6 +50,7 @@ declare_args() { graphic_2d_feature_enable_prefetch = true graphic_2d_feature_bootanimation_ext_enable = "default" graphic_2d_support_access_token = true + graphic_2d_feature_overlay_display_enable = false if (defined(is_arkui_x) && is_arkui_x) { is_cross_platform = true @@ -189,6 +190,10 @@ if (graphic_2d_feature_tp_switch_enbale) { tp_defines = [ "TP_FEATURE_ENABLE" ] } +if (graphic_2d_feature_overlay_display_enable) { + gpu_defines += [ "RS_ENABLE_OVERLAY_DISPLAY" ] +} + check_graphic_ext_file_script = "//build/ohos/file_exists.py" check_ddgr_ext_file_args = [ diff --git a/rosen/modules/render_service/BUILD.gn b/rosen/modules/render_service/BUILD.gn index 0089aec5bb..9d95524517 100644 --- a/rosen/modules/render_service/BUILD.gn +++ b/rosen/modules/render_service/BUILD.gn @@ -258,6 +258,10 @@ ohos_shared_library("librender_service") { include_dirs += [ "$graphic_2d_ext_root/chipset_vsync/include" ] } + if (graphic_2d_feature_overlay_display_enable) { + sources += [ "core/feature/overlay_display/rs_overlay_display_manager.cpp" ] + } + if (rosen_is_ohos) { sources += [ "$rosen_root/modules/frame_report/src/rs_frame_report.cpp" ] } else if (!is_arkui_x) { diff --git a/rosen/modules/render_service/core/drawable/rs_display_render_node_drawable.cpp b/rosen/modules/render_service/core/drawable/rs_display_render_node_drawable.cpp index 1561a82e2e..307fe82172 100644 --- a/rosen/modules/render_service/core/drawable/rs_display_render_node_drawable.cpp +++ b/rosen/modules/render_service/core/drawable/rs_display_render_node_drawable.cpp @@ -29,6 +29,9 @@ #include "common/rs_singleton.h" #include "common/rs_special_layer_manager.h" #include "drawable/rs_surface_render_node_drawable.h" +#ifdef RS_ENABLE_OVERLAY_DISPLAY +#include "feature/overlay_display/rs_overlay_display_manager.h" +#endif #include "hgm_core.h" #include "memory/rs_tag_tracker.h" #include "params/rs_display_render_params.h" @@ -828,6 +831,9 @@ void RSDisplayRenderNodeDrawable::OnDraw(Drawing::Canvas& canvas) DrawWatermarkIfNeed(*params, *curCanvas_); SwitchColorFilter(*curCanvas_, hdrBrightnessRatio); } +#ifdef RS_ENABLE_OVERLAY_DISPLAY + RSOverlayDisplayManager::Instance().PostProcFilter(*curCanvas_); +#endif auto dirtyManager = GetSyncDirtyManager(); const auto& activeRect = dirtyManager->GetActiveSurfaceRect(); if (!activeRect.IsEmpty() && (!dirtyManager->GetDirtyRegion().IsInsideOf(activeRect) || diff --git a/rosen/modules/render_service/core/feature/overlay_display/rs_overlay_display_manager.cpp b/rosen/modules/render_service/core/feature/overlay_display/rs_overlay_display_manager.cpp new file mode 100644 index 0000000000..4f4bcdbe46 --- /dev/null +++ b/rosen/modules/render_service/core/feature/overlay_display/rs_overlay_display_manager.cpp @@ -0,0 +1,150 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +*/ + +#include "rs_overlay_display_manager.h" + +#include + +#include "platform/common/rs_log.h" + +namespace OHOS::Rosen { +const std::string OVERLAY_DISPLAY_SO_PATH = "liboverlay_display.z.so"; +const std::string OVERLAY_DISPLAY_POST_PROC_HOOK = "OverlayDisplayPostProcHook"; +const std::string OVERLAY_DISPLAY_EXPAND_DIRTY_REGION = "OverlayDisplayExpandDirtyRegion"; + +const int32_t OVERLAY_RET_FAILED = -1; +const int32_t OVERLAY_RET_SUCCESS = 0; + +RSOverlayDisplayManager& RSOverlayDisplayManager::Instance() +{ + static RSOverlayDisplayManager instance; + return instance; +} + +int32_t RSOverlayDisplayManager::SetOverlayDisplayMode(int32_t mode) +{ + std::unique_lock lock(mutex_); + if (mode == mode_) { + return OVERLAY_RET_SUCCESS; + } + + // Non-zero is overlay mode + if (mode != 0) { + if (!LoadLibrary()) { + RS_LOGE("%{public}s: load library failed!", __func__); + return OVERLAY_RET_FAILED; + } + } else { + CloseLibrary(); + } + mode_ = mode; + RS_LOGI("%{public}s: mode:%{public}d", __func__, mode); + return OVERLAY_RET_SUCCESS; +} + +void RSOverlayDisplayManager::PreProcForRender() +{ + std::unique_lock lock(mutex_); + isStatusChanged_ = false; + if (modeOfCurrentVsync_ != mode_) { + isStatusChanged_ = true; + RS_LOGI("%{public}s: mode changed to %{public}d", __func__, mode_); + } + modeOfCurrentVsync_ = mode_; +} + +bool RSOverlayDisplayManager::IsOverlayDisplayEnableForCurrentVsync() +{ + return modeOfCurrentVsync_ != 0; +} + +bool RSOverlayDisplayManager::CheckStatusChanged() +{ + return isStatusChanged_; +} + +void RSOverlayDisplayManager::PostProcFilter(RSPaintFilterCanvas& canvas) +{ + std::shared_lock lock(mutex_); + if (modeOfCurrentVsync_ == 0) { + return; + } + if (postProcFunc_ == nullptr) { + RS_LOGE("%{public}s function is null.", __func__); + return; + } + postProcFunc_(canvas); +} + +void RSOverlayDisplayManager::ExpandDirtyRegion( + RSDirtyRegionManager& dirtyManager, const ScreenInfo& screenInfo, Occlusion::Region& dirtyRegion) +{ + std::shared_lock lock(mutex_); + if (modeOfCurrentVsync_ == 0) { + return; + } + if (expandDirtyRegionFunc_ == nullptr) { + RS_LOGI("%{public}s function is null.", __func__); + return; + } + expandDirtyRegionFunc_(dirtyManager, screenInfo, dirtyRegion); +} + +bool RSOverlayDisplayManager::LoadLibrary() +{ + if (isSoLoaded_) { + return true; + } + dlerror(); + soHandle_ = dlopen(OVERLAY_DISPLAY_SO_PATH.c_str(), RTLD_LAZY); + if (soHandle_ == nullptr) { + RS_LOGE("%{public}s: dlopen failed! error = %{public}s", __func__, dlerror()); + return false; + } + RS_LOGI("%{public}s: dlopen success!", __func__); + postProcFunc_ = (OverlayPostProcFunc)LoadSymbol(OVERLAY_DISPLAY_POST_PROC_HOOK); + expandDirtyRegionFunc_ = (OverlayExpandDirtyRegionFunc)LoadSymbol(OVERLAY_DISPLAY_EXPAND_DIRTY_REGION); + if (postProcFunc_ == nullptr || expandDirtyRegionFunc_ == nullptr) { + CloseLibrary(); + return false; + } + RS_LOGI("%{public}s load func success!", __func__); + isSoLoaded_ = true; + return true; +} + +void RSOverlayDisplayManager::CloseLibrary() +{ + postProcFunc_ = nullptr; + expandDirtyRegionFunc_ = nullptr; + if (soHandle_ != nullptr) { + dlclose(soHandle_); + soHandle_ = nullptr; + } + isSoLoaded_ = false; + RS_LOGI("%{public}s done!", __func__); +} + +void *RSOverlayDisplayManager::LoadSymbol(const std::string& symName) +{ + dlerror(); + void *funcSym = dlsym(soHandle_, symName.c_str()); + if (funcSym == nullptr) { + RS_LOGE("%{public}s Get %{public}s symbol failed: %{public}s", __func__, symName.c_str(), dlerror()); + return nullptr; + } + return funcSym; +} +} // namespace OHOS::Rosen \ No newline at end of file diff --git a/rosen/modules/render_service/core/feature/overlay_display/rs_overlay_display_manager.h b/rosen/modules/render_service/core/feature/overlay_display/rs_overlay_display_manager.h new file mode 100644 index 0000000000..3c7b7e02d3 --- /dev/null +++ b/rosen/modules/render_service/core/feature/overlay_display/rs_overlay_display_manager.h @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +*/ + +#ifndef RS_OVERLAY_DISPLAY_MANAGER_H +#define RS_OVERLAY_DISPLAY_MANAGER_H + +#include + +#include "common/rs_occlusion_region.h" +#include "pipeline/rs_dirty_region_manager.h" +#include "pipeline/rs_paint_filter_canvas.h" +#include "screen_manager/rs_screen_info.h" + +namespace OHOS::Rosen { +using OverlayPostProcFunc = void (*)(RSPaintFilterCanvas&); +using OverlayExpandDirtyRegionFunc = void (*)(RSDirtyRegionManager&, const ScreenInfo&, Occlusion::Region&); + +class RSOverlayDisplayManager { +public: + static RSOverlayDisplayManager& Instance(); + + void PostProcFilter(RSPaintFilterCanvas& canvas); + void ExpandDirtyRegion( + RSDirtyRegionManager& dirtyManager, const ScreenInfo& screenInfo, Occlusion::Region& dirtyRegion); + int32_t SetOverlayDisplayMode(int32_t mode); + // pre-process before render for judge whether the mode changed + void PreProcForRender(); + bool IsOverlayDisplayEnableForCurrentVsync(); + bool CheckStatusChanged(); + +private: + RSOverlayDisplayManager() = default; + ~RSOverlayDisplayManager() = default; + + bool LoadLibrary(); + void CloseLibrary(); + void *LoadSymbol(const std::string& symName); + + bool isStatusChanged_ = false; + int32_t mode_ = 0; + int32_t modeOfCurrentVsync_ = 0; + bool isSoLoaded_ = false; + void *soHandle_ = nullptr; + OverlayPostProcFunc postProcFunc_ = nullptr; + OverlayExpandDirtyRegionFunc expandDirtyRegionFunc_ = nullptr; + mutable std::shared_mutex mutex_; +}; +} // namespace OHOS::Rosen +#endif // RS_OVERLAY_DISPLAY_MANAGER_H \ No newline at end of file diff --git a/rosen/modules/render_service/core/pipeline/render_thread/rs_uni_render_util.cpp b/rosen/modules/render_service/core/pipeline/render_thread/rs_uni_render_util.cpp index ec13f5c415..5b10978bb0 100644 --- a/rosen/modules/render_service/core/pipeline/render_thread/rs_uni_render_util.cpp +++ b/rosen/modules/render_service/core/pipeline/render_thread/rs_uni_render_util.cpp @@ -29,6 +29,9 @@ #include "drawable/dfx/rs_dirty_rects_dfx.h" #include "drawable/rs_display_render_node_drawable.h" #include "drawable/rs_surface_render_node_drawable.h" +#ifdef RS_ENABLE_OVERLAY_DISPLAY +#include "feature/overlay_display/rs_overlay_display_manager.h" +#endif #include "info_collection/rs_gpu_dirty_region_collection.h" #include "params/rs_display_render_params.h" #include "params/rs_surface_render_params.h" @@ -100,6 +103,10 @@ std::vector RSUniRenderUtil::MergeDirtyHistory(DrawableV2::RSDisplayRende allDirtyRegion.GetRegionInfo().c_str(), bound.GetRectInfo().c_str()); } } +#ifdef RS_ENABLE_OVERLAY_DISPLAY + // overlay display expand dirty region + RSOverlayDisplayManager::Instance().ExpandDirtyRegion(*dirtyManager, screenInfo, dirtyRegion); +#endif Occlusion::Region globalDirtyRegion{ Occlusion::Rect{ dirtyManager->GetDirtyRegion() } }; if (screenInfo.isSamplingOn && screenInfo.samplingScale > 0) { Occlusion::Region allDirtyRegion{dirtyRegion.Or(globalDirtyRegion)}; diff --git a/rosen/modules/render_service/core/pipeline/rs_main_thread.cpp b/rosen/modules/render_service/core/pipeline/rs_main_thread.cpp index ebcc53efa8..f5bbbffd8e 100644 --- a/rosen/modules/render_service/core/pipeline/rs_main_thread.cpp +++ b/rosen/modules/render_service/core/pipeline/rs_main_thread.cpp @@ -52,6 +52,9 @@ #include "common/rs_optional_trace.h" #include "drawable/rs_canvas_drawing_render_node_drawable.h" #include "feature/anco_manager/rs_anco_manager.h" +#ifdef RS_ENABLE_OVERLAY_DISPLAY +#include "feature/overlay_display/rs_overlay_display_manager.h" +#endif #include "gfx/performance/rs_perfmonitor_reporter.h" #include "info_collection/rs_gpu_dirty_region_collection.h" #include "luminance/rs_luminance_control.h" @@ -1584,6 +1587,10 @@ void RSMainThread::CollectInfoForHardwareComposer() if (!isUniRender_) { return; } +#ifdef RS_ENABLE_OVERLAY_DISPLAY + // pre proc for tv overlay display + RSOverlayDisplayManager::Instance().PreProcForRender(); +#endif CheckIfHardwareForcedDisabled(); if (!pendingUiCaptureTasks_.empty()) { RS_OPTIONAL_TRACE_NAME("rs debug: uiCapture SetDoDirectComposition false"); @@ -1703,6 +1710,15 @@ bool RSMainThread::IsLastFrameUIFirstEnabled(NodeId appNodeId) const return false; } +static bool CheckOverlayDisplayEnable() +{ +#ifdef RS_ENABLE_OVERLAY_DISPLAY + return RSOverlayDisplayManager::Instance().IsOverlayDisplayEnableForCurrentVsync(); +#else + return false; +#endif +} + void RSMainThread::CheckIfHardwareForcedDisabled() { ColorFilterMode colorFilterMode = renderEngine_->GetColorFilterMode(); @@ -1751,8 +1767,9 @@ void RSMainThread::CheckIfHardwareForcedDisabled() // [PLANNING] GetChildrenCount > 1 indicates multi display, only Mirror Mode need be marked here // Mirror Mode reuses display node's buffer, so mark it and disable hardware composer in this case isHardwareForcedDisabled_ = isHardwareForcedDisabled_ || doWindowAnimate_ || - (isMultiDisplay && (isExpandScreenOrWiredProjectionCase || !enableHwcForMirrorMode) && !hasProtectedLayer_) || - hasColorFilter; + hasColorFilter || CheckOverlayDisplayEnable() || + (isMultiDisplay && !hasProtectedLayer_ && (isExpandScreenOrWiredProjectionCase || !enableHwcForMirrorMode)); + RS_OPTIONAL_TRACE_NAME_FMT("hwc debug global: CheckIfHardwareForcedDisabled isHardwareForcedDisabled_:%d " "doWindowAnimate_:%d isMultiDisplay:%d hasColorFilter:%d", isHardwareForcedDisabled_, doWindowAnimate_.load(), isMultiDisplay, hasColorFilter); diff --git a/rosen/modules/render_service/core/pipeline/rs_render_service_connection.cpp b/rosen/modules/render_service/core/pipeline/rs_render_service_connection.cpp index ab389b5932..80b7fb3f86 100644 --- a/rosen/modules/render_service/core/pipeline/rs_render_service_connection.cpp +++ b/rosen/modules/render_service/core/pipeline/rs_render_service_connection.cpp @@ -37,6 +37,9 @@ #include "feature/capture/rs_surface_capture_task.h" #include "feature/capture/rs_ui_capture_task_parallel.h" #include "feature/capture/rs_surface_capture_task_parallel.h" +#ifdef RS_ENABLE_OVERLAY_DISPLAY +#include "feature/overlay_display/rs_overlay_display_manager.h" +#endif #include "include/gpu/GrDirectContext.h" #include "info_collection/rs_hdr_collection.h" #ifdef RS_ENABLE_GPU @@ -2673,5 +2676,13 @@ void RSRenderServiceConnection::SetWindowContainer(NodeId nodeId, bool value) }; mainThread_->PostTask(task); } + +#ifdef RS_ENABLE_OVERLAY_DISPLAY +int32_t RSRenderServiceConnection::SetOverlayDisplayMode(int32_t mode) +{ + RS_LOGI("RSRenderServiceConnection::SetOverlayDisplayMode: mode: [%{public}d]", mode); + return RSOverlayDisplayManager::Instance().SetOverlayDisplayMode(mode); +} +#endif } // namespace Rosen } // namespace OHOS diff --git a/rosen/modules/render_service/core/pipeline/rs_render_service_connection.h b/rosen/modules/render_service/core/pipeline/rs_render_service_connection.h index f055db65dd..beddb4208f 100644 --- a/rosen/modules/render_service/core/pipeline/rs_render_service_connection.h +++ b/rosen/modules/render_service/core/pipeline/rs_render_service_connection.h @@ -357,6 +357,10 @@ private: void SetWindowContainer(NodeId nodeId, bool value) override; +#ifdef RS_ENABLE_OVERLAY_DISPLAY + int32_t SetOverlayDisplayMode(int32_t mode) override; +#endif + pid_t remotePid_; wptr renderService_; RSMainThread* mainThread_ = nullptr; diff --git a/rosen/modules/render_service/core/pipeline/rs_uni_render_visitor.cpp b/rosen/modules/render_service/core/pipeline/rs_uni_render_visitor.cpp index 3cd5db2c00..e59f6772c5 100644 --- a/rosen/modules/render_service/core/pipeline/rs_uni_render_visitor.cpp +++ b/rosen/modules/render_service/core/pipeline/rs_uni_render_visitor.cpp @@ -28,6 +28,9 @@ #include "common/rs_optional_trace.h" #include "common/rs_singleton.h" #include "common/rs_special_layer_manager.h" +#ifdef RS_ENABLE_OVERLAY_DISPLAY +#include "feature/overlay_display/rs_overlay_display_manager.h" +#endif #include "luminance/rs_luminance_control.h" #include "memory/rs_tag_tracker.h" #include "params/rs_display_render_params.h" @@ -603,6 +606,10 @@ void RSUniRenderVisitor::ResetDisplayDirtyRegion() IsFirstFrameOfOverdrawSwitch() || IsFirstFrameOfDrawingCacheDfxSwitch() || IsAccessibilityConfigChanged(); + +#ifdef RS_ENABLE_OVERLAY_DISPLAY + ret = ret || RSOverlayDisplayManager::Instance().CheckStatusChanged(); +#endif if (ret) { curDisplayDirtyManager_->ResetDirtyAsSurfaceSize(); RS_LOGD("RSUniRenderVisitor::ResetDisplayDirtyRegion on"); diff --git a/rosen/modules/render_service/core/transaction/rs_irender_service_connection_ipc_interface_code_access_verifier.cpp b/rosen/modules/render_service/core/transaction/rs_irender_service_connection_ipc_interface_code_access_verifier.cpp index 1b8adf8b1e..9b04d60c66 100644 --- a/rosen/modules/render_service/core/transaction/rs_irender_service_connection_ipc_interface_code_access_verifier.cpp +++ b/rosen/modules/render_service/core/transaction/rs_irender_service_connection_ipc_interface_code_access_verifier.cpp @@ -473,6 +473,12 @@ bool RSIRenderServiceConnectionInterfaceCodeAccessVerifier::IsExclusiveVerificat hasPermission = IsSystemCalling(codeEnumTypeName_ + "::GET_PIXELMAP_BY_PROCESSID"); break; } +#ifdef RS_ENABLE_OVERLAY_DISPLAY + case static_cast(CodeEnumType::SET_OVERLAY_DISPLAY_MODE): { + hasPermission = IsSystemCalling(codeEnumTypeName_ + "::SET_OVERLAY_DISPLAY_MODE"); + break; + } +#endif default: { break; } diff --git a/rosen/modules/render_service/core/transaction/rs_render_service_connection_stub.cpp b/rosen/modules/render_service/core/transaction/rs_render_service_connection_stub.cpp index 3dbd8ed022..7139976bbb 100644 --- a/rosen/modules/render_service/core/transaction/rs_render_service_connection_stub.cpp +++ b/rosen/modules/render_service/core/transaction/rs_render_service_connection_stub.cpp @@ -181,6 +181,9 @@ static constexpr std::array descriptorCheckList = { static_cast(RSIRenderServiceConnectionInterfaceCode::UNREGISTER_SURFACE_BUFFER_CALLBACK), static_cast(RSIRenderServiceConnectionInterfaceCode::SET_LAYER_TOP), static_cast(RSIRenderServiceConnectionInterfaceCode::SET_WINDOW_CONTAINER), +#ifdef RS_ENABLE_OVERLAY_DISPLAY + static_cast(RSIRenderServiceConnectionInterfaceCode::SET_OVERLAY_DISPLAY_MODE), +#endif }; void CopyFileDescriptor(MessageParcel& old, MessageParcel& copied) @@ -2690,6 +2693,19 @@ int RSRenderServiceConnectionStub::OnRemoteRequest( SetWindowContainer(nodeId, isEnabled); break; } +#ifdef RS_ENABLE_OVERLAY_DISPLAY + case static_cast(RSIRenderServiceConnectionInterfaceCode::SET_OVERLAY_DISPLAY_MODE) : { + RS_LOGI("RSRenderServicrConnectionStub::OnRemoteRequest SET_OVERLAY_DISPLAY_MODE"); + int32_t mode{0}; + if (!data.ReadInt32(mode)) { + ret = ERR_INVALID_DATA; + break; + } + int32_t result = SetOverlayDisplayMode(mode); + reply.WriteInt32(result); + break; + } +#endif default: { return IPCObjectStub::OnRemoteRequest(code, data, reply, option); } diff --git a/rosen/modules/render_service_base/include/platform/ohos/rs_irender_service_connection.h b/rosen/modules/render_service_base/include/platform/ohos/rs_irender_service_connection.h index 7bea50af39..04c5e3a40f 100644 --- a/rosen/modules/render_service_base/include/platform/ohos/rs_irender_service_connection.h +++ b/rosen/modules/render_service_base/include/platform/ohos/rs_irender_service_connection.h @@ -351,6 +351,10 @@ public: virtual void SetFreeMultiWindowStatus(bool enable) = 0; +#ifdef RS_ENABLE_OVERLAY_DISPLAY + virtual int32_t SetOverlayDisplayMode(int32_t mode) = 0; +#endif + virtual void SetLayerTop(const std::string &nodeIdStr, bool isTop) = 0; #ifdef TP_FEATURE_ENABLE virtual void SetTpFeatureConfig(int32_t feature, const char* config, TpFeatureConfigType tpFeatureConfigType) = 0; diff --git a/rosen/modules/render_service_base/include/platform/ohos/rs_irender_service_connection_ipc_interface_code.h b/rosen/modules/render_service_base/include/platform/ohos/rs_irender_service_connection_ipc_interface_code.h index d765e74f11..257f156033 100644 --- a/rosen/modules/render_service_base/include/platform/ohos/rs_irender_service_connection_ipc_interface_code.h +++ b/rosen/modules/render_service_base/include/platform/ohos/rs_irender_service_connection_ipc_interface_code.h @@ -156,6 +156,9 @@ enum class RSIRenderServiceConnectionInterfaceCode : CodeUnderlyingType { REPAINT_EVERYTHING, FORCE_REFRESH_ONE_FRAME_WITH_NEXT_VSYNC, SET_WINDOW_CONTAINER, +#ifdef RS_ENABLE_OVERLAY_DISPLAY + SET_OVERLAY_DISPLAY_MODE, +#endif // Special invocation. Do not change it. NOTIFY_LIGHT_FACTOR_STATUS = 1000, NOTIFY_PACKAGE_EVENT = 1001, diff --git a/rosen/modules/render_service_base/include/transaction/rs_render_service_client.h b/rosen/modules/render_service_base/include/transaction/rs_render_service_client.h index b40fb1f6c8..0056557c3a 100644 --- a/rosen/modules/render_service_base/include/transaction/rs_render_service_client.h +++ b/rosen/modules/render_service_base/include/transaction/rs_render_service_client.h @@ -399,6 +399,11 @@ public: bool SetAncoForceDoDirect(bool direct); void SetLayerTop(const std::string &nodeIdStr, bool isTop); + +#ifdef RS_ENABLE_OVERLAY_DISPLAY + int32_t SetOverlayDisplayMode(int32_t mode); +#endif + #ifdef TP_FEATURE_ENABLE void SetTpFeatureConfig(int32_t feature, const char* config, TpFeatureConfigType tpFeatureConfigType = TpFeatureConfigType::DEFAULT_TP_FEATURE); diff --git a/rosen/modules/render_service_base/src/platform/ohos/rs_render_service_client.cpp b/rosen/modules/render_service_base/src/platform/ohos/rs_render_service_client.cpp index 81f69d20fc..6e4e43b6a5 100644 --- a/rosen/modules/render_service_base/src/platform/ohos/rs_render_service_client.cpp +++ b/rosen/modules/render_service_base/src/platform/ohos/rs_render_service_client.cpp @@ -1892,5 +1892,16 @@ void RSRenderServiceClient::SetWindowContainer(NodeId nodeId, bool value) renderService->SetWindowContainer(nodeId, value); } } + +#ifdef RS_ENABLE_OVERLAY_DISPLAY +int32_t RSRenderServiceClient::SetOverlayDisplayMode(int32_t mode) +{ + auto renderService = RSRenderServiceConnectHub::GetRenderService(); + if (renderService == nullptr) { + return RENDER_SERVICE_NULL; + } + return renderService->SetOverlayDisplayMode(mode); +} +#endif } // namespace Rosen } // namespace OHOS diff --git a/rosen/modules/render_service_base/src/platform/ohos/rs_render_service_connection_proxy.cpp b/rosen/modules/render_service_base/src/platform/ohos/rs_render_service_connection_proxy.cpp index d7ec026151..5171af173e 100644 --- a/rosen/modules/render_service_base/src/platform/ohos/rs_render_service_connection_proxy.cpp +++ b/rosen/modules/render_service_base/src/platform/ohos/rs_render_service_connection_proxy.cpp @@ -3904,5 +3904,32 @@ void RSRenderServiceConnectionProxy::NotifyScreenSwitched() return; } } + +#ifdef RS_ENABLE_OVERLAY_DISPLAY +int32_t RSRenderServiceConnectionProxy::SetOverlayDisplayMode(int32_t mode) +{ + MessageParcel data; + MessageParcel reply; + MessageOption option; + if (!data.WriteInterfaceToken(RSIRenderServiceConnection::GetDescriptor())) { + ROSEN_LOGE("%{public}s: Write InterfaceToken val err.", __func__); + return RS_CONNECTION_ERROR; + } + option.SetFlags(MessageOption::TF_SYNC); + if (!data.WriteInt32(mode)) { + ROSEN_LOGE("%{public}s: Write Int32 val err.", __func__); + return RS_CONNECTION_ERROR; + } + uint32_t code = static_cast(RSIRenderServiceConnectionInterfaceCode::SET_OVERLAY_DISPLAY_MODE); + int32_t err = Remote()->SendRequest(code, data, reply, option); + if (err != NO_ERROR) { + ROSEN_LOGE("%{public}s: SendRequest failed. err:%{public}d.", __func__, err); + return RS_CONNECTION_ERROR; + } + int32_t result = reply.ReadInt32(); + ROSEN_LOGI("%{public}s: mode:%{public}d, result:%{public}d.", __func__, mode, result); + return result; +} +#endif } // namespace Rosen } // namespace OHOS diff --git a/rosen/modules/render_service_base/src/platform/ohos/rs_render_service_connection_proxy.h b/rosen/modules/render_service_base/src/platform/ohos/rs_render_service_connection_proxy.h index 0b126def47..35eb1bb546 100644 --- a/rosen/modules/render_service_base/src/platform/ohos/rs_render_service_connection_proxy.h +++ b/rosen/modules/render_service_base/src/platform/ohos/rs_render_service_connection_proxy.h @@ -351,6 +351,10 @@ private: void SetLayerTop(const std::string &nodeIdStr, bool isTop) override; +#ifdef RS_ENABLE_OVERLAY_DISPLAY + int32_t SetOverlayDisplayMode(int32_t mode) override; +#endif + static inline BrokerDelegator delegator_; pid_t pid_ = GetRealPid(); diff --git a/rosen/modules/render_service_base/src/platform/windows/rs_render_service_client.cpp b/rosen/modules/render_service_base/src/platform/windows/rs_render_service_client.cpp index 8150edf1d2..d8b95dda3c 100644 --- a/rosen/modules/render_service_base/src/platform/windows/rs_render_service_client.cpp +++ b/rosen/modules/render_service_base/src/platform/windows/rs_render_service_client.cpp @@ -723,5 +723,12 @@ void RSRenderServiceClient::NotifyScreenSwitched() void RSRenderServiceClient::SetWindowContainer(NodeId nodeId, bool value) { } + +#ifdef RS_ENABLE_OVERLAY_DISPLAY +int32_t SetOverlayDisplayMode(int32_t mode) +{ + return {}; +} +#endif } // namespace Rosen } // namespace OHOS diff --git a/rosen/modules/render_service_client/core/transaction/rs_interfaces.cpp b/rosen/modules/render_service_client/core/transaction/rs_interfaces.cpp index 9d00996be0..71ef4a278e 100644 --- a/rosen/modules/render_service_client/core/transaction/rs_interfaces.cpp +++ b/rosen/modules/render_service_client/core/transaction/rs_interfaces.cpp @@ -942,5 +942,13 @@ void RSInterfaces::SetWindowContainer(NodeId nodeId, bool value) { renderServiceClient_->SetWindowContainer(nodeId, value); } + +#ifdef RS_ENABLE_OVERLAY_DISPLAY +int32_t RSInterfaces::SetOverlayDisplayMode(int32_t mode) +{ + ROSEN_LOGI("RSInterfaces::SetOverlayDisplayMode enter."); + return renderServiceClient_->SetOverlayDisplayMode(mode); +} +#endif } // namespace Rosen } // namespace OHOS diff --git a/rosen/modules/render_service_client/core/transaction/rs_interfaces.h b/rosen/modules/render_service_client/core/transaction/rs_interfaces.h index 819ebafe62..5928195d5d 100644 --- a/rosen/modules/render_service_client/core/transaction/rs_interfaces.h +++ b/rosen/modules/render_service_client/core/transaction/rs_interfaces.h @@ -351,6 +351,10 @@ public: void ForceRefreshOneFrameWithNextVSync(); void SetWindowContainer(NodeId nodeId, bool value); + +#ifdef RS_ENABLE_OVERLAY_DISPLAY + int32_t SetOverlayDisplayMode(int32_t mode); +#endif private: RSInterfaces(); ~RSInterfaces() noexcept; diff --git a/rosen/test/render_service/render_service/fuzztest/rsrenderserviceconnection_fuzzer/rsrenderserviceconnection_fuzzer.cpp b/rosen/test/render_service/render_service/fuzztest/rsrenderserviceconnection_fuzzer/rsrenderserviceconnection_fuzzer.cpp index 809595b2da..2160db06b0 100644 --- a/rosen/test/render_service/render_service/fuzztest/rsrenderserviceconnection_fuzzer/rsrenderserviceconnection_fuzzer.cpp +++ b/rosen/test/render_service/render_service/fuzztest/rsrenderserviceconnection_fuzzer/rsrenderserviceconnection_fuzzer.cpp @@ -1262,6 +1262,18 @@ bool DoCreatePixelMapFromSurface() return true; } +#ifdef RS_ENABLE_OVERLAY_DISPLAY +bool DoSetOverlayDisplayMode() +{ + if (rsConn_ == nullptr) { + return false; + } + int32_t mode = GetData(); + rsConn_->SetOverlayDisplayMode(mode); + return true; +} +#endif + void DoFuzzerTest1() { DoRegisterApplicationAgent(); @@ -1367,6 +1379,9 @@ void DoFuzzerTest3() { DoNotifySoftVsyncEvent(); DoCreatePixelMapFromSurface(); +#ifdef RS_ENABLE_OVERLAY_DISPLAY + DoSetOverlayDisplayMode(); +#endif } } // namespace Rosen } // namespace OHOS diff --git a/rosen/test/render_service/render_service_base/fuzztest/rsrenderserviceconnectionproxy_fuzzer/rsrenderserviceconnectionproxy_fuzzer.cpp b/rosen/test/render_service/render_service_base/fuzztest/rsrenderserviceconnectionproxy_fuzzer/rsrenderserviceconnectionproxy_fuzzer.cpp index 4ecbd9251f..de99517d4c 100644 --- a/rosen/test/render_service/render_service_base/fuzztest/rsrenderserviceconnectionproxy_fuzzer/rsrenderserviceconnectionproxy_fuzzer.cpp +++ b/rosen/test/render_service/render_service_base/fuzztest/rsrenderserviceconnectionproxy_fuzzer/rsrenderserviceconnectionproxy_fuzzer.cpp @@ -293,6 +293,30 @@ bool OHOS::Rosen::DoSetTpFeatureConfigFuzzTest(const uint8_t* data, size_t size) return true; } #endif + +#ifdef RS_ENABLE_OVERLAY_DISPLAY +bool DoSetOverlayDisplayModeFuzzTest(const uint8_t* data, size_t size) +{ + if (data == nullptr) { + return false; + } + + // initialize + g_data = data; + g_size = size; + g_pos = 0; + + // get data + int32_t mode = GetData(); + + // test + auto samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); + auto remoteObject = samgr->GetSystemAbility(RENDER_SERVICE); + RSRenderServiceConnectionProxy rsRenderServiceConnectionProxy(remoteObject); + rsRenderServiceConnectionProxy.SetOverlayDisplayMode(mode); + return true; +} +#endif } // namespace Rosen } // namespace OHOS @@ -303,6 +327,9 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) OHOS::Rosen::DoSomethingInterestingWithMyAPI(data, size); #ifdef TP_FEATURE_ENABLE OHOS::Rosen::DoSetTpFeatureConfigFuzzTest(data, size); +#endif +#ifdef RS_ENABLE_OVERLAY_DISPLAY + OHOS::Rosen::DoSetOverlayDisplayModeFuzzTest(data, size); #endif return 0; } diff --git a/rosen/test/render_service/render_service_client/fuzztest/rsinterfaces_fuzzer/rsinterfaces_fuzzer.cpp b/rosen/test/render_service/render_service_client/fuzztest/rsinterfaces_fuzzer/rsinterfaces_fuzzer.cpp index f6dff502fd..0b56f01f9c 100644 --- a/rosen/test/render_service/render_service_client/fuzztest/rsinterfaces_fuzzer/rsinterfaces_fuzzer.cpp +++ b/rosen/test/render_service/render_service_client/fuzztest/rsinterfaces_fuzzer/rsinterfaces_fuzzer.cpp @@ -290,6 +290,28 @@ bool DoDropFrameByPid(const uint8_t* data, size_t size) rsInterfaces.DropFrameByPid(pidList); return true; } + +#ifdef RS_ENABLE_OVERLAY_DISPLAY +bool DoSetOverlayDisplayModeFuzzTest(const uint8_t* data, size_t size) +{ + if (data == nullptr) { + return false; + } + + // initialize + g_data = data; + g_size = size; + g_pos = 0; + + // get data + int32_t mode = GetData(); + + // test + auto& rsInterfaces = RSInterfaces::GetInstance(); + rsInterfaces.SetOverlayDisplayMode(mode); + return true; +} +#endif } // namespace Rosen } // namespace OHOS @@ -303,5 +325,8 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) #endif OHOS::Rosen::DoSetFreeMultiWindowStatus(data, size); OHOS::Rosen::DoDropFrameByPid(data, size); +#ifdef RS_ENABLE_OVERLAY_DISPLAY + OHOS::Rosen::DoSetOverlayDisplayModeFuzzTest(data, size); +#endif return 0; } diff --git a/rosen/test/render_service/render_service_client/unittest/transaction/rs_interfaces_test.cpp b/rosen/test/render_service/render_service_client/unittest/transaction/rs_interfaces_test.cpp index b9e6fe6996..aca9c31d9c 100755 --- a/rosen/test/render_service/render_service_client/unittest/transaction/rs_interfaces_test.cpp +++ b/rosen/test/render_service/render_service_client/unittest/transaction/rs_interfaces_test.cpp @@ -554,4 +554,28 @@ HWTEST_F(RSInterfacesTest, GetPixelMapByProcessIdTest, TestSize.Level1) int32_t res = instance.GetPixelMapByProcessId(pixelMapVector, pid); EXPECT_EQ(res, SUCCESS); } + +#ifdef RS_ENABLE_OVERLAY_DISPLAY +/** + * @tc.name: SetOverlayDisplayMode001 + * @tc.desc: test results of SetOverlayDisplayMode + * @tc.type: FUNC + * @tc.require: issueIBHTL0 + */ +HWTEST_F(RSInterfacesTest, SetOverlayDisplayMode001, TestSize.Level1) +{ + RSInterfaces& instance = RSInterfaces::GetInstance(); + instance.renderServiceClient_ = std::make_unique(); + + // open overlay + int32_t mode = 1; + int32_t res = instance.SetOverlayDisplayMode(mode); + EXPECT_EQ(res, SUCCESS); + + // close overlay + mode = 0; + res = instance.SetOverlayDisplayMode(mode); + EXPECT_EQ(res, SUCCESS); +} +#endif } // namespace OHOS::Rosen -- Gitee