• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "transaction/rs_render_service_client.h"
17 
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