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 ×tamp, 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 ×tamp); 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