• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2022 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 "pipeline/rs_render_node_map.h"
19 #include "pipeline/rs_render_service_listener.h"
20 #include "pipeline/rs_surface_capture_task.h"
21 #include "pipeline/rs_surface_render_node.h"
22 #include "pipeline/rs_uni_render_judgement.h"
23 #include "platform/common/rs_log.h"
24 #include "rs_main_thread.h"
25 #include "rs_trace.h"
26 
27 namespace OHOS {
28 namespace Rosen {
29 // we guarantee that when constructing this object,
30 // 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)31 RSRenderServiceConnection::RSRenderServiceConnection(
32     pid_t remotePid,
33     wptr<RSRenderService> renderService,
34     RSMainThread* mainThread,
35     sptr<RSScreenManager> screenManager,
36     sptr<IRemoteObject> token,
37     sptr<VSyncDistributor> distributor)
38     : remotePid_(remotePid),
39       renderService_(renderService),
40       mainThread_(mainThread),
41       screenManager_(screenManager),
42       token_(token),
43       connDeathRecipient_(new RSConnectionDeathRecipient(this)),
44       ApplicationDeathRecipient_(new RSApplicationRenderThreadDeathRecipient(this)),
45       appVSyncDistributor_(distributor)
46 {
47     if (!token_->AddDeathRecipient(connDeathRecipient_)) {
48         RS_LOGW("RSRenderServiceConnection: Failed to set death recipient.");
49     }
50 }
51 
~RSRenderServiceConnection()52 RSRenderServiceConnection::~RSRenderServiceConnection() noexcept
53 {
54     CleanAll();
55 }
56 
CleanVirtualScreens()57 void RSRenderServiceConnection::CleanVirtualScreens() noexcept
58 {
59     std::lock_guard<std::mutex> lock(mutex_);
60 
61     for (const auto id : virtualScreenIds_) {
62         screenManager_->RemoveVirtualScreen(id);
63     }
64     virtualScreenIds_.clear();
65 
66     if (screenChangeCallback_ != nullptr) {
67         screenManager_->RemoveScreenChangeCallback(screenChangeCallback_);
68         screenChangeCallback_ = nullptr;
69     }
70 }
71 
CleanRenderNodes()72 void RSRenderServiceConnection::CleanRenderNodes() noexcept
73 {
74     auto& context = mainThread_->GetContext();
75     auto& nodeMap = context.GetMutableNodeMap();
76 
77     nodeMap.FilterNodeByPid(remotePid_);
78 }
79 
CleanAll(bool toDelete)80 void RSRenderServiceConnection::CleanAll(bool toDelete) noexcept
81 {
82     {
83         std::lock_guard<std::mutex> lock(mutex_);
84         if (cleanDone_) {
85             return;
86         }
87     }
88     RS_LOGD("RSRenderServiceConnection::CleanAll() start.");
89     mainThread_->ScheduleTask([this]() {
90         CleanVirtualScreens();
91         CleanRenderNodes();
92         mainThread_->ClearTransactionDataPidInfo(remotePid_);
93     }).wait();
94 
95     for (auto& conn : vsyncConnections_) {
96         appVSyncDistributor_->RemoveConnection(conn);
97     }
98 
99     {
100         std::lock_guard<std::mutex> lock(mutex_);
101         vsyncConnections_.clear();
102         cleanDone_ = true;
103     }
104 
105     if (toDelete) {
106         auto renderService = renderService_.promote();
107         if (renderService == nullptr) {
108             RS_LOGW("RSRenderServiceConnection::CleanAll() RenderService is dead.");
109         } else {
110             renderService->RemoveConnection(GetToken());
111         }
112     }
113 
114     RS_LOGD("RSRenderServiceConnection::CleanAll() end.");
115 }
116 
RSConnectionDeathRecipient(wptr<RSRenderServiceConnection> conn)117 RSRenderServiceConnection::RSConnectionDeathRecipient::RSConnectionDeathRecipient(
118     wptr<RSRenderServiceConnection> conn) : conn_(conn)
119 {
120 }
121 
OnRemoteDied(const wptr<IRemoteObject> & token)122 void RSRenderServiceConnection::RSConnectionDeathRecipient::OnRemoteDied(const wptr<IRemoteObject>& token)
123 {
124     auto tokenSptr = token.promote();
125     if (tokenSptr == nullptr) {
126         RS_LOGW("RSConnectionDeathRecipient::OnRemoteDied: can't promote remote object.");
127         return;
128     }
129 
130     auto rsConn = conn_.promote();
131     if (rsConn == nullptr) {
132         RS_LOGW("RSConnectionDeathRecipient::OnRemoteDied: RSRenderServiceConnection was dead, do nothing.");
133         return;
134     }
135 
136     if (rsConn->GetToken() != tokenSptr) {
137         RS_LOGI("RSConnectionDeathRecipient::OnRemoteDied: token doesn't match, ignore it.");
138         return;
139     }
140 
141     RS_LOGI("RSConnectionDeathRecipient::OnRemoteDied: do the clean work.");
142     rsConn->CleanAll(true);
143 }
144 
RSApplicationRenderThreadDeathRecipient(wptr<RSRenderServiceConnection> conn)145 RSRenderServiceConnection::RSApplicationRenderThreadDeathRecipient::RSApplicationRenderThreadDeathRecipient(
146     wptr<RSRenderServiceConnection> conn) : conn_(conn)
147 {}
148 
OnRemoteDied(const wptr<IRemoteObject> & token)149 void RSRenderServiceConnection::RSApplicationRenderThreadDeathRecipient::OnRemoteDied(const wptr<IRemoteObject>& token)
150 {
151     auto tokenSptr = token.promote();
152     if (tokenSptr == nullptr) {
153         RS_LOGW("RSApplicationRenderThreadDeathRecipient::OnRemoteDied: can't promote remote object.");
154         return;
155     }
156 
157     auto rsConn = conn_.promote();
158     if (rsConn == nullptr) {
159         RS_LOGW("RSApplicationRenderThreadDeathRecipient::OnRemoteDied: RSRenderServiceConnection was dead, do nothing.");
160         return;
161     }
162 
163     RS_LOGI("RSApplicationRenderThreadDeathRecipient::OnRemoteDied: Unregister.");
164     auto app = iface_cast<IApplicationAgent>(tokenSptr);
165     rsConn->UnRegisterApplicationAgent(app);
166 }
167 
CommitTransaction(std::unique_ptr<RSTransactionData> & transactionData)168 void RSRenderServiceConnection::CommitTransaction(std::unique_ptr<RSTransactionData>& transactionData)
169 {
170     mainThread_->RecvRSTransactionData(transactionData);
171 }
172 
ExecuteSynchronousTask(const std::shared_ptr<RSSyncTask> & task)173 void RSRenderServiceConnection::ExecuteSynchronousTask(const std::shared_ptr<RSSyncTask>& task)
174 {
175     if (task == nullptr) {
176         return;
177     }
178 
179     auto& context = mainThread_->GetContext();
180     mainThread_->ScheduleTask([task, &context]() {
181         task->Process(context);
182     }).wait_for(std::chrono::nanoseconds(task->GetTimeout()));
183 }
184 
SetRenderModeChangeCallback(sptr<RSIRenderModeChangeCallback> callback)185 int32_t RSRenderServiceConnection::SetRenderModeChangeCallback(sptr<RSIRenderModeChangeCallback> callback)
186 {
187     if (!callback) {
188         RS_LOGD("RSRenderServiceConnection::SetRenderModeChangeCallback: callback is nullptr");
189         return INVALID_ARGUMENTS;
190     }
191     mainThread_->SetRenderModeChangeCallback(callback);
192     return SUCCESS;
193 }
194 
UpdateRenderMode(bool isUniRender)195 void RSRenderServiceConnection::UpdateRenderMode(bool isUniRender)
196 {
197     mainThread_->NotifyRenderModeChanged(isUniRender);
198 }
199 
GetUniRenderEnabled()200 bool RSRenderServiceConnection::GetUniRenderEnabled()
201 {
202     return RSUniRenderJudgement::IsUniRender();
203 }
204 
QueryIfRTNeedRender()205 bool RSRenderServiceConnection::QueryIfRTNeedRender()
206 {
207     return !mainThread_->QueryIfUseUniVisitor();
208 }
209 
CreateNode(const RSSurfaceRenderNodeConfig & config)210 bool RSRenderServiceConnection::CreateNode(const RSSurfaceRenderNodeConfig& config)
211 {
212     std::shared_ptr<RSSurfaceRenderNode> node =
213         std::make_shared<RSSurfaceRenderNode>(config, mainThread_->GetContext().weak_from_this());
214     if (node == nullptr) {
215         RS_LOGE("RSRenderService::CreateNode fail");
216         return false;
217     }
218     std::function<void()> registerNode = [node, this]() -> void {
219         this->mainThread_->GetContext().GetMutableNodeMap().RegisterRenderNode(node);
220     };
221     mainThread_->PostTask(registerNode);
222     return true;
223 }
224 
CreateNodeAndSurface(const RSSurfaceRenderNodeConfig & config)225 sptr<Surface> RSRenderServiceConnection::CreateNodeAndSurface(const RSSurfaceRenderNodeConfig& config)
226 {
227     std::shared_ptr<RSSurfaceRenderNode> node =
228         std::make_shared<RSSurfaceRenderNode>(config, mainThread_->GetContext().weak_from_this());
229     if (node == nullptr) {
230         RS_LOGE("RSRenderService::CreateNodeAndSurface CreateNode fail");
231         return nullptr;
232     }
233     sptr<Surface> surface = Surface::CreateSurfaceAsConsumer(config.name);
234     if (surface == nullptr) {
235         RS_LOGE("RSRenderService::CreateNodeAndSurface get consumer surface fail");
236         return nullptr;
237     }
238     const std::string& surfaceName = surface->GetName();
239     RS_LOGI("RsDebug RSRenderService::CreateNodeAndSurface node id:%" PRIu64 " name:%s surface id:%" PRIu64 " name:%s",
240         node->GetId(), node->GetName().c_str(), surface->GetUniqueId(), surfaceName.c_str());
241     node->SetConsumer(surface);
242     std::function<void()> registerNode = [node, this]() -> void {
243         this->mainThread_->GetContext().GetMutableNodeMap().RegisterRenderNode(node);
244     };
245     mainThread_->PostTask(registerNode);
246     std::weak_ptr<RSSurfaceRenderNode> surfaceRenderNode(node);
247     sptr<IBufferConsumerListener> listener = new RSRenderServiceListener(surfaceRenderNode);
248     SurfaceError ret = surface->RegisterConsumerListener(listener);
249     if (ret != SURFACE_ERROR_OK) {
250         RS_LOGE("RSRenderService::CreateNodeAndSurface Register Consumer Listener fail");
251         return nullptr;
252     }
253     return surface;
254 }
255 
256 
CreateVSyncConnection(const std::string & name)257 sptr<IVSyncConnection> RSRenderServiceConnection::CreateVSyncConnection(const std::string& name)
258 {
259     sptr<VSyncConnection> conn = new VSyncConnection(appVSyncDistributor_, name);
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)268 int32_t RSRenderServiceConnection::SetFocusAppInfo(
269     int32_t pid, int32_t uid, const std::string &bundleName, const std::string &abilityName)
270 {
271     mainThread_->SetFocusAppInfo(pid, uid, bundleName, abilityName);
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     mainThread_->ScheduleTask([=]() {
337         screenManager_->SetScreenActiveMode(id, modeId);
338     }).wait();
339 }
340 
SetVirtualScreenResolution(ScreenId id,uint32_t width,uint32_t height)341 int32_t RSRenderServiceConnection::SetVirtualScreenResolution(ScreenId id, uint32_t width, uint32_t height)
342 {
343     return mainThread_->ScheduleTask([=]() {
344         return screenManager_->SetVirtualScreenResolution(id, width, height);
345     }).get();
346 }
347 
SetScreenPowerStatus(ScreenId id,ScreenPowerStatus status)348 void RSRenderServiceConnection::SetScreenPowerStatus(ScreenId id, ScreenPowerStatus status)
349 {
350     mainThread_->ScheduleTask([=]() {
351         screenManager_->SetScreenPowerStatus(id, status);
352     }).wait();
353 }
354 
TakeSurfaceCapture(NodeId id,sptr<RSISurfaceCaptureCallback> callback,float scaleX,float scaleY)355 void RSRenderServiceConnection::TakeSurfaceCapture(NodeId id, sptr<RSISurfaceCaptureCallback> callback,
356     float scaleX, float scaleY)
357 {
358     std::function<void()> captureTask = [scaleY, scaleX, callback, id]() -> void {
359         RS_LOGD("RSRenderService::TakeSurfaceCapture callback->OnSurfaceCapture nodeId:[%" PRIu64 "]", id);
360         ROSEN_TRACE_BEGIN(HITRACE_TAG_GRAPHIC_AGP, "RSRenderService::TakeSurfaceCapture");
361         RSSurfaceCaptureTask task(id, scaleX, scaleY);
362         std::unique_ptr<Media::PixelMap> pixelmap = task.Run();
363         callback->OnSurfaceCapture(id, pixelmap.get());
364         ROSEN_TRACE_END(HITRACE_TAG_GRAPHIC_AGP);
365     };
366     mainThread_->PostTask(captureTask);
367 }
368 
RegisterApplicationAgent(uint32_t pid,sptr<IApplicationAgent> app)369 void RSRenderServiceConnection::RegisterApplicationAgent(uint32_t pid, sptr<IApplicationAgent> app)
370 {
371     auto captureTask = [=]() -> void {
372         mainThread_->RegisterApplicationAgent(pid, app);
373     };
374     mainThread_->PostTask(captureTask);
375 
376     app->AsObject()->AddDeathRecipient(ApplicationDeathRecipient_);
377 }
378 
UnRegisterApplicationAgent(sptr<IApplicationAgent> app)379 void RSRenderServiceConnection::UnRegisterApplicationAgent(sptr<IApplicationAgent> app)
380 {
381     auto captureTask = [=]() -> void {
382         RSMainThread::Instance()->UnRegisterApplicationAgent(app);
383     };
384     RSMainThread::Instance()->ScheduleTask(captureTask).wait();
385 }
386 
GetVirtualScreenResolution(ScreenId id)387 RSVirtualScreenResolution RSRenderServiceConnection::GetVirtualScreenResolution(ScreenId id)
388 {
389     RSVirtualScreenResolution virtualScreenResolution;
390     screenManager_->GetVirtualScreenResolution(id, virtualScreenResolution);
391     return virtualScreenResolution;
392 }
393 
GetScreenActiveMode(ScreenId id)394 RSScreenModeInfo RSRenderServiceConnection::GetScreenActiveMode(ScreenId id)
395 {
396     RSScreenModeInfo screenModeInfo;
397     mainThread_->ScheduleTask([=, &screenModeInfo]() {
398         return screenManager_->GetScreenActiveMode(id, screenModeInfo);
399     }).wait();
400     return screenModeInfo;
401 }
402 
GetScreenSupportedModes(ScreenId id)403 std::vector<RSScreenModeInfo> RSRenderServiceConnection::GetScreenSupportedModes(ScreenId id)
404 {
405     return mainThread_->ScheduleTask([=]() {
406         return screenManager_->GetScreenSupportedModes(id);
407     }).get();
408 }
409 
GetScreenCapability(ScreenId id)410 RSScreenCapability RSRenderServiceConnection::GetScreenCapability(ScreenId id)
411 {
412     RSScreenCapability screenCapability;
413     return mainThread_->ScheduleTask([=]() {
414         return screenManager_->GetScreenCapability(id);
415     }).get();
416 }
417 
GetScreenPowerStatus(ScreenId id)418 ScreenPowerStatus RSRenderServiceConnection::GetScreenPowerStatus(ScreenId id)
419 {
420     return mainThread_->ScheduleTask([=]() {
421         return screenManager_->GetScreenPowerStatus(id);
422     }).get();
423 }
424 
GetScreenData(ScreenId id)425 RSScreenData RSRenderServiceConnection::GetScreenData(ScreenId id)
426 {
427     RSScreenData screenData;
428     return mainThread_->ScheduleTask([=]() {
429         return screenManager_->GetScreenData(id);
430     }).get();
431 }
432 
GetScreenBacklight(ScreenId id)433 int32_t RSRenderServiceConnection::GetScreenBacklight(ScreenId id)
434 {
435     return mainThread_->ScheduleTask([=]() {
436         return screenManager_->GetScreenBacklight(id);
437     }).get();
438 }
439 
SetScreenBacklight(ScreenId id,uint32_t level)440 void RSRenderServiceConnection::SetScreenBacklight(ScreenId id, uint32_t level)
441 {
442     mainThread_->ScheduleTask([=]() {
443         screenManager_->SetScreenBacklight(id, level);
444     }).wait();
445 }
446 
RegisterBufferAvailableListener(NodeId id,sptr<RSIBufferAvailableCallback> callback,bool isFromRenderThread)447 void RSRenderServiceConnection::RegisterBufferAvailableListener(
448     NodeId id, sptr<RSIBufferAvailableCallback> callback, bool isFromRenderThread)
449 {
450     auto registerBufferAvailableListener = [id, callback, isFromRenderThread, this]() -> bool {
451         if (auto node = this->mainThread_->GetContext().GetNodeMap().GetRenderNode<RSSurfaceRenderNode>(id)) {
452             node->RegisterBufferAvailableListener(callback, isFromRenderThread);
453             return true;
454         }
455         return false;
456     };
457     if (!registerBufferAvailableListener()) {
458         RS_LOGI("RegisterBufferAvailableListener: node not found, post task to retry");
459         mainThread_->PostTask(registerBufferAvailableListener);
460     }
461 }
462 
GetScreenSupportedColorGamuts(ScreenId id,std::vector<ScreenColorGamut> & mode)463 int32_t RSRenderServiceConnection::GetScreenSupportedColorGamuts(ScreenId id, std::vector<ScreenColorGamut>& mode)
464 {
465     return mainThread_->ScheduleTask([=, &mode]() {
466         return screenManager_->GetScreenSupportedColorGamuts(id, mode);
467     }).get();
468 }
469 
GetScreenSupportedMetaDataKeys(ScreenId id,std::vector<ScreenHDRMetadataKey> & keys)470 int32_t RSRenderServiceConnection::GetScreenSupportedMetaDataKeys(ScreenId id, std::vector<ScreenHDRMetadataKey>& keys)
471 {
472     return mainThread_->ScheduleTask([=, &keys]() {
473         return screenManager_->GetScreenSupportedMetaDataKeys(id, keys);
474     }).get();
475 }
476 
GetScreenColorGamut(ScreenId id,ScreenColorGamut & mode)477 int32_t RSRenderServiceConnection::GetScreenColorGamut(ScreenId id, ScreenColorGamut& mode)
478 {
479     return mainThread_->ScheduleTask([=, &mode]() {
480         return screenManager_->GetScreenColorGamut(id, mode);
481     }).get();
482 }
483 
SetScreenColorGamut(ScreenId id,int32_t modeIdx)484 int32_t RSRenderServiceConnection::SetScreenColorGamut(ScreenId id, int32_t modeIdx)
485 {
486     return mainThread_->ScheduleTask([=]() {
487         return screenManager_->SetScreenColorGamut(id, modeIdx);
488     }).get();
489 }
490 
SetScreenGamutMap(ScreenId id,ScreenGamutMap mode)491 int32_t RSRenderServiceConnection::SetScreenGamutMap(ScreenId id, ScreenGamutMap mode)
492 {
493     return mainThread_->ScheduleTask([=]() {
494         return screenManager_->SetScreenGamutMap(id, mode);
495     }).get();
496 }
497 
GetScreenGamutMap(ScreenId id,ScreenGamutMap & mode)498 int32_t RSRenderServiceConnection::GetScreenGamutMap(ScreenId id, ScreenGamutMap& mode)
499 {
500     return mainThread_->ScheduleTask([=, &mode]() {
501         return screenManager_->GetScreenGamutMap(id, mode);
502     }).get();
503 }
504 
GetScreenHDRCapability(ScreenId id,RSScreenHDRCapability & screenHdrCapability)505 int32_t RSRenderServiceConnection::GetScreenHDRCapability(ScreenId id, RSScreenHDRCapability& screenHdrCapability)
506 {
507     std::lock_guard<std::mutex> lock(mutex_);
508     return screenManager_->GetScreenHDRCapability(id, screenHdrCapability);
509 }
510 
GetScreenType(ScreenId id,RSScreenType & screenType)511 int32_t RSRenderServiceConnection::GetScreenType(ScreenId id, RSScreenType& screenType)
512 {
513     std::lock_guard<std::mutex> lock(mutex_);
514     return screenManager_->GetScreenType(id, screenType);
515 }
516 
SetScreenSkipFrameInterval(ScreenId id,uint32_t skipFrameInterval)517 int32_t RSRenderServiceConnection::SetScreenSkipFrameInterval(ScreenId id, uint32_t skipFrameInterval)
518 {
519     return mainThread_->ScheduleTask([=]() {
520         return screenManager_->SetScreenSkipFrameInterval(id, skipFrameInterval);
521     }).get();
522 }
523 
RegisterOcclusionChangeCallback(sptr<RSIOcclusionChangeCallback> callback)524 int32_t RSRenderServiceConnection::RegisterOcclusionChangeCallback(sptr<RSIOcclusionChangeCallback> callback)
525 {
526     std::lock_guard<std::mutex> lock(mutex_);
527     if (!callback) {
528         RS_LOGD("RSRenderServiceConnection::RegisterOcclusionChangeCallback: callback is nullptr");
529         return StatusCode::INVALID_ARGUMENTS;
530     }
531     mainThread_->RegisterOcclusionChangeCallback(callback);
532     return StatusCode::SUCCESS;
533 }
534 
UnRegisterOcclusionChangeCallback(sptr<RSIOcclusionChangeCallback> callback)535 int32_t RSRenderServiceConnection::UnRegisterOcclusionChangeCallback(sptr<RSIOcclusionChangeCallback> callback)
536 {
537     std::lock_guard<std::mutex> lock(mutex_);
538     if (!callback) {
539         RS_LOGD("RSRenderServiceConnection::UnRegisterOcclusionChangeCallback: callback is nullptr");
540         return StatusCode::INVALID_ARGUMENTS;
541     }
542     mainThread_->UnRegisterOcclusionChangeCallback(callback);
543     return StatusCode::SUCCESS;
544 }
545 
SetAppWindowNum(uint32_t num)546 void RSRenderServiceConnection::SetAppWindowNum(uint32_t num)
547 {
548     auto task = [this, num]() -> void {
549         mainThread_->SetAppWindowNum(num);
550     };
551     mainThread_->PostTask(task);
552 }
553 } // namespace Rosen
554 } // namespace OHOS
555