1 /*
2  * Copyright (c) 2022-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 #ifndef RENDER_SERVICE_CLIENT_CORE_PIPELINE_RS_SURFACE_HANDLER_H
16 #define RENDER_SERVICE_CLIENT_CORE_PIPELINE_RS_SURFACE_HANDLER_H
17 
18 #include <atomic>
19 #include <map>
20 #include <mutex>
21 
22 #include "common/rs_common_def.h"
23 #include "common/rs_macros.h"
24 #include "platform/common/rs_log.h"
25 #ifndef ROSEN_CROSS_PLATFORM
26 #include <iconsumer_surface.h>
27 #include <surface.h>
28 #include "sync_fence.h"
29 #endif
30 
31 namespace OHOS {
32 namespace Rosen {
33 using OnDeleteBufferFunc = std::function<void(int32_t)>;
34 class RSB_EXPORT RSSurfaceHandler {
35 public:
36     // indicates which node this handler belongs to.
RSSurfaceHandler(NodeId id)37     explicit RSSurfaceHandler(NodeId id) : id_(id) {}
38     virtual ~RSSurfaceHandler() noexcept;
39 
40     struct SurfaceBufferEntry {
41 #ifndef ROSEN_CROSS_PLATFORM
~SurfaceBufferEntrySurfaceBufferEntry42         ~SurfaceBufferEntry() noexcept
43         {
44             if (buffer != nullptr && bufferDeleteCb_ != nullptr) {
45                 bufferDeleteCb_(buffer->GetSeqNum());
46             }
47         }
48 
RegisterDeleteBufferListenerSurfaceBufferEntry49         void RegisterDeleteBufferListener(OnDeleteBufferFunc bufferDeleteCb)
50         {
51             if (bufferDeleteCb_ == nullptr) {
52                 bufferDeleteCb_ = bufferDeleteCb;
53             }
54         }
55 #endif
ResetSurfaceBufferEntry56         void Reset()
57         {
58 #ifndef ROSEN_CROSS_PLATFORM
59             if (buffer == nullptr) {
60                 return;
61             }
62             if (bufferDeleteCb_) {
63                 bufferDeleteCb_(buffer->GetSeqNum());
64             }
65             buffer = nullptr;
66             acquireFence = SyncFence::InvalidFence();
67             releaseFence = SyncFence::InvalidFence();
68             damageRect = Rect {0, 0, 0, 0};
69 #endif
70             timestamp = 0;
71         }
72 #ifndef ROSEN_CROSS_PLATFORM
73         sptr<SurfaceBuffer> buffer = nullptr;
74         sptr<SyncFence> acquireFence = SyncFence::InvalidFence();
75         sptr<SyncFence> releaseFence = SyncFence::InvalidFence();
76         Rect damageRect = {0, 0, 0, 0};
77         OnDeleteBufferFunc bufferDeleteCb_ = nullptr;
78 #endif
79         int64_t timestamp = 0;
80     };
81 
82     void IncreaseAvailableBuffer();
83     void ReduceAvailableBuffer();
84 
GetNodeId()85     NodeId GetNodeId() const
86     {
87         return id_;
88     }
89 
SetDefaultWidthAndHeight(int32_t width,int32_t height)90     void SetDefaultWidthAndHeight(int32_t width, int32_t height)
91     {
92 #ifndef ROSEN_CROSS_PLATFORM
93         if (consumer_ != nullptr) {
94             consumer_->SetDefaultWidthAndHeight(width, height);
95         }
96 #endif
97     }
98 
99 #ifndef ROSEN_CROSS_PLATFORM
100     void SetConsumer(sptr<IConsumerSurface> consumer);
101 
GetConsumer()102     sptr<IConsumerSurface> GetConsumer() const
103     {
104         return consumer_;
105     }
106 
SetHoldBuffer(std::shared_ptr<SurfaceBufferEntry> buffer)107     void SetHoldBuffer(std::shared_ptr<SurfaceBufferEntry> buffer)
108     {
109         holdBuffer_ = buffer;
110     }
111 
GetHoldBuffer()112     inline std::shared_ptr<SurfaceBufferEntry> GetHoldBuffer()
113     {
114         return holdBuffer_;
115     }
116 
SetBuffer(const sptr<SurfaceBuffer> & buffer,const sptr<SyncFence> & acquireFence,const Rect & damage,const int64_t timestamp)117     void SetBuffer(
118         const sptr<SurfaceBuffer>& buffer,
119         const sptr<SyncFence>& acquireFence,
120         const Rect& damage,
121         const int64_t timestamp)
122     {
123         std::lock_guard<std::mutex> lock(mutex_);
124         preBuffer_.Reset();
125         preBuffer_ = buffer_;
126         buffer_.buffer = buffer;
127         buffer_.acquireFence = acquireFence;
128         buffer_.damageRect = damage;
129         buffer_.timestamp = timestamp;
130     }
131 
GetBuffer()132     const sptr<SurfaceBuffer> GetBuffer() const
133     {
134         std::lock_guard<std::mutex> lock(mutex_);
135         return buffer_.buffer;
136     }
137 
GetBufferUsage()138     uint64_t GetBufferUsage() const
139     {
140         std::lock_guard<std::mutex> lock(mutex_);
141         if (!buffer_.buffer) {
142             return 0;
143         }
144         return buffer_.buffer->GetUsage();
145     }
146 
GetAcquireFence()147     const sptr<SyncFence> GetAcquireFence() const
148     {
149         std::lock_guard<std::mutex> lock(mutex_);
150         return buffer_.acquireFence;
151     }
152 
GetDamageRegion()153     const Rect GetDamageRegion() const
154     {
155         std::lock_guard<std::mutex> lock(mutex_);
156         return buffer_.damageRect;
157     }
158 
SetCurrentReleaseFence(sptr<SyncFence> fence)159     void SetCurrentReleaseFence(sptr<SyncFence> fence)
160     {
161         std::lock_guard<std::mutex> lock(mutex_);
162         buffer_.releaseFence = fence;
163     }
164 
SetReleaseFence(sptr<SyncFence> fence)165     void SetReleaseFence(sptr<SyncFence> fence)
166     {
167         // The fence which get from hdi is preBuffer's releaseFence now.
168         std::lock_guard<std::mutex> lock(mutex_);
169         preBuffer_.releaseFence = std::move(fence);
170     }
171 
SetBufferSizeChanged(const sptr<SurfaceBuffer> & buffer)172     void SetBufferSizeChanged(const sptr<SurfaceBuffer>& buffer)
173     {
174         std::lock_guard<std::mutex> lock(mutex_);
175         if (preBuffer_.buffer == nullptr) {
176             return;
177         }
178         bufferSizeChanged_ = buffer->GetWidth() != preBuffer_.buffer->GetWidth() ||
179                              buffer->GetHeight() != preBuffer_.buffer->GetHeight();
180     }
181 
SetBufferTransformTypeChanged(bool flag)182     void SetBufferTransformTypeChanged(bool flag)
183     {
184         bufferTransformTypeChanged_ = flag;
185     }
186 
CheckScalingModeChanged()187     bool CheckScalingModeChanged()
188     {
189         std::lock_guard<std::mutex> lock(mutex_);
190         if (consumer_ == nullptr || buffer_.buffer == nullptr) {
191             return false;
192         }
193 
194         ScalingMode scalingMode = ScalingMode::SCALING_MODE_SCALE_TO_WINDOW;
195         consumer_->GetScalingMode(buffer_.buffer->GetSeqNum(), scalingMode);
196         bool ScalingModeChanged_ = scalingMode != scalingModePre;
197         scalingModePre = scalingMode;
198         return ScalingModeChanged_;
199     }
200 
GetPreBuffer()201     sptr<SurfaceBuffer> GetPreBuffer()
202     {
203         std::lock_guard<std::mutex> lock(mutex_);
204         return preBuffer_.buffer;
205     }
206 
GetPreBufferAcquireFence()207     sptr<SyncFence> GetPreBufferAcquireFence()
208     {
209         std::lock_guard<std::mutex> lock(mutex_);
210         return preBuffer_.acquireFence;
211     }
212 
GetPreBufferReleaseFence()213     sptr<SyncFence> GetPreBufferReleaseFence()
214     {
215         std::lock_guard<std::mutex> lock(mutex_);
216         return preBuffer_.releaseFence;
217     }
218 #endif
219 
ResetPreBuffer()220     void ResetPreBuffer()
221     {
222         std::lock_guard<std::mutex> lock(mutex_);
223         preBuffer_.Reset();
224     }
225 
GetAvailableBufferCount()226     int32_t GetAvailableBufferCount() const
227     {
228         return bufferAvailableCount_;
229     }
230 
SetAvailableBufferCount(const int32_t bufferAvailableCount)231     void SetAvailableBufferCount(const int32_t bufferAvailableCount)
232     {
233         bufferAvailableCount_ = bufferAvailableCount;
234     }
235 
GetTimestamp()236     int64_t GetTimestamp() const
237     {
238         std::lock_guard<std::mutex> lock(mutex_);
239         return buffer_.timestamp;
240     }
241 
CleanCache()242     void CleanCache()
243     {
244         std::lock_guard<std::mutex> lock(mutex_);
245         buffer_.Reset();
246         preBuffer_.Reset();
247     }
248 
ResetBufferAvailableCount()249     void ResetBufferAvailableCount()
250     {
251         bufferAvailableCount_ = 0;
252     }
253 
254     void SetGlobalZOrder(float globalZOrder);
255     float GetGlobalZOrder() const;
256 
GetBufferSizeChanged()257     bool GetBufferSizeChanged()
258     {
259         std::lock_guard<std::mutex> lock(mutex_);
260         return bufferSizeChanged_;
261     }
262 
GetBufferTransformTypeChanged()263     bool GetBufferTransformTypeChanged() const
264     {
265         return bufferTransformTypeChanged_;
266     }
267 
HasConsumer()268     bool HasConsumer() const
269     {
270 #ifndef ROSEN_CROSS_PLATFORM
271         return consumer_ != nullptr;
272 #else
273         return false;
274 #endif
275     }
IsCurrentFrameBufferConsumed()276     inline bool IsCurrentFrameBufferConsumed() const
277     {
278         return isCurrentFrameBufferConsumed_;
279     }
ResetCurrentFrameBufferConsumed()280     inline void ResetCurrentFrameBufferConsumed()
281     {
282         isCurrentFrameBufferConsumed_ = false;
283     }
SetCurrentFrameBufferConsumed()284     inline void SetCurrentFrameBufferConsumed()
285     {
286         isCurrentFrameBufferConsumed_ = true;
287     }
288 
289 #ifndef ROSEN_CROSS_PLATFORM
RegisterDeleteBufferListener(OnDeleteBufferFunc bufferDeleteCb)290     void RegisterDeleteBufferListener(OnDeleteBufferFunc bufferDeleteCb)
291     {
292         if (bufferDeleteCb != nullptr) {
293             std::lock_guard<std::mutex> lock(mutex_);
294             buffer_.RegisterDeleteBufferListener(bufferDeleteCb);
295             preBuffer_.RegisterDeleteBufferListener(bufferDeleteCb);
296         }
297     }
298     void ConsumeAndUpdateBuffer(SurfaceBufferEntry buffer);
299 #endif
300 
301 protected:
302 #ifndef ROSEN_CROSS_PLATFORM
303     sptr<IConsumerSurface> consumer_ = nullptr;
304 #endif
305     bool isCurrentFrameBufferConsumed_ = false;
306 
307 private:
308     void ConsumeAndUpdateBufferInner(SurfaceBufferEntry& buffer);
309 
310 #ifndef ROSEN_CROSS_PLATFORM
311     ScalingMode scalingModePre = ScalingMode::SCALING_MODE_SCALE_TO_WINDOW;
312 #endif
313     NodeId id_ = 0;
314     // mutex buffer_ & preBuffer_ & bufferCache_
315     mutable std::mutex mutex_;
316     SurfaceBufferEntry buffer_;
317     SurfaceBufferEntry preBuffer_;
318     float globalZOrder_ = 0.0f;
319     std::atomic<int> bufferAvailableCount_ = 0;
320     bool bufferSizeChanged_ = false;
321     bool bufferTransformTypeChanged_ = false;
322     std::shared_ptr<SurfaceBufferEntry> holdBuffer_ = nullptr;
323 };
324 }
325 }
326 #endif // RENDER_SERVICE_CLIENT_CORE_PIPELINE_RS_SURFACE_HANDLER_H
327