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