1 /* 2 * Copyright (c) 2022-2024 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 FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PAINTS_ADAPTER_ROSEN_RENDER_SURFACE_H 17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PAINTS_ADAPTER_ROSEN_RENDER_SURFACE_H 18 19 #ifdef OHOS_PLATFORM 20 #include "ibuffer_consumer_listener.h" 21 #include "iconsumer_surface.h" 22 #include "surface.h" 23 #include "surface/window.h" 24 #include "surface_delegate.h" 25 #include "transaction/rs_render_service_client.h" 26 #endif 27 28 #include "base/memory/referenced.h" 29 #include "base/utils/noncopyable.h" 30 #include "core/components_ng/render/drawing.h" 31 #include "core/components_ng/render/ext_surface_callback_interface.h" 32 #include "core/components_ng/render/render_surface.h" 33 34 namespace OHOS::Ace::NG { 35 constexpr int32_t SURFACE_QUEUE_SIZE = 5; 36 #ifdef OHOS_PLATFORM 37 struct SurfaceBufferNode; 38 #endif 39 40 class RosenRenderSurface : public RenderSurface { 41 DECLARE_ACE_TYPE(RosenRenderSurface, NG::RenderSurface) 42 public: 43 RosenRenderSurface() = default; 44 ~RosenRenderSurface() override; 45 46 void InitSurface() override; 47 48 void UpdateSurfaceConfig() override; 49 50 void* GetNativeWindow() override; 51 52 void SetRenderContext(const RefPtr<RenderContext>& renderContext) override; 53 54 void ConfigSurface(uint32_t surfaceWidth, uint32_t surfaceHeight) override; 55 56 bool IsSurfaceValid() const override; 57 58 void CreateNativeWindow() override; 59 60 void AdjustNativeWindowSize(uint32_t width, uint32_t height) override; 61 62 std::string GetUniqueId() const override; 63 64 uint64_t GetUniqueIdNum() const; 65 SetIsTexture(bool isTexture)66 void SetIsTexture(bool isTexture) override 67 { 68 isTexture_ = isTexture; 69 } 70 SetInstanceId(int32_t instanceId)71 void SetInstanceId(int32_t instanceId) override 72 { 73 instanceId_ = instanceId; 74 } 75 76 void SetSurfaceDefaultSize(int32_t width, int32_t height) override; 77 78 void ConsumeXComponentBuffer(); 79 80 void ConsumeWebBuffer(); 81 SetWebMessage(OffsetF offset)82 void SetWebMessage(OffsetF offset) override 83 { 84 orgin_ = offset; 85 } 86 SetPatternType(const std::string & type)87 void SetPatternType(const std::string& type) override 88 { 89 patternType_ = type; 90 } 91 GetPatternType()92 std::string GetPatternType() const 93 { 94 return patternType_; 95 } 96 SetWebSlideAxis(Axis axis)97 void SetWebSlideAxis(Axis axis) override 98 { 99 axis_ = axis; 100 } 101 SetWebOffset(float webOffset)102 void SetWebOffset(float webOffset) override 103 { 104 webOffset_ = webOffset; 105 } 106 107 void SetSurfaceQueueSize(int32_t queueSize = SURFACE_QUEUE_SIZE) override 108 { 109 queueSize_ = queueSize; 110 } 111 112 void DrawBuffer(int32_t width = -1, int32_t height = -1); 113 114 void DrawBufferForXComponent(RSCanvas& canvas, float width, float height, float offsetX, float offsetY) override; 115 116 #ifdef OHOS_PLATFORM GetSurface()117 OHOS::sptr<OHOS::Surface> GetSurface() const 118 { 119 return producerSurface_; 120 } 121 122 bool CompareBufferSize(int32_t width, int32_t height, std::shared_ptr<SurfaceBufferNode> surfaceNode); 123 SetIsNeedSyncGeometryProperties(bool isNeedSyncGeometryProperties)124 void SetIsNeedSyncGeometryProperties(bool isNeedSyncGeometryProperties) override 125 { 126 isNeedSyncGeometryProperties_ = isNeedSyncGeometryProperties; 127 } 128 SetKeyBoardAvoidRect(RectF keyBoardAvoidRect)129 void SetKeyBoardAvoidRect(RectF keyBoardAvoidRect) override 130 { 131 keyBoardAvoidRect_ = keyBoardAvoidRect; 132 } 133 134 #endif 135 136 void ReleaseSurfaceBuffers() override; 137 138 void UpdateSurfaceSizeInUserData(uint32_t width, uint32_t height) override; 139 140 void SetExtSurfaceBounds(int32_t left, int32_t top, int32_t width, int32_t height) override; 141 142 void SetExtSurfaceCallback(const RefPtr<ExtSurfaceCallbackInterface>& extSurfaceCallback) override; 143 144 void SetTransformHint(uint32_t rotation) override; 145 146 void RegisterSurface() const override; 147 148 void UnregisterSurface() const override; 149 150 void Connect() const override; 151 152 void Disconnect() const override; 153 154 void DumpInfo() override; 155 156 void ReleaseSurfaceBufferById(uint32_t bufferId); 157 158 #ifdef OHOS_PLATFORM 159 void ReleaseSurfaceBufferForRT(const Rosen::FinishCallbackRet& ret); 160 #endif 161 162 void RegisterBufferCallback() override; 163 164 void SetIsUniRender(bool isUniRender); 165 166 void PostRenderOnlyTaskToUI(); 167 168 void OnWindowStateChange(bool isShow) override; 169 170 private: 171 void MarkDirtyIfNeeded(); 172 173 #ifdef OHOS_PLATFORM 174 void InsertSurfaceNode(const std::shared_ptr<SurfaceBufferNode>& surfaceNode); 175 #endif 176 177 std::mutex surfaceNodeMutex_; 178 bool isNeedSyncGeometryProperties_ = false; 179 RectF keyBoardAvoidRect_; 180 OffsetF orgin_ { 0, 0 }; 181 std::string patternType_; 182 int32_t queueSize_ = SURFACE_QUEUE_SIZE; 183 Axis axis_ = Axis::NONE; 184 float webOffset_ = 0.0; 185 #ifdef OHOS_PLATFORM 186 OHOS::sptr<OHOS::Surface> producerSurface_ = nullptr; 187 OHOS::sptr<IConsumerSurface> consumerSurface_ = nullptr; 188 OHOS::sptr<IBufferConsumerListener> drawBufferListener_ = nullptr; 189 struct NativeWindow* nativeWindow_ = nullptr; 190 sptr<OHOS::SurfaceDelegate> surfaceDelegate_; 191 std::queue<std::shared_ptr<SurfaceBufferNode>> availableBuffers_; 192 std::list<std::shared_ptr<SurfaceBufferNode>> buffersToDraw_; 193 std::list<std::shared_ptr<SurfaceBufferNode>> buffersToRelease_; 194 std::shared_ptr<Rosen::SurfaceBufferCallback> bufferCallback_; 195 int32_t failTimes_ = 0; 196 #endif 197 WeakPtr<NG::RenderContext> renderContext_ = nullptr; 198 RefPtr<ExtSurfaceCallbackInterface> extSurfaceCallbackInterface_ = nullptr; 199 bool isTexture_ = false; 200 int32_t instanceId_; 201 202 std::atomic_bool isShow_ = true; 203 std::atomic_bool isUniRender_ = true; 204 std::atomic_int32_t sendCount_ = -1; 205 206 ACE_DISALLOW_COPY_AND_MOVE(RosenRenderSurface); 207 }; 208 209 #ifdef OHOS_PLATFORM 210 class DrawBufferListener : public IBufferConsumerListener { 211 public: DrawBufferListener(const WeakPtr<NG::RosenRenderSurface> & renderSurface)212 explicit DrawBufferListener(const WeakPtr<NG::RosenRenderSurface>& renderSurface) : renderSurface_(renderSurface) {} 213 ~DrawBufferListener() override = default; 214 void OnBufferAvailable() override; 215 216 private: 217 WeakPtr<NG::RosenRenderSurface> renderSurface_; 218 }; 219 220 class XComponentSurfaceBufferCallback : public Rosen::SurfaceBufferCallback { 221 public: XComponentSurfaceBufferCallback(const WeakPtr<NG::RosenRenderSurface> & renderSurface)222 explicit XComponentSurfaceBufferCallback(const WeakPtr<NG::RosenRenderSurface>& renderSurface) 223 : renderSurface_(renderSurface) 224 {} 225 virtual ~XComponentSurfaceBufferCallback() = default; 226 void OnFinish(const Rosen::FinishCallbackRet& ret) override; OnAfterAcquireBuffer(const Rosen::AfterAcquireBufferRet & ret)227 void OnAfterAcquireBuffer(const Rosen::AfterAcquireBufferRet& ret) override {} 228 229 private: 230 WeakPtr<NG::RosenRenderSurface> renderSurface_; 231 }; 232 #endif 233 234 #ifdef OHOS_PLATFORM 235 class ExtSurfaceCallback : public OHOS::SurfaceDelegate::ISurfaceCallback { 236 public: ExtSurfaceCallback(const WeakPtr<ExtSurfaceCallbackInterface> & interface)237 explicit ExtSurfaceCallback(const WeakPtr<ExtSurfaceCallbackInterface>& interface) : weakInterface_(interface) {} 238 239 ~ExtSurfaceCallback() override = default; 240 241 void OnSurfaceCreated(const sptr<Surface>& surface) override; 242 243 void OnSurfaceChanged(const sptr<Surface>& surface, int32_t width, int32_t height) override; 244 245 void OnSurfaceDestroyed() override; 246 247 private: 248 WeakPtr<ExtSurfaceCallbackInterface> weakInterface_; 249 }; 250 #endif 251 } // namespace OHOS::Ace::NG 252 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PAINTS_ADAPTER_ROSEN_RENDER_SURFACE_H 253