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_delegate.h" 24 #include "surface/window.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 #endif 124 125 void ReleaseSurfaceBuffers() override; 126 127 void UpdateSurfaceSizeInUserData(uint32_t width, uint32_t height) override; 128 129 void SetExtSurfaceBounds(int32_t left, int32_t top, int32_t width, int32_t height) override; 130 131 void SetExtSurfaceCallback(const RefPtr<ExtSurfaceCallbackInterface>& extSurfaceCallback) override; 132 133 void SetTransformHint(uint32_t rotation) override; 134 135 void RegisterSurface() const override; 136 137 void UnregisterSurface() const override; 138 139 void Connect() const override; 140 141 void Disconnect() const override; 142 143 void DumpInfo() override; 144 145 void ReleaseSurfaceBufferById(uint32_t bufferId); 146 147 void RegisterBufferCallback() override; 148 149 private: 150 void PostRenderOnlyTaskToUI(); 151 152 std::mutex surfaceNodeMutex_; 153 OffsetF orgin_ { 0, 0 }; 154 std::string patternType_; 155 int32_t queueSize_ = SURFACE_QUEUE_SIZE; 156 Axis axis_ = Axis::NONE; 157 float webOffset_ = 0.0; 158 #ifdef OHOS_PLATFORM 159 OHOS::sptr<OHOS::Surface> producerSurface_ = nullptr; 160 OHOS::sptr<IConsumerSurface> consumerSurface_ = nullptr; 161 OHOS::sptr<IBufferConsumerListener> drawBufferListener_ = nullptr; 162 struct NativeWindow* nativeWindow_ = nullptr; 163 sptr<OHOS::SurfaceDelegate> surfaceDelegate_; 164 std::queue<std::shared_ptr<SurfaceBufferNode>> availableBuffers_; 165 std::list<std::shared_ptr<SurfaceBufferNode>> availableBufferList_; 166 std::shared_ptr<Rosen::SurfaceBufferCallback> bufferCallback_; 167 int32_t failTimes_ = 0; 168 #endif 169 WeakPtr<NG::RenderContext> renderContext_ = nullptr; 170 RefPtr<ExtSurfaceCallbackInterface> extSurfaceCallbackInterface_ = nullptr; 171 bool isTexture_ = false; 172 int32_t instanceId_; 173 174 ACE_DISALLOW_COPY_AND_MOVE(RosenRenderSurface); 175 }; 176 177 #ifdef OHOS_PLATFORM 178 class DrawBufferListener : public IBufferConsumerListener { 179 public: DrawBufferListener(const WeakPtr<NG::RosenRenderSurface> & renderSurface)180 explicit DrawBufferListener(const WeakPtr<NG::RosenRenderSurface>& renderSurface) : renderSurface_(renderSurface) {} 181 ~DrawBufferListener() override = default; 182 void OnBufferAvailable() override; 183 184 private: 185 WeakPtr<NG::RosenRenderSurface> renderSurface_; 186 }; 187 188 class XComponentSurfaceBufferCallback : public Rosen::SurfaceBufferCallback { 189 public: XComponentSurfaceBufferCallback(const WeakPtr<NG::RosenRenderSurface> & renderSurface)190 explicit XComponentSurfaceBufferCallback(const WeakPtr<NG::RosenRenderSurface>& renderSurface) 191 : renderSurface_(renderSurface) 192 {} 193 virtual ~XComponentSurfaceBufferCallback() = default; 194 void OnFinish(uint64_t uid, const std::vector<uint32_t>& surfaceBufferIds) override; 195 196 private: 197 WeakPtr<NG::RosenRenderSurface> renderSurface_; 198 }; 199 #endif 200 201 #ifdef OHOS_PLATFORM 202 class ExtSurfaceCallback : public OHOS::SurfaceDelegate::ISurfaceCallback { 203 public: ExtSurfaceCallback(const WeakPtr<ExtSurfaceCallbackInterface> & interface)204 explicit ExtSurfaceCallback(const WeakPtr<ExtSurfaceCallbackInterface>& interface) : weakInterface_(interface) {} 205 206 ~ExtSurfaceCallback() override = default; 207 208 void OnSurfaceCreated(const sptr<Surface>& surface) override; 209 210 void OnSurfaceChanged(const sptr<Surface>& surface, int32_t width, int32_t height) override; 211 212 void OnSurfaceDestroyed() override; 213 214 private: 215 WeakPtr<ExtSurfaceCallbackInterface> weakInterface_; 216 }; 217 #endif 218 } // namespace OHOS::Ace::NG 219 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PAINTS_ADAPTER_ROSEN_RENDER_SURFACE_H 220