• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-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_render_service_connection.h"
17 
18 #include "hgm_core.h"
19 #include "hgm_command.h"
20 #include "offscreen_render/rs_offscreen_render_thread.h"
21 #include "pipeline/rs_canvas_drawing_render_node.h"
22 #include "pipeline/rs_render_node_map.h"
23 #include "pipeline/rs_render_service_listener.h"
24 #include "pipeline/rs_surface_capture_task.h"
25 #include "pipeline/rs_surface_render_node.h"
26 #include "pipeline/rs_uni_render_judgement.h"
27 #include "pipeline/rs_uni_ui_capture.h"
28 #include "platform/common/rs_log.h"
29 #include "platform/common/rs_system_properties.h"
30 #include "platform/ohos/rs_jank_stats.h"
31 #include "rs_main_thread.h"
32 #include "rs_trace.h"
33 
34 namespace OHOS {
35 namespace Rosen {
36 // we guarantee that when constructing this object,
37 // all these pointers are valid, so will not check them.
RSRenderServiceConnection(pid_t remotePid,wptr<RSRenderService> renderService,RSMainThread * mainThread,sptr<RSScreenManager> screenManager,sptr<IRemoteObject> token,sptr<VSyncDistributor> distributor)38 RSRenderServiceConnection::RSRenderServiceConnection(
39     pid_t remotePid,
40     wptr<RSRenderService> renderService,
41     RSMainThread* mainThread,
42     sptr<RSScreenManager> screenManager,
43     sptr<IRemoteObject> token,
44     sptr<VSyncDistributor> distributor)
45     : remotePid_(remotePid),
46       renderService_(renderService),
47       mainThread_(mainThread),
48       screenManager_(screenManager),
49       token_(token),
50       connDeathRecipient_(new RSConnectionDeathRecipient(this)),
51       ApplicationDeathRecipient_(new RSApplicationRenderThreadDeathRecipient(this)),
52       appVSyncDistributor_(distributor)
53 {
54     if (!token_->AddDeathRecipient(connDeathRecipient_)) {
55         RS_LOGW("RSRenderServiceConnection: Failed to set death recipient.");
56     }
57 }
58 
~RSRenderServiceConnection()59 RSRenderServiceConnection::~RSRenderServiceConnection() noexcept
60 {
61     if (token_ && connDeathRecipient_) {
62         token_->RemoveDeathRecipient(connDeathRecipient_);
63     }
64     CleanAll();
65 }
66 
CleanVirtualScreens()67 void RSRenderServiceConnection::CleanVirtualScreens() noexcept
68 {
69     std::lock_guard<std::mutex> lock(mutex_);
70 
71     for (const auto id : virtualScreenIds_) {
72         screenManager_->RemoveVirtualScreen(id);
73     }
74     virtualScreenIds_.clear();
75 
76     if (screenChangeCallback_ != nullptr) {
77         screenManager_->RemoveScreenChangeCallback(screenChangeCallback_);
78         screenChangeCallback_ = nullptr;
79     }
80 }
81 
CleanRenderNodes()82 void RSRenderServiceConnection::CleanRenderNodes() noexcept
83 {
84     auto& context = mainThread_->GetContext();
85     auto& nodeMap = context.GetMutableNodeMap();
86 
87     nodeMap.FilterNodeByPid(remotePid_);
88 }
89 
CleanAll(bool toDelete)90 void RSRenderServiceConnection::CleanAll(bool toDelete) noexcept
91 {
92     {
93         std::lock_guard<std::mutex> lock(mutex_);
94         if (cleanDone_) {
95             return;
96         }
97     }
98     RS_LOGD("RSRenderServiceConnection::CleanAll() start.");
99     mainThread_->ScheduleTask(
100         [this]() {
101             CleanVirtualScreens();
102             CleanRenderNodes();
103             mainThread_->ClearTransactionDataPidInfo(remotePid_);
104             mainThread_->UnRegisterOcclusionChangeCallback(remotePid_);
105         }).wait();
106 
107     for (auto& conn : vsyncConnections_) {
108         appVSyncDistributor_->RemoveConnection(conn);
109     }
110 
111     {
112         std::lock_guard<std::mutex> lock(mutex_);
113         vsyncConnections_.clear();
114         cleanDone_ = true;
115     }
116 
117     if (toDelete) {
118         auto renderService = renderService_.promote();
119         if (renderService == nullptr) {
120             RS_LOGW("RSRenderServiceConnection::CleanAll() RenderService is dead.");
121         } else {
122             renderService->RemoveConnection(GetToken());
123         }
124     }
125 
126     RS_LOGD("RSRenderServiceConnection::CleanAll() end.");
127 }
128 
RSConnectionDeathRecipient(wptr<RSRenderServiceConnection> conn)129 RSRenderServiceConnection::RSConnectionDeathRecipient::RSConnectionDeathRecipient(
130     wptr<RSRenderServiceConnection> conn) : conn_(conn)
131 {
132 }
133 
OnRemoteDied(const wptr<IRemoteObject> & token)134 void RSRenderServiceConnection::RSConnectionDeathRecipient::OnRemoteDied(const wptr<IRemoteObject>& token)
135 {
136     auto tokenSptr = token.promote();
137     if (tokenSptr == nullptr) {
138         RS_LOGW("RSConnectionDeathRecipient::OnRemoteDied: can't promote remote object.");
139         return;
140     }
141 
142     auto rsConn = conn_.promote();
143     if (rsConn == nullptr) {
144         RS_LOGW("RSConnectionDeathRecipient::OnRemoteDied: RSRenderServiceConnection was dead, do nothing.");
145         return;
146     }
147 
148     if (rsConn->GetToken() != tokenSptr) {
149         RS_LOGI("RSConnectionDeathRecipient::OnRemoteDied: token doesn't match, ignore it.");
150         return;
151     }
152 
153     rsConn->CleanAll(true);
154 }
155 
RSApplicationRenderThreadDeathRecipient(wptr<RSRenderServiceConnection> conn)156 RSRenderServiceConnection::RSApplicationRenderThreadDeathRecipient::RSApplicationRenderThreadDeathRecipient(
157     wptr<RSRenderServiceConnection> conn) : conn_(conn)
158 {}
159 
OnRemoteDied(const wptr<IRemoteObject> & token)160 void RSRenderServiceConnection::RSApplicationRenderThreadDeathRecipient::OnRemoteDied(const wptr<IRemoteObject>& token)
161 {
162     auto tokenSptr = token.promote();
163     if (tokenSptr == nullptr) {
164         RS_LOGW("RSApplicationRenderThreadDeathRecipient::OnRemoteDied: can't promote remote object.");
165         return;
166     }
167 
168     auto rsConn = conn_.promote();
169     if (rsConn == nullptr) {
170         RS_LOGW("RSApplicationRenderThreadDeathRecipient::OnRemoteDied: RSRenderServiceConnection was dead, do nothing.");
171         return;
172     }
173 
174     RS_LOGI("RSApplicationRenderThreadDeathRecipient::OnRemoteDied: Unregister.");
175     auto app = iface_cast<IApplicationAgent>(tokenSptr);
176     rsConn->UnRegisterApplicationAgent(app);
177 }
178 
CommitTransaction(std::unique_ptr<RSTransactionData> & transactionData)179 void RSRenderServiceConnection::CommitTransaction(std::unique_ptr<RSTransactionData>& transactionData)
180 {
181     mainThread_->RecvRSTransactionData(transactionData);
182 }
183 
ExecuteSynchronousTask(const std::shared_ptr<RSSyncTask> & task)184 void RSRenderServiceConnection::ExecuteSynchronousTask(const std::shared_ptr<RSSyncTask>& task)
185 {
186     std::mutex mutex;
187     std::unique_lock<std::mutex> lock(mutex);
188     auto cv = std::make_shared<std::condition_variable>();
189     auto& mainThread = mainThread_;
190     mainThread->PostTask([task, cv, &mainThread]() {
191         if (task == nullptr || cv == nullptr) {
192             return;
193         }
194         task->Process(mainThread->GetContext());
195         cv->notify_all();
196     });
197     cv->wait_for(lock, std::chrono::nanoseconds(task->GetTimeout()));
198 }
199 
GetUniRenderEnabled()200 bool RSRenderServiceConnection::GetUniRenderEnabled()
201 {
202     return RSUniRenderJudgement::IsUniRender();
203 }
204 
CreateNode(const RSSurfaceRenderNodeConfig & config)205 bool RSRenderServiceConnection::CreateNode(const RSSurfaceRenderNodeConfig& config)
206 {
207     std::shared_ptr<RSSurfaceRenderNode> node =
208         std::make_shared<RSSurfaceRenderNode>(config, mainThread_->GetContext().weak_from_this());
209     if (node == nullptr) {
210         RS_LOGE("RSRenderService::CreateNode fail");
211         return false;
212     }
213     std::function<void()> registerNode = [node, this]() -> void {
214         this->mainThread_->GetContext().GetMutableNodeMap().RegisterRenderNode(node);
215     };
216     mainThread_->PostTask(registerNode);
217     return true;
218 }
219 
CreateNodeAndSurface(const RSSurfaceRenderNodeConfig & config)220 sptr<Surface> RSRenderServiceConnection::CreateNodeAndSurface(const RSSurfaceRenderNodeConfig& config)
221 {
222     std::shared_ptr<RSSurfaceRenderNode> node =
223         std::make_shared<RSSurfaceRenderNode>(config, mainThread_->GetContext().weak_from_this());
224     if (node == nullptr) {
225         RS_LOGE("RSRenderService::CreateNodeAndSurface CreateNode fail");
226         return nullptr;
227     }
228     sptr<IConsumerSurface> surface = IConsumerSurface::Create(config.name);
229     if (surface == nullptr) {
230         RS_LOGE("RSRenderService::CreateNodeAndSurface get consumer surface fail");
231         return nullptr;
232     }
233     const std::string& surfaceName = surface->GetName();
234     RS_LOGI("RsDebug RSRenderService::CreateNodeAndSurface node" \
235         "id:%" PRIu64 " name:%s bundleName:%s surface id:%" PRIu64 " name:%s",
236         node->GetId(), node->GetName().c_str(), node->GetBundleName().c_str(),
237         surface->GetUniqueId(), surfaceName.c_str());
238     node->SetConsumer(surface);
239     std::function<void()> registerNode = [node, this]() -> void {
240         this->mainThread_->GetContext().GetMutableNodeMap().RegisterRenderNode(node);
241     };
242     mainThread_->PostTask(registerNode);
243     std::weak_ptr<RSSurfaceRenderNode> surfaceRenderNode(node);
244     sptr<IBufferConsumerListener> listener = new RSRenderServiceListener(surfaceRenderNode);
245     SurfaceError ret = surface->RegisterConsumerListener(listener);
246     if (ret != SURFACE_ERROR_OK) {
247         RS_LOGE("RSRenderService::CreateNodeAndSurface Register Consumer Listener fail");
248         return nullptr;
249     }
250     sptr<IBufferProducer> producer = surface->GetProducer();
251     sptr<Surface> pSurface = Surface::CreateSurfaceAsProducer(producer);
252     return pSurface;
253 }
254 
255 
CreateVSyncConnection(const std::string & name,const sptr<VSyncIConnectionToken> & token)256 sptr<IVSyncConnection> RSRenderServiceConnection::CreateVSyncConnection(const std::string& name,
257                                                                         const sptr<VSyncIConnectionToken>& token)
258 {
259     sptr<VSyncConnection> conn = new VSyncConnection(appVSyncDistributor_, name, token->AsObject());
260     appVSyncDistributor_->AddConnection(conn);
261     {
262         std::lock_guard<std::mutex> lock(mutex_);
263         vsyncConnections_.push_back(conn);
264     }
265     return conn;
266 }
267 
SetFocusAppInfo(int32_t pid,int32_t uid,const std::string & bundleName,const std::string & abilityName,uint64_t focusNodeId)268 int32_t RSRenderServiceConnection::SetFocusAppInfo(
269     int32_t pid, int32_t uid, const std::string &bundleName, const std::string &abilityName, uint64_t focusNodeId)
270 {
271     mainThread_->SetFocusAppInfo(pid, uid, bundleName, abilityName, focusNodeId);
272     return SUCCESS;
273 }
274 
GetDefaultScreenId()275 ScreenId RSRenderServiceConnection::GetDefaultScreenId()
276 {
277     std::lock_guard<std::mutex> lock(mutex_);
278     return screenManager_->GetDefaultScreenId();
279 }
280 
GetAllScreenIds()281 std::vector<ScreenId> RSRenderServiceConnection::GetAllScreenIds()
282 {
283     std::lock_guard<std::mutex> lock(mutex_);
284     return screenManager_->GetAllScreenIds();
285 }
286 
CreateVirtualScreen(const std::string & name,uint32_t width,uint32_t height,sptr<Surface> surface,ScreenId mirrorId,int32_t flags)287 ScreenId RSRenderServiceConnection::CreateVirtualScreen(
288     const std::string &name,
289     uint32_t width,
290     uint32_t height,
291     sptr<Surface> surface,
292     ScreenId mirrorId,
293     int32_t flags)
294 {
295     std::lock_guard<std::mutex> lock(mutex_);
296     auto newVirtualScreenId = screenManager_->CreateVirtualScreen(name, width, height, surface, mirrorId, flags);
297     virtualScreenIds_.insert(newVirtualScreenId);
298     return newVirtualScreenId;
299 }
300 
SetVirtualScreenSurface(ScreenId id,sptr<Surface> surface)301 int32_t RSRenderServiceConnection::SetVirtualScreenSurface(ScreenId id, sptr<Surface> surface)
302 {
303     std::lock_guard<std::mutex> lock(mutex_);
304     return screenManager_->SetVirtualScreenSurface(id, surface);
305 }
306 
RemoveVirtualScreen(ScreenId id)307 void RSRenderServiceConnection::RemoveVirtualScreen(ScreenId id)
308 {
309     std::lock_guard<std::mutex> lock(mutex_);
310     screenManager_->RemoveVirtualScreen(id);
311     virtualScreenIds_.erase(id);
312 }
313 
SetScreenChangeCallback(sptr<RSIScreenChangeCallback> callback)314 int32_t RSRenderServiceConnection::SetScreenChangeCallback(sptr<RSIScreenChangeCallback> callback)
315 {
316     std::unique_lock<std::mutex> lock(mutex_);
317     if (screenChangeCallback_ == callback) {
318         return INVALID_ARGUMENTS;
319     }
320 
321     if (screenChangeCallback_ != nullptr) {
322         // remove the old callback
323         screenManager_->RemoveScreenChangeCallback(screenChangeCallback_);
324     }
325 
326     // update
327     int32_t status = screenManager_->AddScreenChangeCallback(callback);
328     auto tmp = screenChangeCallback_;
329     screenChangeCallback_ = callback;
330     lock.unlock();
331     return status;
332 }
333 
SetScreenActiveMode(ScreenId id,uint32_t modeId)334 void RSRenderServiceConnection::SetScreenActiveMode(ScreenId id, uint32_t modeId)
335 {
336     auto renderType = RSUniRenderJudgement::GetUniRenderEnabledType();
337     if (renderType == UniRenderEnabledType::UNI_RENDER_ENABLED_FOR_ALL) {
338         return RSHardwareThread::Instance().ScheduleTask(
339             [=]() { screenManager_->SetScreenActiveMode(id, modeId); }).wait();
340     } else {
341         return mainThread_->ScheduleTask(
342             [=]() { screenManager_->SetScreenActiveMode(id, modeId); }).wait();
343     }
344 }
345 
SetScreenRefreshRate(ScreenId id,int32_t sceneId,int32_t rate)346 void RSRenderServiceConnection::SetScreenRefreshRate(ScreenId id, int32_t sceneId, int32_t rate)
347 {
348     ROSEN_TRACE_BEGIN(HITRACE_TAG_GRAPHIC_AGP, "RSRenderService::SetScreenRefreshRate");
349     auto renderType = RSUniRenderJudgement::GetUniRenderEnabledType();
350     if (renderType == UniRenderEnabledType::UNI_RENDER_ENABLED_FOR_ALL) {
351         RSHardwareThread::Instance().ScheduleTask([=]() {
352             auto &hgmCore = OHOS::Rosen::HgmCore::Instance();
353             int32_t setResult = hgmCore.SetScreenRefreshRate(id, sceneId, rate);
354             if (setResult != 0) {
355                 RS_LOGW("SetScreenRefreshRate request of screen %" PRIu64 " of rate %d is refused", id, rate);
356                 return;
357             }
358         }).wait();
359     } else {
360         mainThread_->ScheduleTask([=]() {
361             auto &hgmCore = OHOS::Rosen::HgmCore::Instance();
362             int32_t setResult = hgmCore.SetScreenRefreshRate(id, sceneId, rate);
363             if (setResult != 0) {
364                 RS_LOGW("SetScreenRefreshRate request of screen %" PRIu64 " of rate %d is refused", id, rate);
365                 return;
366             }
367         }).wait();
368     }
369     ROSEN_TRACE_END(HITRACE_TAG_GRAPHIC_AGP);
370 }
371 
SetRefreshRateMode(int32_t refreshRateMode)372 void RSRenderServiceConnection::SetRefreshRateMode(int32_t refreshRateMode)
373 {
374     ROSEN_TRACE_BEGIN(HITRACE_TAG_GRAPHIC_AGP, "RSRenderService::SetRefreshRateMode");
375     auto renderType = RSUniRenderJudgement::GetUniRenderEnabledType();
376     if (renderType == UniRenderEnabledType::UNI_RENDER_ENABLED_FOR_ALL) {
377         RSHardwareThread::Instance().ScheduleTask([=]() {
378             auto &hgmCore = OHOS::Rosen::HgmCore::Instance();
379             int32_t setResult = hgmCore.SetRefreshRateMode(static_cast<RefreshRateMode>(refreshRateMode));
380             if (setResult != 0) {
381                 RS_LOGW("SetRefreshRateMode mode %d is not supported", refreshRateMode);
382                 return;
383             } else {
384                 RSSystemProperties::SetHgmRefreshRateModesEnabled(std::to_string(refreshRateMode));
385             }
386         }).wait();
387     } else {
388         mainThread_->ScheduleTask([=]() {
389             auto &hgmCore = OHOS::Rosen::HgmCore::Instance();
390             int32_t setResult = hgmCore.SetRefreshRateMode(static_cast<RefreshRateMode>(refreshRateMode));
391             if (setResult != 0) {
392                 RS_LOGW("SetRefreshRateMode mode %d is not supported", refreshRateMode);
393                 return;
394             } else {
395                 RSSystemProperties::SetHgmRefreshRateModesEnabled(std::to_string(refreshRateMode));
396             }
397         }).wait();
398     }
399     ROSEN_TRACE_END(HITRACE_TAG_GRAPHIC_AGP);
400 }
401 
GetScreenCurrentRefreshRate(ScreenId id)402 uint32_t RSRenderServiceConnection::GetScreenCurrentRefreshRate(ScreenId id)
403 {
404     auto renderType = RSUniRenderJudgement::GetUniRenderEnabledType();
405     if (renderType == UniRenderEnabledType::UNI_RENDER_ENABLED_FOR_ALL) {
406         return RSHardwareThread::Instance().ScheduleTask([=]() {
407             auto &hgmCore = OHOS::Rosen::HgmCore::Instance();
408             int32_t rate = hgmCore.GetScreenCurrentRefreshRate(id);
409             if (rate == 0) {
410                 RS_LOGW("GetScreenCurrentRefreshRate failed to get current refreshrate of screen : %" PRIu64 "", id);
411             }
412             return rate;
413         }).get();
414     } else {
415         return mainThread_->ScheduleTask([=]() {
416             auto &hgmCore = OHOS::Rosen::HgmCore::Instance();
417             int32_t rate = hgmCore.GetScreenCurrentRefreshRate(id);
418             if (rate == 0) {
419                 RS_LOGW("GetScreenCurrentRefreshRate failed to get current refreshrate of screen : %" PRIu64 "", id);
420             }
421             return rate;
422         }).get();
423     }
424 }
425 
GetScreenSupportedRefreshRates(ScreenId id)426 std::vector<uint32_t> RSRenderServiceConnection::GetScreenSupportedRefreshRates(ScreenId id)
427 {
428     auto renderType = RSUniRenderJudgement::GetUniRenderEnabledType();
429     if (renderType == UniRenderEnabledType::UNI_RENDER_ENABLED_FOR_ALL) {
430         return RSHardwareThread::Instance().ScheduleTask([=]() {
431             auto &hgmCore = OHOS::Rosen::HgmCore::Instance();
432             std::vector<uint32_t> rates = hgmCore.GetScreenSupportedRefreshRates(id);
433             return rates;
434         }).get();
435     } else {
436         return mainThread_->ScheduleTask([=]() {
437             auto &hgmCore = OHOS::Rosen::HgmCore::Instance();
438             std::vector<uint32_t> rates = hgmCore.GetScreenSupportedRefreshRates(id);
439             return rates;
440         }).get();
441     }
442 }
443 
SetVirtualScreenResolution(ScreenId id,uint32_t width,uint32_t height)444 int32_t RSRenderServiceConnection::SetVirtualScreenResolution(ScreenId id, uint32_t width, uint32_t height)
445 {
446     auto renderType = RSUniRenderJudgement::GetUniRenderEnabledType();
447     if (renderType == UniRenderEnabledType::UNI_RENDER_ENABLED_FOR_ALL) {
448         return RSHardwareThread::Instance().ScheduleTask(
449             [=]() { return screenManager_->SetVirtualScreenResolution(id, width, height); }).get();
450     } else {
451         return mainThread_->ScheduleTask(
452             [=]() { return screenManager_->SetVirtualScreenResolution(id, width, height); }).get();
453     }
454 }
455 
SetScreenPowerStatus(ScreenId id,ScreenPowerStatus status)456 void RSRenderServiceConnection::SetScreenPowerStatus(ScreenId id, ScreenPowerStatus status)
457 {
458     auto renderType = RSUniRenderJudgement::GetUniRenderEnabledType();
459     if (renderType == UniRenderEnabledType::UNI_RENDER_ENABLED_FOR_ALL) {
460         RSHardwareThread::Instance().ScheduleTask(
461             [=]() { screenManager_->SetScreenPowerStatus(id, status); }).wait();
462     } else {
463         mainThread_->ScheduleTask(
464             [=]() { screenManager_->SetScreenPowerStatus(id, status); }).wait();
465     }
466 }
467 
TakeSurfaceCapture(NodeId id,sptr<RSISurfaceCaptureCallback> callback,float scaleX,float scaleY)468 void RSRenderServiceConnection::TakeSurfaceCapture(NodeId id, sptr<RSISurfaceCaptureCallback> callback,
469     float scaleX, float scaleY)
470 {
471     auto node = RSMainThread::Instance()->GetContext().GetNodeMap().GetRenderNode<RSRenderNode>(id);
472     if (node == nullptr) {
473         RS_LOGW("RSRenderServiceConnection::TakeSurfaceCapture cannot find nodeId: [%" PRIu64 "]", id);
474         callback->OnSurfaceCapture(id, nullptr);
475         return;
476     }
477     if ((node->GetType() == RSRenderNodeType::DISPLAY_NODE) ||
478         ((node->GetType() == RSRenderNodeType::SURFACE_NODE) &&
479             (node->ReinterpretCastTo<RSSurfaceRenderNode>()->IsMainWindowType()))) {
480         std::function<void()> captureTask = [scaleY, scaleX, callback, id]() -> void {
481             RS_LOGD("RSRenderService::TakeSurfaceCapture callback->OnSurfaceCapture nodeId:[%" PRIu64 "]", id);
482             ROSEN_TRACE_BEGIN(HITRACE_TAG_GRAPHIC_AGP, "RSRenderService::TakeSurfaceCapture");
483             RSSurfaceCaptureTask task(id, scaleX, scaleY);
484             std::unique_ptr<Media::PixelMap> pixelmap = task.Run();
485             callback->OnSurfaceCapture(id, pixelmap.get());
486             ROSEN_TRACE_END(HITRACE_TAG_GRAPHIC_AGP);
487         };
488         mainThread_->PostTask(captureTask);
489     } else {
490         TakeSurfaceCaptureForUIWithUni(id, callback, scaleX, scaleY);
491     }
492 }
493 
TakeSurfaceCaptureForUIWithUni(NodeId id,sptr<RSISurfaceCaptureCallback> callback,float scaleX,float scaleY)494 void RSRenderServiceConnection::TakeSurfaceCaptureForUIWithUni(NodeId id, sptr<RSISurfaceCaptureCallback> callback,
495     float scaleX, float scaleY)
496 {
497     std::function<void()> offscreenRenderTask = [scaleY, scaleX, callback, id, this]() -> void {
498         RS_LOGD("RSRenderService::TakeSurfaceCaptureForUIWithUni callback->OnOffscreenRender nodeId:[%" PRIu64 "]", id);
499         ROSEN_TRACE_BEGIN(HITRACE_TAG_GRAPHIC_AGP, "RSRenderService::TakeSurfaceCaptureForUIWithUni");
500         std::shared_ptr<RSUniUICapture> rsUniUICapture =
501             std::make_shared<RSUniUICapture>(id, scaleX, scaleY);
502         std::shared_ptr<Media::PixelMap> pixelmap = rsUniUICapture->TakeLocalCapture();
503         callback->OnSurfaceCapture(id, pixelmap.get());
504         std::lock_guard<std::mutex> lock(offscreenRenderMutex_);
505         offscreenRenderNum_--;
506         if (offscreenRenderNum_ == 0) {
507             RSOffscreenRenderThread::Instance().Stop();
508         }
509         ROSEN_TRACE_END(HITRACE_TAG_GRAPHIC_AGP);
510     };
511     {
512         std::lock_guard<std::mutex> lock(offscreenRenderMutex_);
513         if (offscreenRenderNum_ == 0) {
514             RSOffscreenRenderThread::Instance().Start();
515         }
516         offscreenRenderNum_++;
517     }
518     RSOffscreenRenderThread::Instance().PostTask(offscreenRenderTask);
519 }
520 
RegisterApplicationAgent(uint32_t pid,sptr<IApplicationAgent> app)521 void RSRenderServiceConnection::RegisterApplicationAgent(uint32_t pid, sptr<IApplicationAgent> app)
522 {
523     auto captureTask = [=]() -> void {
524         mainThread_->RegisterApplicationAgent(pid, app);
525     };
526     mainThread_->PostTask(captureTask);
527 
528     app->AsObject()->AddDeathRecipient(ApplicationDeathRecipient_);
529 }
530 
UnRegisterApplicationAgent(sptr<IApplicationAgent> app)531 void RSRenderServiceConnection::UnRegisterApplicationAgent(sptr<IApplicationAgent> app)
532 {
533     auto captureTask = [=]() -> void {
534         RSMainThread::Instance()->UnRegisterApplicationAgent(app);
535     };
536     RSMainThread::Instance()->ScheduleTask(captureTask).wait();
537 }
538 
GetVirtualScreenResolution(ScreenId id)539 RSVirtualScreenResolution RSRenderServiceConnection::GetVirtualScreenResolution(ScreenId id)
540 {
541     RSVirtualScreenResolution virtualScreenResolution;
542     screenManager_->GetVirtualScreenResolution(id, virtualScreenResolution);
543     return virtualScreenResolution;
544 }
545 
GetScreenActiveMode(ScreenId id)546 RSScreenModeInfo RSRenderServiceConnection::GetScreenActiveMode(ScreenId id)
547 {
548     RSScreenModeInfo screenModeInfo;
549     auto renderType = RSUniRenderJudgement::GetUniRenderEnabledType();
550     if (renderType == UniRenderEnabledType::UNI_RENDER_ENABLED_FOR_ALL) {
551         RSHardwareThread::Instance().ScheduleTask(
552             [=, &screenModeInfo]() { return screenManager_->GetScreenActiveMode(id, screenModeInfo); }).wait();
553     } else {
554         mainThread_->ScheduleTask(
555             [=, &screenModeInfo]() { return screenManager_->GetScreenActiveMode(id, screenModeInfo); }).wait();
556     }
557     return screenModeInfo;
558 }
559 
GetMemoryGraphic(int pid)560 MemoryGraphic RSRenderServiceConnection::GetMemoryGraphic(int pid)
561 {
562     MemoryGraphic memoryGraphic;
563     if (!RSMainThread::Instance()->GetContext().GetNodeMap().ContainPid(pid)) {
564         return memoryGraphic;
565     }
566     if (GetUniRenderEnabled()) {
567         mainThread_->ScheduleTask([this, &pid, &memoryGraphic]() { return mainThread_->CountMem(pid, memoryGraphic); })
568             .wait();
569         return memoryGraphic;
570     } else {
571         return memoryGraphic;
572     }
573 }
574 
GetMemoryGraphics()575 std::vector<MemoryGraphic> RSRenderServiceConnection::GetMemoryGraphics()
576 {
577     std::vector<MemoryGraphic> memoryGraphics;
578     if (GetUniRenderEnabled()) {
579         mainThread_->ScheduleTask(
580             [this, &memoryGraphics]() { return mainThread_->CountMem(memoryGraphics); }).wait();
581         return memoryGraphics;
582     } else {
583         return memoryGraphics;
584     }
585 }
586 
GetScreenSupportedModes(ScreenId id)587 std::vector<RSScreenModeInfo> RSRenderServiceConnection::GetScreenSupportedModes(ScreenId id)
588 {
589     auto renderType = RSUniRenderJudgement::GetUniRenderEnabledType();
590     if (renderType == UniRenderEnabledType::UNI_RENDER_ENABLED_FOR_ALL) {
591         return RSHardwareThread::Instance().ScheduleTask(
592             [=]() { return screenManager_->GetScreenSupportedModes(id); }).get();
593     } else {
594         return mainThread_->ScheduleTask(
595             [=]() { return screenManager_->GetScreenSupportedModes(id); }).get();
596     }
597 }
598 
GetScreenCapability(ScreenId id)599 RSScreenCapability RSRenderServiceConnection::GetScreenCapability(ScreenId id)
600 {
601     auto renderType = RSUniRenderJudgement::GetUniRenderEnabledType();
602     if (renderType == UniRenderEnabledType::UNI_RENDER_ENABLED_FOR_ALL) {
603         return RSHardwareThread::Instance().ScheduleTask(
604             [=]() { return screenManager_->GetScreenCapability(id); }).get();
605     } else {
606         return mainThread_->ScheduleTask(
607             [=]() { return screenManager_->GetScreenCapability(id); }).get();
608     }
609 }
610 
GetScreenPowerStatus(ScreenId id)611 ScreenPowerStatus RSRenderServiceConnection::GetScreenPowerStatus(ScreenId id)
612 {
613     auto renderType = RSUniRenderJudgement::GetUniRenderEnabledType();
614     if (renderType == UniRenderEnabledType::UNI_RENDER_ENABLED_FOR_ALL) {
615         return RSHardwareThread::Instance().ScheduleTask(
616             [=]() { return screenManager_->GetScreenPowerStatus(id); }).get();
617     } else {
618         return mainThread_->ScheduleTask(
619             [=]() { return screenManager_->GetScreenPowerStatus(id); }).get();
620     }
621 }
622 
GetScreenData(ScreenId id)623 RSScreenData RSRenderServiceConnection::GetScreenData(ScreenId id)
624 {
625     RSScreenData screenData;
626     auto renderType = RSUniRenderJudgement::GetUniRenderEnabledType();
627     if (renderType == UniRenderEnabledType::UNI_RENDER_ENABLED_FOR_ALL) {
628         return RSHardwareThread::Instance().ScheduleTask(
629             [=]() { return screenManager_->GetScreenData(id); }).get();
630     } else {
631         return mainThread_->ScheduleTask(
632             [=]() { return screenManager_->GetScreenData(id); }).get();
633     }
634 }
635 
GetScreenBacklight(ScreenId id)636 int32_t RSRenderServiceConnection::GetScreenBacklight(ScreenId id)
637 {
638     auto renderType = RSUniRenderJudgement::GetUniRenderEnabledType();
639     if (renderType == UniRenderEnabledType::UNI_RENDER_ENABLED_FOR_ALL) {
640         return RSHardwareThread::Instance().ScheduleTask(
641             [=]() { return screenManager_->GetScreenBacklight(id); }).get();
642     } else {
643         return mainThread_->ScheduleTask(
644             [=]() { return screenManager_->GetScreenBacklight(id); }).get();
645     }
646 }
647 
SetScreenBacklight(ScreenId id,uint32_t level)648 void RSRenderServiceConnection::SetScreenBacklight(ScreenId id, uint32_t level)
649 {
650     auto renderType = RSUniRenderJudgement::GetUniRenderEnabledType();
651     if (renderType == UniRenderEnabledType::UNI_RENDER_ENABLED_FOR_ALL) {
652         RSHardwareThread::Instance().ScheduleTask(
653             [=]() { return screenManager_->SetScreenBacklight(id, level); }).wait();
654     } else {
655         mainThread_->ScheduleTask(
656             [=]() { screenManager_->SetScreenBacklight(id, level); }).wait();
657     }
658 }
659 
RegisterBufferClearListener(NodeId id,sptr<RSIBufferClearCallback> callback)660 void RSRenderServiceConnection::RegisterBufferClearListener(
661     NodeId id, sptr<RSIBufferClearCallback> callback)
662 {
663     auto registerBufferClearListener = [id, callback, this]() -> bool {
664         if (auto node = this->mainThread_->GetContext().GetNodeMap().GetRenderNode<RSSurfaceRenderNode>(id)) {
665             node->RegisterBufferClearListener(callback);
666             return true;
667         }
668         return false;
669     };
670     if (!registerBufferClearListener()) {
671         mainThread_->PostTask(registerBufferClearListener);
672     }
673 }
674 
RegisterBufferAvailableListener(NodeId id,sptr<RSIBufferAvailableCallback> callback,bool isFromRenderThread)675 void RSRenderServiceConnection::RegisterBufferAvailableListener(
676     NodeId id, sptr<RSIBufferAvailableCallback> callback, bool isFromRenderThread)
677 {
678     auto registerBufferAvailableListener = [id, callback, isFromRenderThread, this]() -> bool {
679         if (auto node = this->mainThread_->GetContext().GetNodeMap().GetRenderNode<RSSurfaceRenderNode>(id)) {
680             node->RegisterBufferAvailableListener(callback, isFromRenderThread);
681             return true;
682         }
683         return false;
684     };
685     if (!registerBufferAvailableListener()) {
686         RS_LOGI("RegisterBufferAvailableListener: node not found, post task to retry");
687         mainThread_->PostTask(registerBufferAvailableListener);
688     }
689 }
690 
GetScreenSupportedColorGamuts(ScreenId id,std::vector<ScreenColorGamut> & mode)691 int32_t RSRenderServiceConnection::GetScreenSupportedColorGamuts(ScreenId id, std::vector<ScreenColorGamut>& mode)
692 {
693     auto renderType = RSUniRenderJudgement::GetUniRenderEnabledType();
694     if (renderType == UniRenderEnabledType::UNI_RENDER_ENABLED_FOR_ALL) {
695         return RSHardwareThread::Instance().ScheduleTask(
696             [=, &mode]() { return screenManager_->GetScreenSupportedColorGamuts(id, mode); }).get();
697     } else {
698         return mainThread_->ScheduleTask(
699             [=, &mode]() { return screenManager_->GetScreenSupportedColorGamuts(id, mode); }).get();
700     }
701 }
702 
GetScreenSupportedMetaDataKeys(ScreenId id,std::vector<ScreenHDRMetadataKey> & keys)703 int32_t RSRenderServiceConnection::GetScreenSupportedMetaDataKeys(ScreenId id, std::vector<ScreenHDRMetadataKey>& keys)
704 {
705     auto renderType = RSUniRenderJudgement::GetUniRenderEnabledType();
706     if (renderType == UniRenderEnabledType::UNI_RENDER_ENABLED_FOR_ALL) {
707         return RSHardwareThread::Instance().ScheduleTask(
708             [=, &keys]() { return screenManager_->GetScreenSupportedMetaDataKeys(id, keys); }).get();
709     } else {
710         return mainThread_->ScheduleTask(
711             [=, &keys]() { return screenManager_->GetScreenSupportedMetaDataKeys(id, keys); }).get();
712     }
713 }
714 
GetScreenColorGamut(ScreenId id,ScreenColorGamut & mode)715 int32_t RSRenderServiceConnection::GetScreenColorGamut(ScreenId id, ScreenColorGamut& mode)
716 {
717     auto renderType = RSUniRenderJudgement::GetUniRenderEnabledType();
718     if (renderType == UniRenderEnabledType::UNI_RENDER_ENABLED_FOR_ALL) {
719         return RSHardwareThread::Instance().ScheduleTask(
720             [=, &mode]() { return screenManager_->GetScreenColorGamut(id, mode); }).get();
721     } else {
722         return mainThread_->ScheduleTask(
723             [=, &mode]() { return screenManager_->GetScreenColorGamut(id, mode); }).get();
724     }
725 }
726 
SetScreenColorGamut(ScreenId id,int32_t modeIdx)727 int32_t RSRenderServiceConnection::SetScreenColorGamut(ScreenId id, int32_t modeIdx)
728 {
729     auto renderType = RSUniRenderJudgement::GetUniRenderEnabledType();
730     if (renderType == UniRenderEnabledType::UNI_RENDER_ENABLED_FOR_ALL) {
731         return RSHardwareThread::Instance().ScheduleTask(
732             [=]() { return screenManager_->SetScreenColorGamut(id, modeIdx); }).get();
733     } else {
734         return mainThread_->ScheduleTask(
735             [=]() { return screenManager_->SetScreenColorGamut(id, modeIdx); }).get();
736     }
737 }
738 
SetScreenGamutMap(ScreenId id,ScreenGamutMap mode)739 int32_t RSRenderServiceConnection::SetScreenGamutMap(ScreenId id, ScreenGamutMap mode)
740 {
741     auto renderType = RSUniRenderJudgement::GetUniRenderEnabledType();
742     if (renderType == UniRenderEnabledType::UNI_RENDER_ENABLED_FOR_ALL) {
743         return RSHardwareThread::Instance().ScheduleTask(
744             [=]() { return screenManager_->SetScreenGamutMap(id, mode); }).get();
745     } else {
746         return mainThread_->ScheduleTask(
747             [=]() { return screenManager_->SetScreenGamutMap(id, mode); }).get();
748     }
749 }
750 
GetScreenGamutMap(ScreenId id,ScreenGamutMap & mode)751 int32_t RSRenderServiceConnection::GetScreenGamutMap(ScreenId id, ScreenGamutMap& mode)
752 {
753     auto renderType = RSUniRenderJudgement::GetUniRenderEnabledType();
754     if (renderType == UniRenderEnabledType::UNI_RENDER_ENABLED_FOR_ALL) {
755         return RSHardwareThread::Instance().ScheduleTask(
756             [=, &mode]() { return screenManager_->GetScreenGamutMap(id, mode); }).get();
757     } else {
758         return mainThread_->ScheduleTask(
759             [=, &mode]() { return screenManager_->GetScreenGamutMap(id, mode); }).get();
760     }
761 }
762 
GetScreenHDRCapability(ScreenId id,RSScreenHDRCapability & screenHdrCapability)763 int32_t RSRenderServiceConnection::GetScreenHDRCapability(ScreenId id, RSScreenHDRCapability& screenHdrCapability)
764 {
765     std::lock_guard<std::mutex> lock(mutex_);
766     return screenManager_->GetScreenHDRCapability(id, screenHdrCapability);
767 }
768 
GetScreenType(ScreenId id,RSScreenType & screenType)769 int32_t RSRenderServiceConnection::GetScreenType(ScreenId id, RSScreenType& screenType)
770 {
771     std::lock_guard<std::mutex> lock(mutex_);
772     return screenManager_->GetScreenType(id, screenType);
773 }
774 
775 #ifndef USE_ROSEN_DRAWING
GetBitmap(NodeId id,SkBitmap & bitmap)776 bool RSRenderServiceConnection::GetBitmap(NodeId id, SkBitmap& bitmap)
777 #else
778 bool RSRenderServiceConnection::GetBitmap(NodeId id, Drawing::Bitmap& bitmap)
779 #endif
780 {
781     auto node = mainThread_->GetContext().GetNodeMap().GetRenderNode<RSCanvasDrawingRenderNode>(id);
782     if (node == nullptr) {
783         RS_LOGE("RSRenderServiceConnection::GetBitmap cannot find NodeId: [%" PRIu64 "]", id);
784         return false;
785     }
786     if (node->GetType() != RSRenderNodeType::CANVAS_DRAWING_NODE) {
787         RS_LOGE("RSRenderServiceConnection::GetBitmap RenderNodeType != RSRenderNodeType::CANVAS_DRAWING_NODE");
788         return false;
789     }
790     auto getBitmapTask = [&node, &bitmap]() { bitmap = node->GetBitmap(); };
791     mainThread_->PostSyncTask(getBitmapTask);
792 #ifndef USE_ROSEN_DRAWING
793     return !bitmap.empty();
794 #else
795     return bitmap.IsValid();
796 #endif
797 }
798 
GetPixelmap(NodeId id,const std::shared_ptr<Media::PixelMap> pixelmap,const SkRect * rect)799 bool RSRenderServiceConnection::GetPixelmap(
800     NodeId id, const std::shared_ptr<Media::PixelMap> pixelmap, const SkRect* rect)
801 {
802     auto node = mainThread_->GetContext().GetNodeMap().GetRenderNode<RSCanvasDrawingRenderNode>(id);
803     if (node == nullptr) {
804         RS_LOGE("RSRenderServiceConnection::GetPixelmap: cannot find NodeId: [%{public}" PRIu64 "]", id);
805         return false;
806     }
807     if (node->GetType() != RSRenderNodeType::CANVAS_DRAWING_NODE) {
808         RS_LOGE("RSRenderServiceConnection::GetPixelmap: RenderNodeType != RSRenderNodeType::CANVAS_DRAWING_NODE");
809         return false;
810     }
811     bool result = false;
812     auto getPixelmapTask = [&node, &pixelmap, rect, &result]() { result = node->GetPixelmap(pixelmap, rect); };
813     mainThread_->PostSyncTask(getPixelmapTask);
814     return result;
815 }
816 
SetScreenSkipFrameInterval(ScreenId id,uint32_t skipFrameInterval)817 int32_t RSRenderServiceConnection::SetScreenSkipFrameInterval(ScreenId id, uint32_t skipFrameInterval)
818 {
819     auto renderType = RSUniRenderJudgement::GetUniRenderEnabledType();
820     if (renderType == UniRenderEnabledType::UNI_RENDER_ENABLED_FOR_ALL) {
821         return RSHardwareThread::Instance().ScheduleTask(
822             [=]() { return screenManager_->SetScreenSkipFrameInterval(id, skipFrameInterval); }).get();
823     } else {
824         return mainThread_->ScheduleTask(
825             [=]() { return screenManager_->SetScreenSkipFrameInterval(id, skipFrameInterval); }).get();
826     }
827 }
828 
RegisterOcclusionChangeCallback(sptr<RSIOcclusionChangeCallback> callback)829 int32_t RSRenderServiceConnection::RegisterOcclusionChangeCallback(sptr<RSIOcclusionChangeCallback> callback)
830 {
831     std::lock_guard<std::mutex> lock(mutex_);
832     if (!callback) {
833         RS_LOGD("RSRenderServiceConnection::RegisterOcclusionChangeCallback: callback is nullptr");
834         return StatusCode::INVALID_ARGUMENTS;
835     }
836     mainThread_->RegisterOcclusionChangeCallback(remotePid_, callback);
837     return StatusCode::SUCCESS;
838 }
839 
SetAppWindowNum(uint32_t num)840 void RSRenderServiceConnection::SetAppWindowNum(uint32_t num)
841 {
842     auto task = [this, num]() -> void {
843         mainThread_->SetAppWindowNum(num);
844     };
845     mainThread_->PostTask(task);
846 }
847 
ShowWatermark(const std::shared_ptr<Media::PixelMap> & watermarkImg,bool isShow)848 void RSRenderServiceConnection::ShowWatermark(const std::shared_ptr<Media::PixelMap> &watermarkImg, bool isShow)
849 {
850     auto task = [this, watermarkImg, isShow]() -> void {
851         mainThread_->ShowWatermark(watermarkImg, isShow);
852     };
853     mainThread_->PostTask(task);
854 }
855 
ReportJankStats()856 void RSRenderServiceConnection::ReportJankStats()
857 {
858     auto task = [this]() -> void { RSJankStats::GetInstance().ReportJankStats(); };
859     mainThread_->PostTask(task);
860 }
861 
ReportEventResponse(DataBaseRs info)862 void RSRenderServiceConnection::ReportEventResponse(DataBaseRs info)
863 {
864     auto task = [this, info]() -> void {
865         RSJankStats::GetInstance().SetReportEventResponse(info);
866     };
867     mainThread_->PostTask(task);
868 }
869 
ReportEventComplete(DataBaseRs info)870 void RSRenderServiceConnection::ReportEventComplete(DataBaseRs info)
871 {
872     auto task = [this, info]() -> void {
873         RSJankStats::GetInstance().SetReportEventComplete(info);
874     };
875     mainThread_->PostTask(task);
876 }
877 
ReportEventJankFrame(DataBaseRs info)878 void RSRenderServiceConnection::ReportEventJankFrame(DataBaseRs info)
879 {
880     auto task = [this, info]() -> void {
881         RSJankStats::GetInstance().SetReportEventJankFrame(info);
882     };
883     mainThread_->PostTask(task);
884 }
885 
SetHardwareEnabled(NodeId id,bool isEnabled)886 void RSRenderServiceConnection::SetHardwareEnabled(NodeId id, bool isEnabled)
887 {
888     auto task = [this, id, isEnabled]() -> void {
889         auto& context = mainThread_->GetContext();
890         auto node = context.GetNodeMap().GetRenderNode<RSSurfaceRenderNode>(id);
891         if (node) {
892             node->SetHardwareEnabled(isEnabled);
893         }
894     };
895     mainThread_->PostTask(task);
896 }
897 } // namespace Rosen
898 } // namespace OHOS
899