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