• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2022 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 #include "rs_uni_render_processor.h"
17 
18 #include <vector>
19 
20 #include "hdi_layer.h"
21 #include "hdi_layer_info.h"
22 #include "rs_trace.h"
23 #include "rs_uni_render_util.h"
24 #include "string_utils.h"
25 #include "surface_type.h"
26 
27 #include "common/rs_optional_trace.h"
28 #include "display_engine/rs_luminance_control.h"
29 #include "drawable/rs_display_render_node_drawable.h"
30 #include "drawable/rs_surface_render_node_drawable.h"
31 #include "params/rs_display_render_params.h"
32 #include "params/rs_surface_render_params.h"
33 #include "feature/round_corner_display/rs_rcd_surface_render_node.h"
34 #include "feature/round_corner_display/rs_rcd_surface_render_node_drawable.h"
35 #include "platform/common/rs_log.h"
36 
37 namespace OHOS {
38 namespace Rosen {
RSUniRenderProcessor()39 RSUniRenderProcessor::RSUniRenderProcessor()
40     : uniComposerAdapter_(std::make_unique<RSUniRenderComposerAdapter>())
41 {
42 }
43 
~RSUniRenderProcessor()44 RSUniRenderProcessor::~RSUniRenderProcessor() noexcept
45 {
46 }
47 
Init(RSDisplayRenderNode & node,int32_t offsetX,int32_t offsetY,ScreenId mirroredId,std::shared_ptr<RSBaseRenderEngine> renderEngine)48 bool RSUniRenderProcessor::Init(RSDisplayRenderNode& node, int32_t offsetX, int32_t offsetY, ScreenId mirroredId,
49                                 std::shared_ptr<RSBaseRenderEngine> renderEngine)
50 {
51     if (!RSProcessor::Init(node, offsetX, offsetY, mirroredId, renderEngine)) {
52         return false;
53     }
54     // In uni render mode, we can handle screen rotation in the rendering process,
55     // so we do not need to handle rotation in composer adapter any more,
56     // just pass the buffer to composer straightly.
57     screenInfo_.rotation = ScreenRotation::ROTATION_0;
58     return uniComposerAdapter_->Init(screenInfo_, offsetX_, offsetY_, mirrorAdaptiveCoefficient_);
59 }
60 
InitForRenderThread(DrawableV2::RSDisplayRenderNodeDrawable & displayDrawable,ScreenId mirroredId,std::shared_ptr<RSBaseRenderEngine> renderEngine)61 bool RSUniRenderProcessor::InitForRenderThread(DrawableV2::RSDisplayRenderNodeDrawable& displayDrawable,
62     ScreenId mirroredId, std::shared_ptr<RSBaseRenderEngine> renderEngine)
63 {
64     if (!RSProcessor::InitForRenderThread(displayDrawable, mirroredId, renderEngine)) {
65         return false;
66     }
67     // In uni render mode, we can handle screen rotation in the rendering process,
68     // so we do not need to handle rotation in composer adapter any more,
69     // just pass the buffer to composer straightly.
70     screenInfo_.rotation = ScreenRotation::ROTATION_0;
71     return uniComposerAdapter_->Init(screenInfo_, offsetX_, offsetY_, mirrorAdaptiveCoefficient_);
72 }
73 
PostProcess()74 void RSUniRenderProcessor::PostProcess()
75 {
76     uniComposerAdapter_->CommitLayers(layers_);
77     RS_LOGD("RSUniRenderProcessor::PostProcess layers_:%{public}zu", layers_.size());
78 }
79 
CreateLayer(const RSSurfaceRenderNode & node,RSSurfaceRenderParams & params)80 void RSUniRenderProcessor::CreateLayer(const RSSurfaceRenderNode& node, RSSurfaceRenderParams& params)
81 {
82     auto surfaceHandler = node.GetRSSurfaceHandler();
83     auto buffer = surfaceHandler->GetBuffer();
84     if (buffer == nullptr || surfaceHandler->GetConsumer() == nullptr) {
85         return;
86     }
87     auto& layerInfo = params.GetLayerInfo();
88     const Rect& dirtyRect = params.GetBufferDamage();
89     RS_OPTIONAL_TRACE_NAME_FMT(
90         "CreateLayer name:%s zorder:%d src:[%d, %d, %d, %d] dst:[%d, %d, %d, %d] dirty:[%d, %d, %d, %d] "
91         "buffer:[%d, %d] alpha:[%f] type:[%d]",
92         node.GetName().c_str(), layerInfo.zOrder,
93         layerInfo.srcRect.x, layerInfo.srcRect.y, layerInfo.srcRect.w, layerInfo.srcRect.h,
94         layerInfo.dstRect.x, layerInfo.dstRect.y, layerInfo.dstRect.w, layerInfo.dstRect.h,
95         dirtyRect.x, dirtyRect.y, dirtyRect.w, dirtyRect.h,
96         buffer->GetSurfaceBufferWidth(), buffer->GetSurfaceBufferHeight(), layerInfo.alpha, layerInfo.layerType);
97     RS_LOGD_IF(DEBUG_PIPELINE,
98         "CreateLayer name:%{public}s zorder:%{public}d src:[%{public}d, %{public}d, %{public}d, %{public}d] "
99         "dst:[%{public}d, %{public}d, %{public}d, %{public}d] "
100         "drity:[%{public}d, %{public}d, %{public}d, %{public}d] "
101         "buffer:[%{public}d, %{public}d] alpha:[%{public}f]",
102         node.GetName().c_str(), layerInfo.zOrder, layerInfo.srcRect.x, layerInfo.srcRect.y, layerInfo.srcRect.w,
103         layerInfo.srcRect.h, layerInfo.dstRect.x, layerInfo.dstRect.y, layerInfo.dstRect.w, layerInfo.dstRect.h,
104         dirtyRect.x, dirtyRect.y, dirtyRect.w, dirtyRect.h, buffer->GetSurfaceBufferWidth(),
105         buffer->GetSurfaceBufferHeight(), layerInfo.alpha);
106     auto preBuffer = params.GetPreBuffer();
107     LayerInfoPtr layer = GetLayerInfo(
108         params, buffer, preBuffer, surfaceHandler->GetConsumer(), params.GetAcquireFence());
109     layer->SetSdrNit(params.GetSdrNit());
110     layer->SetDisplayNit(params.GetDisplayNit());
111     layer->SetBrightnessRatio(params.GetBrightnessRatio());
112     layer->SetLayerLinearMatrix(params.GetLayerLinearMatrix());
113 
114     uniComposerAdapter_->SetMetaDataInfoToLayer(layer, params.GetBuffer(), surfaceHandler->GetConsumer());
115     CreateSolidColorLayer(layer, params);
116     layers_.emplace_back(layer);
117     params.SetLayerCreated(true);
118 }
119 
CreateLayerForRenderThread(DrawableV2::RSSurfaceRenderNodeDrawable & surfaceDrawable)120 void RSUniRenderProcessor::CreateLayerForRenderThread(DrawableV2::RSSurfaceRenderNodeDrawable& surfaceDrawable)
121 {
122     auto& paramsSp = surfaceDrawable.GetRenderParams();
123     if (!paramsSp) {
124         return;
125     }
126     auto& params = *(static_cast<RSSurfaceRenderParams*>(paramsSp.get()));
127     auto buffer = params.GetBuffer();
128     if (buffer == nullptr) {
129         return;
130     }
131     auto& layerInfo = params.GetLayerInfo();
132     const Rect& dirtyRect = params.GetBufferDamage();
133     RS_OPTIONAL_TRACE_NAME_FMT(
134         "CreateLayer name:%s zorder:%d src:[%d, %d, %d, %d] dst:[%d, %d, %d, %d] dirty:[%d, %d, %d, %d] "
135         "buffer:[%d, %d] alpha:[%f] type:[%d]",
136         surfaceDrawable.GetName().c_str(), layerInfo.zOrder,
137         layerInfo.srcRect.x, layerInfo.srcRect.y, layerInfo.srcRect.w, layerInfo.srcRect.h,
138         layerInfo.dstRect.x, layerInfo.dstRect.y, layerInfo.dstRect.w, layerInfo.dstRect.h,
139         dirtyRect.x, dirtyRect.y, dirtyRect.w, dirtyRect.h,
140         buffer->GetSurfaceBufferWidth(), buffer->GetSurfaceBufferHeight(), layerInfo.alpha, layerInfo.layerType);
141     RS_LOGD("CreateLayer name:%{public}s zorder:%{public}d src:[%{public}d, %{public}d, %{public}d, %{public}d] "
142             "dst:[%{public}d, %{public}d, %{public}d, %{public}d] "
143             "drity:[%{public}d, %{public}d, %{public}d, %{public}d] "
144             "buffer:[%{public}d, %{public}d] alpha:[%{public}f] type:%{public}d]",
145         surfaceDrawable.GetName().c_str(), layerInfo.zOrder,
146         layerInfo.srcRect.x, layerInfo.srcRect.y, layerInfo.srcRect.w, layerInfo.srcRect.h,
147         layerInfo.dstRect.x, layerInfo.dstRect.y, layerInfo.dstRect.w, layerInfo.dstRect.h,
148         dirtyRect.x, dirtyRect.y, dirtyRect.w, dirtyRect.h,
149         buffer->GetSurfaceBufferWidth(), buffer->GetSurfaceBufferHeight(), layerInfo.alpha, layerInfo.layerType);
150     auto preBuffer = params.GetPreBuffer();
151     LayerInfoPtr layer = GetLayerInfo(static_cast<RSSurfaceRenderParams&>(params), buffer, preBuffer,
152         surfaceDrawable.GetConsumerOnDraw(), params.GetAcquireFence());
153     layer->SetNodeId(surfaceDrawable.GetId());
154     auto& renderParams = static_cast<RSSurfaceRenderParams&>(params);
155     layer->SetSdrNit(renderParams.GetSdrNit());
156     layer->SetDisplayNit(renderParams.GetDisplayNit());
157     layer->SetBrightnessRatio(renderParams.GetBrightnessRatio());
158     layer->SetLayerLinearMatrix(renderParams.GetLayerLinearMatrix());
159     uniComposerAdapter_->SetMetaDataInfoToLayer(layer, params.GetBuffer(), surfaceDrawable.GetConsumerOnDraw());
160     CreateSolidColorLayer(layer, params);
161     layers_.emplace_back(layer);
162     params.SetLayerCreated(true);
163 }
164 
CreateSolidColorLayer(LayerInfoPtr layer,RSSurfaceRenderParams & params)165 void RSUniRenderProcessor::CreateSolidColorLayer(LayerInfoPtr layer, RSSurfaceRenderParams& params)
166 {
167     auto color = params.GetBackgroundColor();
168     if (!params.GetIsHwcEnabledBySolidLayer()) {
169         auto solidColorLayer = HdiLayerInfo::CreateHdiLayerInfo();
170         solidColorLayer->CopyLayerInfo(layer);
171         if (layer->GetZorder() > 0) {
172             solidColorLayer->SetZorder(layer->GetZorder() - 1);
173         }
174         solidColorLayer->SetTransform(GraphicTransformType::GRAPHIC_ROTATE_NONE);
175         auto dstRect = params.layerInfo_.dstRect;
176         GraphicIRect layerRect = {dstRect.x, dstRect.y, dstRect.w, dstRect.h};
177         solidColorLayer->SetLayerSize(layerRect);
178         solidColorLayer->SetCompositionType(GraphicCompositionType::GRAPHIC_COMPOSITION_SOLID_COLOR);
179         solidColorLayer->SetLayerColor({color.GetRed(), color.GetGreen(), color.GetBlue(), color.GetAlpha()});
180         solidColorLayer->SetSurface({});
181         solidColorLayer->SetBuffer({}, {});
182         solidColorLayer->SetPreBuffer({});
183         solidColorLayer->SetMetaData({});
184         layers_.emplace_back(solidColorLayer);
185     }
186 }
187 
GetForceClientForDRM(RSSurfaceRenderParams & params)188 bool RSUniRenderProcessor::GetForceClientForDRM(RSSurfaceRenderParams& params)
189 {
190     if (params.GetSpecialLayerMgr().Find(SpecialLayerType::PROTECTED) == false) {
191         return false;
192     }
193     if (params.GetAnimateState() == true ||
194         RSUniRenderUtil::GetRotationDegreeFromMatrix(params.GetTotalMatrix()) % RS_ROTATION_90 != 0) {
195         return true;
196     }
197     if (!params.GetCornerRadiusInfoForDRM().empty()) {
198         return true;
199     }
200     if (params.GetIsOutOfScreen() == true) {
201         return true;
202     }
203     bool forceClientForDRM = false;
204     auto ancestorDisplayDrawable =
205         std::static_pointer_cast<DrawableV2::RSDisplayRenderNodeDrawable>(params.GetAncestorDisplayDrawable().lock());
206     auto& uniParam = RSUniRenderThread::Instance().GetRSRenderThreadParams();
207     if (ancestorDisplayDrawable == nullptr || ancestorDisplayDrawable->GetRenderParams() == nullptr ||
208         uniParam == nullptr) {
209         RS_LOGE("%{public}s ancestorDisplayDrawable/ancestorDisplayDrawableParams/uniParam is nullptr", __func__);
210         return false;
211     } else {
212         auto displayParams = static_cast<RSDisplayRenderParams*>(ancestorDisplayDrawable->GetRenderParams().get());
213         forceClientForDRM = displayParams->IsRotationChanged() || uniParam->GetCacheEnabledForRotation();
214     }
215     return forceClientForDRM;
216 }
217 
GetLayerInfo(RSSurfaceRenderParams & params,sptr<SurfaceBuffer> & buffer,sptr<SurfaceBuffer> & preBuffer,const sptr<IConsumerSurface> & consumer,const sptr<SyncFence> & acquireFence)218 LayerInfoPtr RSUniRenderProcessor::GetLayerInfo(RSSurfaceRenderParams& params, sptr<SurfaceBuffer>& buffer,
219     sptr<SurfaceBuffer>& preBuffer, const sptr<IConsumerSurface>& consumer, const sptr<SyncFence>& acquireFence)
220 {
221     LayerInfoPtr layer = HdiLayerInfo::CreateHdiLayerInfo();
222     auto& layerInfo = params.layerInfo_;
223     layer->SetNeedBilinearInterpolation(params.NeedBilinearInterpolation());
224     layer->SetSurface(consumer);
225     layer->SetBuffer(buffer, acquireFence);
226     layer->SetPreBuffer(preBuffer);
227     params.SetPreBuffer(nullptr);
228     layer->SetZorder(layerInfo.zOrder);
229     layer->SetType(layerInfo.layerType);
230     layer->SetRotationFixed(params.GetFixRotationByUser());
231 
232     GraphicLayerAlpha alpha;
233     alpha.enGlobalAlpha = true;
234     // Alpha of 255 indicates opacity
235     alpha.gAlpha = static_cast<uint8_t>(std::clamp(layerInfo.alpha, 0.0f, 1.0f) * RGBA_MAX);
236     layer->SetAlpha(alpha);
237     GraphicIRect dstRect = layerInfo.dstRect;
238     if (layerInfo.layerType == GraphicLayerType::GRAPHIC_LAYER_TYPE_CURSOR &&
239         ((layerInfo.dstRect.w != layerInfo.srcRect.w) || (layerInfo.dstRect.h != layerInfo.srcRect.h))) {
240         dstRect = {layerInfo.dstRect.x, layerInfo.dstRect.y, layerInfo.srcRect.w, layerInfo.srcRect.h};
241     }
242     layer->SetLayerSize(dstRect);
243     layer->SetBoundSize(layerInfo.boundRect);
244     bool forceClientForDRM = GetForceClientForDRM(params);
245     RS_OPTIONAL_TRACE_NAME_FMT("%s nodeName[%s] forceClientForDRM[%d]",
246         __func__, params.GetName().c_str(), forceClientForDRM);
247     RS_LOGD("%{public}s nodeName[%{public}s] forceClientForDRM[%{public}d]",
248         __func__, params.GetName().c_str(), forceClientForDRM);
249     bool forceClient = RSSystemProperties::IsForceClient() || forceClientForDRM;
250     layer->SetCompositionType(forceClient ? GraphicCompositionType::GRAPHIC_COMPOSITION_CLIENT :
251         GraphicCompositionType::GRAPHIC_COMPOSITION_DEVICE);
252     layer->SetCornerRadiusInfoForDRM(params.GetCornerRadiusInfoForDRM());
253     auto bufferBackgroundColor = params.GetBackgroundColor();
254     GraphicLayerColor backgroundColor = {
255         .r = bufferBackgroundColor.GetRed(),
256         .g = bufferBackgroundColor.GetGreen(),
257         .b = bufferBackgroundColor.GetBlue(),
258         .a = bufferBackgroundColor.GetAlpha()
259     };
260     layer->SetBackgroundColor(backgroundColor);
261 
262     std::vector<GraphicIRect> visibleRegions;
263     visibleRegions.emplace_back(layerInfo.dstRect);
264     layer->SetVisibleRegions(visibleRegions);
265     std::vector<GraphicIRect> dirtyRegions;
266     if (RSSystemProperties::GetHwcDirtyRegionEnabled()) {
267         const auto& bufferDamage = params.GetBufferDamage();
268         GraphicIRect dirtyRect = params.GetIsBufferFlushed() ? GraphicIRect { bufferDamage.x, bufferDamage.y,
269             bufferDamage.w, bufferDamage.h } : GraphicIRect { 0, 0, 0, 0 };
270         auto intersectRect = RSUniRenderUtil::IntersectRect(layerInfo.srcRect, dirtyRect);
271         RS_OPTIONAL_TRACE_NAME_FMT("intersectRect:[%d, %d, %d, %d]",
272             intersectRect.x, intersectRect.y, intersectRect.w, intersectRect.h);
273         dirtyRegions.emplace_back(intersectRect);
274     } else {
275         dirtyRegions.emplace_back(layerInfo.srcRect);
276     }
277     layer->SetDirtyRegions(dirtyRegions);
278 
279     layer->SetBlendType(layerInfo.blendType);
280     layer->SetCropRect(layerInfo.srcRect);
281     layer->SetGravity(layerInfo.gravity);
282     layer->SetTransform(layerInfo.transformType);
283     if (layerInfo.layerType == GraphicLayerType::GRAPHIC_LAYER_TYPE_CURSOR) {
284         layer->SetTransform(GraphicTransformType::GRAPHIC_ROTATE_NONE);
285     }
286     auto matrix = GraphicMatrix {layerInfo.matrix.Get(Drawing::Matrix::Index::SCALE_X),
287         layerInfo.matrix.Get(Drawing::Matrix::Index::SKEW_X), layerInfo.matrix.Get(Drawing::Matrix::Index::TRANS_X),
288         layerInfo.matrix.Get(Drawing::Matrix::Index::SKEW_Y), layerInfo.matrix.Get(Drawing::Matrix::Index::SCALE_Y),
289         layerInfo.matrix.Get(Drawing::Matrix::Index::TRANS_Y), layerInfo.matrix.Get(Drawing::Matrix::Index::PERSP_0),
290         layerInfo.matrix.Get(Drawing::Matrix::Index::PERSP_1), layerInfo.matrix.Get(Drawing::Matrix::Index::PERSP_2)};
291     layer->SetMatrix(matrix);
292     layer->SetLayerSourceTuning(params.GetLayerSourceTuning());
293     layer->SetLayerArsr(layerInfo.arsrTag);
294     return layer;
295 }
296 
ProcessSurface(RSSurfaceRenderNode & node)297 void RSUniRenderProcessor::ProcessSurface(RSSurfaceRenderNode &node)
298 {
299     RS_LOGE("It is update to DrawableV2 to process node now!!");
300 }
301 
ProcessSurfaceForRenderThread(DrawableV2::RSSurfaceRenderNodeDrawable & surfaceDrawable)302 void RSUniRenderProcessor::ProcessSurfaceForRenderThread(DrawableV2::RSSurfaceRenderNodeDrawable& surfaceDrawable)
303 {
304     auto layer = uniComposerAdapter_->CreateLayer(surfaceDrawable);
305     if (layer == nullptr) {
306         RS_LOGE("RSUniRenderProcessor::ProcessSurface: failed to createLayer for node(id: %{public}" PRIu64 ")",
307             surfaceDrawable.GetId());
308         return;
309     }
310     layers_.emplace_back(layer);
311 }
312 
ProcessDisplaySurface(RSDisplayRenderNode & node)313 void RSUniRenderProcessor::ProcessDisplaySurface(RSDisplayRenderNode& node)
314 {
315     auto layer = uniComposerAdapter_->CreateLayer(node);
316     if (layer == nullptr) {
317         RS_LOGE("RSUniRenderProcessor::ProcessDisplaySurface: failed to createLayer for node(id: %{public}" PRIu64 ")",
318             node.GetId());
319         return;
320     }
321     if (node.GetFingerprint()) {
322         layer->SetLayerMaskInfo(HdiLayerInfo::LayerMask::LAYER_MASK_HBM_SYNC);
323         RS_LOGD("RSUniRenderProcessor::ProcessDisplaySurface, set layer mask hbm sync");
324     } else {
325         layer->SetLayerMaskInfo(HdiLayerInfo::LayerMask::LAYER_MASK_NORMAL);
326     }
327     layers_.emplace_back(layer);
328     auto drawable = node.GetRenderDrawable();
329     if (!drawable) {
330         return;
331     }
332     auto displayDrawable = std::static_pointer_cast<DrawableV2::RSDisplayRenderNodeDrawable>(drawable);
333     auto surfaceHandler = displayDrawable->GetRSSurfaceHandlerOnDraw();
334     RSUniRenderThread::Instance().SetAcquireFence(surfaceHandler->GetAcquireFence());
335 }
336 
ProcessDisplaySurfaceForRenderThread(DrawableV2::RSDisplayRenderNodeDrawable & displayDrawable)337 void RSUniRenderProcessor::ProcessDisplaySurfaceForRenderThread(
338     DrawableV2::RSDisplayRenderNodeDrawable& displayDrawable)
339 {
340     auto layer = uniComposerAdapter_->CreateLayer(displayDrawable);
341     if (layer == nullptr) {
342         RS_LOGE("RSUniRenderProcessor::ProcessDisplaySurface: failed to createLayer for node(id: %{public}" PRIu64 ")",
343             displayDrawable.GetId());
344         return;
345     }
346     auto& params = displayDrawable.GetRenderParams();
347     if (!params) {
348         return;
349     }
350     if (params->GetFingerprint()) {
351         layer->SetLayerMaskInfo(HdiLayerInfo::LayerMask::LAYER_MASK_HBM_SYNC);
352         RS_LOGD("RSUniRenderProcessor::ProcessDisplaySurface, set layer mask hbm sync");
353     } else {
354         layer->SetLayerMaskInfo(HdiLayerInfo::LayerMask::LAYER_MASK_NORMAL);
355     }
356     layers_.emplace_back(layer);
357     auto surfaceHandler = displayDrawable.GetRSSurfaceHandlerOnDraw();
358     if (!surfaceHandler) {
359         return;
360     }
361     RSUniRenderThread::Instance().SetAcquireFence(surfaceHandler->GetAcquireFence());
362 }
363 
ProcessRcdSurface(RSRcdSurfaceRenderNode & node)364 void RSUniRenderProcessor::ProcessRcdSurface(RSRcdSurfaceRenderNode& node)
365 {
366     auto layer = uniComposerAdapter_->CreateLayer(node);
367     if (layer == nullptr) {
368         RS_LOGE("RSUniRenderProcessor::ProcessRcdSurface: failed to createLayer for node(id: %{public}" PRIu64 ")",
369             node.GetId());
370         return;
371     }
372     layers_.emplace_back(layer);
373 }
374 
ProcessRcdSurfaceForRenderThread(DrawableV2::RSRcdSurfaceRenderNodeDrawable & rcdDrawable)375 void RSUniRenderProcessor::ProcessRcdSurfaceForRenderThread(DrawableV2::RSRcdSurfaceRenderNodeDrawable &rcdDrawable)
376 {
377     auto layer = uniComposerAdapter_->CreateLayer(rcdDrawable);
378     if (layer == nullptr) {
379         RS_LOGE("RSUniRenderProcessor::ProcessRcdSurfaceForRenderThread: failed to createLayer for node(id: "
380                 "%{public}" PRIu64 ")",
381             rcdDrawable.GetId());
382         return;
383     }
384     layers_.emplace_back(layer);
385 }
386 
387 #ifdef OHOS_BUILD_ENABLE_MAGICCURSOR
GetLayers() const388 std::vector<LayerInfoPtr> RSUniRenderProcessor::GetLayers() const
389 {
390     return layers_;
391 }
392 #endif
393 } // namespace Rosen
394 } // namespace OHOS
395