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