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