1 /*
2 * Copyright (c) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "rs_driven_render_ext.h"
17 #include <dlfcn.h>
18
19 namespace OHOS {
20 namespace Rosen {
21 // If need to modify libdriven_render together, update the version to keep both sides in sync.
22 static const std::string DRIVEN_RENDER_VERSION = "1.0.0";
23
Instance()24 RSDrivenRenderExt& RSDrivenRenderExt::Instance()
25 {
26 static RSDrivenRenderExt instance;
27 return instance;
28 }
29
~RSDrivenRenderExt()30 RSDrivenRenderExt::~RSDrivenRenderExt()
31 {
32 CloseDrivenRenderExt();
33 }
34
OpenDrivenRenderExt()35 bool RSDrivenRenderExt::OpenDrivenRenderExt()
36 {
37 drivenRenderExtHandle_ = dlopen("libdriven_render.z.so", RTLD_NOW);
38 if (!drivenRenderExtHandle_) {
39 RS_LOGW("RSDrivenRenderExt: dlopen libdriven_render.z.so failed!");
40 return false;
41 }
42 if (!DrivenRenderVersionMatched()) {
43 CloseDrivenRenderExt();
44 RS_LOGW("RSDrivenRenderExt: version not matched!");
45 return false;
46 }
47 drivenRenderExtLoaded_ = LoadDrivenRenderFunc();
48 if (!drivenRenderExtLoaded_) {
49 CloseDrivenRenderExt();
50 RS_LOGW("RSDrivenRenderExt: load driven render func failed!");
51 }
52 return drivenRenderExtLoaded_;
53 }
54
DrivenRenderVersionMatched()55 bool RSDrivenRenderExt::DrivenRenderVersionMatched()
56 {
57 void* versionMatchedFunc = dlsym(drivenRenderExtHandle_, "DrivenRenderVersionMatched");
58 if (!versionMatchedFunc) {
59 RS_LOGW("RSDrivenRenderExt: load version func failed!");
60 return false;
61 }
62 // If need to modify the definition of this interface,
63 // init RSDrivenRenderManager as disabled until libdriven_render updated.
64 auto versionMatched = reinterpret_cast<bool (*)(const std::string&)>(versionMatchedFunc);
65 return versionMatched(DRIVEN_RENDER_VERSION);
66 }
67
LoadDrivenRenderFunc()68 bool RSDrivenRenderExt::LoadDrivenRenderFunc()
69 {
70 disabledRenderModeFunc_ = dlsym(drivenRenderExtHandle_, "DisabledRenderMode");
71 setCurrFrameBoundsFunc_ = dlsym(drivenRenderExtHandle_, "SetCurrFrameBounds");
72 updateActivateFrameStateFunc_ = dlsym(drivenRenderExtHandle_, "UpdateActivateFrameState");
73 isValidSurfaceNameFunc_ = dlsym(drivenRenderExtHandle_, "IsValidSurfaceName");
74
75 bool success =
76 disabledRenderModeFunc_ && setCurrFrameBoundsFunc_ && updateActivateFrameStateFunc_ && isValidSurfaceNameFunc_;
77 if (!success) {
78 RS_LOGW("RSDrivenRenderExt: load driven render func failed!");
79 }
80 return success;
81 }
82
CloseDrivenRenderExt()83 void RSDrivenRenderExt::CloseDrivenRenderExt()
84 {
85 if (drivenRenderExtHandle_) {
86 dlclose(drivenRenderExtHandle_);
87 }
88 drivenRenderExtLoaded_ = false;
89 drivenRenderExtHandle_ = nullptr;
90
91 disabledRenderModeFunc_ = nullptr;
92 setCurrFrameBoundsFunc_ = nullptr;
93 updateActivateFrameStateFunc_ = nullptr;
94 isValidSurfaceNameFunc_ = nullptr;
95 }
96
DisabledRenderMode(DrivenExtInfo & mutableInfo) const97 void RSDrivenRenderExt::DisabledRenderMode(DrivenExtInfo& mutableInfo) const
98 {
99 if (!drivenRenderExtLoaded_) {
100 return;
101 }
102 auto disabledRenderMode = reinterpret_cast<void (*)(DrivenExtInfo&)>(disabledRenderModeFunc_);
103 disabledRenderMode(mutableInfo);
104 }
105
SetCurrFrameBounds(DrivenExtInfo & mutableInfo,const RectF & bounds,const RectF & viewPort,const RectI & contentAbsRect) const106 void RSDrivenRenderExt::SetCurrFrameBounds(
107 DrivenExtInfo& mutableInfo, const RectF& bounds, const RectF& viewPort, const RectI& contentAbsRect) const
108 {
109 if (!drivenRenderExtLoaded_) {
110 return;
111 }
112 auto setCurrFrameBounds =
113 reinterpret_cast<void (*)(DrivenExtInfo&, const RectF&, const RectF&, const RectI&)>(setCurrFrameBoundsFunc_);
114 setCurrFrameBounds(mutableInfo, bounds, viewPort, contentAbsRect);
115 }
116
UpdateActivateFrameState(DrivenExtInfo & mutableInfo,const RectI & dstRect,bool backgroundDirty,bool contentDirty,bool nonContentDirty) const117 void RSDrivenRenderExt::UpdateActivateFrameState(DrivenExtInfo& mutableInfo, const RectI& dstRect,
118 bool backgroundDirty, bool contentDirty, bool nonContentDirty) const
119 {
120 if (!drivenRenderExtLoaded_) {
121 return;
122 }
123 auto updateActivateFrameState =
124 reinterpret_cast<void (*)(DrivenExtInfo&, const RectI&, bool, bool, bool)>(updateActivateFrameStateFunc_);
125 updateActivateFrameState(mutableInfo, dstRect, backgroundDirty, contentDirty, nonContentDirty);
126 }
127
IsValidSurfaceName(const std::string & surfaceName) const128 bool RSDrivenRenderExt::IsValidSurfaceName(const std::string& surfaceName) const
129 {
130 if (!drivenRenderExtLoaded_) {
131 return false;
132 }
133 auto isValidSurfaceName = reinterpret_cast<bool (*)(const std::string&)>(isValidSurfaceNameFunc_);
134 return isValidSurfaceName(surfaceName);
135 }
136 } // namespace Rosen
137 } // namespace OHOS
138