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 <buffer_producer_listener.h>
25#include <ibuffer_consumer_listener.h>
26#include <ibuffer_producer.h>
27#include "iconsumer_surface.h"
28#include "surface_type.h"
29#include <surface_tunnel_handle.h>
30#include "surface_buffer.h"
31#include "consumer_surface_delegator.h"
32
33namespace OHOS {
34enum BufferState {
35    BUFFER_STATE_RELEASED,
36    BUFFER_STATE_REQUESTED,
37    BUFFER_STATE_FLUSHED,
38    BUFFER_STATE_ACQUIRED,
39    BUFFER_STATE_ATTACHED,
40};
41
42enum InvokerType {
43    PRODUCER_INVOKER,
44    CONSUMER_INVOKER,
45};
46
47using BufferElement = struct BufferElement {
48    sptr<SurfaceBuffer> buffer;
49    BufferState state;
50    bool isDeleting;
51
52    BufferRequestConfig config;
53    sptr<SyncFence> fence;
54    int64_t timestamp;
55    std::vector<Rect> damages;
56    ScalingMode scalingMode;
57    HDRMetaDataType hdrMetaDataType = HDRMetaDataType::HDR_NOT_USED;
58    std::vector<GraphicHDRMetaData> metaData;
59    GraphicHDRMetadataKey key;
60    std::vector<uint8_t> metaDataSet;
61    GraphicPresentTimestamp presentTimestamp = {GRAPHIC_DISPLAY_PTS_UNSUPPORTED, 0};
62    /**
63     * The desired time to present the buffer in nanoseconds.
64     * The buffer should wait until desiredPresentTimestamp is reached before being consumed and displayed.
65     * If multiple buffers reach desiredPresentTimestamp, the earlier buffer should be dropped.
66     */
67    int64_t desiredPresentTimestamp;
68    /**
69     * The desiredPresentTimestamp is automatically generated by the system, isAutoTimestamp is true.
70     * The desiredPresentTimestamp is manually set by the producer, isAutoTimestamp is false.
71     */
72    bool isAutoTimestamp;
73};
74
75class BufferQueue : public RefBase {
76public:
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);
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);
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    GSError SetGlobalAlpha(int32_t alpha);
200    GSError GetGlobalAlpha(int32_t &alpha);
201    uint32_t GetAvailableBufferCount();
202
203private:
204    GSError AllocBuffer(sptr<SurfaceBuffer>& buffer, const BufferRequestConfig &config);
205    void DeleteBufferInCache(uint32_t sequence);
206
207    uint32_t GetUsedSize();
208    void DeleteBuffersLocked(int32_t count);
209
210    GSError PopFromFreeListLocked(sptr<SurfaceBuffer>& buffer, const BufferRequestConfig &config);
211    GSError PopFromDirtyListLocked(sptr<SurfaceBuffer>& buffer);
212
213    GSError CheckRequestConfig(const BufferRequestConfig &config);
214    GSError CheckFlushConfig(const BufferFlushConfigWithDamages &config);
215    void DumpCache(std::string &result);
216    void DumpMetadata(std::string &result, BufferElement element);
217    void ClearLocked();
218    bool CheckProducerCacheListLocked();
219    GSError SetProducerCacheCleanFlagLocked(bool flag);
220    GSError AttachBufferUpdateStatus(std::unique_lock<std::mutex> &lock, uint32_t sequence, int32_t timeOut);
221    void AttachBufferUpdateBufferInfo(sptr<SurfaceBuffer>& buffer);
222    void ListenerBufferReleasedCb(sptr<SurfaceBuffer> &buffer, const sptr<SyncFence> &fence);
223    void OnBufferDeleteCbForHardwareThreadLocked(const sptr<SurfaceBuffer> &buffer) const;
224    GSError CheckBufferQueueCache(uint32_t sequence);
225    GSError ReallocBufferLocked(const BufferRequestConfig &config,
226        struct IBufferProducer::RequestBufferReturnValue &retval);
227    void SetSurfaceBufferHebcMetaLocked(sptr<SurfaceBuffer> buffer);
228    GSError RequestBufferCheckStatus();
229    GSError DelegatorQueueBuffer(uint32_t sequence, sptr<SyncFence> fence);
230    bool WaitForCondition();
231    void RequestBufferDebugInfoLocked();
232    bool GetStatusLocked() const;
233    void CallConsumerListener();
234    void SetSurfaceBufferGlobalAlphaUnlocked(sptr<SurfaceBuffer> buffer);
235    bool IsPresentTimestampReady(int64_t desiredPresentTimestamp, int64_t expectPresentTimestamp);
236    void LogAndTraceAllBufferInBufferQueueCache();
237    void SetDesiredPresentTimestampAndUiTimestamp(uint32_t sequence, int64_t desiredPresentTimestamp,
238                                                 uint64_t uiTimestamp);
239    int32_t defaultWidth_ = 0;
240    int32_t defaultHeight_ = 0;
241    uint64_t defaultUsage_ = 0;
242    uint32_t bufferQueueSize_ = SURFACE_DEFAULT_QUEUE_SIZE;
243    ScalingMode scalingMode_ = ScalingMode::SCALING_MODE_SCALE_TO_WINDOW;
244    GraphicTransformType transform_ = GraphicTransformType::GRAPHIC_ROTATE_NONE;
245    GraphicTransformType lastFlushedTransform_ = GraphicTransformType::GRAPHIC_ROTATE_NONE;
246    std::string name_;
247    std::list<uint32_t> freeList_;
248    std::list<uint32_t> dirtyList_;
249    std::list<uint32_t> deletingList_;
250    std::list<uint32_t> producerCacheList_;
251    std::map<uint32_t, BufferElement> bufferQueueCache_;
252    sptr<IBufferConsumerListener> listener_ = nullptr;
253    IBufferConsumerListenerClazz *listenerClazz_ = nullptr;
254    mutable std::mutex mutex_;
255    std::mutex listenerMutex_;
256    std::mutex producerListenerMutex_;
257    const uint64_t uniqueId_;
258    OnReleaseFunc onBufferRelease_ = nullptr;
259    std::mutex onBufferReleaseMutex_;
260    sptr<IProducerListener> producerListener_ = nullptr;
261    OnDeleteBufferFunc onBufferDeleteForRSMainThread_;
262    OnDeleteBufferFunc onBufferDeleteForRSHardwareThread_;
263    bool isShared_ = false;
264    std::condition_variable waitReqCon_;
265    std::condition_variable waitAttachCon_;
266    sptr<SurfaceTunnelHandle> tunnelHandle_ = nullptr;
267    bool isValidStatus_ = true;
268    bool producerCacheClean_ = false;
269    const bool isLocalRender_;
270    uint32_t lastFlusedSequence_ = 0;
271    sptr<SyncFence> lastFlusedFence_;
272    wptr<ConsumerSurfaceDelegator> wpCSurfaceDelegator_;
273    bool isCpuAccessable_ = false;
274    GraphicTransformType transformHint_ = GraphicTransformType::GRAPHIC_ROTATE_NONE;
275    bool isBufferHold_ = false;
276    bool isBatch_ = false;
277    OHSurfaceSource sourceType_ = OHSurfaceSource::OH_SURFACE_SOURCE_DEFAULT;
278    std::string appFrameworkType_ = "";
279    float hdrWhitePointBrightness_ = 0.0;
280    float sdrWhitePointBrightness_ = 0.0;
281    uint32_t acquireLastFlushedBufSequence_;
282    int32_t globalAlpha_ = -1;
283    std::mutex globalAlphaMutex_;
284    std::string requestBufferStateStr_;
285    std::string acquireBufferStateStr_;
286};
287}; // namespace OHOS
288
289#endif // FRAMEWORKS_SURFACE_INCLUDE_BUFFER_QUEUE_H
290