• 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 "transaction/rs_render_service_client.h"
17 #include "surface_type.h"
18 #include "surface_utils.h"
19 
20 #include "backend/rs_surface_ohos_gl.h"
21 #include "backend/rs_surface_ohos_raster.h"
22 #ifdef RS_ENABLE_VK
23 #include "backend/rs_surface_ohos_vulkan.h"
24 #endif
25 
26 #include "command/rs_command.h"
27 #include "command/rs_node_showing_command.h"
28 #include "ipc_callbacks/rs_surface_occlusion_change_callback_stub.h"
29 #include "ipc_callbacks/screen_change_callback_stub.h"
30 #include "ipc_callbacks/rs_surface_buffer_callback_stub.h"
31 #include "ipc_callbacks/surface_capture_callback_stub.h"
32 #include "ipc_callbacks/buffer_available_callback_stub.h"
33 #include "ipc_callbacks/buffer_clear_callback_stub.h"
34 #include "ipc_callbacks/hgm_config_change_callback_stub.h"
35 #include "ipc_callbacks/rs_occlusion_change_callback_stub.h"
36 #include "ipc_callbacks/rs_uiextension_callback_stub.h"
37 #include "platform/common/rs_log.h"
38 #include "platform/common/rs_system_properties.h"
39 #ifdef NEW_RENDER_CONTEXT
40 #include "render_backend/rs_surface_factory.h"
41 #endif
42 #include "render/rs_typeface_cache.h"
43 #include "rs_render_service_connect_hub.h"
44 #include "rs_surface_ohos.h"
45 #include "vsync_iconnection_token.h"
46 
47 namespace OHOS {
48 namespace Rosen {
CreateRenderServiceClient()49 std::shared_ptr<RSIRenderClient> RSIRenderClient::CreateRenderServiceClient()
50 {
51     static std::shared_ptr<RSIRenderClient> client = std::make_shared<RSRenderServiceClient>();
52     return client;
53 }
54 
CommitTransaction(std::unique_ptr<RSTransactionData> & transactionData)55 void RSRenderServiceClient::CommitTransaction(std::unique_ptr<RSTransactionData>& transactionData)
56 {
57     auto renderService = RSRenderServiceConnectHub::GetRenderService();
58     if (renderService != nullptr) {
59         renderService->CommitTransaction(transactionData);
60     } else {
61         RS_LOGE_LIMIT(__func__, __line__, "RSRenderServiceClient::CommitTransaction failed, renderService is nullptr");
62     }
63 }
64 
ExecuteSynchronousTask(const std::shared_ptr<RSSyncTask> & task)65 void RSRenderServiceClient::ExecuteSynchronousTask(const std::shared_ptr<RSSyncTask>& task)
66 {
67     if (task == nullptr) {
68         return;
69     }
70 
71     auto renderService = RSRenderServiceConnectHub::GetRenderService();
72     if (renderService != nullptr) {
73         renderService->ExecuteSynchronousTask(task);
74     }
75 }
76 
GetUniRenderEnabled()77 bool RSRenderServiceClient::GetUniRenderEnabled()
78 {
79     auto renderService = RSRenderServiceConnectHub::GetRenderService();
80     if (renderService == nullptr) {
81         return false;
82     }
83     return renderService->GetUniRenderEnabled();
84 }
85 
GetMemoryGraphic(int pid)86 MemoryGraphic RSRenderServiceClient::GetMemoryGraphic(int pid)
87 {
88     auto renderService = RSRenderServiceConnectHub::GetRenderService();
89     if (renderService == nullptr) {
90         return MemoryGraphic {};
91     }
92     return renderService->GetMemoryGraphic(pid);
93 }
94 
GetMemoryGraphics()95 std::vector<MemoryGraphic> RSRenderServiceClient::GetMemoryGraphics()
96 {
97     auto renderService = RSRenderServiceConnectHub::GetRenderService();
98     if (renderService == nullptr) {
99         return {};
100     }
101     return renderService->GetMemoryGraphics();
102 }
103 
GetTotalAppMemSize(float & cpuMemSize,float & gpuMemSize)104 bool RSRenderServiceClient::GetTotalAppMemSize(float& cpuMemSize, float& gpuMemSize)
105 {
106     auto renderService = RSRenderServiceConnectHub::GetRenderService();
107     if (renderService == nullptr) {
108         return false;
109     }
110     return renderService->GetTotalAppMemSize(cpuMemSize, gpuMemSize);
111 }
112 
CreateNode(const RSDisplayNodeConfig & displayNodeConfig,NodeId nodeId)113 bool RSRenderServiceClient::CreateNode(const RSDisplayNodeConfig& displayNodeConfig, NodeId nodeId)
114 {
115     auto renderService = RSRenderServiceConnectHub::GetRenderService();
116     if (renderService == nullptr) {
117         return false;
118     }
119     return renderService->CreateNode(displayNodeConfig, nodeId);
120 }
121 
CreateNode(const RSSurfaceRenderNodeConfig & config)122 bool RSRenderServiceClient::CreateNode(const RSSurfaceRenderNodeConfig& config)
123 {
124     auto renderService = RSRenderServiceConnectHub::GetRenderService();
125     if (renderService == nullptr) {
126         return false;
127     }
128     return renderService->CreateNode(config);
129 }
130 
131 #ifdef NEW_RENDER_CONTEXT
CreateNodeAndSurface(const RSSurfaceRenderNodeConfig & config)132 std::shared_ptr<RSRenderSurface> RSRenderServiceClient::CreateNodeAndSurface(const RSSurfaceRenderNodeConfig& config)
133 #else
134 std::shared_ptr<RSSurface> RSRenderServiceClient::CreateNodeAndSurface(const RSSurfaceRenderNodeConfig& config)
135 #endif
136 {
137     auto renderService = RSRenderServiceConnectHub::GetRenderService();
138     if (renderService == nullptr) {
139         return nullptr;
140     }
141     sptr<Surface> surface = renderService->CreateNodeAndSurface(config);
142     return CreateRSSurface(surface);
143 }
144 
145 #if defined(NEW_RENDER_CONTEXT)
CreateRSSurface(const sptr<Surface> & surface)146 std::shared_ptr<RSRenderSurface> RSRenderServiceClient::CreateRSSurface(const sptr<Surface> &surface)
147 {
148     std::shared_ptr<RSRenderSurface> producer = RSSurfaceFactory::CreateRSSurface(PlatformName::OHOS, surface);
149     return producer;
150 }
151 #else
CreateRSSurface(const sptr<Surface> & surface)152 std::shared_ptr<RSSurface> RSRenderServiceClient::CreateRSSurface(const sptr<Surface> &surface)
153 {
154 #if defined (ACE_ENABLE_VK)
155     if (RSSystemProperties::IsUseVulkan()) {
156         return std::make_shared<RSSurfaceOhosVulkan>(surface); // GPU render
157     }
158 #endif
159 
160 #if defined (ACE_ENABLE_GL)
161     if (RSSystemProperties::GetGpuApiType() == Rosen::GpuApiType::OPENGL) {
162         return std::make_shared<RSSurfaceOhosGl>(surface); // GPU render
163     }
164 #endif
165     return std::make_shared<RSSurfaceOhosRaster>(surface); // CPU render
166 }
167 #endif
168 
CreateVSyncReceiver(const std::string & name,const std::shared_ptr<OHOS::AppExecFwk::EventHandler> & looper,uint64_t id,NodeId windowNodeId)169 std::shared_ptr<VSyncReceiver> RSRenderServiceClient::CreateVSyncReceiver(
170     const std::string& name,
171     const std::shared_ptr<OHOS::AppExecFwk::EventHandler> &looper,
172     uint64_t id,
173     NodeId windowNodeId)
174 {
175     ROSEN_LOGD("RSRenderServiceClient::CreateVSyncReceiver Start");
176     auto renderService = RSRenderServiceConnectHub::GetRenderService();
177     if (renderService == nullptr) {
178         return nullptr;
179     }
180     sptr<VSyncIConnectionToken> token = new IRemoteStub<VSyncIConnectionToken>();
181     sptr<IVSyncConnection> conn = renderService->CreateVSyncConnection(name, token, id, windowNodeId);
182     if (conn == nullptr) {
183         ROSEN_LOGE("RSRenderServiceClient::CreateVSyncReceiver Failed");
184         return nullptr;
185     }
186     return std::make_shared<VSyncReceiver>(conn, token->AsObject(), looper, name);
187 }
188 
CreatePixelMapFromSurfaceId(uint64_t surfaceId,const Rect & srcRect)189 std::shared_ptr<Media::PixelMap> RSRenderServiceClient::CreatePixelMapFromSurfaceId(uint64_t surfaceId,
190     const Rect &srcRect)
191 {
192     auto renderService = RSRenderServiceConnectHub::GetRenderService();
193     if (renderService == nullptr) {
194         return nullptr;
195     }
196     sptr<Surface> surface = SurfaceUtils::GetInstance()->GetSurface(surfaceId);
197     if (surface == nullptr) {
198         return nullptr;
199     }
200 
201     return renderService->CreatePixelMapFromSurface(surface, srcRect);
202 }
203 
TriggerSurfaceCaptureCallback(NodeId id,std::shared_ptr<Media::PixelMap> pixelmap)204 void RSRenderServiceClient::TriggerSurfaceCaptureCallback(NodeId id, std::shared_ptr<Media::PixelMap> pixelmap)
205 {
206     ROSEN_LOGD("RSRenderServiceClient::Into TriggerSurfaceCaptureCallback nodeId:[%{public}" PRIu64 "]", id);
207     std::vector<std::shared_ptr<SurfaceCaptureCallback>> callbackVector;
208     {
209         std::lock_guard<std::mutex> lock(mutex_);
210         auto iter = surfaceCaptureCbMap_.find(id);
211         if (iter != surfaceCaptureCbMap_.end()) {
212             callbackVector = iter->second;
213             surfaceCaptureCbMap_.erase(iter);
214         }
215     }
216     if (callbackVector.empty()) {
217         ROSEN_LOGE("RSRenderServiceClient::TriggerSurfaceCaptureCallback: callbackVector is empty!");
218         return;
219     }
220     for (decltype(callbackVector.size()) i = 0; i < callbackVector.size(); ++i) {
221         if (callbackVector[i] == nullptr) {
222             ROSEN_LOGE("RSRenderServiceClient::TriggerSurfaceCaptureCallback: callback is nullptr!");
223             continue;
224         }
225         std::shared_ptr<Media::PixelMap> surfaceCapture = pixelmap;
226         if (UNLIKELY(RSSystemProperties::GetPixelmapDfxEnabled()) || (i != callbackVector.size() - 1)) {
227             if (pixelmap != nullptr) {
228                 Media::InitializationOptions options;
229                 std::unique_ptr<Media::PixelMap> pixelmapCopy = Media::PixelMap::Create(*pixelmap, options);
230                 surfaceCapture = std::move(pixelmapCopy);
231             }
232         }
233         callbackVector[i]->OnSurfaceCapture(surfaceCapture);
234     }
235 }
236 
237 class SurfaceCaptureCallbackDirector : public RSSurfaceCaptureCallbackStub
238 {
239 public:
SurfaceCaptureCallbackDirector(RSRenderServiceClient * client)240     explicit SurfaceCaptureCallbackDirector(RSRenderServiceClient* client) : client_(client) {}
~SurfaceCaptureCallbackDirector()241     ~SurfaceCaptureCallbackDirector() override {};
OnSurfaceCapture(NodeId id,Media::PixelMap * pixelmap)242     void OnSurfaceCapture(NodeId id, Media::PixelMap* pixelmap) override
243     {
244         std::shared_ptr<Media::PixelMap> surfaceCapture(pixelmap);
245         client_->TriggerSurfaceCaptureCallback(id, surfaceCapture);
246     };
247 
248 private:
249     RSRenderServiceClient* client_;
250 };
251 
TakeSurfaceCapture(NodeId id,std::shared_ptr<SurfaceCaptureCallback> callback,const RSSurfaceCaptureConfig & captureConfig)252 bool RSRenderServiceClient::TakeSurfaceCapture(NodeId id, std::shared_ptr<SurfaceCaptureCallback> callback,
253     const RSSurfaceCaptureConfig& captureConfig)
254 {
255     auto renderService = RSRenderServiceConnectHub::GetRenderService();
256     if (renderService == nullptr) {
257         ROSEN_LOGE("RSRenderServiceClient::TakeSurfaceCapture renderService == nullptr!");
258         return false;
259     }
260     if (callback == nullptr) {
261         ROSEN_LOGE("RSRenderServiceClient::TakeSurfaceCapture callback == nullptr!");
262         return false;
263     }
264     {
265         std::lock_guard<std::mutex> lock(mutex_);
266         auto iter = surfaceCaptureCbMap_.find(id);
267         if (iter != surfaceCaptureCbMap_.end()) {
268             ROSEN_LOGW("RSRenderServiceClient::TakeSurfaceCapture surfaceCaptureCbMap_.count(id) != 0");
269             iter->second.emplace_back(callback);
270             return true;
271         }
272         std::vector<std::shared_ptr<SurfaceCaptureCallback>> callbackVector = {callback};
273         surfaceCaptureCbMap_.emplace(id, callbackVector);
274     }
275 
276     if (surfaceCaptureCbDirector_ == nullptr) {
277         surfaceCaptureCbDirector_ = new SurfaceCaptureCallbackDirector(this);
278     }
279     renderService->TakeSurfaceCapture(id, surfaceCaptureCbDirector_, captureConfig);
280     return true;
281 }
282 
SetFocusAppInfo(int32_t pid,int32_t uid,const std::string & bundleName,const std::string & abilityName,uint64_t focusNodeId)283 int32_t RSRenderServiceClient::SetFocusAppInfo(
284     int32_t pid, int32_t uid, const std::string &bundleName, const std::string &abilityName, uint64_t focusNodeId)
285 {
286     auto renderService = RSRenderServiceConnectHub::GetRenderService();
287     if (renderService == nullptr) {
288         return RENDER_SERVICE_NULL;
289     }
290 
291     return renderService->SetFocusAppInfo(pid, uid, bundleName, abilityName, focusNodeId);
292 }
293 
GetDefaultScreenId()294 ScreenId RSRenderServiceClient::GetDefaultScreenId()
295 {
296     auto renderService = RSRenderServiceConnectHub::GetRenderService();
297     if (renderService == nullptr) {
298         return INVALID_SCREEN_ID;
299     }
300 
301     return renderService->GetDefaultScreenId();
302 }
303 
GetActiveScreenId()304 ScreenId RSRenderServiceClient::GetActiveScreenId()
305 {
306     auto renderService = RSRenderServiceConnectHub::GetRenderService();
307     if (renderService == nullptr) {
308         return INVALID_SCREEN_ID;
309     }
310 
311     return renderService->GetActiveScreenId();
312 }
313 
GetAllScreenIds()314 std::vector<ScreenId> RSRenderServiceClient::GetAllScreenIds()
315 {
316     auto renderService = RSRenderServiceConnectHub::GetRenderService();
317     if (renderService == nullptr) {
318         return std::vector<ScreenId>();
319     }
320 
321     return renderService->GetAllScreenIds();
322 }
323 
CreateVirtualScreen(const std::string & name,uint32_t width,uint32_t height,sptr<Surface> surface,ScreenId mirrorId,int32_t flags,std::vector<NodeId> whiteList)324 ScreenId RSRenderServiceClient::CreateVirtualScreen(
325     const std::string &name,
326     uint32_t width,
327     uint32_t height,
328     sptr<Surface> surface,
329     ScreenId mirrorId,
330     int32_t flags,
331     std::vector<NodeId> whiteList)
332 {
333     auto renderService = RSRenderServiceConnectHub::GetRenderService();
334     if (renderService == nullptr) {
335         return INVALID_SCREEN_ID;
336     }
337 
338     return renderService->CreateVirtualScreen(name, width, height, surface, mirrorId, flags, whiteList);
339 }
340 
SetVirtualScreenBlackList(ScreenId id,std::vector<NodeId> & blackListVector)341 int32_t RSRenderServiceClient::SetVirtualScreenBlackList(ScreenId id, std::vector<NodeId>& blackListVector)
342 {
343     auto renderService = RSRenderServiceConnectHub::GetRenderService();
344     if (renderService == nullptr) {
345         return RENDER_SERVICE_NULL;
346     }
347 
348     return renderService->SetVirtualScreenBlackList(id, blackListVector);
349 }
350 
AddVirtualScreenBlackList(ScreenId id,std::vector<NodeId> & blackListVector)351 int32_t RSRenderServiceClient::AddVirtualScreenBlackList(ScreenId id, std::vector<NodeId>& blackListVector)
352 {
353     auto renderService = RSRenderServiceConnectHub::GetRenderService();
354     if (renderService == nullptr) {
355         return RENDER_SERVICE_NULL;
356     }
357 
358     return renderService->AddVirtualScreenBlackList(id, blackListVector);
359 }
360 
RemoveVirtualScreenBlackList(ScreenId id,std::vector<NodeId> & blackListVector)361 int32_t RSRenderServiceClient::RemoveVirtualScreenBlackList(ScreenId id, std::vector<NodeId>& blackListVector)
362 {
363     auto renderService = RSRenderServiceConnectHub::GetRenderService();
364     if (renderService == nullptr) {
365         return RENDER_SERVICE_NULL;
366     }
367 
368     return renderService->RemoveVirtualScreenBlackList(id, blackListVector);
369 }
370 
SetVirtualScreenSecurityExemptionList(ScreenId id,const std::vector<NodeId> & securityExemptionList)371 int32_t RSRenderServiceClient::SetVirtualScreenSecurityExemptionList(
372     ScreenId id,
373     const std::vector<NodeId>& securityExemptionList)
374 {
375     auto renderService = RSRenderServiceConnectHub::GetRenderService();
376     if (renderService == nullptr) {
377         return RENDER_SERVICE_NULL;
378     }
379 
380     return renderService->SetVirtualScreenSecurityExemptionList(id, securityExemptionList);
381 }
382 
SetCastScreenEnableSkipWindow(ScreenId id,bool enable)383 int32_t RSRenderServiceClient::SetCastScreenEnableSkipWindow(ScreenId id, bool enable)
384 {
385     auto renderService = RSRenderServiceConnectHub::GetRenderService();
386     if (renderService == nullptr) {
387         return RENDER_SERVICE_NULL;
388     }
389 
390     return renderService->SetCastScreenEnableSkipWindow(id, enable);
391 }
392 
SetVirtualScreenSurface(ScreenId id,sptr<Surface> surface)393 int32_t RSRenderServiceClient::SetVirtualScreenSurface(ScreenId id, sptr<Surface> surface)
394 {
395     auto renderService = RSRenderServiceConnectHub::GetRenderService();
396     if (renderService == nullptr) {
397         return RENDER_SERVICE_NULL;
398     }
399 
400     return renderService->SetVirtualScreenSurface(id, surface);
401 }
402 
RemoveVirtualScreen(ScreenId id)403 void RSRenderServiceClient::RemoveVirtualScreen(ScreenId id)
404 {
405     auto renderService = RSRenderServiceConnectHub::GetRenderService();
406     if (renderService == nullptr) {
407         return;
408     }
409 
410     renderService->RemoveVirtualScreen(id);
411 }
412 
413 class CustomScreenChangeCallback : public RSScreenChangeCallbackStub
414 {
415 public:
CustomScreenChangeCallback(const ScreenChangeCallback & callback)416     explicit CustomScreenChangeCallback(const ScreenChangeCallback &callback) : cb_(callback) {}
~CustomScreenChangeCallback()417     ~CustomScreenChangeCallback() override {};
418 
OnScreenChanged(ScreenId id,ScreenEvent event)419     void OnScreenChanged(ScreenId id, ScreenEvent event) override
420     {
421         if (cb_ != nullptr) {
422             cb_(id, event);
423         }
424     }
425 
426 private:
427     ScreenChangeCallback cb_;
428 };
429 
SetScreenChangeCallback(const ScreenChangeCallback & callback)430 int32_t RSRenderServiceClient::SetScreenChangeCallback(const ScreenChangeCallback &callback)
431 {
432     auto renderService = RSRenderServiceConnectHub::GetRenderService();
433     if (renderService == nullptr) {
434         return RENDER_SERVICE_NULL;
435     }
436 
437     screenChangeCb_ = new CustomScreenChangeCallback(callback);
438     return renderService->SetScreenChangeCallback(screenChangeCb_);
439 }
440 
SetScreenActiveMode(ScreenId id,uint32_t modeId)441 void RSRenderServiceClient::SetScreenActiveMode(ScreenId id, uint32_t modeId)
442 {
443     auto renderService = RSRenderServiceConnectHub::GetRenderService();
444     if (renderService == nullptr) {
445         return;
446     }
447 
448     renderService->SetScreenActiveMode(id, modeId);
449 }
450 
SetScreenRefreshRate(ScreenId id,int32_t sceneId,int32_t rate)451 void RSRenderServiceClient::SetScreenRefreshRate(ScreenId id, int32_t sceneId, int32_t rate)
452 {
453     auto renderService = RSRenderServiceConnectHub::GetRenderService();
454     if (renderService == nullptr) {
455         ROSEN_LOGW("RSRenderServiceClient renderService == nullptr!");
456         return;
457     }
458 
459     renderService->SetScreenRefreshRate(id, sceneId, rate);
460 }
461 
SetRefreshRateMode(int32_t refreshRateMode)462 void RSRenderServiceClient::SetRefreshRateMode(int32_t refreshRateMode)
463 {
464     auto renderService = RSRenderServiceConnectHub::GetRenderService();
465     if (renderService == nullptr) {
466         ROSEN_LOGW("RSRenderServiceClient renderService == nullptr!");
467         return;
468     }
469 
470     renderService->SetRefreshRateMode(refreshRateMode);
471 }
472 
SyncFrameRateRange(FrameRateLinkerId id,const FrameRateRange & range,int32_t animatorExpectedFrameRate)473 void RSRenderServiceClient::SyncFrameRateRange(FrameRateLinkerId id,
474     const FrameRateRange& range, int32_t animatorExpectedFrameRate)
475 {
476     auto renderService = RSRenderServiceConnectHub::GetRenderService();
477     if (renderService == nullptr) {
478         ROSEN_LOGW("RSRenderServiceClient renderService == nullptr!");
479         return;
480     }
481 
482     return renderService->SyncFrameRateRange(id, range, animatorExpectedFrameRate);
483 }
484 
UnregisterFrameRateLinker(FrameRateLinkerId id)485 void RSRenderServiceClient::UnregisterFrameRateLinker(FrameRateLinkerId id)
486 {
487     auto renderService = RSRenderServiceConnectHub::GetRenderService();
488     if (renderService == nullptr) {
489         ROSEN_LOGW("RSRenderServiceClient renderService == nullptr!");
490         return;
491     }
492     renderService->UnregisterFrameRateLinker(id);
493 }
494 
GetScreenCurrentRefreshRate(ScreenId id)495 uint32_t RSRenderServiceClient::GetScreenCurrentRefreshRate(ScreenId id)
496 {
497     auto renderService = RSRenderServiceConnectHub::GetRenderService();
498     if (renderService == nullptr) {
499         ROSEN_LOGW("RSRenderServiceClient renderService == nullptr!");
500         return RENDER_SERVICE_NULL;
501     }
502 
503     return renderService->GetScreenCurrentRefreshRate(id);
504 }
505 
GetCurrentRefreshRateMode()506 int32_t RSRenderServiceClient::GetCurrentRefreshRateMode()
507 {
508     auto renderService = RSRenderServiceConnectHub::GetRenderService();
509     if (renderService == nullptr) {
510         ROSEN_LOGW("RSRenderServiceClient renderService == nullptr!");
511         return RENDER_SERVICE_NULL;
512     }
513 
514     return renderService->GetCurrentRefreshRateMode();
515 }
516 
GetScreenSupportedRefreshRates(ScreenId id)517 std::vector<int32_t> RSRenderServiceClient::GetScreenSupportedRefreshRates(ScreenId id)
518 {
519     auto renderService = RSRenderServiceConnectHub::GetRenderService();
520     if (renderService == nullptr) {
521         ROSEN_LOGW("RSRenderServiceClient renderService == nullptr!");
522         return {};
523     }
524 
525     return renderService->GetScreenSupportedRefreshRates(id);
526 }
527 
GetShowRefreshRateEnabled()528 bool RSRenderServiceClient::GetShowRefreshRateEnabled()
529 {
530     auto renderService = RSRenderServiceConnectHub::GetRenderService();
531     if (renderService == nullptr) {
532         ROSEN_LOGW("RSRenderServiceClient renderService == nullptr!");
533         return false;
534     }
535 
536     return renderService->GetShowRefreshRateEnabled();
537 }
538 
GetRefreshInfo(pid_t pid)539 std::string RSRenderServiceClient::GetRefreshInfo(pid_t pid)
540 {
541     auto renderService = RSRenderServiceConnectHub::GetRenderService();
542     if (renderService == nullptr) {
543         ROSEN_LOGW("RSRenderServiceClient renderService == nullptr!");
544         return "";
545     }
546     return renderService->GetRefreshInfo(pid);
547 }
548 
SetShowRefreshRateEnabled(bool enable)549 void RSRenderServiceClient::SetShowRefreshRateEnabled(bool enable)
550 {
551     auto renderService = RSRenderServiceConnectHub::GetRenderService();
552     if (renderService == nullptr) {
553         ROSEN_LOGW("RSRenderServiceClient renderService == nullptr!");
554         return;
555     }
556 
557     return renderService->SetShowRefreshRateEnabled(enable);
558 }
559 
SetVirtualScreenResolution(ScreenId id,uint32_t width,uint32_t height)560 int32_t RSRenderServiceClient::SetVirtualScreenResolution(ScreenId id, uint32_t width, uint32_t height)
561 {
562     auto renderService = RSRenderServiceConnectHub::GetRenderService();
563     if (renderService == nullptr) {
564         ROSEN_LOGE("RSRenderServiceClient::SetVirtualScreenResolution renderService == nullptr!");
565         return RENDER_SERVICE_NULL;
566     }
567 
568     return renderService->SetVirtualScreenResolution(id, width, height);
569 }
570 
GetVirtualScreenResolution(ScreenId id)571 RSVirtualScreenResolution RSRenderServiceClient::GetVirtualScreenResolution(ScreenId id)
572 {
573     auto renderService = RSRenderServiceConnectHub::GetRenderService();
574     if (renderService == nullptr) {
575         return RSVirtualScreenResolution {}; // return empty RSVirtualScreenResolution.
576     }
577 
578     return renderService->GetVirtualScreenResolution(id);
579 }
580 
MarkPowerOffNeedProcessOneFrame()581 void RSRenderServiceClient::MarkPowerOffNeedProcessOneFrame()
582 {
583     auto renderService = RSRenderServiceConnectHub::GetRenderService();
584     if (renderService == nullptr) {
585         return;
586     }
587 
588     renderService->MarkPowerOffNeedProcessOneFrame();
589 }
590 
DisablePowerOffRenderControl(ScreenId id)591 void RSRenderServiceClient::DisablePowerOffRenderControl(ScreenId id)
592 {
593     auto renderService = RSRenderServiceConnectHub::GetRenderService();
594     if (renderService == nullptr) {
595         return;
596     }
597 
598     renderService->DisablePowerOffRenderControl(id);
599 }
600 
SetScreenPowerStatus(ScreenId id,ScreenPowerStatus status)601 void RSRenderServiceClient::SetScreenPowerStatus(ScreenId id, ScreenPowerStatus status)
602 {
603     auto renderService = RSRenderServiceConnectHub::GetRenderService();
604     if (renderService == nullptr) {
605         return;
606     }
607 
608     renderService->SetScreenPowerStatus(id, status);
609 }
610 
GetScreenActiveMode(ScreenId id)611 RSScreenModeInfo RSRenderServiceClient::GetScreenActiveMode(ScreenId id)
612 {
613     auto renderService = RSRenderServiceConnectHub::GetRenderService();
614     if (renderService == nullptr) {
615         return RSScreenModeInfo {}; // return empty RSScreenModeInfo.
616     }
617 
618     return renderService->GetScreenActiveMode(id);
619 }
620 
GetScreenSupportedModes(ScreenId id)621 std::vector<RSScreenModeInfo> RSRenderServiceClient::GetScreenSupportedModes(ScreenId id)
622 {
623     auto renderService = RSRenderServiceConnectHub::GetRenderService();
624     if (renderService == nullptr) {
625         return {};
626     }
627 
628     return renderService->GetScreenSupportedModes(id);
629 }
630 
GetScreenCapability(ScreenId id)631 RSScreenCapability RSRenderServiceClient::GetScreenCapability(ScreenId id)
632 {
633     auto renderService = RSRenderServiceConnectHub::GetRenderService();
634     if (renderService == nullptr) {
635         return RSScreenCapability {};
636     }
637 
638     return renderService->GetScreenCapability(id);
639 }
640 
GetScreenPowerStatus(ScreenId id)641 ScreenPowerStatus RSRenderServiceClient::GetScreenPowerStatus(ScreenId id)
642 {
643     auto renderService = RSRenderServiceConnectHub::GetRenderService();
644     if (renderService == nullptr) {
645         return ScreenPowerStatus::INVALID_POWER_STATUS;
646     }
647 
648     return renderService->GetScreenPowerStatus(id);
649 }
650 
GetScreenData(ScreenId id)651 RSScreenData RSRenderServiceClient::GetScreenData(ScreenId id)
652 {
653     auto renderService = RSRenderServiceConnectHub::GetRenderService();
654     if (renderService == nullptr) {
655         return RSScreenData {};
656     }
657 
658     return renderService->GetScreenData(id);
659 }
660 
GetScreenBacklight(ScreenId id)661 int32_t RSRenderServiceClient::GetScreenBacklight(ScreenId id)
662 {
663     auto renderService = RSRenderServiceConnectHub::GetRenderService();
664     if (renderService == nullptr) {
665         return INVALID_BACKLIGHT_VALUE;
666     }
667 
668     return renderService->GetScreenBacklight(id);
669 }
670 
SetScreenBacklight(ScreenId id,uint32_t level)671 void RSRenderServiceClient::SetScreenBacklight(ScreenId id, uint32_t level)
672 {
673     auto renderService = RSRenderServiceConnectHub::GetRenderService();
674     if (renderService == nullptr) {
675         return;
676     }
677 
678     renderService->SetScreenBacklight(id, level);
679 }
680 
681 class CustomBufferAvailableCallback : public RSBufferAvailableCallbackStub
682 {
683 public:
CustomBufferAvailableCallback(const BufferAvailableCallback & callback)684     explicit CustomBufferAvailableCallback(const BufferAvailableCallback &callback) : cb_(callback) {}
~CustomBufferAvailableCallback()685     ~CustomBufferAvailableCallback() override {};
686 
OnBufferAvailable()687     void OnBufferAvailable() override
688     {
689         if (cb_ != nullptr) {
690             cb_();
691         }
692     }
693 
694 private:
695     BufferAvailableCallback cb_;
696 };
697 
698 class CustomBufferClearCallback : public RSBufferClearCallbackStub
699 {
700 public:
CustomBufferClearCallback(const BufferClearCallback & callback)701     explicit CustomBufferClearCallback(const BufferClearCallback &callback) : cb_(callback) {}
~CustomBufferClearCallback()702     ~CustomBufferClearCallback() override {};
703 
OnBufferClear()704     void OnBufferClear() override
705     {
706         if (cb_ != nullptr) {
707             cb_();
708         }
709     }
710 
711 private:
712     BufferClearCallback cb_;
713 };
714 
RegisterBufferAvailableListener(NodeId id,const BufferAvailableCallback & callback,bool isFromRenderThread)715 bool RSRenderServiceClient::RegisterBufferAvailableListener(
716     NodeId id, const BufferAvailableCallback &callback, bool isFromRenderThread)
717 {
718     auto renderService = RSRenderServiceConnectHub::GetRenderService();
719     if (renderService == nullptr) {
720         return false;
721     }
722 
723     auto iter = isFromRenderThread ? bufferAvailableCbRTMap_.find(id) : bufferAvailableCbUIMap_.find(id);
724     if (isFromRenderThread && iter != bufferAvailableCbRTMap_.end()) {
725         ROSEN_LOGW("RSRenderServiceClient::RegisterBufferAvailableListener "
726                    "Node %{public}" PRIu64 " already, bufferAvailableCbRTMap_", iter->first);
727     }
728 
729     if (!isFromRenderThread && iter != bufferAvailableCbUIMap_.end()) {
730         ROSEN_LOGW("RSRenderServiceClient::RegisterBufferAvailableListener "
731                    "Node %{public}" PRIu64 " already, bufferAvailableCbUIMap_", iter->first);
732         bufferAvailableCbUIMap_.erase(iter);
733     }
734 
735     sptr<RSIBufferAvailableCallback> bufferAvailableCb = new CustomBufferAvailableCallback(callback);
736     renderService->RegisterBufferAvailableListener(id, bufferAvailableCb, isFromRenderThread);
737     if (isFromRenderThread) {
738         bufferAvailableCbRTMap_.emplace(id, bufferAvailableCb);
739     } else {
740         std::lock_guard<std::mutex> lock(mapMutex_);
741         bufferAvailableCbUIMap_.emplace(id, bufferAvailableCb);
742     }
743     return true;
744 }
745 
RegisterBufferClearListener(NodeId id,const BufferClearCallback & callback)746 bool RSRenderServiceClient::RegisterBufferClearListener(NodeId id, const BufferClearCallback& callback)
747 {
748     auto renderService = RSRenderServiceConnectHub::GetRenderService();
749     if (renderService == nullptr) {
750         return false;
751     }
752     sptr<RSIBufferClearCallback> bufferClearCb = new CustomBufferClearCallback(callback);
753     renderService->RegisterBufferClearListener(id, bufferClearCb);
754     return true;
755 }
756 
757 
UnregisterBufferAvailableListener(NodeId id)758 bool RSRenderServiceClient::UnregisterBufferAvailableListener(NodeId id)
759 {
760     auto iter = bufferAvailableCbRTMap_.find(id);
761     if (iter != bufferAvailableCbRTMap_.end()) {
762         bufferAvailableCbRTMap_.erase(iter);
763     } else {
764         ROSEN_LOGD("RSRenderServiceClient::UnregisterBufferAvailableListener "
765                    "Node %{public}" PRIu64 " has not registered RT callback", id);
766     }
767     std::lock_guard<std::mutex> lock(mapMutex_);
768     iter = bufferAvailableCbUIMap_.find(id);
769     if (iter != bufferAvailableCbUIMap_.end()) {
770         bufferAvailableCbUIMap_.erase(iter);
771     } else {
772         ROSEN_LOGD("RSRenderServiceClient::UnregisterBufferAvailableListener "
773                    "Node %{public}" PRIu64 " has not registered UI callback", id);
774     }
775     return true;
776 }
777 
GetScreenSupportedColorGamuts(ScreenId id,std::vector<ScreenColorGamut> & mode)778 int32_t RSRenderServiceClient::GetScreenSupportedColorGamuts(ScreenId id, std::vector<ScreenColorGamut>& mode)
779 {
780     auto renderService = RSRenderServiceConnectHub::GetRenderService();
781     if (renderService == nullptr) {
782         return RENDER_SERVICE_NULL;
783     }
784     return renderService->GetScreenSupportedColorGamuts(id, mode);
785 }
786 
GetScreenSupportedMetaDataKeys(ScreenId id,std::vector<ScreenHDRMetadataKey> & keys)787 int32_t RSRenderServiceClient::GetScreenSupportedMetaDataKeys(ScreenId id, std::vector<ScreenHDRMetadataKey>& keys)
788 {
789     auto renderService = RSRenderServiceConnectHub::GetRenderService();
790     if (renderService == nullptr) {
791         ROSEN_LOGE("RSRenderServiceClient::RequestRotation renderService == nullptr!");
792         return RENDER_SERVICE_NULL;
793     }
794     return renderService->GetScreenSupportedMetaDataKeys(id, keys);
795 }
796 
GetScreenColorGamut(ScreenId id,ScreenColorGamut & mode)797 int32_t RSRenderServiceClient::GetScreenColorGamut(ScreenId id, ScreenColorGamut& mode)
798 {
799     auto renderService = RSRenderServiceConnectHub::GetRenderService();
800     if (renderService == nullptr) {
801         return RENDER_SERVICE_NULL;
802     }
803     return renderService->GetScreenColorGamut(id, mode);
804 }
805 
SetScreenColorGamut(ScreenId id,int32_t modeIdx)806 int32_t RSRenderServiceClient::SetScreenColorGamut(ScreenId id, int32_t modeIdx)
807 {
808     auto renderService = RSRenderServiceConnectHub::GetRenderService();
809     if (renderService == nullptr) {
810         return RENDER_SERVICE_NULL;
811     }
812     return renderService->SetScreenColorGamut(id, modeIdx);
813 }
814 
SetScreenGamutMap(ScreenId id,ScreenGamutMap mode)815 int32_t RSRenderServiceClient::SetScreenGamutMap(ScreenId id, ScreenGamutMap mode)
816 {
817     auto renderService = RSRenderServiceConnectHub::GetRenderService();
818     if (renderService == nullptr) {
819         return RENDER_SERVICE_NULL;
820     }
821     return renderService->SetScreenGamutMap(id, mode);
822 }
823 
SetScreenCorrection(ScreenId id,ScreenRotation screenRotation)824 int32_t RSRenderServiceClient::SetScreenCorrection(ScreenId id, ScreenRotation screenRotation)
825 {
826     auto renderService = RSRenderServiceConnectHub::GetRenderService();
827     if (renderService == nullptr) {
828         return RENDER_SERVICE_NULL;
829     }
830     return renderService->SetScreenCorrection(id, screenRotation);
831 }
832 
SetVirtualMirrorScreenCanvasRotation(ScreenId id,bool canvasRotation)833 bool RSRenderServiceClient::SetVirtualMirrorScreenCanvasRotation(ScreenId id, bool canvasRotation)
834 {
835     auto renderService = RSRenderServiceConnectHub::GetRenderService();
836     if (renderService == nullptr) {
837         ROSEN_LOGE("RSRenderServiceClient::SetVirtualMirrorScreenCanvasRotation: renderService is nullptr");
838         return false;
839     }
840     return renderService->SetVirtualMirrorScreenCanvasRotation(id, canvasRotation);
841 }
842 
SetVirtualMirrorScreenScaleMode(ScreenId id,ScreenScaleMode scaleMode)843 bool RSRenderServiceClient::SetVirtualMirrorScreenScaleMode(ScreenId id, ScreenScaleMode scaleMode)
844 {
845     auto renderService = RSRenderServiceConnectHub::GetRenderService();
846     if (renderService == nullptr) {
847         ROSEN_LOGE("RSRenderServiceClient::SetVirtualMirrorScreenScaleMode: renderService is nullptr");
848         return false;
849     }
850     return renderService->SetVirtualMirrorScreenScaleMode(id, scaleMode);
851 }
852 
SetGlobalDarkColorMode(bool isDark)853 bool RSRenderServiceClient::SetGlobalDarkColorMode(bool isDark)
854 {
855     auto renderService = RSRenderServiceConnectHub::GetRenderService();
856     if (renderService == nullptr) {
857         ROSEN_LOGE("RSRenderServiceClient::SetGlobalDarkColorMode: renderService is nullptr");
858         return false;
859     }
860     return renderService->SetGlobalDarkColorMode(isDark);
861 }
862 
GetScreenGamutMap(ScreenId id,ScreenGamutMap & mode)863 int32_t RSRenderServiceClient::GetScreenGamutMap(ScreenId id, ScreenGamutMap& mode)
864 {
865     auto renderService = RSRenderServiceConnectHub::GetRenderService();
866     if (renderService == nullptr) {
867         return RENDER_SERVICE_NULL;
868     }
869     return renderService->GetScreenGamutMap(id, mode);
870 }
871 
GetScreenHDRCapability(ScreenId id,RSScreenHDRCapability & screenHdrCapability)872 int32_t RSRenderServiceClient::GetScreenHDRCapability(ScreenId id, RSScreenHDRCapability& screenHdrCapability)
873 {
874     auto renderService = RSRenderServiceConnectHub::GetRenderService();
875     if (renderService == nullptr) {
876         ROSEN_LOGE("RSRenderServiceClient::GetScreenHDRCapability renderService == nullptr!");
877         return RENDER_SERVICE_NULL;
878     }
879     return renderService->GetScreenHDRCapability(id, screenHdrCapability);
880 }
881 
GetPixelFormat(ScreenId id,GraphicPixelFormat & pixelFormat)882 int32_t RSRenderServiceClient::GetPixelFormat(ScreenId id, GraphicPixelFormat& pixelFormat)
883 {
884     auto renderService = RSRenderServiceConnectHub::GetRenderService();
885     if (renderService == nullptr) {
886         ROSEN_LOGE("RSRenderServiceClient::GetPixelFormat renderService == nullptr!");
887         return RENDER_SERVICE_NULL;
888     }
889     return renderService->GetPixelFormat(id, pixelFormat);
890 }
891 
SetPixelFormat(ScreenId id,GraphicPixelFormat pixelFormat)892 int32_t RSRenderServiceClient::SetPixelFormat(ScreenId id, GraphicPixelFormat pixelFormat)
893 {
894     auto renderService = RSRenderServiceConnectHub::GetRenderService();
895     if (renderService == nullptr) {
896         ROSEN_LOGE("RSRenderServiceClient::SetPixelFormat renderService == nullptr!");
897         return RENDER_SERVICE_NULL;
898     }
899     return renderService->SetPixelFormat(id, pixelFormat);
900 }
901 
GetScreenSupportedHDRFormats(ScreenId id,std::vector<ScreenHDRFormat> & hdrFormats)902 int32_t RSRenderServiceClient::GetScreenSupportedHDRFormats(ScreenId id, std::vector<ScreenHDRFormat>& hdrFormats)
903 {
904     auto renderService = RSRenderServiceConnectHub::GetRenderService();
905     if (renderService == nullptr) {
906         return RENDER_SERVICE_NULL;
907     }
908     return renderService->GetScreenSupportedHDRFormats(id, hdrFormats);
909 }
910 
GetScreenHDRFormat(ScreenId id,ScreenHDRFormat & hdrFormat)911 int32_t RSRenderServiceClient::GetScreenHDRFormat(ScreenId id, ScreenHDRFormat& hdrFormat)
912 {
913     auto renderService = RSRenderServiceConnectHub::GetRenderService();
914     if (renderService == nullptr) {
915         return RENDER_SERVICE_NULL;
916     }
917     return renderService->GetScreenHDRFormat(id, hdrFormat);
918 }
919 
SetScreenHDRFormat(ScreenId id,int32_t modeIdx)920 int32_t RSRenderServiceClient::SetScreenHDRFormat(ScreenId id, int32_t modeIdx)
921 {
922     auto renderService = RSRenderServiceConnectHub::GetRenderService();
923     if (renderService == nullptr) {
924         return RENDER_SERVICE_NULL;
925     }
926     return renderService->SetScreenHDRFormat(id, modeIdx);
927 }
928 
GetScreenSupportedColorSpaces(ScreenId id,std::vector<GraphicCM_ColorSpaceType> & colorSpaces)929 int32_t RSRenderServiceClient::GetScreenSupportedColorSpaces(
930     ScreenId id, std::vector<GraphicCM_ColorSpaceType>& colorSpaces)
931 {
932     auto renderService = RSRenderServiceConnectHub::GetRenderService();
933     if (renderService == nullptr) {
934         return RENDER_SERVICE_NULL;
935     }
936     return renderService->GetScreenSupportedColorSpaces(id, colorSpaces);
937 }
938 
GetScreenColorSpace(ScreenId id,GraphicCM_ColorSpaceType & colorSpace)939 int32_t RSRenderServiceClient::GetScreenColorSpace(ScreenId id, GraphicCM_ColorSpaceType& colorSpace)
940 {
941     auto renderService = RSRenderServiceConnectHub::GetRenderService();
942     if (renderService == nullptr) {
943         return RENDER_SERVICE_NULL;
944     }
945     return renderService->GetScreenColorSpace(id, colorSpace);
946 }
947 
SetScreenColorSpace(ScreenId id,GraphicCM_ColorSpaceType colorSpace)948 int32_t RSRenderServiceClient::SetScreenColorSpace(ScreenId id, GraphicCM_ColorSpaceType colorSpace)
949 {
950     auto renderService = RSRenderServiceConnectHub::GetRenderService();
951     if (renderService == nullptr) {
952         return RENDER_SERVICE_NULL;
953     }
954     return renderService->SetScreenColorSpace(id, colorSpace);
955 }
956 
GetScreenType(ScreenId id,RSScreenType & screenType)957 int32_t RSRenderServiceClient::GetScreenType(ScreenId id, RSScreenType& screenType)
958 {
959     auto renderService = RSRenderServiceConnectHub::GetRenderService();
960     if (renderService == nullptr) {
961         ROSEN_LOGE("RSRenderServiceClient::GetScreenType renderService == nullptr!");
962         return RENDER_SERVICE_NULL;
963     }
964     return renderService->GetScreenType(id, screenType);
965 }
966 
GetBitmap(NodeId id,Drawing::Bitmap & bitmap)967 bool RSRenderServiceClient::GetBitmap(NodeId id, Drawing::Bitmap& bitmap)
968 {
969     auto renderService = RSRenderServiceConnectHub::GetRenderService();
970     if (renderService == nullptr) {
971         ROSEN_LOGE("RSRenderServiceClient::GetBitmap renderService == nullptr!");
972         return false;
973     }
974     return renderService->GetBitmap(id, bitmap);
975 }
976 
GetPixelmap(NodeId id,std::shared_ptr<Media::PixelMap> pixelmap,const Drawing::Rect * rect,std::shared_ptr<Drawing::DrawCmdList> drawCmdList)977 bool RSRenderServiceClient::GetPixelmap(NodeId id, std::shared_ptr<Media::PixelMap> pixelmap,
978     const Drawing::Rect* rect, std::shared_ptr<Drawing::DrawCmdList> drawCmdList)
979 {
980     auto renderService = RSRenderServiceConnectHub::GetRenderService();
981     if (renderService == nullptr) {
982         ROSEN_LOGE("RSRenderServiceClient::GetPixelmap: renderService is nullptr");
983         return false;
984     }
985     return renderService->GetPixelmap(id, pixelmap, rect, drawCmdList);
986 }
987 
RegisterTypeface(std::shared_ptr<Drawing::Typeface> & typeface)988 bool RSRenderServiceClient::RegisterTypeface(std::shared_ptr<Drawing::Typeface>& typeface)
989 {
990     auto renderService = RSRenderServiceConnectHub::GetRenderService();
991     if (renderService == nullptr) {
992         ROSEN_LOGE("RSRenderServiceClient::RegisterTypeface: renderService is nullptr");
993         return false;
994     }
995     uint64_t globalUniqueId = RSTypefaceCache::GenGlobalUniqueId(typeface->GetUniqueID());
996     ROSEN_LOGD("RSRenderServiceClient::RegisterTypeface: pid[%{public}d] register typface[%{public}u]",
997         RSTypefaceCache::GetTypefacePid(globalUniqueId), RSTypefaceCache::GetTypefaceId(globalUniqueId));
998     return renderService->RegisterTypeface(globalUniqueId, typeface);
999 }
1000 
UnRegisterTypeface(std::shared_ptr<Drawing::Typeface> & typeface)1001 bool RSRenderServiceClient::UnRegisterTypeface(std::shared_ptr<Drawing::Typeface>& typeface)
1002 {
1003     auto renderService = RSRenderServiceConnectHub::GetRenderService();
1004     if (renderService == nullptr) {
1005         ROSEN_LOGE("RSRenderServiceClient::UnRegisterTypeface: renderService is nullptr");
1006         return false;
1007     }
1008     uint64_t globalUniqueId = RSTypefaceCache::GenGlobalUniqueId(typeface->GetUniqueID());
1009     ROSEN_LOGD("RSRenderServiceClient::UnRegisterTypeface: pid[%{public}d] unregister typface[%{public}u]",
1010         RSTypefaceCache::GetTypefacePid(globalUniqueId), RSTypefaceCache::GetTypefaceId(globalUniqueId));
1011     return renderService->UnRegisterTypeface(globalUniqueId);
1012 }
1013 
SetScreenSkipFrameInterval(ScreenId id,uint32_t skipFrameInterval)1014 int32_t RSRenderServiceClient::SetScreenSkipFrameInterval(ScreenId id, uint32_t skipFrameInterval)
1015 {
1016     auto renderService = RSRenderServiceConnectHub::GetRenderService();
1017     if (renderService == nullptr) {
1018         return RENDER_SERVICE_NULL;
1019     }
1020     return renderService->SetScreenSkipFrameInterval(id, skipFrameInterval);
1021 }
1022 
1023 class CustomOcclusionChangeCallback : public RSOcclusionChangeCallbackStub
1024 {
1025 public:
CustomOcclusionChangeCallback(const OcclusionChangeCallback & callback)1026     explicit CustomOcclusionChangeCallback(const OcclusionChangeCallback &callback) : cb_(callback) {}
~CustomOcclusionChangeCallback()1027     ~CustomOcclusionChangeCallback() override {};
1028 
OnOcclusionVisibleChanged(std::shared_ptr<RSOcclusionData> occlusionData)1029     void OnOcclusionVisibleChanged(std::shared_ptr<RSOcclusionData> occlusionData) override
1030     {
1031         if (cb_ != nullptr) {
1032             cb_(occlusionData);
1033         }
1034     }
1035 
1036 private:
1037     OcclusionChangeCallback cb_;
1038 };
1039 
RegisterOcclusionChangeCallback(const OcclusionChangeCallback & callback)1040 int32_t RSRenderServiceClient::RegisterOcclusionChangeCallback(const OcclusionChangeCallback& callback)
1041 {
1042     auto renderService = RSRenderServiceConnectHub::GetRenderService();
1043     if (renderService == nullptr) {
1044         ROSEN_LOGE("RSRenderServiceClient::RegisterOcclusionChangeCallback renderService == nullptr!");
1045         return RENDER_SERVICE_NULL;
1046     }
1047     sptr<CustomOcclusionChangeCallback> cb = new CustomOcclusionChangeCallback(callback);
1048     return renderService->RegisterOcclusionChangeCallback(cb);
1049 }
1050 
1051 class CustomSurfaceOcclusionChangeCallback : public RSSurfaceOcclusionChangeCallbackStub
1052 {
1053 public:
CustomSurfaceOcclusionChangeCallback(const SurfaceOcclusionChangeCallback & callback)1054     explicit CustomSurfaceOcclusionChangeCallback(const SurfaceOcclusionChangeCallback &callback) : cb_(callback) {}
~CustomSurfaceOcclusionChangeCallback()1055     ~CustomSurfaceOcclusionChangeCallback() override {};
1056 
OnSurfaceOcclusionVisibleChanged(float visibleAreaRatio)1057     void OnSurfaceOcclusionVisibleChanged(float visibleAreaRatio) override
1058     {
1059         if (cb_ != nullptr) {
1060             cb_(visibleAreaRatio);
1061         }
1062     }
1063 
1064 private:
1065     SurfaceOcclusionChangeCallback cb_;
1066 };
1067 
RegisterSurfaceOcclusionChangeCallback(NodeId id,const SurfaceOcclusionChangeCallback & callback,std::vector<float> & partitionPoints)1068 int32_t RSRenderServiceClient::RegisterSurfaceOcclusionChangeCallback(
1069     NodeId id, const SurfaceOcclusionChangeCallback& callback, std::vector<float>& partitionPoints)
1070 {
1071     auto renderService = RSRenderServiceConnectHub::GetRenderService();
1072     if (renderService == nullptr) {
1073         ROSEN_LOGE("RSRenderServiceClient::RegisterSurfaceOcclusionChangeCallback renderService == nullptr!");
1074         return RENDER_SERVICE_NULL;
1075     }
1076     sptr<CustomSurfaceOcclusionChangeCallback> cb = new CustomSurfaceOcclusionChangeCallback(callback);
1077     return renderService->RegisterSurfaceOcclusionChangeCallback(id, cb, partitionPoints);
1078 }
1079 
UnRegisterSurfaceOcclusionChangeCallback(NodeId id)1080 int32_t RSRenderServiceClient::UnRegisterSurfaceOcclusionChangeCallback(NodeId id)
1081 {
1082     auto renderService = RSRenderServiceConnectHub::GetRenderService();
1083     if (renderService == nullptr) {
1084         ROSEN_LOGE("RSRenderServiceClient::UnRegisterSurfaceOcclusionChangeCallback renderService == nullptr!");
1085         return RENDER_SERVICE_NULL;
1086     }
1087     return renderService->UnRegisterSurfaceOcclusionChangeCallback(id);
1088 }
1089 
1090 class CustomHgmConfigChangeCallback : public RSHgmConfigChangeCallbackStub
1091 {
1092 public:
CustomHgmConfigChangeCallback(const HgmConfigChangeCallback & callback)1093     explicit CustomHgmConfigChangeCallback(const HgmConfigChangeCallback& callback) : cb_(callback) {}
~CustomHgmConfigChangeCallback()1094     ~CustomHgmConfigChangeCallback() override {};
1095 
OnHgmConfigChanged(std::shared_ptr<RSHgmConfigData> configData)1096     void OnHgmConfigChanged(std::shared_ptr<RSHgmConfigData> configData) override
1097     {
1098         if (cb_ != nullptr) {
1099             cb_(configData);
1100         }
1101     }
1102 
OnHgmRefreshRateModeChanged(int32_t refreshRateMode)1103     void OnHgmRefreshRateModeChanged(int32_t refreshRateMode) override
1104     {
1105     }
1106 
OnHgmRefreshRateUpdate(int32_t refreshRate)1107     void OnHgmRefreshRateUpdate(int32_t refreshRate) override
1108     {
1109     }
1110 private:
1111     HgmConfigChangeCallback cb_;
1112 };
1113 
RegisterHgmConfigChangeCallback(const HgmConfigChangeCallback & callback)1114 int32_t RSRenderServiceClient::RegisterHgmConfigChangeCallback(const HgmConfigChangeCallback& callback)
1115 {
1116     auto renderService = RSRenderServiceConnectHub::GetRenderService();
1117     if (renderService == nullptr) {
1118         ROSEN_LOGE("RSRenderServiceClient::RegisterHgmConfigChangeCallback renderService == nullptr!");
1119         return RENDER_SERVICE_NULL;
1120     }
1121     sptr<CustomHgmConfigChangeCallback> cb = new CustomHgmConfigChangeCallback(callback);
1122     return renderService->RegisterHgmConfigChangeCallback(cb);
1123 }
1124 
1125 class CustomHgmRefreshRateModeChangeCallback : public RSHgmConfigChangeCallbackStub
1126 {
1127 public:
CustomHgmRefreshRateModeChangeCallback(const HgmRefreshRateModeChangeCallback & callback)1128     explicit CustomHgmRefreshRateModeChangeCallback(const HgmRefreshRateModeChangeCallback& callback) : cb_(callback) {}
~CustomHgmRefreshRateModeChangeCallback()1129     ~CustomHgmRefreshRateModeChangeCallback() override {};
1130 
OnHgmRefreshRateModeChanged(int32_t refreshRateMode)1131     void OnHgmRefreshRateModeChanged(int32_t refreshRateMode) override
1132     {
1133         if (cb_ != nullptr) {
1134             cb_(refreshRateMode);
1135         }
1136     }
1137 
OnHgmConfigChanged(std::shared_ptr<RSHgmConfigData> configData)1138     void OnHgmConfigChanged(std::shared_ptr<RSHgmConfigData> configData) override
1139     {
1140     }
1141 
OnHgmRefreshRateUpdate(int32_t refreshRate)1142     void OnHgmRefreshRateUpdate(int32_t refreshRate) override
1143     {
1144     }
1145 private:
1146     HgmRefreshRateModeChangeCallback cb_;
1147 };
1148 
RegisterHgmRefreshRateModeChangeCallback(const HgmRefreshRateModeChangeCallback & callback)1149 int32_t RSRenderServiceClient::RegisterHgmRefreshRateModeChangeCallback(
1150     const HgmRefreshRateModeChangeCallback& callback)
1151 {
1152     auto renderService = RSRenderServiceConnectHub::GetRenderService();
1153     if (renderService == nullptr) {
1154         ROSEN_LOGE("RSRenderServiceClient::RegisterHgmRefreshRateModeChangeCallback renderService == nullptr!");
1155         return RENDER_SERVICE_NULL;
1156     }
1157     sptr<CustomHgmRefreshRateModeChangeCallback> cb = new CustomHgmRefreshRateModeChangeCallback(callback);
1158     return renderService->RegisterHgmRefreshRateModeChangeCallback(cb);
1159 }
1160 
1161 class CustomHgmRefreshRateUpdateCallback : public RSHgmConfigChangeCallbackStub
1162 {
1163 public:
CustomHgmRefreshRateUpdateCallback(const HgmRefreshRateModeChangeCallback & callback)1164     explicit CustomHgmRefreshRateUpdateCallback(const HgmRefreshRateModeChangeCallback& callback) : cb_(callback) {}
~CustomHgmRefreshRateUpdateCallback()1165     ~CustomHgmRefreshRateUpdateCallback() override {};
1166 
OnHgmRefreshRateModeChanged(int32_t refreshRateMode)1167     void OnHgmRefreshRateModeChanged(int32_t refreshRateMode) override
1168     {
1169     }
1170 
OnHgmConfigChanged(std::shared_ptr<RSHgmConfigData> configData)1171     void OnHgmConfigChanged(std::shared_ptr<RSHgmConfigData> configData) override
1172     {
1173     }
1174 
OnHgmRefreshRateUpdate(int32_t refreshRate)1175     void OnHgmRefreshRateUpdate(int32_t refreshRate) override
1176     {
1177         ROSEN_LOGD("CustomHgmRefreshRateUpdateCallback::OnHgmRefreshRateUpdate called");
1178         if (cb_ != nullptr) {
1179             cb_(refreshRate);
1180         }
1181     }
1182 
1183 private:
1184     HgmRefreshRateUpdateCallback cb_;
1185 };
1186 
RegisterHgmRefreshRateUpdateCallback(const HgmRefreshRateUpdateCallback & callback)1187 int32_t RSRenderServiceClient::RegisterHgmRefreshRateUpdateCallback(
1188     const HgmRefreshRateUpdateCallback& callback)
1189 {
1190     sptr<CustomHgmRefreshRateUpdateCallback> cb = nullptr;
1191     auto renderService = RSRenderServiceConnectHub::GetRenderService();
1192     if (renderService == nullptr) {
1193         ROSEN_LOGE("RSRenderServiceClient::RegisterHgmRefreshRateUpdateCallback renderService == nullptr!");
1194         return RENDER_SERVICE_NULL;
1195     }
1196 
1197     if (callback) {
1198         cb = new CustomHgmRefreshRateUpdateCallback(callback);
1199     }
1200 
1201     ROSEN_LOGD("RSRenderServiceClient::RegisterHgmRefreshRateUpdateCallback called");
1202     return renderService->RegisterHgmRefreshRateUpdateCallback(cb);
1203 }
1204 
SetAppWindowNum(uint32_t num)1205 void RSRenderServiceClient::SetAppWindowNum(uint32_t num)
1206 {
1207     auto renderService = RSRenderServiceConnectHub::GetRenderService();
1208     if (renderService != nullptr) {
1209         renderService->SetAppWindowNum(num);
1210     }
1211 }
1212 
SetSystemAnimatedScenes(SystemAnimatedScenes systemAnimatedScenes)1213 bool RSRenderServiceClient::SetSystemAnimatedScenes(SystemAnimatedScenes systemAnimatedScenes)
1214 {
1215     auto renderService = RSRenderServiceConnectHub::GetRenderService();
1216     if (renderService == nullptr) {
1217         ROSEN_LOGE("RSRenderServiceClient::SetSystemAnimatedScenes renderService == nullptr!");
1218         return false;
1219     }
1220     return renderService->SetSystemAnimatedScenes(systemAnimatedScenes);
1221 }
1222 
ShowWatermark(const std::shared_ptr<Media::PixelMap> & watermarkImg,bool isShow)1223 void RSRenderServiceClient::ShowWatermark(const std::shared_ptr<Media::PixelMap> &watermarkImg, bool isShow)
1224 {
1225     auto renderService = RSRenderServiceConnectHub::GetRenderService();
1226     if (renderService != nullptr) {
1227         renderService->ShowWatermark(watermarkImg, isShow);
1228     }
1229 }
1230 
ResizeVirtualScreen(ScreenId id,uint32_t width,uint32_t height)1231 int32_t RSRenderServiceClient::ResizeVirtualScreen(ScreenId id, uint32_t width, uint32_t height)
1232 {
1233     auto renderService = RSRenderServiceConnectHub::GetRenderService();
1234     if (renderService == nullptr) {
1235         ROSEN_LOGE("RSRenderServiceClient::ResizeVirtualScreen renderService == nullptr!");
1236         return RENDER_SERVICE_NULL;
1237     }
1238 
1239     ROSEN_LOGI("RSRenderServiceClient::ResizeVirtualScreen, width:%{public}u, height:%{public}u", width, height);
1240     return renderService->ResizeVirtualScreen(id, width, height);
1241 }
1242 
ReportJankStats()1243 void RSRenderServiceClient::ReportJankStats()
1244 {
1245     auto renderService = RSRenderServiceConnectHub::GetRenderService();
1246     if (renderService != nullptr) {
1247         renderService->ReportJankStats();
1248     }
1249 }
1250 
ReportEventResponse(DataBaseRs info)1251 void RSRenderServiceClient::ReportEventResponse(DataBaseRs info)
1252 {
1253     auto renderService = RSRenderServiceConnectHub::GetRenderService();
1254     if (renderService != nullptr) {
1255         renderService->ReportEventResponse(info);
1256     }
1257 }
1258 
ReportEventComplete(DataBaseRs info)1259 void RSRenderServiceClient::ReportEventComplete(DataBaseRs info)
1260 {
1261     auto renderService = RSRenderServiceConnectHub::GetRenderService();
1262     if (renderService != nullptr) {
1263         renderService->ReportEventComplete(info);
1264     }
1265 }
1266 
ReportEventJankFrame(DataBaseRs info)1267 void RSRenderServiceClient::ReportEventJankFrame(DataBaseRs info)
1268 {
1269     auto renderService = RSRenderServiceConnectHub::GetRenderService();
1270     if (renderService != nullptr) {
1271         renderService->ReportEventJankFrame(info);
1272     }
1273 }
1274 
ReportGameStateData(GameStateData info)1275 void RSRenderServiceClient::ReportGameStateData(GameStateData info)
1276 {
1277     auto renderService = RSRenderServiceConnectHub::GetRenderService();
1278     if (renderService != nullptr) {
1279         renderService->ReportGameStateData(info);
1280     }
1281 }
1282 
SetHardwareEnabled(NodeId id,bool isEnabled,SelfDrawingNodeType selfDrawingType,bool dynamicHardwareEnable)1283 void RSRenderServiceClient::SetHardwareEnabled(NodeId id, bool isEnabled, SelfDrawingNodeType selfDrawingType,
1284     bool dynamicHardwareEnable)
1285 {
1286     auto renderService = RSRenderServiceConnectHub::GetRenderService();
1287     if (renderService != nullptr) {
1288         renderService->SetHardwareEnabled(id, isEnabled, selfDrawingType, dynamicHardwareEnable);
1289     }
1290 }
1291 
SetHidePrivacyContent(NodeId id,bool needHidePrivacyContent)1292 uint32_t RSRenderServiceClient::SetHidePrivacyContent(NodeId id, bool needHidePrivacyContent)
1293 {
1294     auto renderService = RSRenderServiceConnectHub::GetRenderService();
1295     if (renderService != nullptr) {
1296         return renderService->SetHidePrivacyContent(id, needHidePrivacyContent);
1297     }
1298     return static_cast<uint32_t>(RSInterfaceErrorCode::UNKNOWN_ERROR);
1299 }
1300 
NotifyLightFactorStatus(bool isSafe)1301 void RSRenderServiceClient::NotifyLightFactorStatus(bool isSafe)
1302 {
1303     auto renderService = RSRenderServiceConnectHub::GetRenderService();
1304     if (renderService != nullptr) {
1305         renderService->NotifyLightFactorStatus(isSafe);
1306     }
1307 }
1308 
NotifyPackageEvent(uint32_t listSize,const std::vector<std::string> & packageList)1309 void RSRenderServiceClient::NotifyPackageEvent(uint32_t listSize, const std::vector<std::string>& packageList)
1310 {
1311     auto renderService = RSRenderServiceConnectHub::GetRenderService();
1312     if (renderService != nullptr) {
1313         renderService->NotifyPackageEvent(listSize, packageList);
1314     }
1315 }
1316 
NotifyRefreshRateEvent(const EventInfo & eventInfo)1317 void RSRenderServiceClient::NotifyRefreshRateEvent(const EventInfo& eventInfo)
1318 {
1319     auto renderService = RSRenderServiceConnectHub::GetRenderService();
1320     if (renderService != nullptr) {
1321         renderService->NotifyRefreshRateEvent(eventInfo);
1322     }
1323 }
1324 
NotifyTouchEvent(int32_t touchStatus,int32_t touchCnt)1325 void RSRenderServiceClient::NotifyTouchEvent(int32_t touchStatus, int32_t touchCnt)
1326 {
1327     auto renderService = RSRenderServiceConnectHub::GetRenderService();
1328     if (renderService != nullptr) {
1329         renderService->NotifyTouchEvent(touchStatus, touchCnt);
1330     }
1331 }
1332 
NotifyDynamicModeEvent(bool enableDynamicMode)1333 void RSRenderServiceClient::NotifyDynamicModeEvent(bool enableDynamicMode)
1334 {
1335     auto renderService = RSRenderServiceConnectHub::GetRenderService();
1336     if (renderService != nullptr) {
1337         renderService->NotifyDynamicModeEvent(enableDynamicMode);
1338     }
1339 }
1340 
SetCacheEnabledForRotation(bool isEnabled)1341 void RSRenderServiceClient::SetCacheEnabledForRotation(bool isEnabled)
1342 {
1343     auto renderService = RSRenderServiceConnectHub::GetRenderService();
1344     if (renderService != nullptr) {
1345         renderService->SetCacheEnabledForRotation(isEnabled);
1346     }
1347 }
1348 
SetDefaultDeviceRotationOffset(uint32_t offset)1349 void RSRenderServiceClient::SetDefaultDeviceRotationOffset(uint32_t offset)
1350 {
1351     auto renderService = RSRenderServiceConnectHub::GetRenderService();
1352     if (renderService != nullptr) {
1353         renderService->SetDefaultDeviceRotationOffset(offset);
1354     }
1355 }
1356 
SetOnRemoteDiedCallback(const OnRemoteDiedCallback & callback)1357 void RSRenderServiceClient::SetOnRemoteDiedCallback(const OnRemoteDiedCallback& callback)
1358 {
1359     auto renderService = RSRenderServiceConnectHub::GetRenderService();
1360     if (renderService != nullptr) {
1361         renderService->SetOnRemoteDiedCallback(callback);
1362     }
1363 }
1364 
GetActiveDirtyRegionInfo()1365 std::vector<ActiveDirtyRegionInfo> RSRenderServiceClient::GetActiveDirtyRegionInfo()
1366 {
1367     auto renderService = RSRenderServiceConnectHub::GetRenderService();
1368     if (renderService == nullptr) {
1369         return {};
1370     }
1371     return renderService->GetActiveDirtyRegionInfo();
1372 }
1373 
GetGlobalDirtyRegionInfo()1374 GlobalDirtyRegionInfo RSRenderServiceClient::GetGlobalDirtyRegionInfo()
1375 {
1376     auto renderService = RSRenderServiceConnectHub::GetRenderService();
1377     if (renderService == nullptr) {
1378         return GlobalDirtyRegionInfo {};
1379     }
1380     return renderService->GetGlobalDirtyRegionInfo();
1381 }
1382 
GetLayerComposeInfo()1383 LayerComposeInfo RSRenderServiceClient::GetLayerComposeInfo()
1384 {
1385     auto renderService = RSRenderServiceConnectHub::GetRenderService();
1386     if (renderService == nullptr) {
1387         return LayerComposeInfo {};
1388     }
1389     return renderService->GetLayerComposeInfo();
1390 }
1391 
GetHwcDisabledReasonInfo()1392 HwcDisabledReasonInfos RSRenderServiceClient::GetHwcDisabledReasonInfo()
1393 {
1394     auto renderService = RSRenderServiceConnectHub::GetRenderService();
1395     if (renderService == nullptr) {
1396         return {};
1397     }
1398     return renderService->GetHwcDisabledReasonInfo();
1399 }
1400 
SetVmaCacheStatus(bool flag)1401 void RSRenderServiceClient::SetVmaCacheStatus(bool flag)
1402 {
1403     auto renderService = RSRenderServiceConnectHub::GetRenderService();
1404     if (renderService == nullptr) {
1405         return;
1406     }
1407     renderService->SetVmaCacheStatus(flag);
1408 }
1409 
1410 #ifdef TP_FEATURE_ENABLE
SetTpFeatureConfig(int32_t feature,const char * config)1411 void RSRenderServiceClient::SetTpFeatureConfig(int32_t feature, const char* config)
1412 {
1413     auto renderService = RSRenderServiceConnectHub::GetRenderService();
1414     if (renderService == nullptr) {
1415         return;
1416     }
1417     renderService->SetTpFeatureConfig(feature, config);
1418 }
1419 #endif
1420 
SetVirtualScreenUsingStatus(bool isVirtualScreenUsingStatus)1421 void RSRenderServiceClient::SetVirtualScreenUsingStatus(bool isVirtualScreenUsingStatus)
1422 {
1423     auto renderService = RSRenderServiceConnectHub::GetRenderService();
1424     if (renderService != nullptr) {
1425         renderService->SetVirtualScreenUsingStatus(isVirtualScreenUsingStatus);
1426     }
1427 }
1428 
SetCurtainScreenUsingStatus(bool isCurtainScreenOn)1429 void RSRenderServiceClient::SetCurtainScreenUsingStatus(bool isCurtainScreenOn)
1430 {
1431     auto renderService = RSRenderServiceConnectHub::GetRenderService();
1432     if (renderService != nullptr) {
1433         renderService->SetCurtainScreenUsingStatus(isCurtainScreenOn);
1434     }
1435 }
1436 
1437 class CustomUIExtensionCallback : public RSUIExtensionCallbackStub
1438 {
1439 public:
CustomUIExtensionCallback(const UIExtensionCallback & callback)1440     explicit CustomUIExtensionCallback(const UIExtensionCallback &callback) : cb_(callback) {}
~CustomUIExtensionCallback()1441     ~CustomUIExtensionCallback() override {};
1442 
OnUIExtension(std::shared_ptr<RSUIExtensionData> uiExtensionData,uint64_t userId)1443     void OnUIExtension(std::shared_ptr<RSUIExtensionData> uiExtensionData, uint64_t userId) override
1444     {
1445         if (cb_ != nullptr) {
1446             cb_(uiExtensionData, userId);
1447         }
1448     }
1449 
1450 private:
1451     UIExtensionCallback cb_;
1452 };
1453 
RegisterUIExtensionCallback(uint64_t userId,const UIExtensionCallback & callback)1454 int32_t RSRenderServiceClient::RegisterUIExtensionCallback(uint64_t userId, const UIExtensionCallback& callback)
1455 {
1456     auto renderService = RSRenderServiceConnectHub::GetRenderService();
1457     if (renderService == nullptr) {
1458         ROSEN_LOGE("RSRenderServiceClient::RegisterUIExtensionCallback renderService == nullptr!");
1459         return RENDER_SERVICE_NULL;
1460     }
1461     sptr<CustomUIExtensionCallback> cb = new CustomUIExtensionCallback(callback);
1462     return renderService->RegisterUIExtensionCallback(userId, cb);
1463 }
1464 
SetAncoForceDoDirect(bool direct)1465 bool RSRenderServiceClient::SetAncoForceDoDirect(bool direct)
1466 {
1467     auto renderService = RSRenderServiceConnectHub::GetRenderService();
1468     if (renderService != nullptr) {
1469         return renderService->SetAncoForceDoDirect(direct);
1470     }
1471     ROSEN_LOGE("RSRenderServiceClient::SetAncoForceDoDirect renderService is null");
1472     return false;
1473 }
1474 
1475 class SurfaceBufferCallbackDirector : public RSSurfaceBufferCallbackStub {
1476 public:
SurfaceBufferCallbackDirector(RSRenderServiceClient * client)1477     explicit SurfaceBufferCallbackDirector(RSRenderServiceClient* client) : client_(client) {}
1478     ~SurfaceBufferCallbackDirector() noexcept override = default;
OnFinish(uint64_t uid,const std::vector<uint32_t> & surfaceBufferIds)1479     void OnFinish(uint64_t uid, const std::vector<uint32_t>& surfaceBufferIds) override
1480     {
1481         client_->TriggerSurfaceBufferCallback(uid, surfaceBufferIds);
1482     }
1483 
1484 private:
1485     RSRenderServiceClient* client_;
1486 };
1487 
RegisterSurfaceBufferCallback(pid_t pid,uint64_t uid,std::shared_ptr<SurfaceBufferCallback> callback)1488 bool RSRenderServiceClient::RegisterSurfaceBufferCallback(
1489     pid_t pid, uint64_t uid, std::shared_ptr<SurfaceBufferCallback> callback)
1490 {
1491     auto renderService = RSRenderServiceConnectHub::GetRenderService();
1492     if (renderService == nullptr) {
1493         ROSEN_LOGE("RSRenderServiceClient::RegisterSurfaceBufferCallback renderService == nullptr!");
1494         return false;
1495     }
1496     if (callback == nullptr) {
1497         ROSEN_LOGE("RSRenderServiceClient::RegisterSurfaceBufferCallback callback == nullptr!");
1498         return false;
1499     }
1500     {
1501         std::unique_lock<std::shared_mutex> lock { surfaceBufferCallbackMutex_ };
1502         if (surfaceBufferCallbacks_.find(uid) == std::end(surfaceBufferCallbacks_)) {
1503             surfaceBufferCallbacks_.emplace(uid, callback);
1504         } else {
1505             ROSEN_LOGE("RSRenderServiceClient::RegisterSurfaceBufferCallback callback exists"
1506                 " in uid %{public}s", std::to_string(uid).c_str());
1507             return false;
1508         }
1509         if (surfaceBufferCbDirector_ == nullptr) {
1510             surfaceBufferCbDirector_ = new SurfaceBufferCallbackDirector(this);
1511         }
1512     }
1513     renderService->RegisterSurfaceBufferCallback(pid, uid, surfaceBufferCbDirector_);
1514     return true;
1515 }
1516 
UnregisterSurfaceBufferCallback(pid_t pid,uint64_t uid)1517 bool RSRenderServiceClient::UnregisterSurfaceBufferCallback(pid_t pid, uint64_t uid)
1518 {
1519     auto renderService = RSRenderServiceConnectHub::GetRenderService();
1520     if (renderService == nullptr) {
1521         ROSEN_LOGE("RSRenderServiceClient::UnregisterSurfaceBufferCallback renderService == nullptr!");
1522         return false;
1523     }
1524     {
1525         std::unique_lock<std::shared_mutex> lock { surfaceBufferCallbackMutex_ };
1526         auto iter = surfaceBufferCallbacks_.find(uid);
1527         if (iter == std::end(surfaceBufferCallbacks_)) {
1528             ROSEN_LOGE("RSRenderServiceClient::UnregisterSurfaceBufferCallback invaild uid.");
1529             return false;
1530         }
1531         surfaceBufferCallbacks_.erase(iter);
1532     }
1533     renderService->UnregisterSurfaceBufferCallback(pid, uid);
1534     return true;
1535 }
1536 
TriggerSurfaceBufferCallback(uint64_t uid,const std::vector<uint32_t> & surfaceBufferIds) const1537 void RSRenderServiceClient::TriggerSurfaceBufferCallback(uint64_t uid,
1538     const std::vector<uint32_t>& surfaceBufferIds) const
1539 {
1540     std::shared_ptr<SurfaceBufferCallback> callback = nullptr;
1541     {
1542         std::shared_lock<std::shared_mutex> lock { surfaceBufferCallbackMutex_ };
1543         if (auto iter = surfaceBufferCallbacks_.find(uid); iter != std::cend(surfaceBufferCallbacks_)) {
1544             callback = iter->second;
1545         }
1546     }
1547     if (callback) {
1548         callback->OnFinish(uid, surfaceBufferIds);
1549     }
1550 }
1551 
SetLayerTop(const std::string & nodeIdStr,bool isTop)1552 void RSRenderServiceClient::SetLayerTop(const std::string &nodeIdStr, bool isTop)
1553 {
1554     auto renderService = RSRenderServiceConnectHub::GetRenderService();
1555     if (renderService != nullptr) {
1556         renderService->SetLayerTop(nodeIdStr, isTop);
1557     }
1558 }
1559 } // namespace Rosen
1560 } // namespace OHOS
1561