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