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