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