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