• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "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 using BufferElement = struct BufferElement {
42     sptr<SurfaceBuffer> buffer;
43     BufferState state;
44     bool isDeleting;
45 
46     BufferRequestConfig config;
47     sptr<SyncFence> fence;
48     int64_t timestamp;
49     std::vector<Rect> damages;
50     ScalingMode scalingMode;
51     HDRMetaDataType hdrMetaDataType = HDRMetaDataType::HDR_NOT_USED;
52     std::vector<GraphicHDRMetaData> metaData;
53     GraphicHDRMetadataKey key;
54     std::vector<uint8_t> metaDataSet;
55     GraphicPresentTimestamp presentTimestamp = {GRAPHIC_DISPLAY_PTS_UNSUPPORTED, 0};
56 };
57 
58 class BufferQueue : public RefBase {
59 public:
60     BufferQueue(const std::string &name, bool isShared = false);
61     virtual ~BufferQueue();
62     GSError Init();
63 
64     GSError RequestBuffer(const BufferRequestConfig &config, sptr<BufferExtraData> &bedata,
65                           struct IBufferProducer::RequestBufferReturnValue &retval);
66 
67     GSError ReuseBuffer(const BufferRequestConfig &config, sptr<BufferExtraData> &bedata,
68                         struct IBufferProducer::RequestBufferReturnValue &retval);
69 
70     GSError CancelBuffer(uint32_t sequence, const sptr<BufferExtraData> &bedata);
71 
72     GSError FlushBuffer(uint32_t sequence, const sptr<BufferExtraData> &bedata,
73                         const sptr<SyncFence>& fence, const BufferFlushConfigWithDamages &config);
74 
75     GSError DoFlushBuffer(uint32_t sequence, const sptr<BufferExtraData> &bedata,
76                           const sptr<SyncFence>& fence, const BufferFlushConfigWithDamages &config);
77 
78     GSError GetLastFlushedBuffer(sptr<SurfaceBuffer>& buffer, sptr<SyncFence>& fence,
79         float matrix[16]);
80 
81     GSError AcquireBuffer(sptr<SurfaceBuffer>& buffer, sptr<SyncFence>& fence,
82                           int64_t &timestamp, std::vector<Rect> &damages);
83     GSError ReleaseBuffer(sptr<SurfaceBuffer>& buffer, const sptr<SyncFence>& fence);
84 
85     GSError AttachBuffer(sptr<SurfaceBuffer>& buffer, int32_t timeOut);
86 
87     GSError DetachBuffer(sptr<SurfaceBuffer>& buffer);
88 
89     GSError RegisterSurfaceDelegator(sptr<IRemoteObject> client, sptr<Surface> cSurface);
90 
91     bool QueryIfBufferAvailable();
92 
93     uint32_t GetQueueSize();
94     GSError SetQueueSize(uint32_t queueSize);
95 
96     GSError GetName(std::string &name);
97 
98     GSError RegisterConsumerListener(sptr<IBufferConsumerListener>& listener);
99     GSError RegisterConsumerListener(IBufferConsumerListenerClazz *listener);
100     GSError RegisterReleaseListener(OnReleaseFunc func);
101     GSError RegisterProducerReleaseListener(sptr<IProducerListener> listener);
102     GSError UnRegisterProducerReleaseListener();
103     GSError RegisterDeleteBufferListener(OnDeleteBufferFunc func, bool isForUniRedraw = false);
104     GSError UnregisterConsumerListener();
105 
106     GSError SetDefaultWidthAndHeight(int32_t width, int32_t height);
107     int32_t GetDefaultWidth();
108     int32_t GetDefaultHeight();
109     GSError SetDefaultUsage(uint64_t usage);
110     uint64_t GetDefaultUsage();
111 
112     GSError CleanCache();
113     GSError GoBackground();
114     GSError OnConsumerDied();
115 
116     uint64_t GetUniqueId() const;
117 
118     void Dump(std::string &result);
119 
120     GSError SetTransform(GraphicTransformType transform);
121     GraphicTransformType GetTransform() const;
122 
123     GSError IsSupportedAlloc(const std::vector<BufferVerifyAllocInfo> &infos,
124                              std::vector<bool> &supporteds) const;
125 
126     GSError SetScalingMode(uint32_t sequence, ScalingMode scalingMode);
127     GSError GetScalingMode(uint32_t sequence, ScalingMode &scalingMode);
128     GSError SetMetaData(uint32_t sequence, const std::vector<GraphicHDRMetaData> &metaData);
129     GSError SetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey key,
130                            const std::vector<uint8_t> &metaData);
131     GSError QueryMetaDataType(uint32_t sequence, HDRMetaDataType &type);
132     GSError GetMetaData(uint32_t sequence, std::vector<GraphicHDRMetaData> &metaData);
133     GSError GetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey &key,
134                            std::vector<uint8_t> &metaData);
135     GSError SetTunnelHandle(const sptr<SurfaceTunnelHandle> &handle);
136     sptr<SurfaceTunnelHandle> GetTunnelHandle();
137     GSError SetPresentTimestamp(uint32_t sequence, const GraphicPresentTimestamp &timestamp);
138     GSError GetPresentTimestamp(uint32_t sequence, GraphicPresentTimestampType type, int64_t &time);
139 
140     bool GetStatus() const;
141     void SetStatus(bool status);
142 
143     GSError SetProducerCacheCleanFlag(bool flag);
144 
145 private:
146     GSError AllocBuffer(sptr<SurfaceBuffer>& buffer, const BufferRequestConfig &config);
147     void DeleteBufferInCache(uint32_t sequence);
148     void DumpToFile(uint32_t sequence);
149 
150     uint32_t GetUsedSize();
151     void DeleteBuffersLocked(int32_t count);
152 
153     GSError PopFromFreeList(sptr<SurfaceBuffer>& buffer, const BufferRequestConfig &config);
154     GSError PopFromDirtyList(sptr<SurfaceBuffer>& buffer);
155 
156     GSError CheckRequestConfig(const BufferRequestConfig &config);
157     GSError CheckFlushConfig(const BufferFlushConfigWithDamages &config);
158     void DumpCache(std::string &result);
159     void ClearLocked();
160     bool CheckProducerCacheList();
161     GSError SetProducerCacheCleanFlagLocked(bool flag);
162     GSError AttachBufferUpdateStatus(std::unique_lock<std::mutex> &lock, uint32_t sequence, int32_t timeOut);
163     void AttachBufferUpdateBufferInfo(sptr<SurfaceBuffer>& buffer);
164     void ListenerBufferReleasedCb(sptr<SurfaceBuffer> &buffer, const sptr<SyncFence> &fence);
165     GSError CheckBufferQueueCache(uint32_t sequence);
166     GSError ReallocBuffer(const BufferRequestConfig &config, struct IBufferProducer::RequestBufferReturnValue &retval);
167 
168     int32_t defaultWidth = 0;
169     int32_t defaultHeight = 0;
170     uint64_t defaultUsage = 0;
171     uint32_t queueSize_ = SURFACE_DEFAULT_QUEUE_SIZE;
172     GraphicTransformType transform_ = GraphicTransformType::GRAPHIC_ROTATE_NONE;
173     GraphicTransformType lastFlushedTransform_ = GraphicTransformType::GRAPHIC_ROTATE_NONE;
174     std::string name_;
175     std::list<uint32_t> freeList_;
176     std::list<uint32_t> dirtyList_;
177     std::list<uint32_t> deletingList_;
178     std::list<uint32_t> producerCacheList_;
179     std::map<uint32_t, BufferElement> bufferQueueCache_;
180     sptr<IBufferConsumerListener> listener_ = nullptr;
181     IBufferConsumerListenerClazz *listenerClazz_ = nullptr;
182     std::mutex mutex_;
183     std::mutex listenerMutex_;
184     std::mutex producerListenerMutex_;
185     const uint64_t uniqueId_;
186     OnReleaseFunc onBufferRelease_ = nullptr;
187     std::mutex onBufferReleaseMutex_;
188     sptr<IProducerListener> producerListener_ = nullptr;
189     OnDeleteBufferFunc onBufferDeleteForRSMainThread_;
190     OnDeleteBufferFunc onBufferDeleteForRSHardwareThread_;
191     bool isShared_ = false;
192     std::condition_variable waitReqCon_;
193     std::condition_variable waitAttachCon_;
194     sptr<SurfaceTunnelHandle> tunnelHandle_ = nullptr;
195     std::atomic_bool isValidStatus_ = true;
196     std::atomic_bool producerCacheClean_ = false;
197     const bool isLocalRender_;
198     uint32_t lastFlusedSequence_ = 0;
199     sptr<SyncFence> lastFlusedFence_;
200     wptr<ConsumerSurfaceDelegator> wpCSurfaceDelegator_;
201 };
202 }; // namespace OHOS
203 
204 #endif // FRAMEWORKS_SURFACE_INCLUDE_BUFFER_QUEUE_H
205