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
18 #include "backend/rs_surface_ohos_gl.h"
19 #include "backend/rs_surface_ohos_raster.h"
20 #ifdef RS_ENABLE_VK
21 #include "backend/rs_surface_ohos_vulkan.h"
22 #endif
23
24 #include "command/rs_command.h"
25 #include "command/rs_node_showing_command.h"
26 #include "ipc_callbacks/screen_change_callback_stub.h"
27 #include "ipc_callbacks/surface_capture_callback_stub.h"
28 #include "ipc_callbacks/buffer_available_callback_stub.h"
29 #include "ipc_callbacks/buffer_clear_callback_stub.h"
30 #include "ipc_callbacks/rs_occlusion_change_callback_stub.h"
31 #include "platform/common/rs_log.h"
32 #ifdef NEW_RENDER_CONTEXT
33 #include "render_backend/rs_surface_factory.h"
34 #endif
35 #include "rs_render_service_connect_hub.h"
36 #include "rs_surface_ohos.h"
37 #include "vsync_iconnection_token.h"
38
39 namespace OHOS {
40 namespace Rosen {
CreateRenderServiceClient()41 std::shared_ptr<RSIRenderClient> RSIRenderClient::CreateRenderServiceClient()
42 {
43 static std::shared_ptr<RSIRenderClient> client = std::make_shared<RSRenderServiceClient>();
44 return client;
45 }
46
CommitTransaction(std::unique_ptr<RSTransactionData> & transactionData)47 void RSRenderServiceClient::CommitTransaction(std::unique_ptr<RSTransactionData>& transactionData)
48 {
49 auto renderService = RSRenderServiceConnectHub::GetRenderService();
50 if (renderService != nullptr) {
51 renderService->CommitTransaction(transactionData);
52 }
53 }
54
ExecuteSynchronousTask(const std::shared_ptr<RSSyncTask> & task)55 void RSRenderServiceClient::ExecuteSynchronousTask(const std::shared_ptr<RSSyncTask>& task)
56 {
57 if (task == nullptr) {
58 return;
59 }
60
61 auto renderService = RSRenderServiceConnectHub::GetRenderService();
62 if (renderService != nullptr) {
63 renderService->ExecuteSynchronousTask(task);
64 }
65 }
66
GetUniRenderEnabled()67 bool RSRenderServiceClient::GetUniRenderEnabled()
68 {
69 auto renderService = RSRenderServiceConnectHub::GetRenderService();
70 if (renderService == nullptr) {
71 return false;
72 }
73 return renderService->GetUniRenderEnabled();
74 }
75
GetMemoryGraphic(int pid)76 MemoryGraphic RSRenderServiceClient::GetMemoryGraphic(int pid)
77 {
78 auto renderService = RSRenderServiceConnectHub::GetRenderService();
79 if (renderService == nullptr) {
80 return MemoryGraphic {};
81 }
82 return renderService->GetMemoryGraphic(pid);
83 }
84
GetMemoryGraphics()85 std::vector<MemoryGraphic> RSRenderServiceClient::GetMemoryGraphics()
86 {
87 auto renderService = RSRenderServiceConnectHub::GetRenderService();
88 if (renderService == nullptr) {
89 return {};
90 }
91 return renderService->GetMemoryGraphics();
92 }
93
CreateNode(const RSSurfaceRenderNodeConfig & config)94 bool RSRenderServiceClient::CreateNode(const RSSurfaceRenderNodeConfig& config)
95 {
96 auto renderService = RSRenderServiceConnectHub::GetRenderService();
97 if (renderService == nullptr) {
98 return false;
99 }
100 return renderService->CreateNode(config);
101 }
102
103 #ifdef NEW_RENDER_CONTEXT
CreateNodeAndSurface(const RSSurfaceRenderNodeConfig & config)104 std::shared_ptr<RSRenderSurface> RSRenderServiceClient::CreateNodeAndSurface(const RSSurfaceRenderNodeConfig& config)
105 #else
106 std::shared_ptr<RSSurface> RSRenderServiceClient::CreateNodeAndSurface(const RSSurfaceRenderNodeConfig& config)
107 #endif
108 {
109 auto renderService = RSRenderServiceConnectHub::GetRenderService();
110 if (renderService == nullptr) {
111 return nullptr;
112 }
113 sptr<Surface> surface = renderService->CreateNodeAndSurface(config);
114 return CreateRSSurface(surface);
115 }
116
117 #if defined(NEW_RENDER_CONTEXT)
CreateRSSurface(const sptr<Surface> & surface)118 std::shared_ptr<RSRenderSurface> RSRenderServiceClient::CreateRSSurface(const sptr<Surface> &surface)
119 {
120 std::shared_ptr<RSRenderSurface> producer = RSSurfaceFactory::CreateRSSurface(PlatformName::OHOS, surface);
121 return producer;
122 }
123 #else
CreateRSSurface(const sptr<Surface> & surface)124 std::shared_ptr<RSSurface> RSRenderServiceClient::CreateRSSurface(const sptr<Surface> &surface)
125 {
126 #if defined(ACE_ENABLE_VK)
127 // GPU render
128 std::shared_ptr<RSSurface> producer = std::make_shared<RSSurfaceOhosVulkan>(surface);
129 #elif defined(ACE_ENABLE_GL)
130 // GPU render
131 std::shared_ptr<RSSurface> producer = std::make_shared<RSSurfaceOhosGl>(surface);
132 #else
133 // CPU render
134 std::shared_ptr<RSSurface> producer = std::make_shared<RSSurfaceOhosRaster>(surface);
135 #endif
136 return producer;
137 }
138 #endif
139
CreateVSyncReceiver(const std::string & name,const std::shared_ptr<OHOS::AppExecFwk::EventHandler> & looper)140 std::shared_ptr<VSyncReceiver> RSRenderServiceClient::CreateVSyncReceiver(
141 const std::string& name,
142 const std::shared_ptr<OHOS::AppExecFwk::EventHandler> &looper)
143 {
144 auto renderService = RSRenderServiceConnectHub::GetRenderService();
145 if (renderService == nullptr) {
146 return nullptr;
147 }
148 sptr<VSyncIConnectionToken> token = new IRemoteStub<VSyncIConnectionToken>();
149 sptr<IVSyncConnection> conn = renderService->CreateVSyncConnection(name, token);
150 if (conn == nullptr) {
151 ROSEN_LOGE("RSRenderServiceClient::CreateVSyncReceiver Failed");
152 return nullptr;
153 }
154 return std::make_shared<VSyncReceiver>(conn, token->AsObject(), looper, name);
155 }
156
TriggerSurfaceCaptureCallback(NodeId id,Media::PixelMap * pixelmap)157 void RSRenderServiceClient::TriggerSurfaceCaptureCallback(NodeId id, Media::PixelMap* pixelmap)
158 {
159 ROSEN_LOGI("RSRenderServiceClient::Into TriggerSurfaceCaptureCallback nodeId:[%" PRIu64 "]", id);
160 std::vector<std::shared_ptr<SurfaceCaptureCallback>> callbackVector;
161 {
162 std::lock_guard<std::mutex> lock(mutex_);
163 auto iter = surfaceCaptureCbMap_.find(id);
164 if (iter != surfaceCaptureCbMap_.end()) {
165 callbackVector = iter->second;
166 surfaceCaptureCbMap_.erase(iter);
167 }
168 }
169 if (callbackVector.empty()) {
170 ROSEN_LOGE("RSRenderServiceClient::TriggerSurfaceCaptureCallback: callbackVector is empty!");
171 return;
172 }
173 for (decltype(callbackVector.size()) i = 0; i < callbackVector.size(); ++i) {
174 if (callbackVector[i] == nullptr) {
175 ROSEN_LOGE("RSRenderServiceClient::TriggerSurfaceCaptureCallback: callback is nullptr!");
176 continue;
177 }
178 Media::PixelMap* pixelmapCopyRelease = nullptr;
179 if (i != callbackVector.size() - 1) {
180 if (pixelmap != nullptr) {
181 Media::InitializationOptions options;
182 std::unique_ptr<Media::PixelMap> pixelmapCopy = Media::PixelMap::Create(*pixelmap, options);
183 pixelmapCopyRelease = pixelmapCopy.release();
184 }
185 } else {
186 pixelmapCopyRelease = pixelmap;
187 }
188 std::shared_ptr<Media::PixelMap> surfaceCapture(pixelmapCopyRelease);
189 callbackVector[i]->OnSurfaceCapture(surfaceCapture);
190 }
191 }
192
193 class SurfaceCaptureCallbackDirector : public RSSurfaceCaptureCallbackStub
194 {
195 public:
SurfaceCaptureCallbackDirector(RSRenderServiceClient * client)196 explicit SurfaceCaptureCallbackDirector(RSRenderServiceClient* client) : client_(client) {}
~SurfaceCaptureCallbackDirector()197 ~SurfaceCaptureCallbackDirector() override {};
OnSurfaceCapture(NodeId id,Media::PixelMap * pixelmap)198 void OnSurfaceCapture(NodeId id, Media::PixelMap* pixelmap) override
199 {
200 client_->TriggerSurfaceCaptureCallback(id, pixelmap);
201 };
202
203 private:
204 RSRenderServiceClient* client_;
205 };
206
TakeSurfaceCapture(NodeId id,std::shared_ptr<SurfaceCaptureCallback> callback,float scaleX,float scaleY)207 bool RSRenderServiceClient::TakeSurfaceCapture(NodeId id, std::shared_ptr<SurfaceCaptureCallback> callback,
208 float scaleX, float scaleY)
209 {
210 auto renderService = RSRenderServiceConnectHub::GetRenderService();
211 if (renderService == nullptr) {
212 ROSEN_LOGE("RSRenderServiceClient::TakeSurfaceCapture renderService == nullptr!");
213 return false;
214 }
215 if (callback == nullptr) {
216 ROSEN_LOGE("RSRenderServiceClient::TakeSurfaceCapture callback == nullptr!");
217 return false;
218 }
219 {
220 std::lock_guard<std::mutex> lock(mutex_);
221 auto iter = surfaceCaptureCbMap_.find(id);
222 if (iter != surfaceCaptureCbMap_.end()) {
223 ROSEN_LOGW("RSRenderServiceClient::TakeSurfaceCapture surfaceCaptureCbMap_.count(id) != 0");
224 iter->second.emplace_back(callback);
225 return true;
226 }
227 std::vector<std::shared_ptr<SurfaceCaptureCallback>> callbackVector = {callback};
228 surfaceCaptureCbMap_.emplace(id, callbackVector);
229 }
230
231 if (surfaceCaptureCbDirector_ == nullptr) {
232 surfaceCaptureCbDirector_ = new SurfaceCaptureCallbackDirector(this);
233 }
234 renderService->TakeSurfaceCapture(id, surfaceCaptureCbDirector_, scaleX, scaleY);
235 return true;
236 }
237
SetFocusAppInfo(int32_t pid,int32_t uid,const std::string & bundleName,const std::string & abilityName,uint64_t focusNodeId)238 int32_t RSRenderServiceClient::SetFocusAppInfo(
239 int32_t pid, int32_t uid, const std::string &bundleName, const std::string &abilityName, uint64_t focusNodeId)
240 {
241 auto renderService = RSRenderServiceConnectHub::GetRenderService();
242 if (renderService == nullptr) {
243 return RENDER_SERVICE_NULL;
244 }
245
246 return renderService->SetFocusAppInfo(pid, uid, bundleName, abilityName, focusNodeId);
247 }
248
GetDefaultScreenId()249 ScreenId RSRenderServiceClient::GetDefaultScreenId()
250 {
251 auto renderService = RSRenderServiceConnectHub::GetRenderService();
252 if (renderService == nullptr) {
253 return INVALID_SCREEN_ID;
254 }
255
256 return renderService->GetDefaultScreenId();
257 }
258
GetAllScreenIds()259 std::vector<ScreenId> RSRenderServiceClient::GetAllScreenIds()
260 {
261 auto renderService = RSRenderServiceConnectHub::GetRenderService();
262 if (renderService == nullptr) {
263 return std::vector<ScreenId>();
264 }
265
266 return renderService->GetAllScreenIds();
267 }
268
CreateVirtualScreen(const std::string & name,uint32_t width,uint32_t height,sptr<Surface> surface,ScreenId mirrorId,int32_t flags)269 ScreenId RSRenderServiceClient::CreateVirtualScreen(
270 const std::string &name,
271 uint32_t width,
272 uint32_t height,
273 sptr<Surface> surface,
274 ScreenId mirrorId,
275 int32_t flags)
276 {
277 auto renderService = RSRenderServiceConnectHub::GetRenderService();
278 if (renderService == nullptr) {
279 return INVALID_SCREEN_ID;
280 }
281
282 return renderService->CreateVirtualScreen(name, width, height, surface, mirrorId, flags);
283 }
284
SetVirtualScreenSurface(ScreenId id,sptr<Surface> surface)285 int32_t RSRenderServiceClient::SetVirtualScreenSurface(ScreenId id, sptr<Surface> surface)
286 {
287 auto renderService = RSRenderServiceConnectHub::GetRenderService();
288 if (renderService == nullptr) {
289 return RENDER_SERVICE_NULL;
290 }
291
292 return renderService->SetVirtualScreenSurface(id, surface);
293 }
294
RemoveVirtualScreen(ScreenId id)295 void RSRenderServiceClient::RemoveVirtualScreen(ScreenId id)
296 {
297 auto renderService = RSRenderServiceConnectHub::GetRenderService();
298 if (renderService == nullptr) {
299 return;
300 }
301
302 renderService->RemoveVirtualScreen(id);
303 }
304
305 class CustomScreenChangeCallback : public RSScreenChangeCallbackStub
306 {
307 public:
CustomScreenChangeCallback(const ScreenChangeCallback & callback)308 explicit CustomScreenChangeCallback(const ScreenChangeCallback &callback) : cb_(callback) {}
~CustomScreenChangeCallback()309 ~CustomScreenChangeCallback() override {};
310
OnScreenChanged(ScreenId id,ScreenEvent event)311 void OnScreenChanged(ScreenId id, ScreenEvent event) override
312 {
313 if (cb_ != nullptr) {
314 cb_(id, event);
315 }
316 }
317
318 private:
319 ScreenChangeCallback cb_;
320 };
321
SetScreenChangeCallback(const ScreenChangeCallback & callback)322 int32_t RSRenderServiceClient::SetScreenChangeCallback(const ScreenChangeCallback &callback)
323 {
324 auto renderService = RSRenderServiceConnectHub::GetRenderService();
325 if (renderService == nullptr) {
326 return RENDER_SERVICE_NULL;
327 }
328
329 screenChangeCb_ = new CustomScreenChangeCallback(callback);
330 return renderService->SetScreenChangeCallback(screenChangeCb_);
331 }
332
SetScreenActiveMode(ScreenId id,uint32_t modeId)333 void RSRenderServiceClient::SetScreenActiveMode(ScreenId id, uint32_t modeId)
334 {
335 auto renderService = RSRenderServiceConnectHub::GetRenderService();
336 if (renderService == nullptr) {
337 return;
338 }
339
340 renderService->SetScreenActiveMode(id, modeId);
341 }
342
SetScreenRefreshRate(ScreenId id,int32_t sceneId,int32_t rate)343 void RSRenderServiceClient::SetScreenRefreshRate(ScreenId id, int32_t sceneId, int32_t rate)
344 {
345 auto renderService = RSRenderServiceConnectHub::GetRenderService();
346 if (renderService == nullptr) {
347 ROSEN_LOGW("RSRenderServiceClient renderService == nullptr!");
348 return;
349 }
350
351 renderService->SetScreenRefreshRate(id, sceneId, rate);
352 }
353
SetRefreshRateMode(int32_t refreshRateMode)354 void RSRenderServiceClient::SetRefreshRateMode(int32_t refreshRateMode)
355 {
356 auto renderService = RSRenderServiceConnectHub::GetRenderService();
357 if (renderService == nullptr) {
358 ROSEN_LOGW("RSRenderServiceClient renderService == nullptr!");
359 return;
360 }
361
362 renderService->SetRefreshRateMode(refreshRateMode);
363 }
364
GetScreenCurrentRefreshRate(ScreenId id)365 uint32_t RSRenderServiceClient::GetScreenCurrentRefreshRate(ScreenId id)
366 {
367 auto renderService = RSRenderServiceConnectHub::GetRenderService();
368 if (renderService == nullptr) {
369 ROSEN_LOGW("RSRenderServiceClient renderService == nullptr!");
370 return RENDER_SERVICE_NULL;
371 }
372
373 return renderService->GetScreenCurrentRefreshRate(id);
374 }
375
GetScreenSupportedRefreshRates(ScreenId id)376 std::vector<uint32_t> RSRenderServiceClient::GetScreenSupportedRefreshRates(ScreenId id)
377 {
378 auto renderService = RSRenderServiceConnectHub::GetRenderService();
379 if (renderService == nullptr) {
380 ROSEN_LOGW("RSRenderServiceClient renderService == nullptr!");
381 return {};
382 }
383
384 return renderService->GetScreenSupportedRefreshRates(id);
385 }
386
SetVirtualScreenResolution(ScreenId id,uint32_t width,uint32_t height)387 int32_t RSRenderServiceClient::SetVirtualScreenResolution(ScreenId id, uint32_t width, uint32_t height)
388 {
389 auto renderService = RSRenderServiceConnectHub::GetRenderService();
390 if (renderService == nullptr) {
391 ROSEN_LOGE("RSRenderServiceClient::SetVirtualScreenResolution renderService == nullptr!");
392 return RENDER_SERVICE_NULL;
393 }
394
395 return renderService->SetVirtualScreenResolution(id, width, height);
396 }
397
GetVirtualScreenResolution(ScreenId id)398 RSVirtualScreenResolution RSRenderServiceClient::GetVirtualScreenResolution(ScreenId id)
399 {
400 auto renderService = RSRenderServiceConnectHub::GetRenderService();
401 if (renderService == nullptr) {
402 return RSVirtualScreenResolution {}; // return empty RSVirtualScreenResolution.
403 }
404
405 return renderService->GetVirtualScreenResolution(id);
406 }
407
SetScreenPowerStatus(ScreenId id,ScreenPowerStatus status)408 void RSRenderServiceClient::SetScreenPowerStatus(ScreenId id, ScreenPowerStatus status)
409 {
410 auto renderService = RSRenderServiceConnectHub::GetRenderService();
411 if (renderService == nullptr) {
412 return;
413 }
414
415 renderService->SetScreenPowerStatus(id, status);
416 }
417
GetScreenActiveMode(ScreenId id)418 RSScreenModeInfo RSRenderServiceClient::GetScreenActiveMode(ScreenId id)
419 {
420 auto renderService = RSRenderServiceConnectHub::GetRenderService();
421 if (renderService == nullptr) {
422 return RSScreenModeInfo {}; // return empty RSScreenModeInfo.
423 }
424
425 return renderService->GetScreenActiveMode(id);
426 }
427
GetScreenSupportedModes(ScreenId id)428 std::vector<RSScreenModeInfo> RSRenderServiceClient::GetScreenSupportedModes(ScreenId id)
429 {
430 auto renderService = RSRenderServiceConnectHub::GetRenderService();
431 if (renderService == nullptr) {
432 return {};
433 }
434
435 return renderService->GetScreenSupportedModes(id);
436 }
437
GetScreenCapability(ScreenId id)438 RSScreenCapability RSRenderServiceClient::GetScreenCapability(ScreenId id)
439 {
440 auto renderService = RSRenderServiceConnectHub::GetRenderService();
441 if (renderService == nullptr) {
442 return RSScreenCapability {};
443 }
444
445 return renderService->GetScreenCapability(id);
446 }
447
GetScreenPowerStatus(ScreenId id)448 ScreenPowerStatus RSRenderServiceClient::GetScreenPowerStatus(ScreenId id)
449 {
450 auto renderService = RSRenderServiceConnectHub::GetRenderService();
451 if (renderService == nullptr) {
452 return ScreenPowerStatus::INVALID_POWER_STATUS;
453 }
454
455 return renderService->GetScreenPowerStatus(id);
456 }
457
GetScreenData(ScreenId id)458 RSScreenData RSRenderServiceClient::GetScreenData(ScreenId id)
459 {
460 auto renderService = RSRenderServiceConnectHub::GetRenderService();
461 if (renderService == nullptr) {
462 return RSScreenData {};
463 }
464
465 return renderService->GetScreenData(id);
466 }
467
GetScreenBacklight(ScreenId id)468 int32_t RSRenderServiceClient::GetScreenBacklight(ScreenId id)
469 {
470 auto renderService = RSRenderServiceConnectHub::GetRenderService();
471 if (renderService == nullptr) {
472 return INVALID_BACKLIGHT_VALUE;
473 }
474
475 return renderService->GetScreenBacklight(id);
476 }
477
SetScreenBacklight(ScreenId id,uint32_t level)478 void RSRenderServiceClient::SetScreenBacklight(ScreenId id, uint32_t level)
479 {
480 auto renderService = RSRenderServiceConnectHub::GetRenderService();
481 if (renderService == nullptr) {
482 return;
483 }
484
485 renderService->SetScreenBacklight(id, level);
486 }
487
488 class CustomBufferAvailableCallback : public RSBufferAvailableCallbackStub
489 {
490 public:
CustomBufferAvailableCallback(const BufferAvailableCallback & callback)491 explicit CustomBufferAvailableCallback(const BufferAvailableCallback &callback) : cb_(callback) {}
~CustomBufferAvailableCallback()492 ~CustomBufferAvailableCallback() override {};
493
OnBufferAvailable()494 void OnBufferAvailable() override
495 {
496 if (cb_ != nullptr) {
497 cb_();
498 }
499 }
500
501 private:
502 BufferAvailableCallback cb_;
503 };
504
505 class CustomBufferClearCallback : public RSBufferClearCallbackStub
506 {
507 public:
CustomBufferClearCallback(const BufferClearCallback & callback)508 explicit CustomBufferClearCallback(const BufferClearCallback &callback) : cb_(callback) {}
~CustomBufferClearCallback()509 ~CustomBufferClearCallback() override {};
510
OnBufferClear()511 void OnBufferClear() override
512 {
513 if (cb_ != nullptr) {
514 cb_();
515 }
516 }
517
518 private:
519 BufferClearCallback cb_;
520 };
521
RegisterBufferAvailableListener(NodeId id,const BufferAvailableCallback & callback,bool isFromRenderThread)522 bool RSRenderServiceClient::RegisterBufferAvailableListener(
523 NodeId id, const BufferAvailableCallback &callback, bool isFromRenderThread)
524 {
525 auto renderService = RSRenderServiceConnectHub::GetRenderService();
526 if (renderService == nullptr) {
527 return false;
528 }
529
530 auto iter = isFromRenderThread ? bufferAvailableCbRTMap_.find(id) : bufferAvailableCbUIMap_.find(id);
531 if (isFromRenderThread && iter != bufferAvailableCbRTMap_.end()) {
532 ROSEN_LOGW("RSRenderServiceClient::RegisterBufferAvailableListener "
533 "Node %" PRIu64 " already, bufferAvailableCbRTMap_", iter->first);
534 }
535
536 if (!isFromRenderThread && iter != bufferAvailableCbUIMap_.end()) {
537 ROSEN_LOGW("RSRenderServiceClient::RegisterBufferAvailableListener "
538 "Node %" PRIu64 " already, bufferAvailableCbUIMap_", iter->first);
539 }
540
541 sptr<RSIBufferAvailableCallback> bufferAvailableCb = new CustomBufferAvailableCallback(callback);
542 renderService->RegisterBufferAvailableListener(id, bufferAvailableCb, isFromRenderThread);
543 if (isFromRenderThread) {
544 bufferAvailableCbRTMap_.emplace(id, bufferAvailableCb);
545 } else {
546 bufferAvailableCbUIMap_.emplace(id, bufferAvailableCb);
547 }
548 return true;
549 }
550
RegisterBufferClearListener(NodeId id,const BufferClearCallback & callback)551 bool RSRenderServiceClient::RegisterBufferClearListener(NodeId id, const BufferClearCallback& callback)
552 {
553 auto renderService = RSRenderServiceConnectHub::GetRenderService();
554 if (renderService == nullptr) {
555 return false;
556 }
557 sptr<RSIBufferClearCallback> bufferClearCb = new CustomBufferClearCallback(callback);
558 renderService->RegisterBufferClearListener(id, bufferClearCb);
559 return true;
560 }
561
562
UnregisterBufferAvailableListener(NodeId id)563 bool RSRenderServiceClient::UnregisterBufferAvailableListener(NodeId id)
564 {
565 auto iter = bufferAvailableCbRTMap_.find(id);
566 if (iter != bufferAvailableCbRTMap_.end()) {
567 bufferAvailableCbRTMap_.erase(iter);
568 } else {
569 ROSEN_LOGD("RSRenderServiceClient::UnregisterBufferAvailableListener "
570 "Node %" PRIu64 " has not registered RT callback",
571 id);
572 }
573 iter = bufferAvailableCbUIMap_.find(id);
574 if (iter != bufferAvailableCbUIMap_.end()) {
575 bufferAvailableCbUIMap_.erase(iter);
576 } else {
577 ROSEN_LOGD("RSRenderServiceClient::UnregisterBufferAvailableListener "
578 "Node %" PRIu64 " has not registered UI callback",
579 id);
580 }
581 return true;
582 }
583
GetScreenSupportedColorGamuts(ScreenId id,std::vector<ScreenColorGamut> & mode)584 int32_t RSRenderServiceClient::GetScreenSupportedColorGamuts(ScreenId id, std::vector<ScreenColorGamut>& mode)
585 {
586 auto renderService = RSRenderServiceConnectHub::GetRenderService();
587 if (renderService == nullptr) {
588 return RENDER_SERVICE_NULL;
589 }
590 return renderService->GetScreenSupportedColorGamuts(id, mode);
591 }
592
GetScreenSupportedMetaDataKeys(ScreenId id,std::vector<ScreenHDRMetadataKey> & keys)593 int32_t RSRenderServiceClient::GetScreenSupportedMetaDataKeys(ScreenId id, std::vector<ScreenHDRMetadataKey>& keys)
594 {
595 auto renderService = RSRenderServiceConnectHub::GetRenderService();
596 if (renderService == nullptr) {
597 ROSEN_LOGE("RSRenderServiceClient::RequestRotation renderService == nullptr!");
598 return RENDER_SERVICE_NULL;
599 }
600 return renderService->GetScreenSupportedMetaDataKeys(id, keys);
601 }
602
GetScreenColorGamut(ScreenId id,ScreenColorGamut & mode)603 int32_t RSRenderServiceClient::GetScreenColorGamut(ScreenId id, ScreenColorGamut& mode)
604 {
605 auto renderService = RSRenderServiceConnectHub::GetRenderService();
606 if (renderService == nullptr) {
607 return RENDER_SERVICE_NULL;
608 }
609 return renderService->GetScreenColorGamut(id, mode);
610 }
611
SetScreenColorGamut(ScreenId id,int32_t modeIdx)612 int32_t RSRenderServiceClient::SetScreenColorGamut(ScreenId id, int32_t modeIdx)
613 {
614 auto renderService = RSRenderServiceConnectHub::GetRenderService();
615 if (renderService == nullptr) {
616 return RENDER_SERVICE_NULL;
617 }
618 return renderService->SetScreenColorGamut(id, modeIdx);
619 }
620
SetScreenGamutMap(ScreenId id,ScreenGamutMap mode)621 int32_t RSRenderServiceClient::SetScreenGamutMap(ScreenId id, ScreenGamutMap mode)
622 {
623 auto renderService = RSRenderServiceConnectHub::GetRenderService();
624 if (renderService == nullptr) {
625 return RENDER_SERVICE_NULL;
626 }
627 return renderService->SetScreenGamutMap(id, mode);
628 }
629
GetScreenGamutMap(ScreenId id,ScreenGamutMap & mode)630 int32_t RSRenderServiceClient::GetScreenGamutMap(ScreenId id, ScreenGamutMap& mode)
631 {
632 auto renderService = RSRenderServiceConnectHub::GetRenderService();
633 if (renderService == nullptr) {
634 return RENDER_SERVICE_NULL;
635 }
636 return renderService->GetScreenGamutMap(id, mode);
637 }
638
GetScreenHDRCapability(ScreenId id,RSScreenHDRCapability & screenHdrCapability)639 int32_t RSRenderServiceClient::GetScreenHDRCapability(ScreenId id, RSScreenHDRCapability& screenHdrCapability)
640 {
641 auto renderService = RSRenderServiceConnectHub::GetRenderService();
642 if (renderService == nullptr) {
643 ROSEN_LOGE("RSRenderServiceClient::GetScreenHDRCapability renderService == nullptr!");
644 return RENDER_SERVICE_NULL;
645 }
646 return renderService->GetScreenHDRCapability(id, screenHdrCapability);
647 }
648
GetScreenType(ScreenId id,RSScreenType & screenType)649 int32_t RSRenderServiceClient::GetScreenType(ScreenId id, RSScreenType& screenType)
650 {
651 auto renderService = RSRenderServiceConnectHub::GetRenderService();
652 if (renderService == nullptr) {
653 ROSEN_LOGE("RSRenderServiceClient::GetScreenType renderService == nullptr!");
654 return RENDER_SERVICE_NULL;
655 }
656 return renderService->GetScreenType(id, screenType);
657 }
658
659 #ifndef USE_ROSEN_DRAWING
GetBitmap(NodeId id,SkBitmap & bitmap)660 bool RSRenderServiceClient::GetBitmap(NodeId id, SkBitmap& bitmap)
661 #else
662 bool RSRenderServiceClient::GetBitmap(NodeId id, Drawing::Bitmap& bitmap)
663 #endif
664 {
665 auto renderService = RSRenderServiceConnectHub::GetRenderService();
666 if (renderService == nullptr) {
667 ROSEN_LOGE("RSRenderServiceClient::GetBitmap renderService == nullptr!");
668 return false;
669 }
670 return renderService->GetBitmap(id, bitmap);
671 }
672
GetPixelmap(NodeId id,const std::shared_ptr<Media::PixelMap> pixelmap,const SkRect * rect)673 bool RSRenderServiceClient::GetPixelmap(NodeId id, const std::shared_ptr<Media::PixelMap> pixelmap, const SkRect* rect)
674 {
675 auto renderService = RSRenderServiceConnectHub::GetRenderService();
676 if (renderService == nullptr) {
677 ROSEN_LOGE("RSRenderServiceClient::GetPixelmap: renderService is nullptr");
678 return false;
679 }
680 return renderService->GetPixelmap(id, pixelmap, rect);
681 }
682
SetScreenSkipFrameInterval(ScreenId id,uint32_t skipFrameInterval)683 int32_t RSRenderServiceClient::SetScreenSkipFrameInterval(ScreenId id, uint32_t skipFrameInterval)
684 {
685 auto renderService = RSRenderServiceConnectHub::GetRenderService();
686 if (renderService == nullptr) {
687 return RENDER_SERVICE_NULL;
688 }
689 return renderService->SetScreenSkipFrameInterval(id, skipFrameInterval);
690 }
691
692 class CustomOcclusionChangeCallback : public RSOcclusionChangeCallbackStub
693 {
694 public:
CustomOcclusionChangeCallback(const OcclusionChangeCallback & callback)695 explicit CustomOcclusionChangeCallback(const OcclusionChangeCallback &callback) : cb_(callback) {}
~CustomOcclusionChangeCallback()696 ~CustomOcclusionChangeCallback() override {};
697
OnOcclusionVisibleChanged(std::shared_ptr<RSOcclusionData> occlusionData)698 void OnOcclusionVisibleChanged(std::shared_ptr<RSOcclusionData> occlusionData) override
699 {
700 if (cb_ != nullptr) {
701 cb_(occlusionData);
702 }
703 }
704
705 private:
706 OcclusionChangeCallback cb_;
707 };
708
RegisterOcclusionChangeCallback(const OcclusionChangeCallback & callback)709 int32_t RSRenderServiceClient::RegisterOcclusionChangeCallback(const OcclusionChangeCallback& callback)
710 {
711 auto renderService = RSRenderServiceConnectHub::GetRenderService();
712 if (renderService == nullptr) {
713 ROSEN_LOGE("RSRenderServiceClient::RegisterOcclusionChangeCallback renderService == nullptr!");
714 return RENDER_SERVICE_NULL;
715 }
716 sptr<CustomOcclusionChangeCallback> cb = new CustomOcclusionChangeCallback(callback);
717 return renderService->RegisterOcclusionChangeCallback(cb);
718 }
719
SetAppWindowNum(uint32_t num)720 void RSRenderServiceClient::SetAppWindowNum(uint32_t num)
721 {
722 auto renderService = RSRenderServiceConnectHub::GetRenderService();
723 if (renderService != nullptr) {
724 renderService->SetAppWindowNum(num);
725 }
726 }
727
ShowWatermark(const std::shared_ptr<Media::PixelMap> & watermarkImg,bool isShow)728 void RSRenderServiceClient::ShowWatermark(const std::shared_ptr<Media::PixelMap> &watermarkImg, bool isShow)
729 {
730 auto renderService = RSRenderServiceConnectHub::GetRenderService();
731 if (renderService != nullptr) {
732 renderService->ShowWatermark(watermarkImg, isShow);
733 }
734 }
735
ReportJankStats()736 void RSRenderServiceClient::ReportJankStats()
737 {
738 auto renderService = RSRenderServiceConnectHub::GetRenderService();
739 if (renderService != nullptr) {
740 renderService->ReportJankStats();
741 }
742 }
743
ReportEventResponse(DataBaseRs info)744 void RSRenderServiceClient::ReportEventResponse(DataBaseRs info)
745 {
746 auto renderService = RSRenderServiceConnectHub::GetRenderService();
747 if (renderService != nullptr) {
748 renderService->ReportEventResponse(info);
749 }
750 }
751
ReportEventComplete(DataBaseRs info)752 void RSRenderServiceClient::ReportEventComplete(DataBaseRs info)
753 {
754 auto renderService = RSRenderServiceConnectHub::GetRenderService();
755 if (renderService != nullptr) {
756 renderService->ReportEventComplete(info);
757 }
758 }
759
ReportEventJankFrame(DataBaseRs info)760 void RSRenderServiceClient::ReportEventJankFrame(DataBaseRs info)
761 {
762 auto renderService = RSRenderServiceConnectHub::GetRenderService();
763 if (renderService != nullptr) {
764 renderService->ReportEventJankFrame(info);
765 }
766 }
767
SetHardwareEnabled(NodeId id,bool isEnabled)768 void RSRenderServiceClient::SetHardwareEnabled(NodeId id, bool isEnabled)
769 {
770 auto renderService = RSRenderServiceConnectHub::GetRenderService();
771 if (renderService != nullptr) {
772 renderService->SetHardwareEnabled(id, isEnabled);
773 }
774 }
775 } // namespace Rosen
776 } // namespace OHOS
777