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 "iconsumer_surface.h" 28 #include "surface_type.h" 29 #include <surface_tunnel_handle.h> 30 #include "surface_buffer.h" 31 #include "consumer_surface_delegator.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 enum InvokerType { 43 PRODUCER_INVOKER, 44 CONSUMER_INVOKER, 45 }; 46 47 using BufferElement = struct BufferElement { 48 sptr<SurfaceBuffer> buffer; 49 BufferState state; 50 bool isDeleting; 51 52 BufferRequestConfig config; 53 sptr<SyncFence> fence; 54 int64_t timestamp; 55 std::vector<Rect> damages; 56 ScalingMode scalingMode; 57 HDRMetaDataType hdrMetaDataType = HDRMetaDataType::HDR_NOT_USED; 58 std::vector<GraphicHDRMetaData> metaData; 59 GraphicHDRMetadataKey key; 60 std::vector<uint8_t> metaDataSet; 61 GraphicPresentTimestamp presentTimestamp = {GRAPHIC_DISPLAY_PTS_UNSUPPORTED, 0}; 62 /** 63 * The desired time to present the buffer in nanoseconds. 64 * The buffer should wait until desiredPresentTimestamp is reached before being consumed and displayed. 65 * If multiple buffers reach desiredPresentTimestamp, the earlier buffer should be dropped. 66 */ 67 int64_t desiredPresentTimestamp; 68 /** 69 * The desiredPresentTimestamp is automatically generated by the system, isAutoTimestamp is true. 70 * The desiredPresentTimestamp is manually set by the producer, isAutoTimestamp is false. 71 */ 72 bool isAutoTimestamp; 73 }; 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 private: 202 GSError AllocBuffer(sptr<SurfaceBuffer>& buffer, const BufferRequestConfig &config); 203 void DeleteBufferInCache(uint32_t sequence); 204 205 uint32_t GetUsedSize(); 206 void DeleteBuffersLocked(int32_t count); 207 208 GSError PopFromFreeList(sptr<SurfaceBuffer>& buffer, const BufferRequestConfig &config); 209 GSError PopFromDirtyList(sptr<SurfaceBuffer>& buffer); 210 211 GSError CheckRequestConfig(const BufferRequestConfig &config); 212 GSError CheckFlushConfig(const BufferFlushConfigWithDamages &config); 213 void DumpCache(std::string &result); 214 void DumpMetadata(std::string &result, BufferElement element); 215 void ClearLocked(); 216 bool CheckProducerCacheList(); 217 GSError SetProducerCacheCleanFlagLocked(bool flag); 218 GSError AttachBufferUpdateStatus(std::unique_lock<std::mutex> &lock, uint32_t sequence, int32_t timeOut); 219 void AttachBufferUpdateBufferInfo(sptr<SurfaceBuffer>& buffer); 220 void ListenerBufferReleasedCb(sptr<SurfaceBuffer> &buffer, const sptr<SyncFence> &fence); 221 void OnBufferDeleteCbForHardwareThreadLocked(const sptr<SurfaceBuffer> &buffer) const; 222 GSError CheckBufferQueueCache(uint32_t sequence); 223 GSError ReallocBuffer(const BufferRequestConfig &config, struct IBufferProducer::RequestBufferReturnValue &retval); 224 void SetSurfaceBufferHebcMetaLocked(sptr<SurfaceBuffer> buffer); 225 GSError RequestBufferCheckStatus(); 226 GSError DelegatorQueueBuffer(uint32_t sequence, sptr<SyncFence> fence); 227 bool WaitForCondition(); 228 void RequestBufferDebugInfo(); 229 bool GetStatusLocked() const; 230 void CallConsumerListener(); 231 void LogAndTraceAllBufferInBufferQueueCache(); 232 bool IsPresentTimestampReady(int64_t desiredPresentTimestamp, int64_t expectPresentTimestamp); 233 void SetDesiredPresentTimestampAndUiTimestamp(uint32_t sequence, int64_t desiredPresentTimestamp, 234 uint64_t uiTimestamp); 235 void DropFirstDirtyBuffer(BufferElement &frontBufferElement, BufferElement &secondBufferElement, 236 int64_t &frontDesiredPresentTimestamp, bool &frontIsAutoTimestamp, 237 std::vector<BufferElement*> &dropBufferElements); 238 void ReleaseDropBuffers(const std::vector<BufferElement*> &dropBufferElements); 239 240 int32_t defaultWidth_ = 0; 241 int32_t defaultHeight_ = 0; 242 uint64_t defaultUsage_ = 0; 243 uint32_t queueSize_ = SURFACE_DEFAULT_QUEUE_SIZE; 244 ScalingMode scalingMode_ = ScalingMode::SCALING_MODE_SCALE_TO_WINDOW; 245 GraphicTransformType transform_ = GraphicTransformType::GRAPHIC_ROTATE_NONE; 246 GraphicTransformType lastFlushedTransform_ = GraphicTransformType::GRAPHIC_ROTATE_NONE; 247 std::string name_; 248 std::list<uint32_t> freeList_; 249 std::list<uint32_t> dirtyList_; 250 std::list<uint32_t> deletingList_; 251 std::list<uint32_t> producerCacheList_; 252 std::map<uint32_t, BufferElement> bufferQueueCache_; 253 sptr<IBufferConsumerListener> listener_ = nullptr; 254 IBufferConsumerListenerClazz *listenerClazz_ = nullptr; 255 mutable std::mutex mutex_; 256 std::mutex listenerMutex_; 257 std::mutex producerListenerMutex_; 258 const uint64_t uniqueId_; 259 OnReleaseFunc onBufferRelease_ = nullptr; 260 std::mutex onBufferReleaseMutex_; 261 sptr<IProducerListener> producerListener_ = nullptr; 262 OnDeleteBufferFunc onBufferDeleteForRSMainThread_; 263 OnDeleteBufferFunc onBufferDeleteForRSHardwareThread_; 264 bool isShared_ = false; 265 std::condition_variable waitReqCon_; 266 std::condition_variable waitAttachCon_; 267 sptr<SurfaceTunnelHandle> tunnelHandle_ = nullptr; 268 std::atomic_bool isValidStatus_ = true; 269 std::atomic_bool producerCacheClean_ = false; 270 const bool isLocalRender_; 271 uint32_t lastFlusedSequence_ = 0; 272 sptr<SyncFence> lastFlusedFence_; 273 wptr<ConsumerSurfaceDelegator> wpCSurfaceDelegator_; 274 bool isCpuAccessable_ = false; 275 GraphicTransformType transformHint_ = GraphicTransformType::GRAPHIC_ROTATE_NONE; 276 bool isBufferHold_ = false; 277 bool isBatch_ = false; 278 OHSurfaceSource sourceType_ = OHSurfaceSource::OH_SURFACE_SOURCE_DEFAULT; 279 std::string appFrameworkType_ = ""; 280 float hdrWhitePointBrightness_ = 0.0; 281 float sdrWhitePointBrightness_ = 0.0; 282 uint32_t acquireLastFlushedBufSequence_; 283 std::string requestBufferStateStr_; 284 std::string acquireBufferStateStr_; 285 }; 286 }; // namespace OHOS 287 288 #endif // FRAMEWORKS_SURFACE_INCLUDE_BUFFER_QUEUE_H 289