1 /*
2 * Copyright (c) 2024 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 "frame_sched.h"
17
18 #include <dlfcn.h>
19 #include <cstdio>
20 #include <securec.h>
21 #include <unistd.h>
22 #include <hilog/log.h>
23
24 namespace OHOS {
25 namespace Rosen {
26
27 static constexpr OHOS::HiviewDFX::HiLogLabel LOG_LABEL = { LOG_CORE, 0xD001404, "FrameSched" };
28 #define LOGF(...) (void)OHOS::HiviewDFX::HiLog::Fatal(LOG_LABEL, __VA_ARGS__)
29 #define LOGE(...) (void)OHOS::HiviewDFX::HiLog::Error(LOG_LABEL, __VA_ARGS__)
30 #define LOGW(...) (void)OHOS::HiviewDFX::HiLog::Warn(LOG_LABEL, __VA_ARGS__)
31 #define LOGI(...) (void)OHOS::HiviewDFX::HiLog::Info(LOG_LABEL, __VA_ARGS__)
32 #define LOGD(...) (void)OHOS::HiviewDFX::HiLog::Debug(LOG_LABEL, __VA_ARGS__)
33
34 const std::string FRAME_AWARE_SO_PATH = "libframe_ui_intf.z.so";
35
GetInstance()36 FrameSched& FrameSched::GetInstance()
37 {
38 static FrameSched instance;
39 return instance;
40 }
41
FrameSched()42 FrameSched::FrameSched()
43 {
44 LoadLibrary();
45 }
46
~FrameSched()47 FrameSched::~FrameSched()
48 {
49 CloseLibrary();
50 }
51
LoadLibrary()52 bool FrameSched::LoadLibrary()
53 {
54 if (!schedSoLoaded_) {
55 schedHandle_ = dlopen(FRAME_AWARE_SO_PATH.c_str(), RTLD_LAZY);
56 if (schedHandle_ == nullptr) {
57 LOGE("dlopen libframe_ui_intf.so failed! error = %{public}s", dlerror());
58 return false;
59 }
60 schedSoLoaded_ = true;
61 }
62 LOGI("load library success!");
63 sendFenceIdFunc_ = (SendFenceIdFunc)LoadSymbol("SendFenceId");
64 monitorGpuStartFunc_ = (MonitorGpuStartFunc)LoadSymbol("MonitorGpuStart");
65 monitorGpuEndFunc_ = (MonitorGpuEndFunc)LoadSymbol("MonitorGpuEnd");
66 isScbSceneFunc_ = (IsScbSceneFunc)LoadSymbol("IsScbScene");
67 return true;
68 }
69
CloseLibrary()70 void FrameSched::CloseLibrary()
71 {
72 if (schedHandle_ != nullptr) {
73 if (dlclose(schedHandle_) != 0) {
74 LOGE("libframe_ui_intf.so close failed!\n");
75 return;
76 }
77 }
78 schedHandle_ = nullptr;
79 schedSoLoaded_ = false;
80 sendFenceIdFunc_ = nullptr;
81 monitorGpuStartFunc_ = nullptr;
82 monitorGpuEndFunc_ = nullptr;
83 isScbSceneFunc_ = nullptr;
84 LOGI("libframe_ui_intf.so close success!\n");
85 }
86
LoadSymbol(const char * symName)87 void* FrameSched::LoadSymbol(const char* symName)
88 {
89 if (!schedSoLoaded_) {
90 LOGE("libframe_ui_intf.so not loaded.\n");
91 return nullptr;
92 }
93
94 void *funcSym = dlsym(schedHandle_, symName);
95 if (funcSym == nullptr) {
96 LOGE("Get %{public}s symbol failed: %{public}s\n", symName, dlerror());
97 return nullptr;
98 }
99 return funcSym;
100 }
101
Init()102 void FrameSched::Init()
103 {
104 if (initFunc_ == nullptr) {
105 initFunc_ = (InitFunc)LoadSymbol("Init");
106 }
107 if (initFunc_ != nullptr) {
108 initFunc_();
109 } else {
110 LOGE("FrameSched:[Init]load Init function failed.");
111 }
112 }
113
SendFenceId(uint32_t fenceId)114 void FrameSched::SendFenceId(uint32_t fenceId)
115 {
116 if (schedSoLoaded_ && sendFenceIdFunc_ != nullptr) {
117 sendFenceIdFunc_(fenceId);
118 } else {
119 LOGE("FrameSched:[SendFenceId]load SendFenceId function failed.");
120 }
121 }
122
MonitorGpuStart(uint32_t fenceId)123 void FrameSched::MonitorGpuStart(uint32_t fenceId)
124 {
125 if (schedSoLoaded_ && monitorGpuStartFunc_ != nullptr) {
126 monitorGpuStartFunc_(fenceId);
127 } else {
128 LOGE("FrameSched:[MonitorStart]load MonitorStart function failed.");
129 }
130 }
131
MonitorGpuEnd()132 void FrameSched::MonitorGpuEnd()
133 {
134 if (schedSoLoaded_ && monitorGpuEndFunc_ != nullptr) {
135 monitorGpuEndFunc_();
136 } else {
137 LOGE("FrameSched:[MonitorEnd]load MonitorEnd function failed.");
138 }
139 }
140
IsScbScene()141 bool FrameSched::IsScbScene()
142 {
143 if (schedSoLoaded_ && isScbSceneFunc_ != nullptr) {
144 return isScbSceneFunc_();
145 } else {
146 LOGE("FrameSched:[IsScbScene]load IsScbScene function failed.");
147 return false;
148 }
149 }
150
SetFrameParam(int requestId,int load,int schedFrameNum,int value)151 void FrameSched::SetFrameParam(int requestId, int load, int schedFrameNum, int value)
152 {
153 if (setFrameParamFunc_ == nullptr) {
154 setFrameParamFunc_ = (SetFrameParamFunc)LoadSymbol("SetFrameParam");
155 }
156 if (setFrameParamFunc_ != nullptr) {
157 setFrameParamFunc_(requestId, load, schedFrameNum, value);
158 } else {
159 LOGE("FrameSched:[SetFrameParam]load MonitorEnd function failed.");
160 }
161 }
162 } // namespace Rosen
163 } // namespace OHOS