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 "iconsumer_surface.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 enum InvokerType { 42 PRODUCER_INVOKER, 43 CONSUMER_INVOKER, 44 }; 45 46 using BufferElement = struct BufferElement { 47 sptr<SurfaceBuffer> buffer; 48 BufferState state; 49 bool isDeleting; 50 51 BufferRequestConfig config; 52 sptr<SyncFence> fence; 53 int64_t timestamp; 54 std::vector<Rect> damages; 55 HDRMetaDataType hdrMetaDataType = HDRMetaDataType::HDR_NOT_USED; 56 std::vector<GraphicHDRMetaData> metaData; 57 GraphicHDRMetadataKey key; 58 std::vector<uint8_t> metaDataSet; 59 GraphicPresentTimestamp presentTimestamp = {GRAPHIC_DISPLAY_PTS_UNSUPPORTED, 0}; 60 /** 61 * The desired time to present the buffer in nanoseconds. 62 * The buffer should wait until desiredPresentTimestamp is reached before being consumed and displayed. 63 * If multiple buffers reach desiredPresentTimestamp, the earlier buffer should be dropped. 64 */ 65 int64_t desiredPresentTimestamp; 66 /** 67 * The desiredPresentTimestamp is automatically generated by the system, isAutoTimestamp is true. 68 * The desiredPresentTimestamp is manually set by the producer, isAutoTimestamp is false. 69 */ 70 bool isAutoTimestamp; 71 }; 72 73 using BufferAndFence = std::pair<sptr<SurfaceBuffer>, sptr<SyncFence>>; 74 75 class BufferQueue : public RefBase { 76 public: 77 BufferQueue(const std::string &name, bool isShared = false); 78 virtual ~BufferQueue(); 79 80 GSError GetProducerInitInfo(ProducerInitInfo &info); 81 82 GSError RequestBuffer(const BufferRequestConfig &config, sptr<BufferExtraData> &bedata, 83 struct IBufferProducer::RequestBufferReturnValue &retval); 84 85 GSError ReuseBuffer(const BufferRequestConfig &config, sptr<BufferExtraData> &bedata, 86 struct IBufferProducer::RequestBufferReturnValue &retval); 87 88 GSError CancelBuffer(uint32_t sequence, sptr<BufferExtraData> bedata); 89 90 GSError FlushBuffer(uint32_t sequence, sptr<BufferExtraData> bedata, 91 sptr<SyncFence> fence, const BufferFlushConfigWithDamages &config); 92 93 GSError DoFlushBuffer(uint32_t sequence, sptr<BufferExtraData> bedata, 94 sptr<SyncFence> fence, const BufferFlushConfigWithDamages &config); 95 96 GSError GetLastFlushedBuffer(sptr<SurfaceBuffer>& buffer, sptr<SyncFence>& fence, 97 float matrix[16], uint32_t matrixSize, bool isUseNewMatrix, bool needRecordSequence = false); 98 99 GSError AcquireBuffer(sptr<SurfaceBuffer>& buffer, sptr<SyncFence>& fence, 100 int64_t ×tamp, std::vector<Rect> &damages); 101 GSError AcquireBuffer(IConsumerSurface::AcquireBufferReturnValue &returnValue, int64_t expectPresentTimestamp, 102 bool isUsingAutoTimestamp); 103 GSError ReleaseBuffer(sptr<SurfaceBuffer>& buffer, const sptr<SyncFence>& fence); 104 105 GSError AttachBuffer(sptr<SurfaceBuffer>& buffer, int32_t timeOut); 106 107 GSError DetachBuffer(sptr<SurfaceBuffer>& buffer); 108 109 GSError RegisterSurfaceDelegator(sptr<IRemoteObject> client, sptr<Surface> cSurface); 110 111 bool QueryIfBufferAvailable(); 112 113 uint32_t GetQueueSize(); 114 GSError SetQueueSize(uint32_t queueSize); 115 116 GSError GetName(std::string &name); 117 118 GSError RegisterConsumerListener(sptr<IBufferConsumerListener>& listener); 119 GSError RegisterConsumerListener(IBufferConsumerListenerClazz *listener); 120 GSError RegisterReleaseListener(OnReleaseFunc func); 121 GSError RegisterProducerReleaseListener(sptr<IProducerListener> listener); 122 GSError UnRegisterProducerReleaseListener(); 123 GSError RegisterDeleteBufferListener(OnDeleteBufferFunc func, bool isForUniRedraw = false); 124 GSError UnregisterConsumerListener(); 125 126 GSError SetDefaultWidthAndHeight(int32_t width, int32_t height); 127 int32_t GetDefaultWidth(); 128 int32_t GetDefaultHeight(); 129 GSError SetDefaultUsage(uint64_t usage); 130 uint64_t GetDefaultUsage(); 131 132 GSError CleanCache(bool cleanAll); 133 GSError GoBackground(); 134 GSError OnConsumerDied(); 135 136 uint64_t GetUniqueId() const; 137 138 void Dump(std::string &result); 139 140 GSError SetTransform(GraphicTransformType transform); 141 GraphicTransformType GetTransform() const; 142 143 GSError IsSupportedAlloc(const std::vector<BufferVerifyAllocInfo> &infos, 144 std::vector<bool> &supporteds) const; 145 146 GSError SetBufferHold(bool hold); IsBufferHold()147 inline bool IsBufferHold() 148 { 149 return isBufferHold_; 150 } 151 GSError SetScalingMode(uint32_t sequence, ScalingMode scalingMode); 152 GSError GetScalingMode(uint32_t sequence, ScalingMode &scalingMode); 153 GSError SetMetaData(uint32_t sequence, const std::vector<GraphicHDRMetaData> &metaData); 154 GSError SetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey key, 155 const std::vector<uint8_t> &metaData); 156 GSError QueryMetaDataType(uint32_t sequence, HDRMetaDataType &type); 157 GSError GetMetaData(uint32_t sequence, std::vector<GraphicHDRMetaData> &metaData); 158 GSError GetMetaDataSet(uint32_t sequence, GraphicHDRMetadataKey &key, 159 std::vector<uint8_t> &metaData); 160 GSError SetTunnelHandle(const sptr<SurfaceTunnelHandle> &handle); 161 sptr<SurfaceTunnelHandle> GetTunnelHandle(); 162 GSError SetPresentTimestamp(uint32_t sequence, const GraphicPresentTimestamp ×tamp); 163 GSError GetPresentTimestamp(uint32_t sequence, GraphicPresentTimestampType type, int64_t &time); 164 165 bool GetStatus() const; 166 void SetStatus(bool status); 167 168 void SetBatchHandle(bool batch); 169 170 GSError SetProducerCacheCleanFlag(bool flag); ConsumerRequestCpuAccess(bool on)171 inline void ConsumerRequestCpuAccess(bool on) 172 { 173 isCpuAccessable_ = on; 174 } 175 176 GSError AttachBufferToQueue(sptr<SurfaceBuffer> buffer, InvokerType invokerType); 177 GSError DetachBufferFromQueue(sptr<SurfaceBuffer> buffer, InvokerType invokerType); 178 179 GSError SetTransformHint(GraphicTransformType transformHint); 180 GraphicTransformType GetTransformHint() const; 181 GSError SetScalingMode(ScalingMode scalingMode); 182 183 GSError SetSurfaceSourceType(OHSurfaceSource sourceType); 184 OHSurfaceSource GetSurfaceSourceType() const; 185 186 GSError SetSurfaceAppFrameworkType(std::string appFrameworkType); 187 std::string GetSurfaceAppFrameworkType() const; 188 189 GSError SetHdrWhitePointBrightness(float brightness); 190 GSError SetSdrWhitePointBrightness(float brightness); 191 float GetHdrWhitePointBrightness() const; 192 float GetSdrWhitePointBrightness() const; 193 194 GSError IsSurfaceBufferInCache(uint32_t seqNum, bool &isInCache); 195 196 GSError AcquireLastFlushedBuffer(sptr<SurfaceBuffer> &buffer, sptr<SyncFence> &fence, 197 float matrix[16], uint32_t matrixSize, bool isUseNewMatrix); 198 GSError ReleaseLastFlushedBuffer(uint32_t sequence); 199 uint32_t GetAvailableBufferCount(); 200 201 GSError RequestAndDetachBuffer(const BufferRequestConfig& config, sptr<BufferExtraData>& bedata, 202 struct IBufferProducer::RequestBufferReturnValue& retval); 203 GSError AttachAndFlushBuffer(sptr<SurfaceBuffer>& buffer, sptr<BufferExtraData>& bedata, 204 const sptr<SyncFence>& fence, BufferFlushConfigWithDamages& config, bool needMap); 205 206 private: 207 GSError AllocBuffer(sptr<SurfaceBuffer>& buffer, const BufferRequestConfig &config); 208 void DeleteBufferInCache(uint32_t sequence); 209 210 uint32_t GetUsedSize(); 211 void DeleteBuffersLocked(int32_t count); 212 213 GSError PopFromFreeList(sptr<SurfaceBuffer>& buffer, const BufferRequestConfig &config); 214 GSError PopFromDirtyList(sptr<SurfaceBuffer>& buffer); 215 216 GSError CheckRequestConfig(const BufferRequestConfig &config); 217 GSError CheckFlushConfig(const BufferFlushConfigWithDamages &config); 218 void DumpCache(std::string &result); 219 void DumpMetadata(std::string &result, BufferElement element); 220 void ClearLocked(); 221 bool CheckProducerCacheList(); 222 GSError SetProducerCacheCleanFlagLocked(bool flag); 223 GSError AttachBufferUpdateStatus(std::unique_lock<std::mutex> &lock, uint32_t sequence, int32_t timeOut); 224 void AttachBufferUpdateBufferInfo(sptr<SurfaceBuffer>& buffer, bool needMap); 225 void ListenerBufferReleasedCb(sptr<SurfaceBuffer> &buffer, const sptr<SyncFence> &fence); 226 void OnBufferDeleteCbForHardwareThreadLocked(const sptr<SurfaceBuffer> &buffer) const; 227 GSError CheckBufferQueueCache(uint32_t sequence); 228 GSError ReallocBuffer(const BufferRequestConfig &config, struct IBufferProducer::RequestBufferReturnValue &retval); 229 void SetSurfaceBufferHebcMetaLocked(sptr<SurfaceBuffer> buffer); 230 GSError RequestBufferCheckStatus(); 231 GSError DelegatorQueueBuffer(uint32_t sequence, sptr<SyncFence> fence); 232 bool WaitForCondition(); 233 void RequestBufferDebugInfo(); 234 bool GetStatusLocked() const; 235 void CallConsumerListener(); 236 void LogAndTraceAllBufferInBufferQueueCache(); 237 bool IsPresentTimestampReady(int64_t desiredPresentTimestamp, int64_t expectPresentTimestamp); 238 void SetDesiredPresentTimestampAndUiTimestamp(uint32_t sequence, int64_t desiredPresentTimestamp, 239 uint64_t uiTimestamp); 240 void DropFirstDirtyBuffer(BufferElement &frontBufferElement, BufferElement &secondBufferElement, 241 int64_t &frontDesiredPresentTimestamp, bool &frontIsAutoTimestamp, 242 std::vector<BufferAndFence> &dropBuffers); 243 void ReleaseDropBuffers(std::vector<BufferAndFence> &dropBuffers); 244 void OnBufferDeleteForRS(uint32_t sequence); 245 void AddDeletingBuffersLocked(std::vector<uint32_t> &deletingBuffers); 246 GSError DetachBufferFromQueueLocked(uint32_t sequence, InvokerType invokerType); 247 GSError AttachBufferToQueueLocked(sptr<SurfaceBuffer> buffer, InvokerType invokerType, bool needMap); 248 GSError FlushBufferImprovedLocked(uint32_t sequence, sptr<BufferExtraData> &bedata, 249 const sptr<SyncFence> &fence, const BufferFlushConfigWithDamages &config); 250 GSError CheckBufferQueueCacheLocked(uint32_t sequence); 251 GSError DoFlushBufferLocked(uint32_t sequence, sptr<BufferExtraData> bedata, 252 sptr<SyncFence> fence, const BufferFlushConfigWithDamages &config); 253 GSError RequestBufferLocked(const BufferRequestConfig &config, sptr<BufferExtraData> &bedata, 254 struct IBufferProducer::RequestBufferReturnValue &retval, std::unique_lock<std::mutex> &lock); 255 256 int32_t defaultWidth_ = 0; 257 int32_t defaultHeight_ = 0; 258 uint64_t defaultUsage_ = 0; 259 uint32_t queueSize_ = SURFACE_DEFAULT_QUEUE_SIZE; 260 ScalingMode scalingMode_ = ScalingMode::SCALING_MODE_SCALE_TO_WINDOW; 261 GraphicTransformType transform_ = GraphicTransformType::GRAPHIC_ROTATE_NONE; 262 GraphicTransformType lastFlushedTransform_ = GraphicTransformType::GRAPHIC_ROTATE_NONE; 263 std::string name_; 264 std::list<uint32_t> freeList_; 265 std::list<uint32_t> dirtyList_; 266 std::list<uint32_t> deletingList_; 267 std::list<uint32_t> producerCacheList_; 268 std::map<uint32_t, BufferElement> bufferQueueCache_; 269 sptr<IBufferConsumerListener> listener_ = nullptr; 270 IBufferConsumerListenerClazz *listenerClazz_ = nullptr; 271 mutable std::mutex mutex_; 272 std::mutex listenerMutex_; 273 std::mutex producerListenerMutex_; 274 const uint64_t uniqueId_; 275 OnReleaseFunc onBufferRelease_ = nullptr; 276 std::mutex onBufferReleaseMutex_; 277 sptr<IProducerListener> producerListener_ = nullptr; 278 OnDeleteBufferFunc onBufferDeleteForRSMainThread_; 279 OnDeleteBufferFunc onBufferDeleteForRSHardwareThread_; 280 bool isShared_ = false; 281 std::condition_variable waitReqCon_; 282 std::condition_variable waitAttachCon_; 283 sptr<SurfaceTunnelHandle> tunnelHandle_ = nullptr; 284 std::atomic_bool isValidStatus_ = true; 285 std::atomic_bool producerCacheClean_ = false; 286 const bool isLocalRender_; 287 uint32_t lastFlusedSequence_ = 0; 288 sptr<SyncFence> lastFlusedFence_; 289 wptr<ConsumerSurfaceDelegator> wpCSurfaceDelegator_; 290 bool isCpuAccessable_ = false; 291 GraphicTransformType transformHint_ = GraphicTransformType::GRAPHIC_ROTATE_NONE; 292 bool isBufferHold_ = false; 293 bool isBatch_ = false; 294 OHSurfaceSource sourceType_ = OHSurfaceSource::OH_SURFACE_SOURCE_DEFAULT; 295 std::string appFrameworkType_ = ""; 296 float hdrWhitePointBrightness_ = 0.0; 297 float sdrWhitePointBrightness_ = 0.0; 298 uint32_t acquireLastFlushedBufSequence_; 299 std::string requestBufferStateStr_; 300 std::string acquireBufferStateStr_; 301 }; 302 }; // namespace OHOS 303 304 #endif // FRAMEWORKS_SURFACE_INCLUDE_BUFFER_QUEUE_H 305