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