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 33namespace OHOS { 34enum BufferState { 35 BUFFER_STATE_RELEASED, 36 BUFFER_STATE_REQUESTED, 37 BUFFER_STATE_FLUSHED, 38 BUFFER_STATE_ACQUIRED, 39 BUFFER_STATE_ATTACHED, 40}; 41 42enum InvokerType { 43 PRODUCER_INVOKER, 44 CONSUMER_INVOKER, 45}; 46 47using 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 75class BufferQueue : public RefBase { 76public: 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); 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); 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 GSError SetGlobalAlpha(int32_t alpha); 200 GSError GetGlobalAlpha(int32_t &alpha); 201 uint32_t GetAvailableBufferCount(); 202 203private: 204 GSError AllocBuffer(sptr<SurfaceBuffer>& buffer, const BufferRequestConfig &config); 205 void DeleteBufferInCache(uint32_t sequence); 206 207 uint32_t GetUsedSize(); 208 void DeleteBuffersLocked(int32_t count); 209 210 GSError PopFromFreeListLocked(sptr<SurfaceBuffer>& buffer, const BufferRequestConfig &config); 211 GSError PopFromDirtyListLocked(sptr<SurfaceBuffer>& buffer); 212 213 GSError CheckRequestConfig(const BufferRequestConfig &config); 214 GSError CheckFlushConfig(const BufferFlushConfigWithDamages &config); 215 void DumpCache(std::string &result); 216 void DumpMetadata(std::string &result, BufferElement element); 217 void ClearLocked(); 218 bool CheckProducerCacheListLocked(); 219 GSError SetProducerCacheCleanFlagLocked(bool flag); 220 GSError AttachBufferUpdateStatus(std::unique_lock<std::mutex> &lock, uint32_t sequence, int32_t timeOut); 221 void AttachBufferUpdateBufferInfo(sptr<SurfaceBuffer>& buffer); 222 void ListenerBufferReleasedCb(sptr<SurfaceBuffer> &buffer, const sptr<SyncFence> &fence); 223 void OnBufferDeleteCbForHardwareThreadLocked(const sptr<SurfaceBuffer> &buffer) const; 224 GSError CheckBufferQueueCache(uint32_t sequence); 225 GSError ReallocBufferLocked(const BufferRequestConfig &config, 226 struct IBufferProducer::RequestBufferReturnValue &retval); 227 void SetSurfaceBufferHebcMetaLocked(sptr<SurfaceBuffer> buffer); 228 GSError RequestBufferCheckStatus(); 229 GSError DelegatorQueueBuffer(uint32_t sequence, sptr<SyncFence> fence); 230 bool WaitForCondition(); 231 void RequestBufferDebugInfoLocked(); 232 bool GetStatusLocked() const; 233 void CallConsumerListener(); 234 void SetSurfaceBufferGlobalAlphaUnlocked(sptr<SurfaceBuffer> buffer); 235 bool IsPresentTimestampReady(int64_t desiredPresentTimestamp, int64_t expectPresentTimestamp); 236 void LogAndTraceAllBufferInBufferQueueCache(); 237 void SetDesiredPresentTimestampAndUiTimestamp(uint32_t sequence, int64_t desiredPresentTimestamp, 238 uint64_t uiTimestamp); 239 int32_t defaultWidth_ = 0; 240 int32_t defaultHeight_ = 0; 241 uint64_t defaultUsage_ = 0; 242 uint32_t bufferQueueSize_ = SURFACE_DEFAULT_QUEUE_SIZE; 243 ScalingMode scalingMode_ = ScalingMode::SCALING_MODE_SCALE_TO_WINDOW; 244 GraphicTransformType transform_ = GraphicTransformType::GRAPHIC_ROTATE_NONE; 245 GraphicTransformType lastFlushedTransform_ = GraphicTransformType::GRAPHIC_ROTATE_NONE; 246 std::string name_; 247 std::list<uint32_t> freeList_; 248 std::list<uint32_t> dirtyList_; 249 std::list<uint32_t> deletingList_; 250 std::list<uint32_t> producerCacheList_; 251 std::map<uint32_t, BufferElement> bufferQueueCache_; 252 sptr<IBufferConsumerListener> listener_ = nullptr; 253 IBufferConsumerListenerClazz *listenerClazz_ = nullptr; 254 mutable std::mutex mutex_; 255 std::mutex listenerMutex_; 256 std::mutex producerListenerMutex_; 257 const uint64_t uniqueId_; 258 OnReleaseFunc onBufferRelease_ = nullptr; 259 std::mutex onBufferReleaseMutex_; 260 sptr<IProducerListener> producerListener_ = nullptr; 261 OnDeleteBufferFunc onBufferDeleteForRSMainThread_; 262 OnDeleteBufferFunc onBufferDeleteForRSHardwareThread_; 263 bool isShared_ = false; 264 std::condition_variable waitReqCon_; 265 std::condition_variable waitAttachCon_; 266 sptr<SurfaceTunnelHandle> tunnelHandle_ = nullptr; 267 bool isValidStatus_ = true; 268 bool producerCacheClean_ = false; 269 const bool isLocalRender_; 270 uint32_t lastFlusedSequence_ = 0; 271 sptr<SyncFence> lastFlusedFence_; 272 wptr<ConsumerSurfaceDelegator> wpCSurfaceDelegator_; 273 bool isCpuAccessable_ = false; 274 GraphicTransformType transformHint_ = GraphicTransformType::GRAPHIC_ROTATE_NONE; 275 bool isBufferHold_ = false; 276 bool isBatch_ = false; 277 OHSurfaceSource sourceType_ = OHSurfaceSource::OH_SURFACE_SOURCE_DEFAULT; 278 std::string appFrameworkType_ = ""; 279 float hdrWhitePointBrightness_ = 0.0; 280 float sdrWhitePointBrightness_ = 0.0; 281 uint32_t acquireLastFlushedBufSequence_; 282 int32_t globalAlpha_ = -1; 283 std::mutex globalAlphaMutex_; 284 std::string requestBufferStateStr_; 285 std::string acquireBufferStateStr_; 286}; 287}; // namespace OHOS 288 289#endif // FRAMEWORKS_SURFACE_INCLUDE_BUFFER_QUEUE_H 290