1 /* 2 * Copyright (c) 2022-2023 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 #ifndef RENDER_SERVICE_CLIENT_CORE_PIPELINE_RS_SURFACE_HANDLER_H 16 #define RENDER_SERVICE_CLIENT_CORE_PIPELINE_RS_SURFACE_HANDLER_H 17 18 #include <atomic> 19 #include <map> 20 #include <mutex> 21 22 #include "common/rs_common_def.h" 23 #include "common/rs_macros.h" 24 #include "platform/common/rs_log.h" 25 #include "platform/common/rs_system_properties.h" 26 #ifndef ROSEN_CROSS_PLATFORM 27 #include <iconsumer_surface.h> 28 #include <surface.h> 29 #include "sync_fence.h" 30 #endif 31 32 namespace OHOS { 33 namespace Rosen { 34 using OnDeleteBufferFunc = std::function<void(uint32_t)>; 35 class RSB_EXPORT RSSurfaceHandler { 36 public: 37 // indicates which node this handler belongs to. RSSurfaceHandler(NodeId id)38 explicit RSSurfaceHandler(NodeId id) : id_(id) {} 39 virtual ~RSSurfaceHandler() noexcept; 40 41 struct SurfaceBufferEntry { 42 #ifndef ROSEN_CROSS_PLATFORM ~SurfaceBufferEntrySurfaceBufferEntry43 ~SurfaceBufferEntry() noexcept 44 { 45 if (bufferDeleteCb_ != nullptr) { 46 bufferDeleteCb_(seqNum); 47 } 48 } 49 RegisterDeleteBufferListenerSurfaceBufferEntry50 void RegisterDeleteBufferListener(OnDeleteBufferFunc bufferDeleteCb) 51 { 52 if (bufferDeleteCb_ == nullptr) { 53 bufferDeleteCb_ = bufferDeleteCb; 54 } 55 } 56 #endif 57 void Reset(bool needBufferDeleteCb = true) 58 { 59 #ifndef ROSEN_CROSS_PLATFORM 60 if (buffer == nullptr) { 61 return; 62 } 63 if (bufferDeleteCb_) { 64 if (!RSSystemProperties::IsUseVulkan() || needBufferDeleteCb) { 65 bufferDeleteCb_(buffer->GetSeqNum()); 66 } 67 } 68 buffer = nullptr; 69 acquireFence = SyncFence::InvalidFence(); 70 releaseFence = SyncFence::InvalidFence(); 71 damageRect = Rect {0, 0, 0, 0}; 72 #endif 73 timestamp = 0; 74 } 75 #ifndef ROSEN_CROSS_PLATFORM 76 sptr<SurfaceBuffer> buffer = nullptr; 77 sptr<SyncFence> acquireFence = SyncFence::InvalidFence(); 78 sptr<SyncFence> releaseFence = SyncFence::InvalidFence(); 79 Rect damageRect = {0, 0, 0, 0}; 80 OnDeleteBufferFunc bufferDeleteCb_ = nullptr; 81 uint32_t seqNum = 0; 82 #endif 83 int64_t timestamp = 0; 84 }; 85 86 void IncreaseAvailableBuffer(); 87 void ReduceAvailableBuffer(); 88 GetNodeId()89 NodeId GetNodeId() const 90 { 91 return id_; 92 } 93 SetDefaultWidthAndHeight(int32_t width,int32_t height)94 void SetDefaultWidthAndHeight(int32_t width, int32_t height) 95 { 96 #ifndef ROSEN_CROSS_PLATFORM 97 if (consumer_ != nullptr) { 98 consumer_->SetDefaultWidthAndHeight(width, height); 99 } 100 #endif 101 } 102 103 #ifndef ROSEN_CROSS_PLATFORM 104 void SetConsumer(sptr<IConsumerSurface> consumer); 105 GetConsumer()106 sptr<IConsumerSurface> GetConsumer() const 107 { 108 return consumer_; 109 } 110 SetHoldBuffer(std::shared_ptr<SurfaceBufferEntry> buffer)111 void SetHoldBuffer(std::shared_ptr<SurfaceBufferEntry> buffer) 112 { 113 holdBuffer_ = buffer; 114 } 115 GetHoldBuffer()116 inline std::shared_ptr<SurfaceBufferEntry> GetHoldBuffer() 117 { 118 return holdBuffer_; 119 } 120 SetBuffer(const sptr<SurfaceBuffer> & buffer,const sptr<SyncFence> & acquireFence,const Rect & damage,const int64_t timestamp)121 void SetBuffer( 122 const sptr<SurfaceBuffer>& buffer, 123 const sptr<SyncFence>& acquireFence, 124 const Rect& damage, 125 const int64_t timestamp) 126 { 127 std::lock_guard<std::mutex> lock(mutex_); 128 preBuffer_.Reset(); 129 preBuffer_ = buffer_; 130 buffer_.buffer = buffer; 131 if (buffer != nullptr) { 132 buffer_.seqNum = buffer->GetSeqNum(); 133 } 134 buffer_.acquireFence = acquireFence; 135 buffer_.damageRect = damage; 136 buffer_.timestamp = timestamp; 137 } 138 GetBuffer()139 const sptr<SurfaceBuffer> GetBuffer() const 140 { 141 std::lock_guard<std::mutex> lock(mutex_); 142 return buffer_.buffer; 143 } 144 GetBufferUsage()145 uint64_t GetBufferUsage() const 146 { 147 std::lock_guard<std::mutex> lock(mutex_); 148 if (!buffer_.buffer) { 149 return 0; 150 } 151 return buffer_.buffer->GetUsage(); 152 } 153 GetAcquireFence()154 const sptr<SyncFence> GetAcquireFence() const 155 { 156 std::lock_guard<std::mutex> lock(mutex_); 157 return buffer_.acquireFence; 158 } 159 GetDamageRegion()160 const Rect GetDamageRegion() const 161 { 162 std::lock_guard<std::mutex> lock(mutex_); 163 return buffer_.damageRect; 164 } 165 SetCurrentReleaseFence(sptr<SyncFence> fence)166 void SetCurrentReleaseFence(sptr<SyncFence> fence) 167 { 168 std::lock_guard<std::mutex> lock(mutex_); 169 buffer_.releaseFence = fence; 170 } 171 SetReleaseFence(sptr<SyncFence> fence)172 void SetReleaseFence(sptr<SyncFence> fence) 173 { 174 // The fence which get from hdi is preBuffer's releaseFence now. 175 std::lock_guard<std::mutex> lock(mutex_); 176 preBuffer_.releaseFence = std::move(fence); 177 } 178 SetBufferSizeChanged(const sptr<SurfaceBuffer> & buffer)179 void SetBufferSizeChanged(const sptr<SurfaceBuffer>& buffer) 180 { 181 std::lock_guard<std::mutex> lock(mutex_); 182 if (preBuffer_.buffer == nullptr) { 183 return; 184 } 185 bufferSizeChanged_ = buffer->GetWidth() != preBuffer_.buffer->GetWidth() || 186 buffer->GetHeight() != preBuffer_.buffer->GetHeight(); 187 } 188 189 void UpdateBuffer(const sptr<SurfaceBuffer>& buffer, const sptr<SyncFence>& acquireFence, const Rect& damage, 190 const int64_t timestamp); 191 SetBufferTransformTypeChanged(bool flag)192 void SetBufferTransformTypeChanged(bool flag) 193 { 194 bufferTransformTypeChanged_ = flag; 195 } 196 CheckScalingModeChanged()197 bool CheckScalingModeChanged() 198 { 199 std::lock_guard<std::mutex> lock(mutex_); 200 if (consumer_ == nullptr || buffer_.buffer == nullptr) { 201 return false; 202 } 203 204 ScalingMode scalingMode = ScalingMode::SCALING_MODE_SCALE_TO_WINDOW; 205 consumer_->GetScalingMode(buffer_.buffer->GetSeqNum(), scalingMode); 206 bool ScalingModeChanged_ = scalingMode != scalingModePre; 207 scalingModePre = scalingMode; 208 return ScalingModeChanged_; 209 } 210 GetPreBuffer()211 sptr<SurfaceBuffer> GetPreBuffer() 212 { 213 std::lock_guard<std::mutex> lock(mutex_); 214 return preBuffer_.buffer; 215 } 216 GetPreBufferAcquireFence()217 sptr<SyncFence> GetPreBufferAcquireFence() 218 { 219 std::lock_guard<std::mutex> lock(mutex_); 220 return preBuffer_.acquireFence; 221 } 222 GetPreBufferReleaseFence()223 sptr<SyncFence> GetPreBufferReleaseFence() 224 { 225 std::lock_guard<std::mutex> lock(mutex_); 226 return preBuffer_.releaseFence; 227 } 228 #endif 229 ResetPreBuffer()230 void ResetPreBuffer() 231 { 232 std::lock_guard<std::mutex> lock(mutex_); 233 preBuffer_.Reset(); 234 } 235 GetAvailableBufferCount()236 int32_t GetAvailableBufferCount() const 237 { 238 return bufferAvailableCount_; 239 } 240 SetAvailableBufferCount(const int32_t bufferAvailableCount)241 void SetAvailableBufferCount(const int32_t bufferAvailableCount) 242 { 243 bufferAvailableCount_ = bufferAvailableCount; 244 } 245 GetTimestamp()246 int64_t GetTimestamp() const 247 { 248 std::lock_guard<std::mutex> lock(mutex_); 249 return buffer_.timestamp; 250 } 251 CleanCache()252 void CleanCache() 253 { 254 std::lock_guard<std::mutex> lock(mutex_); 255 buffer_.Reset(); 256 preBuffer_.Reset(); 257 } 258 ResetBufferAvailableCount()259 void ResetBufferAvailableCount() 260 { 261 bufferAvailableCount_ = 0; 262 } 263 264 void SetGlobalZOrder(float globalZOrder); 265 float GetGlobalZOrder() const; 266 SetSourceType(uint32_t sourceType)267 void SetSourceType(uint32_t sourceType) 268 { 269 sourceType_ = sourceType; 270 } 271 GetSourceType()272 uint32_t GetSourceType() const 273 { 274 return sourceType_; 275 } 276 GetBufferSizeChanged()277 bool GetBufferSizeChanged() 278 { 279 std::lock_guard<std::mutex> lock(mutex_); 280 return bufferSizeChanged_; 281 } 282 GetBufferTransformTypeChanged()283 bool GetBufferTransformTypeChanged() const 284 { 285 return bufferTransformTypeChanged_; 286 } 287 HasConsumer()288 bool HasConsumer() const 289 { 290 #ifndef ROSEN_CROSS_PLATFORM 291 return consumer_ != nullptr; 292 #else 293 return false; 294 #endif 295 } IsCurrentFrameBufferConsumed()296 inline bool IsCurrentFrameBufferConsumed() const 297 { 298 return isCurrentFrameBufferConsumed_; 299 } ResetCurrentFrameBufferConsumed()300 inline void ResetCurrentFrameBufferConsumed() 301 { 302 isCurrentFrameBufferConsumed_ = false; 303 } SetCurrentFrameBufferConsumed()304 inline void SetCurrentFrameBufferConsumed() 305 { 306 isCurrentFrameBufferConsumed_ = true; 307 } 308 309 #ifndef ROSEN_CROSS_PLATFORM RegisterDeleteBufferListener(OnDeleteBufferFunc bufferDeleteCb)310 void RegisterDeleteBufferListener(OnDeleteBufferFunc bufferDeleteCb) 311 { 312 if (bufferDeleteCb != nullptr) { 313 std::lock_guard<std::mutex> lock(mutex_); 314 buffer_.RegisterDeleteBufferListener(bufferDeleteCb); 315 preBuffer_.RegisterDeleteBufferListener(bufferDeleteCb); 316 } 317 } 318 void ConsumeAndUpdateBuffer(SurfaceBufferEntry buffer); 319 #endif 320 321 protected: 322 #ifndef ROSEN_CROSS_PLATFORM 323 sptr<IConsumerSurface> consumer_ = nullptr; 324 #endif 325 bool isCurrentFrameBufferConsumed_ = false; 326 327 private: 328 void ConsumeAndUpdateBufferInner(SurfaceBufferEntry& buffer); 329 330 #ifndef ROSEN_CROSS_PLATFORM 331 ScalingMode scalingModePre = ScalingMode::SCALING_MODE_SCALE_TO_WINDOW; 332 #endif 333 NodeId id_ = 0; 334 // mutex buffer_ & preBuffer_ & bufferCache_ 335 mutable std::mutex mutex_; 336 SurfaceBufferEntry buffer_; 337 SurfaceBufferEntry preBuffer_; 338 float globalZOrder_ = 0.0f; 339 std::atomic<int> bufferAvailableCount_ = 0; 340 bool bufferSizeChanged_ = false; 341 bool bufferTransformTypeChanged_ = false; 342 uint32_t sourceType_ = 0; 343 std::shared_ptr<SurfaceBufferEntry> holdBuffer_ = nullptr; 344 }; 345 } 346 } 347 #endif // RENDER_SERVICE_CLIENT_CORE_PIPELINE_RS_SURFACE_HANDLER_H 348