• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2022 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 "pipeline/rs_render_service_listener.h"
17 
18 #include "platform/common/rs_log.h"
19 #include "pipeline/rs_main_thread.h"
20 #include "sync_fence.h"
21 
22 namespace OHOS {
23 namespace Rosen {
24 
~RSRenderServiceListener()25 RSRenderServiceListener::~RSRenderServiceListener() {}
26 
RSRenderServiceListener(std::weak_ptr<RSSurfaceRenderNode> surfaceRenderNode)27 RSRenderServiceListener::RSRenderServiceListener(std::weak_ptr<RSSurfaceRenderNode> surfaceRenderNode)
28     : surfaceRenderNode_(surfaceRenderNode)
29 {}
30 
OnBufferAvailable()31 void RSRenderServiceListener::OnBufferAvailable()
32 {
33     auto node = surfaceRenderNode_.lock();
34     if (node == nullptr) {
35         RS_LOGE("RSRenderServiceListener::OnBufferAvailable node is nullptr");
36         return;
37     }
38     RS_LOGD("RsDebug RSRenderServiceListener::OnBufferAvailable node id:%" PRIu64, node->GetId());
39     node->IncreaseAvailableBuffer();
40     if (!node->IsNotifyUIBufferAvailable()) {
41         // Only ipc for one time.
42         RS_LOGD("RsDebug RSRenderServiceListener::OnBufferAvailable id = %" PRIu64 " Notify UI buffer available",
43             node->GetId());
44         node->NotifyUIBufferAvailable();
45     }
46     RSMainThread::Instance()->RequestNextVSync();
47 }
48 
OnTunnelHandleChange()49 void RSRenderServiceListener::OnTunnelHandleChange()
50 {
51     auto node = surfaceRenderNode_.lock();
52     if (node == nullptr) {
53         RS_LOGE("RSRenderServiceListener::OnTunnelHandleChange node is nullptr");
54         return;
55     }
56     node->SetTunnelHandleChange(true);
57     if (!node->IsNotifyUIBufferAvailable()) {
58         // Only ipc for one time.
59         RS_LOGD("RsDebug RSRenderServiceListener::OnTunnelHandleChange id = %" PRIu64 " Notify UI buffer available",
60             node->GetId());
61         node->NotifyUIBufferAvailable();
62     }
63     RSMainThread::Instance()->RequestNextVSync();
64 }
65 
OnCleanCache()66 void RSRenderServiceListener::OnCleanCache()
67 {
68     std::weak_ptr<RSSurfaceRenderNode> surfaceNode = surfaceRenderNode_;
69     RSMainThread::Instance()->PostTask([surfaceNode]() {
70         auto node = surfaceNode.lock();
71         if (node == nullptr) {
72             RS_LOGW("RSRenderServiceListener::OnBufferAvailable node is nullptr");
73             return;
74         }
75         RS_LOGD("RsDebug RSRenderServiceListener::OnCleanCache node id:%" PRIu64, node->GetId());
76         node->ResetBufferAvailableCount();
77     });
78 }
79 
OnGoBackground()80 void RSRenderServiceListener::OnGoBackground()
81 {
82     std::weak_ptr<RSSurfaceRenderNode> surfaceNode = surfaceRenderNode_;
83     RSMainThread::Instance()->PostTask([surfaceNode]() {
84         auto node = surfaceNode.lock();
85         if (node == nullptr) {
86             RS_LOGW("RSRenderServiceListener::OnBufferAvailable node is nullptr");
87             return;
88         }
89         RS_LOGD("RsDebug RSRenderServiceListener::OnGoBackground node id:%" PRIu64, node->GetId());
90         node->ResetBufferAvailableCount();
91         node->CleanCache();
92         node->SetNotifyRTBufferAvailable(false);
93         if (node->IsLastFrameHardwareEnabled()) {
94             node->SetContentDirty();
95             RSMainThread::Instance()->AddActiveNodeId(ExtractPid(node->GetId()), node->GetId());
96         }
97         node->ResetHardwareEnabledStates();
98     });
99 }
100 } // namespace Rosen
101 } // namespace OHOS
102