• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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(uint32_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 (bufferDeleteCb_ != nullptr) {
45                 bufferDeleteCb_(seqNum);
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         uint32_t seqNum = 0;
79 #endif
80         int64_t timestamp = 0;
81     };
82 
83     void IncreaseAvailableBuffer();
84     void ReduceAvailableBuffer();
85 
GetNodeId()86     NodeId GetNodeId() const
87     {
88         return id_;
89     }
90 
SetDefaultWidthAndHeight(int32_t width,int32_t height)91     void SetDefaultWidthAndHeight(int32_t width, int32_t height)
92     {
93 #ifndef ROSEN_CROSS_PLATFORM
94         if (consumer_ != nullptr) {
95             consumer_->SetDefaultWidthAndHeight(width, height);
96         }
97 #endif
98     }
99 
100 #ifndef ROSEN_CROSS_PLATFORM
101     void SetConsumer(sptr<IConsumerSurface> consumer);
102 
GetConsumer()103     sptr<IConsumerSurface> GetConsumer() const
104     {
105         return consumer_;
106     }
107 
SetHoldBuffer(std::shared_ptr<SurfaceBufferEntry> buffer)108     void SetHoldBuffer(std::shared_ptr<SurfaceBufferEntry> buffer)
109     {
110         holdBuffer_ = buffer;
111     }
112 
GetHoldBuffer()113     inline std::shared_ptr<SurfaceBufferEntry> GetHoldBuffer()
114     {
115         return holdBuffer_;
116     }
117 
SetBuffer(const sptr<SurfaceBuffer> & buffer,const sptr<SyncFence> & acquireFence,const Rect & damage,const int64_t timestamp)118     void SetBuffer(
119         const sptr<SurfaceBuffer>& buffer,
120         const sptr<SyncFence>& acquireFence,
121         const Rect& damage,
122         const int64_t timestamp)
123     {
124         std::lock_guard<std::mutex> lock(mutex_);
125         preBuffer_.Reset();
126         preBuffer_ = buffer_;
127         buffer_.buffer = buffer;
128         if (buffer != nullptr) {
129             buffer_.seqNum = buffer->GetSeqNum();
130         }
131         buffer_.acquireFence = acquireFence;
132         buffer_.damageRect = damage;
133         buffer_.timestamp = timestamp;
134     }
135 
GetBuffer()136     const sptr<SurfaceBuffer> GetBuffer() const
137     {
138         std::lock_guard<std::mutex> lock(mutex_);
139         return buffer_.buffer;
140     }
141 
GetBufferUsage()142     uint64_t GetBufferUsage() const
143     {
144         std::lock_guard<std::mutex> lock(mutex_);
145         if (!buffer_.buffer) {
146             return 0;
147         }
148         return buffer_.buffer->GetUsage();
149     }
150 
GetAcquireFence()151     const sptr<SyncFence> GetAcquireFence() const
152     {
153         std::lock_guard<std::mutex> lock(mutex_);
154         return buffer_.acquireFence;
155     }
156 
GetDamageRegion()157     const Rect GetDamageRegion() const
158     {
159         std::lock_guard<std::mutex> lock(mutex_);
160         return buffer_.damageRect;
161     }
162 
SetCurrentReleaseFence(sptr<SyncFence> fence)163     void SetCurrentReleaseFence(sptr<SyncFence> fence)
164     {
165         std::lock_guard<std::mutex> lock(mutex_);
166         buffer_.releaseFence = fence;
167     }
168 
SetReleaseFence(sptr<SyncFence> fence)169     void SetReleaseFence(sptr<SyncFence> fence)
170     {
171         // The fence which get from hdi is preBuffer's releaseFence now.
172         std::lock_guard<std::mutex> lock(mutex_);
173         preBuffer_.releaseFence = std::move(fence);
174     }
175 
SetBufferSizeChanged(const sptr<SurfaceBuffer> & buffer)176     void SetBufferSizeChanged(const sptr<SurfaceBuffer>& buffer)
177     {
178         std::lock_guard<std::mutex> lock(mutex_);
179         if (preBuffer_.buffer == nullptr) {
180             return;
181         }
182         bufferSizeChanged_ = buffer->GetWidth() != preBuffer_.buffer->GetWidth() ||
183                              buffer->GetHeight() != preBuffer_.buffer->GetHeight();
184     }
185 
SetBufferTransformTypeChanged(bool flag)186     void SetBufferTransformTypeChanged(bool flag)
187     {
188         bufferTransformTypeChanged_ = flag;
189     }
190 
CheckScalingModeChanged()191     bool CheckScalingModeChanged()
192     {
193         std::lock_guard<std::mutex> lock(mutex_);
194         if (consumer_ == nullptr || buffer_.buffer == nullptr) {
195             return false;
196         }
197 
198         ScalingMode scalingMode = ScalingMode::SCALING_MODE_SCALE_TO_WINDOW;
199         consumer_->GetScalingMode(buffer_.buffer->GetSeqNum(), scalingMode);
200         bool ScalingModeChanged_ = scalingMode != scalingModePre;
201         scalingModePre = scalingMode;
202         return ScalingModeChanged_;
203     }
204 
GetPreBuffer()205     sptr<SurfaceBuffer> GetPreBuffer()
206     {
207         std::lock_guard<std::mutex> lock(mutex_);
208         return preBuffer_.buffer;
209     }
210 
GetPreBufferAcquireFence()211     sptr<SyncFence> GetPreBufferAcquireFence()
212     {
213         std::lock_guard<std::mutex> lock(mutex_);
214         return preBuffer_.acquireFence;
215     }
216 
GetPreBufferReleaseFence()217     sptr<SyncFence> GetPreBufferReleaseFence()
218     {
219         std::lock_guard<std::mutex> lock(mutex_);
220         return preBuffer_.releaseFence;
221     }
222 #endif
223 
ResetPreBuffer()224     void ResetPreBuffer()
225     {
226         std::lock_guard<std::mutex> lock(mutex_);
227         preBuffer_.Reset();
228     }
229 
GetAvailableBufferCount()230     int32_t GetAvailableBufferCount() const
231     {
232         return bufferAvailableCount_;
233     }
234 
SetAvailableBufferCount(const int32_t bufferAvailableCount)235     void SetAvailableBufferCount(const int32_t bufferAvailableCount)
236     {
237         bufferAvailableCount_ = bufferAvailableCount;
238     }
239 
GetTimestamp()240     int64_t GetTimestamp() const
241     {
242         return buffer_.timestamp;
243     }
244 
CleanCache()245     void CleanCache()
246     {
247         std::lock_guard<std::mutex> lock(mutex_);
248         buffer_.Reset();
249         preBuffer_.Reset();
250     }
251 
ResetBufferAvailableCount()252     void ResetBufferAvailableCount()
253     {
254         bufferAvailableCount_ = 0;
255     }
256 
257     void SetGlobalZOrder(float globalZOrder);
258     float GetGlobalZOrder() const;
259 
GetBufferSizeChanged()260     bool GetBufferSizeChanged()
261     {
262         std::lock_guard<std::mutex> lock(mutex_);
263         return bufferSizeChanged_;
264     }
265 
GetBufferTransformTypeChanged()266     bool GetBufferTransformTypeChanged() const
267     {
268         return bufferTransformTypeChanged_;
269     }
270 
HasConsumer()271     bool HasConsumer() const
272     {
273 #ifndef ROSEN_CROSS_PLATFORM
274         return consumer_ != nullptr;
275 #else
276         return false;
277 #endif
278     }
IsCurrentFrameBufferConsumed()279     inline bool IsCurrentFrameBufferConsumed() const
280     {
281         return isCurrentFrameBufferConsumed_;
282     }
ResetCurrentFrameBufferConsumed()283     inline void ResetCurrentFrameBufferConsumed()
284     {
285         isCurrentFrameBufferConsumed_ = false;
286     }
SetCurrentFrameBufferConsumed()287     inline void SetCurrentFrameBufferConsumed()
288     {
289         isCurrentFrameBufferConsumed_ = true;
290     }
291 
292 #ifndef ROSEN_CROSS_PLATFORM
RegisterDeleteBufferListener(OnDeleteBufferFunc bufferDeleteCb)293     void RegisterDeleteBufferListener(OnDeleteBufferFunc bufferDeleteCb)
294     {
295         if (bufferDeleteCb != nullptr) {
296             std::lock_guard<std::mutex> lock(mutex_);
297             buffer_.RegisterDeleteBufferListener(bufferDeleteCb);
298             preBuffer_.RegisterDeleteBufferListener(bufferDeleteCb);
299         }
300     }
301     void ConsumeAndUpdateBuffer(SurfaceBufferEntry buffer);
302 #endif
303 
304 protected:
305 #ifndef ROSEN_CROSS_PLATFORM
306     sptr<IConsumerSurface> consumer_ = nullptr;
307 #endif
308     bool isCurrentFrameBufferConsumed_ = false;
309 
310 private:
311     void ConsumeAndUpdateBufferInner(SurfaceBufferEntry& buffer);
312 
313 #ifndef ROSEN_CROSS_PLATFORM
314     ScalingMode scalingModePre = ScalingMode::SCALING_MODE_SCALE_TO_WINDOW;
315 #endif
316     NodeId id_ = 0;
317     // mutex buffer_ & preBuffer_ & bufferCache_
318     mutable std::mutex mutex_;
319     SurfaceBufferEntry buffer_;
320     SurfaceBufferEntry preBuffer_;
321     float globalZOrder_ = 0.0f;
322     std::atomic<int> bufferAvailableCount_ = 0;
323     bool bufferSizeChanged_ = false;
324     bool bufferTransformTypeChanged_ = false;
325     std::shared_ptr<SurfaceBufferEntry> holdBuffer_ = nullptr;
326 };
327 }
328 }
329 #endif // RENDER_SERVICE_CLIENT_CORE_PIPELINE_RS_SURFACE_HANDLER_H
330