1 /*
2  * Copyright (c) 2021 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 #ifndef FRAMEWORKS_SURFACE_INCLUDE_BUFFER_QUEUE_H
17 #define FRAMEWORKS_SURFACE_INCLUDE_BUFFER_QUEUE_H
18 
19 #include <map>
20 #include <list>
21 #include <vector>
22 #include <mutex>
23 
24 #include <ibuffer_consumer_listener.h>
25 #include <ibuffer_producer.h>
26 #include "iconsumer_surface.h"
27 #include "surface_type.h"
28 #include <surface_tunnel_handle.h>
29 #include "surface_buffer.h"
30 #include "consumer_surface_delegator.h"
31 
32 namespace OHOS {
33 enum BufferState {
34     BUFFER_STATE_RELEASED,
35     BUFFER_STATE_REQUESTED,
36     BUFFER_STATE_FLUSHED,
37     BUFFER_STATE_ACQUIRED,
38     BUFFER_STATE_ATTACHED,
39 };
40 
41 enum InvokerType {
42     PRODUCER_INVOKER,
43     CONSUMER_INVOKER,
44 };
45 
46 using BufferElement = struct BufferElement {
47     sptr<SurfaceBuffer> buffer;
48     BufferState state;
49     bool isDeleting;
50 
51     BufferRequestConfig config;
52     sptr<SyncFence> fence;
53     int64_t timestamp;
54     std::vector<Rect> damages;
55     HDRMetaDataType hdrMetaDataType = HDRMetaDataType::HDR_NOT_USED;
56     std::vector<GraphicHDRMetaData> metaData;
57     GraphicHDRMetadataKey key;
58     std::vector<uint8_t> metaDataSet;
59     GraphicPresentTimestamp presentTimestamp = {GRAPHIC_DISPLAY_PTS_UNSUPPORTED, 0};
60     /**
61      * The desired time to present the buffer in nanoseconds.
62      * The buffer should wait until desiredPresentTimestamp is reached before being consumed and displayed.
63      * If multiple buffers reach desiredPresentTimestamp, the earlier buffer should be dropped.
64      */
65     int64_t desiredPresentTimestamp;
66     /**
67      * The desiredPresentTimestamp is automatically generated by the system, isAutoTimestamp is true.
68      * The desiredPresentTimestamp is manually set by the producer, isAutoTimestamp is false.
69      */
70     bool isAutoTimestamp;
71 };
72 
73 using BufferAndFence = std::pair<sptr<SurfaceBuffer>, sptr<SyncFence>>;
74 
75 class BufferQueue : public RefBase {
76 public:
77     BufferQueue(const std::string &name, bool isShared = false);
78     virtual ~BufferQueue();
79 
80     GSError GetProducerInitInfo(ProducerInitInfo &info);
81 
82     GSError RequestBuffer(const BufferRequestConfig &config, sptr<BufferExtraData> &bedata,
83                           struct IBufferProducer::RequestBufferReturnValue &retval);
84 
85     GSError ReuseBuffer(const BufferRequestConfig &config, sptr<BufferExtraData> &bedata,
86                         struct IBufferProducer::RequestBufferReturnValue &retval);
87 
88     GSError CancelBuffer(uint32_t sequence, sptr<BufferExtraData> bedata);
89 
90     GSError FlushBuffer(uint32_t sequence, sptr<BufferExtraData> bedata,
91                         sptr<SyncFence> fence, const BufferFlushConfigWithDamages &config);
92 
93     GSError DoFlushBuffer(uint32_t sequence, sptr<BufferExtraData> bedata,
94                           sptr<SyncFence> fence, const BufferFlushConfigWithDamages &config);
95 
96     GSError GetLastFlushedBuffer(sptr<SurfaceBuffer>& buffer, sptr<SyncFence>& fence,
97         float matrix[16], uint32_t matrixSize, bool isUseNewMatrix, bool needRecordSequence = false);
98 
99     GSError AcquireBuffer(sptr<SurfaceBuffer>& buffer, sptr<SyncFence>& fence,
100                           int64_t &timestamp, std::vector<Rect> &damages);
101     GSError AcquireBuffer(IConsumerSurface::AcquireBufferReturnValue &returnValue, int64_t expectPresentTimestamp,
102                           bool isUsingAutoTimestamp);
103     GSError ReleaseBuffer(sptr<SurfaceBuffer>& buffer, const sptr<SyncFence>& fence);
104 
105     GSError AttachBuffer(sptr<SurfaceBuffer>& buffer, int32_t timeOut);
106 
107     GSError DetachBuffer(sptr<SurfaceBuffer>& buffer);
108 
109     GSError RegisterSurfaceDelegator(sptr<IRemoteObject> client, sptr<Surface> cSurface);
110 
111     bool QueryIfBufferAvailable();
112 
113     uint32_t GetQueueSize();
114     GSError SetQueueSize(uint32_t queueSize);
115 
116     GSError GetName(std::string &name);
117 
118     GSError RegisterConsumerListener(sptr<IBufferConsumerListener>& listener);
119     GSError RegisterConsumerListener(IBufferConsumerListenerClazz *listener);
120     GSError RegisterReleaseListener(OnReleaseFunc func);
121     GSError RegisterProducerReleaseListener(sptr<IProducerListener> listener);
122     GSError UnRegisterProducerReleaseListener();
123     GSError RegisterDeleteBufferListener(OnDeleteBufferFunc func, bool isForUniRedraw = false);
124     GSError UnregisterConsumerListener();
125 
126     GSError SetDefaultWidthAndHeight(int32_t width, int32_t height);
127     int32_t GetDefaultWidth();
128     int32_t GetDefaultHeight();
129     GSError SetDefaultUsage(uint64_t usage);
130     uint64_t GetDefaultUsage();
131 
132     GSError CleanCache(bool cleanAll);
133     GSError GoBackground();
134     GSError OnConsumerDied();
135 
136     uint64_t GetUniqueId() const;
137 
138     void Dump(std::string &result);
139 
140     GSError SetTransform(GraphicTransformType transform);
141     GraphicTransformType GetTransform() const;
142 
143     GSError IsSupportedAlloc(const std::vector<BufferVerifyAllocInfo> &infos,
144                              std::vector<bool> &supporteds) const;
145 
146     GSError SetBufferHold(bool hold);
IsBufferHold()147     inline bool IsBufferHold()
148     {
149         return isBufferHold_;
150     }
151     GSError SetScalingMode(uint32_t sequence, ScalingMode scalingMode);
152     GSError GetScalingMode(uint32_t sequence, ScalingMode &scalingMode);
153     GSError SetMetaData(uint32_t sequence, const std::vector<GraphicHDRMetaData> &metaData);
154     GSError SetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey key,
155                            const std::vector<uint8_t> &metaData);
156     GSError QueryMetaDataType(uint32_t sequence, HDRMetaDataType &type);
157     GSError GetMetaData(uint32_t sequence, std::vector<GraphicHDRMetaData> &metaData);
158     GSError GetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey &key,
159                            std::vector<uint8_t> &metaData);
160     GSError SetTunnelHandle(const sptr<SurfaceTunnelHandle> &handle);
161     sptr<SurfaceTunnelHandle> GetTunnelHandle();
162     GSError SetPresentTimestamp(uint32_t sequence, const GraphicPresentTimestamp &timestamp);
163     GSError GetPresentTimestamp(uint32_t sequence, GraphicPresentTimestampType type, int64_t &time);
164 
165     bool GetStatus() const;
166     void SetStatus(bool status);
167 
168     void SetBatchHandle(bool batch);
169 
170     GSError SetProducerCacheCleanFlag(bool flag);
ConsumerRequestCpuAccess(bool on)171     inline void ConsumerRequestCpuAccess(bool on)
172     {
173         isCpuAccessable_ = on;
174     }
175 
176     GSError AttachBufferToQueue(sptr<SurfaceBuffer> buffer, InvokerType invokerType);
177     GSError DetachBufferFromQueue(sptr<SurfaceBuffer> buffer, InvokerType invokerType);
178 
179     GSError SetTransformHint(GraphicTransformType transformHint);
180     GraphicTransformType GetTransformHint() const;
181     GSError SetScalingMode(ScalingMode scalingMode);
182 
183     GSError SetSurfaceSourceType(OHSurfaceSource sourceType);
184     OHSurfaceSource GetSurfaceSourceType() const;
185 
186     GSError SetSurfaceAppFrameworkType(std::string appFrameworkType);
187     std::string GetSurfaceAppFrameworkType() const;
188 
189     GSError SetHdrWhitePointBrightness(float brightness);
190     GSError SetSdrWhitePointBrightness(float brightness);
191     float GetHdrWhitePointBrightness() const;
192     float GetSdrWhitePointBrightness() const;
193 
194     GSError IsSurfaceBufferInCache(uint32_t seqNum, bool &isInCache);
195 
196     GSError AcquireLastFlushedBuffer(sptr<SurfaceBuffer> &buffer, sptr<SyncFence> &fence,
197         float matrix[16], uint32_t matrixSize, bool isUseNewMatrix);
198     GSError ReleaseLastFlushedBuffer(uint32_t sequence);
199     uint32_t GetAvailableBufferCount();
200 
201     GSError RequestAndDetachBuffer(const BufferRequestConfig& config, sptr<BufferExtraData>& bedata,
202         struct IBufferProducer::RequestBufferReturnValue& retval);
203     GSError AttachAndFlushBuffer(sptr<SurfaceBuffer>& buffer, sptr<BufferExtraData>& bedata,
204         const sptr<SyncFence>& fence, BufferFlushConfigWithDamages& config, bool needMap);
205 
206 private:
207     GSError AllocBuffer(sptr<SurfaceBuffer>& buffer, const BufferRequestConfig &config);
208     void DeleteBufferInCache(uint32_t sequence);
209 
210     uint32_t GetUsedSize();
211     void DeleteBuffersLocked(int32_t count);
212 
213     GSError PopFromFreeList(sptr<SurfaceBuffer>& buffer, const BufferRequestConfig &config);
214     GSError PopFromDirtyList(sptr<SurfaceBuffer>& buffer);
215 
216     GSError CheckRequestConfig(const BufferRequestConfig &config);
217     GSError CheckFlushConfig(const BufferFlushConfigWithDamages &config);
218     void DumpCache(std::string &result);
219     void DumpMetadata(std::string &result, BufferElement element);
220     void ClearLocked();
221     bool CheckProducerCacheList();
222     GSError SetProducerCacheCleanFlagLocked(bool flag);
223     GSError AttachBufferUpdateStatus(std::unique_lock<std::mutex> &lock, uint32_t sequence, int32_t timeOut);
224     void AttachBufferUpdateBufferInfo(sptr<SurfaceBuffer>& buffer, bool needMap);
225     void ListenerBufferReleasedCb(sptr<SurfaceBuffer> &buffer, const sptr<SyncFence> &fence);
226     void OnBufferDeleteCbForHardwareThreadLocked(const sptr<SurfaceBuffer> &buffer) const;
227     GSError CheckBufferQueueCache(uint32_t sequence);
228     GSError ReallocBuffer(const BufferRequestConfig &config, struct IBufferProducer::RequestBufferReturnValue &retval);
229     void SetSurfaceBufferHebcMetaLocked(sptr<SurfaceBuffer> buffer);
230     GSError RequestBufferCheckStatus();
231     GSError DelegatorQueueBuffer(uint32_t sequence, sptr<SyncFence> fence);
232     bool WaitForCondition();
233     void RequestBufferDebugInfo();
234     bool GetStatusLocked() const;
235     void CallConsumerListener();
236     void LogAndTraceAllBufferInBufferQueueCache();
237     bool IsPresentTimestampReady(int64_t desiredPresentTimestamp, int64_t expectPresentTimestamp);
238     void SetDesiredPresentTimestampAndUiTimestamp(uint32_t sequence, int64_t desiredPresentTimestamp,
239                                                  uint64_t uiTimestamp);
240     void DropFirstDirtyBuffer(BufferElement &frontBufferElement, BufferElement &secondBufferElement,
241                               int64_t &frontDesiredPresentTimestamp, bool &frontIsAutoTimestamp,
242                               std::vector<BufferAndFence> &dropBuffers);
243     void ReleaseDropBuffers(std::vector<BufferAndFence> &dropBuffers);
244     void OnBufferDeleteForRS(uint32_t sequence);
245     void AddDeletingBuffersLocked(std::vector<uint32_t> &deletingBuffers);
246     GSError DetachBufferFromQueueLocked(uint32_t sequence, InvokerType invokerType);
247     GSError AttachBufferToQueueLocked(sptr<SurfaceBuffer> buffer, InvokerType invokerType, bool needMap);
248     GSError FlushBufferImprovedLocked(uint32_t sequence, sptr<BufferExtraData> &bedata,
249         const sptr<SyncFence> &fence, const BufferFlushConfigWithDamages &config);
250     GSError CheckBufferQueueCacheLocked(uint32_t sequence);
251     GSError DoFlushBufferLocked(uint32_t sequence, sptr<BufferExtraData> bedata,
252         sptr<SyncFence> fence, const BufferFlushConfigWithDamages &config);
253     GSError RequestBufferLocked(const BufferRequestConfig &config, sptr<BufferExtraData> &bedata,
254         struct IBufferProducer::RequestBufferReturnValue &retval, std::unique_lock<std::mutex> &lock);
255 
256     int32_t defaultWidth_ = 0;
257     int32_t defaultHeight_ = 0;
258     uint64_t defaultUsage_ = 0;
259     uint32_t queueSize_ = SURFACE_DEFAULT_QUEUE_SIZE;
260     ScalingMode scalingMode_ = ScalingMode::SCALING_MODE_SCALE_TO_WINDOW;
261     GraphicTransformType transform_ = GraphicTransformType::GRAPHIC_ROTATE_NONE;
262     GraphicTransformType lastFlushedTransform_ = GraphicTransformType::GRAPHIC_ROTATE_NONE;
263     std::string name_;
264     std::list<uint32_t> freeList_;
265     std::list<uint32_t> dirtyList_;
266     std::list<uint32_t> deletingList_;
267     std::list<uint32_t> producerCacheList_;
268     std::map<uint32_t, BufferElement> bufferQueueCache_;
269     sptr<IBufferConsumerListener> listener_ = nullptr;
270     IBufferConsumerListenerClazz *listenerClazz_ = nullptr;
271     mutable std::mutex mutex_;
272     std::mutex listenerMutex_;
273     std::mutex producerListenerMutex_;
274     const uint64_t uniqueId_;
275     OnReleaseFunc onBufferRelease_ = nullptr;
276     std::mutex onBufferReleaseMutex_;
277     sptr<IProducerListener> producerListener_ = nullptr;
278     OnDeleteBufferFunc onBufferDeleteForRSMainThread_;
279     OnDeleteBufferFunc onBufferDeleteForRSHardwareThread_;
280     bool isShared_ = false;
281     std::condition_variable waitReqCon_;
282     std::condition_variable waitAttachCon_;
283     sptr<SurfaceTunnelHandle> tunnelHandle_ = nullptr;
284     std::atomic_bool isValidStatus_ = true;
285     std::atomic_bool producerCacheClean_ = false;
286     const bool isLocalRender_;
287     uint32_t lastFlusedSequence_ = 0;
288     sptr<SyncFence> lastFlusedFence_;
289     wptr<ConsumerSurfaceDelegator> wpCSurfaceDelegator_;
290     bool isCpuAccessable_ = false;
291     GraphicTransformType transformHint_ = GraphicTransformType::GRAPHIC_ROTATE_NONE;
292     bool isBufferHold_ = false;
293     bool isBatch_ = false;
294     OHSurfaceSource sourceType_ = OHSurfaceSource::OH_SURFACE_SOURCE_DEFAULT;
295     std::string appFrameworkType_ = "";
296     float hdrWhitePointBrightness_ = 0.0;
297     float sdrWhitePointBrightness_ = 0.0;
298     uint32_t acquireLastFlushedBufSequence_;
299     std::string requestBufferStateStr_;
300     std::string acquireBufferStateStr_;
301 };
302 }; // namespace OHOS
303 
304 #endif // FRAMEWORKS_SURFACE_INCLUDE_BUFFER_QUEUE_H
305