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