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