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