• 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 AcquireBuffer(sptr<SurfaceBuffer>& buffer, sptr<SyncFence>& fence,
80                           int64_t &timestamp, std::vector<Rect> &damages);
81     GSError ReleaseBuffer(sptr<SurfaceBuffer>& buffer, const sptr<SyncFence>& fence);
82 
83     GSError AttachBuffer(sptr<SurfaceBuffer>& buffer);
84 
85     GSError DetachBuffer(sptr<SurfaceBuffer>& buffer);
86 
87     bool QueryIfBufferAvailable();
88 
89     uint32_t GetQueueSize();
90     GSError SetQueueSize(uint32_t queueSize);
91 
92     GSError GetName(std::string &name);
93 
94     GSError RegisterConsumerListener(sptr<IBufferConsumerListener>& listener);
95     GSError RegisterConsumerListener(IBufferConsumerListenerClazz *listener);
96     GSError RegisterReleaseListener(OnReleaseFunc func);
97     GSError RegisterProducerReleaseListener(sptr<IProducerListener> listener);
98     GSError RegisterDeleteBufferListener(OnDeleteBufferFunc func, bool isForUniRedraw = false);
99     GSError UnregisterConsumerListener();
100 
101     GSError SetDefaultWidthAndHeight(int32_t width, int32_t height);
102     int32_t GetDefaultWidth();
103     int32_t GetDefaultHeight();
104     GSError SetDefaultUsage(uint32_t usage);
105     uint32_t GetDefaultUsage();
106 
107     GSError CleanCache();
108     GSError GoBackground();
109     GSError OnConsumerDied();
110 
111     uint64_t GetUniqueId() const;
112 
113     void Dump(std::string &result);
114 
115     GSError SetTransform(GraphicTransformType transform);
116     GraphicTransformType GetTransform() const;
117 
118     GSError IsSupportedAlloc(const std::vector<BufferVerifyAllocInfo> &infos,
119                              std::vector<bool> &supporteds) const;
120 
121     GSError SetScalingMode(uint32_t sequence, ScalingMode scalingMode);
122     GSError GetScalingMode(uint32_t sequence, ScalingMode &scalingMode);
123     GSError SetMetaData(uint32_t sequence, const std::vector<GraphicHDRMetaData> &metaData);
124     GSError SetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey key,
125                            const std::vector<uint8_t> &metaData);
126     GSError QueryMetaDataType(uint32_t sequence, HDRMetaDataType &type);
127     GSError GetMetaData(uint32_t sequence, std::vector<GraphicHDRMetaData> &metaData);
128     GSError GetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey &key,
129                            std::vector<uint8_t> &metaData);
130     GSError SetTunnelHandle(const sptr<SurfaceTunnelHandle> &handle);
131     sptr<SurfaceTunnelHandle> GetTunnelHandle();
132     GSError SetPresentTimestamp(uint32_t sequence, const GraphicPresentTimestamp &timestamp);
133     GSError GetPresentTimestamp(uint32_t sequence, GraphicPresentTimestampType type, int64_t &time);
134 
135     bool GetStatus() const;
136     void SetStatus(bool status);
137 
138     GSError SetProducerCacheCleanFlag(bool flag);
139 
140 private:
141     GSError AllocBuffer(sptr<SurfaceBuffer>& buffer, const BufferRequestConfig &config);
142     void DeleteBufferInCache(uint32_t sequence);
143     void DumpToFile(uint32_t sequence);
144 
145     uint32_t GetUsedSize();
146     void DeleteBuffers(int32_t count);
147 
148     GSError PopFromFreeList(sptr<SurfaceBuffer>& buffer, const BufferRequestConfig &config);
149     GSError PopFromDirtyList(sptr<SurfaceBuffer>& buffer);
150 
151     GSError CheckRequestConfig(const BufferRequestConfig &config);
152     GSError CheckFlushConfig(const BufferFlushConfigWithDamages &config);
153     void DumpCache(std::string &result);
154     void ClearLocked();
155     bool CheckProducerCacheList();
156     GSError SetProducerCacheCleanFlagLocked(bool flag);
157 
158     int32_t defaultWidth = 0;
159     int32_t defaultHeight = 0;
160     uint32_t defaultUsage = 0;
161     uint32_t queueSize_ = SURFACE_DEFAULT_QUEUE_SIZE;
162     GraphicTransformType transform_ = GraphicTransformType::GRAPHIC_ROTATE_NONE;
163     std::string name_;
164     std::list<uint32_t> freeList_;
165     std::list<uint32_t> dirtyList_;
166     std::list<uint32_t> deletingList_;
167     std::list<uint32_t> producerCacheList_;
168     std::map<uint32_t, BufferElement> bufferQueueCache_;
169     sptr<IBufferConsumerListener> listener_ = nullptr;
170     IBufferConsumerListenerClazz *listenerClazz_ = nullptr;
171     std::mutex mutex_;
172     std::mutex listenerMutex_;
173     std::mutex producerListenerMutex_;
174     const uint64_t uniqueId_;
175     sptr<BufferManager> bufferManager_ = nullptr;
176     OnReleaseFunc onBufferRelease = nullptr;
177     sptr<IProducerListener> producerListener_ = nullptr;
178     OnDeleteBufferFunc onBufferDeleteForRSMainThread_;
179     OnDeleteBufferFunc onBufferDeleteForRSHardwareThread_;
180     bool isShared_ = false;
181     std::condition_variable waitReqCon_;
182     sptr<SurfaceTunnelHandle> tunnelHandle_ = nullptr;
183     std::atomic_bool isValidStatus_ = true;
184     std::atomic_bool producerCacheClean_ = false;
185     const bool isLocalRender_;
186 };
187 }; // namespace OHOS
188 
189 #endif // FRAMEWORKS_SURFACE_INCLUDE_BUFFER_QUEUE_H
190