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