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