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