• 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 "luminance/rs_luminance_control.h"
23 #include "rs_trace.h"
24 #include "rs_uni_render_util.h"
25 #include "string_utils.h"
26 #include "surface_type.h"
27 
28 #include "common/rs_optional_trace.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 "pipeline/parallel_render/rs_sub_thread_manager.h"
34 #include "pipeline/round_corner_display/rs_rcd_surface_render_node.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     isPhone_ = RSMainThread::Instance()->GetDeviceType() == DeviceType::PHONE;
59     return uniComposerAdapter_->Init(screenInfo_, offsetX_, offsetY_, mirrorAdaptiveCoefficient_);
60 }
61 
InitForRenderThread(DrawableV2::RSDisplayRenderNodeDrawable & displayDrawable,ScreenId mirroredId,std::shared_ptr<RSBaseRenderEngine> renderEngine)62 bool RSUniRenderProcessor::InitForRenderThread(DrawableV2::RSDisplayRenderNodeDrawable& displayDrawable,
63     ScreenId mirroredId, std::shared_ptr<RSBaseRenderEngine> renderEngine)
64 {
65     if (!RSProcessor::InitForRenderThread(displayDrawable, mirroredId, renderEngine)) {
66         return false;
67     }
68     // In uni render mode, we can handle screen rotation in the rendering process,
69     // so we do not need to handle rotation in composer adapter any more,
70     // just pass the buffer to composer straightly.
71     screenInfo_.rotation = ScreenRotation::ROTATION_0;
72     isPhone_ = RSMainThread::Instance()->GetDeviceType() == DeviceType::PHONE;
73     return uniComposerAdapter_->Init(screenInfo_, offsetX_, offsetY_, mirrorAdaptiveCoefficient_);
74 }
75 
PostProcess()76 void RSUniRenderProcessor::PostProcess()
77 {
78     uniComposerAdapter_->CommitLayers(layers_);
79     if (!isPhone_) {
80         MultiLayersPerf(layerNum_);
81     }
82     RS_LOGD("RSUniRenderProcessor::PostProcess layers_:%{public}zu", layers_.size());
83 }
84 
CreateLayer(RSSurfaceRenderNode & node,RSSurfaceRenderParams & params)85 void RSUniRenderProcessor::CreateLayer(RSSurfaceRenderNode& node, RSSurfaceRenderParams& params)
86 {
87     auto surfaceHandler = node.GetRSSurfaceHandler();
88     auto buffer = surfaceHandler->GetBuffer();
89     if (buffer == nullptr || surfaceHandler->GetConsumer() == nullptr) {
90         return;
91     }
92     auto& layerInfo = params.GetLayerInfo();
93     const Rect& dirtyRect = params.GetBufferDamage();
94     RS_OPTIONAL_TRACE_NAME_FMT(
95         "CreateLayer name:%s zorder:%d src:[%d, %d, %d, %d] dst:[%d, %d, %d, %d] dirty:[%d, %d, %d, %d] "
96         "buffer:[%d, %d] alpha:[%f] ",
97         node.GetName().c_str(), layerInfo.zOrder,
98         layerInfo.srcRect.x, layerInfo.srcRect.y, layerInfo.srcRect.w, layerInfo.srcRect.h,
99         layerInfo.dstRect.x, layerInfo.dstRect.y, layerInfo.dstRect.w, layerInfo.dstRect.h,
100         dirtyRect.x, dirtyRect.y, dirtyRect.w, dirtyRect.h,
101         buffer->GetSurfaceBufferWidth(), buffer->GetSurfaceBufferHeight(), layerInfo.alpha);
102     RS_LOGD("CreateLayer name:%{public}s zorder:%{public}d src:[%{public}d, %{public}d, %{public}d, %{public}d] "
103             "dst:[%{public}d, %{public}d, %{public}d, %{public}d] "
104             "drity:[%{public}d, %{public}d, %{public}d, %{public}d] "
105             "buffer:[%{public}d, %{public}d] alpha:[%{public}f]",
106         node.GetName().c_str(), layerInfo.zOrder,
107         layerInfo.srcRect.x, layerInfo.srcRect.y, layerInfo.srcRect.w, layerInfo.srcRect.h,
108         layerInfo.dstRect.x, layerInfo.dstRect.y, layerInfo.dstRect.w, layerInfo.dstRect.h,
109         dirtyRect.x, dirtyRect.y, dirtyRect.w, dirtyRect.h,
110         buffer->GetSurfaceBufferWidth(), buffer->GetSurfaceBufferHeight(), layerInfo.alpha);
111     auto preBuffer = params.GetPreBuffer();
112     LayerInfoPtr layer = GetLayerInfo(
113         params, buffer, preBuffer, surfaceHandler->GetConsumer(), params.GetAcquireFence());
114     layer->SetSdrNit(params.GetSdrNit());
115     layer->SetDisplayNit(params.GetDisplayNit());
116     layer->SetBrightnessRatio(params.GetBrightnessRatio());
117 
118     uniComposerAdapter_->SetMetaDataInfoToLayer(layer, params.GetBuffer(), surfaceHandler->GetConsumer());
119     CreateSolidColorLayer(layer, params);
120     layers_.emplace_back(layer);
121     params.SetLayerCreated(true);
122 }
123 
CreateLayerForRenderThread(DrawableV2::RSSurfaceRenderNodeDrawable & surfaceDrawable)124 void RSUniRenderProcessor::CreateLayerForRenderThread(DrawableV2::RSSurfaceRenderNodeDrawable& surfaceDrawable)
125 {
126     auto& paramsSp = surfaceDrawable.GetRenderParams();
127     if (!paramsSp) {
128         return;
129     }
130     auto& params = *(static_cast<RSSurfaceRenderParams*>(paramsSp.get()));
131     auto buffer = params.GetBuffer();
132     if (buffer == nullptr) {
133         return;
134     }
135     auto& layerInfo = params.GetLayerInfo();
136     const Rect& dirtyRect = params.GetBufferDamage();
137     RS_OPTIONAL_TRACE_NAME_FMT(
138         "CreateLayer name:%s zorder:%d src:[%d, %d, %d, %d] dst:[%d, %d, %d, %d] dirty:[%d, %d, %d, %d] "
139         "buffer:[%d, %d] alpha:[%f] ",
140         surfaceDrawable.GetName().c_str(), layerInfo.zOrder,
141         layerInfo.srcRect.x, layerInfo.srcRect.y, layerInfo.srcRect.w, layerInfo.srcRect.h,
142         layerInfo.dstRect.x, layerInfo.dstRect.y, layerInfo.dstRect.w, layerInfo.dstRect.h,
143         dirtyRect.x, dirtyRect.y, dirtyRect.w, dirtyRect.h,
144         buffer->GetSurfaceBufferWidth(), buffer->GetSurfaceBufferHeight(), layerInfo.alpha);
145     RS_LOGD("CreateLayer name:%{public}s zorder:%{public}d src:[%{public}d, %{public}d, %{public}d, %{public}d] "
146             "dst:[%{public}d, %{public}d, %{public}d, %{public}d] "
147             "drity:[%{public}d, %{public}d, %{public}d, %{public}d] "
148             "buffer:[%{public}d, %{public}d] alpha:[%{public}f]",
149         surfaceDrawable.GetName().c_str(), layerInfo.zOrder,
150         layerInfo.srcRect.x, layerInfo.srcRect.y, layerInfo.srcRect.w, layerInfo.srcRect.h,
151         layerInfo.dstRect.x, layerInfo.dstRect.y, layerInfo.dstRect.w, layerInfo.dstRect.h,
152         dirtyRect.x, dirtyRect.y, dirtyRect.w, dirtyRect.h,
153         buffer->GetSurfaceBufferWidth(), buffer->GetSurfaceBufferHeight(), layerInfo.alpha);
154     auto preBuffer = params.GetPreBuffer();
155     LayerInfoPtr layer = GetLayerInfo(static_cast<RSSurfaceRenderParams&>(params), buffer, preBuffer,
156         surfaceDrawable.GetConsumerOnDraw(), params.GetAcquireFence());
157     layer->SetNodeId(surfaceDrawable.GetId());
158     auto& renderParams = static_cast<RSSurfaceRenderParams&>(params);
159     layer->SetSdrNit(renderParams.GetSdrNit());
160     layer->SetDisplayNit(renderParams.GetDisplayNit());
161     layer->SetBrightnessRatio(renderParams.GetBrightnessRatio());
162     uniComposerAdapter_->SetMetaDataInfoToLayer(layer, params.GetBuffer(), surfaceDrawable.GetConsumerOnDraw());
163     CreateSolidColorLayer(layer, params);
164     layers_.emplace_back(layer);
165     params.SetLayerCreated(true);
166 }
167 
CreateUIFirstLayer(DrawableV2::RSSurfaceRenderNodeDrawable & drawable,RSSurfaceRenderParams & params)168 void RSUniRenderProcessor::CreateUIFirstLayer(DrawableV2::RSSurfaceRenderNodeDrawable& drawable,
169     RSSurfaceRenderParams& params)
170 {
171     auto surfaceHandler = drawable.GetMutableRSSurfaceHandlerUiFirstOnDraw();
172     if (!surfaceHandler) {
173         return;
174     }
175     auto buffer = surfaceHandler->GetBuffer();
176     if (buffer == nullptr && surfaceHandler->GetAvailableBufferCount() <= 0) {
177         RS_TRACE_NAME_FMT("HandleSubThreadNode wait %" PRIu64 "", params.GetId());
178         RSSubThreadManager::Instance()->WaitNodeTask(params.GetId());
179     }
180     if (!RSBaseRenderUtil::ConsumeAndUpdateBuffer(*surfaceHandler) || !surfaceHandler->GetBuffer()) {
181         RS_LOGE("CreateUIFirstLayer ConsumeAndUpdateBuffer or GetBuffer return  false");
182         return;
183     }
184     buffer = surfaceHandler->GetBuffer();
185     auto preBuffer = surfaceHandler->GetPreBuffer();
186     LayerInfoPtr layer = GetLayerInfo(
187         params, buffer, preBuffer, surfaceHandler->GetConsumer(), surfaceHandler->GetAcquireFence());
188     uniComposerAdapter_->SetMetaDataInfoToLayer(layer, params.GetBuffer(), surfaceHandler->GetConsumer());
189     layers_.emplace_back(layer);
190     auto& layerInfo = params.layerInfo_;
191     RS_LOGD("RSUniRenderProcessor::CreateUIFirstLayer: [%{public}s-%{public}" PRIu64 "] "
192         "src: %{public}d %{public}d %{public}d %{public}d, "
193         "dst: %{public}d %{public}d %{public}d %{public}d, zOrder: %{public}d",
194         drawable.GetName().c_str(), drawable.GetId(),
195         layerInfo.srcRect.x, layerInfo.srcRect.y, layerInfo.srcRect.w, layerInfo.srcRect.h,
196         layerInfo.dstRect.x, layerInfo.dstRect.y, layerInfo.dstRect.w, layerInfo.dstRect.h, layerInfo.zOrder);
197 }
198 
CreateSolidColorLayer(LayerInfoPtr layer,RSSurfaceRenderParams & params)199 void RSUniRenderProcessor::CreateSolidColorLayer(LayerInfoPtr layer, RSSurfaceRenderParams& params)
200 {
201     auto color = params.GetBackgroundColor();
202     if (!params.GetIsHwcEnabledBySolidLayer()) {
203         return;
204     }
205     auto solidColorLayer = HdiLayerInfo::CreateHdiLayerInfo();
206     solidColorLayer->CopyLayerInfo(layer);
207     if (layer->GetZorder() > 0) {
208         solidColorLayer->SetZorder(layer->GetZorder() - 1);
209     }
210     auto dstRect = params.layerInfo_.dstRect;
211     GraphicIRect layerRect = {dstRect.x, dstRect.y, dstRect.w, dstRect.h};
212     solidColorLayer->SetLayerSize(layerRect);
213     solidColorLayer->SetCompositionType(GraphicCompositionType::GRAPHIC_COMPOSITION_SOLID_COLOR);
214     solidColorLayer->SetLayerColor({color.GetRed(), color.GetGreen(), color.GetBlue(), color.GetAlpha()});
215     solidColorLayer->SetSurface({});
216     solidColorLayer->SetBuffer({}, {});
217     solidColorLayer->SetPreBuffer({});
218     solidColorLayer->SetMetaData({});
219     layers_.emplace_back(solidColorLayer);
220 }
221 
GetForceClientForDRM(RSSurfaceRenderParams & params)222 bool RSUniRenderProcessor::GetForceClientForDRM(RSSurfaceRenderParams& params)
223 {
224     if (params.GetIsProtectedLayer() == false) {
225         return false;
226     }
227     if (params.GetAnimateState() == true ||
228         RSUniRenderUtil::GetRotationDegreeFromMatrix(params.GetTotalMatrix()) % RS_ROTATION_90 != 0) {
229         return true;
230     }
231     if (!params.GetCornerRadiusInfoForDRM().empty()) {
232         return true;
233     }
234     bool forceClientForDRM = false;
235     auto ancestorDisplayDrawable =
236         std::static_pointer_cast<DrawableV2::RSDisplayRenderNodeDrawable>(params.GetAncestorDisplayDrawable().lock());
237     auto& uniParam = RSUniRenderThread::Instance().GetRSRenderThreadParams();
238     if (ancestorDisplayDrawable == nullptr || ancestorDisplayDrawable->GetRenderParams() == nullptr ||
239         uniParam == nullptr) {
240         RS_LOGE("%{public}s ancestorDisplayDrawable/ancestorDisplayDrawableParams/uniParam is nullptr", __func__);
241         return false;
242     } else {
243         auto displayParams = static_cast<RSDisplayRenderParams*>(ancestorDisplayDrawable->GetRenderParams().get());
244         forceClientForDRM = displayParams->IsRotationChanged() || uniParam->GetCacheEnabledForRotation();
245     }
246     return forceClientForDRM;
247 }
248 
GetLayerInfo(RSSurfaceRenderParams & params,sptr<SurfaceBuffer> & buffer,sptr<SurfaceBuffer> & preBuffer,const sptr<IConsumerSurface> & consumer,const sptr<SyncFence> & acquireFence)249 LayerInfoPtr RSUniRenderProcessor::GetLayerInfo(RSSurfaceRenderParams& params, sptr<SurfaceBuffer>& buffer,
250     sptr<SurfaceBuffer>& preBuffer, const sptr<IConsumerSurface>& consumer, const sptr<SyncFence>& acquireFence)
251 {
252     LayerInfoPtr layer = HdiLayerInfo::CreateHdiLayerInfo();
253     auto& layerInfo = params.layerInfo_;
254     layer->SetSurface(consumer);
255     layer->SetBuffer(buffer, acquireFence);
256     layer->SetPreBuffer(preBuffer);
257     params.SetPreBuffer(nullptr);
258     layer->SetZorder(layerInfo.zOrder);
259     layer->SetRotationFixed(params.GetFixRotationByUser());
260 
261     GraphicLayerAlpha alpha;
262     alpha.enGlobalAlpha = true;
263     // Alpha of 255 indicates opacity
264     alpha.gAlpha = static_cast<uint8_t>(std::clamp(layerInfo.alpha, 0.0f, 1.0f) * RGBA_MAX);
265     layer->SetAlpha(alpha);
266     layer->SetLayerSize(layerInfo.dstRect);
267     layer->SetBoundSize(layerInfo.boundRect);
268     bool forceClientForDRM = GetForceClientForDRM(params);
269     RS_OPTIONAL_TRACE_NAME_FMT("%s nodeName[%s] forceClientForDRM[%d]",
270         __func__, params.GetName().c_str(), forceClientForDRM);
271     RS_LOGD("%{public}s nodeName[%{public}s] forceClientForDRM[%{public}d]",
272         __func__, params.GetName().c_str(), forceClientForDRM);
273     bool forceClient = RSSystemProperties::IsForceClient() || forceClientForDRM;
274     layer->SetCompositionType(forceClient ? GraphicCompositionType::GRAPHIC_COMPOSITION_CLIENT :
275         GraphicCompositionType::GRAPHIC_COMPOSITION_DEVICE);
276     layer->SetCornerRadiusInfoForDRM(params.GetCornerRadiusInfoForDRM());
277     auto bufferBackgroundColor = params.GetBackgroundColor();
278     GraphicLayerColor backgroundColor = {
279         .r = bufferBackgroundColor.GetRed(),
280         .g = bufferBackgroundColor.GetGreen(),
281         .b = bufferBackgroundColor.GetBlue(),
282         .a = bufferBackgroundColor.GetAlpha()
283     };
284     layer->SetBackgroundColor(backgroundColor);
285 
286     std::vector<GraphicIRect> visibleRegions;
287     visibleRegions.emplace_back(layerInfo.dstRect);
288     layer->SetVisibleRegions(visibleRegions);
289     std::vector<GraphicIRect> dirtyRegions;
290     if (RSSystemProperties::GetHwcDirtyRegionEnabled()) {
291         const auto& dirtyRect = params.GetBufferDamage();
292         dirtyRegions.emplace_back(GraphicIRect { dirtyRect.x, dirtyRect.y, dirtyRect.w, dirtyRect.h });
293     } else {
294         dirtyRegions.emplace_back(layerInfo.srcRect);
295     }
296     layer->SetDirtyRegions(dirtyRegions);
297 
298     layer->SetBlendType(layerInfo.blendType);
299     ProcessLayerSetCropRect(layer, layerInfo, buffer);
300     layer->SetGravity(layerInfo.gravity);
301     layer->SetTransform(layerInfo.transformType);
302     auto matrix = GraphicMatrix {layerInfo.matrix.Get(Drawing::Matrix::Index::SCALE_X),
303         layerInfo.matrix.Get(Drawing::Matrix::Index::SKEW_X), layerInfo.matrix.Get(Drawing::Matrix::Index::TRANS_X),
304         layerInfo.matrix.Get(Drawing::Matrix::Index::SKEW_Y), layerInfo.matrix.Get(Drawing::Matrix::Index::SCALE_Y),
305         layerInfo.matrix.Get(Drawing::Matrix::Index::TRANS_Y), layerInfo.matrix.Get(Drawing::Matrix::Index::PERSP_0),
306         layerInfo.matrix.Get(Drawing::Matrix::Index::PERSP_1), layerInfo.matrix.Get(Drawing::Matrix::Index::PERSP_2)};
307     layer->SetMatrix(matrix);
308     layer->SetLayerSourceTuning(params.GetLayerSourceTuning());
309     layer->SetClearCacheSet(params.GetBufferClearCacheSet());
310     layer->SetLayerArsr(layerInfo.arsrTag);
311     return layer;
312 }
313 
ProcessLayerSetCropRect(LayerInfoPtr & layerInfoPtr,RSLayerInfo & layerInfo,sptr<SurfaceBuffer> buffer)314 void RSUniRenderProcessor::ProcessLayerSetCropRect(LayerInfoPtr& layerInfoPtr, RSLayerInfo& layerInfo,
315     sptr<SurfaceBuffer> buffer)
316 {
317     auto adaptedSrcRect = layerInfo.srcRect;
318     // Because the buffer is mirrored in the horiziontal/vertical directions,
319     // srcRect need to be adjusted.
320     switch (layerInfo.transformType) {
321         case GraphicTransformType::GRAPHIC_FLIP_H: [[fallthrough]];
322         case GraphicTransformType::GRAPHIC_FLIP_H_ROT180: {
323             // 1. Intersect the left border of the screen.
324             // map_x = (buffer_width - buffer_right_x)
325             if (adaptedSrcRect.x > 0) {
326                 adaptedSrcRect.x = buffer->GetSurfaceBufferWidth() - adaptedSrcRect.x - adaptedSrcRect.w;
327             } else if (layerInfo.dstRect.x + layerInfo.dstRect.w >= static_cast<int32_t>(screenInfo_.width)) {
328                 // 2. Intersect the right border of the screen.
329                 // map_x = (buffer_width - buffer_right_x)
330                 // Only left side adjustment can be triggerred on the narrow screen.
331                 adaptedSrcRect.x =
332                     buffer ? (static_cast<int32_t>(buffer->GetSurfaceBufferWidth()) - adaptedSrcRect.w) : 0;
333             }
334             break;
335         }
336         case GraphicTransformType::GRAPHIC_FLIP_V: [[fallthrough]];
337         case GraphicTransformType::GRAPHIC_FLIP_V_ROT180: {
338             // The processing in the vertical direction is similar to that in the horizontal direction.
339             if (adaptedSrcRect.y > 0) {
340                 adaptedSrcRect.y = buffer->GetSurfaceBufferHeight() - adaptedSrcRect.y - adaptedSrcRect.h;
341             } else if (layerInfo.dstRect.y + layerInfo.dstRect.h >= static_cast<int32_t>(screenInfo_.height)) {
342                 adaptedSrcRect.y =
343                     buffer ? (static_cast<int32_t>(buffer->GetSurfaceBufferHeight()) - adaptedSrcRect.h) : 0;
344             }
345             break;
346         }
347         default:
348             break;
349     }
350     layerInfoPtr->SetCropRect(adaptedSrcRect);
351 }
352 
ProcessSurface(RSSurfaceRenderNode & node)353 void RSUniRenderProcessor::ProcessSurface(RSSurfaceRenderNode &node)
354 {
355     RS_LOGE("It is update to DrawableV2 to process node now!!");
356 }
357 
ProcessSurfaceForRenderThread(DrawableV2::RSSurfaceRenderNodeDrawable & surfaceDrawable)358 void RSUniRenderProcessor::ProcessSurfaceForRenderThread(DrawableV2::RSSurfaceRenderNodeDrawable& surfaceDrawable)
359 {
360     auto layer = uniComposerAdapter_->CreateLayer(surfaceDrawable);
361     if (layer == nullptr) {
362         RS_LOGE("RSUniRenderProcessor::ProcessSurface: failed to createLayer for node(id: %{public}" PRIu64 ")",
363             surfaceDrawable.GetId());
364         return;
365     }
366     layers_.emplace_back(layer);
367 }
368 
ProcessDisplaySurface(RSDisplayRenderNode & node)369 void RSUniRenderProcessor::ProcessDisplaySurface(RSDisplayRenderNode& node)
370 {
371     auto layer = uniComposerAdapter_->CreateLayer(node);
372     if (layer == nullptr) {
373         RS_LOGE("RSUniRenderProcessor::ProcessDisplaySurface: failed to createLayer for node(id: %{public}" PRIu64 ")",
374             node.GetId());
375         return;
376     }
377     if (node.GetFingerprint()) {
378         layer->SetLayerMaskInfo(HdiLayerInfo::LayerMask::LAYER_MASK_HBM_SYNC);
379         RS_LOGD("RSUniRenderProcessor::ProcessDisplaySurface, set layer mask hbm sync");
380     } else {
381         layer->SetLayerMaskInfo(HdiLayerInfo::LayerMask::LAYER_MASK_NORMAL);
382     }
383     layers_.emplace_back(layer);
384     layerNum_ = node.GetSurfaceCountForMultiLayersPerf();
385     auto drawable = node.GetRenderDrawable();
386     if (!drawable) {
387         return;
388     }
389     auto displayDrawable = std::static_pointer_cast<DrawableV2::RSDisplayRenderNodeDrawable>(drawable);
390     auto surfaceHandler = displayDrawable->GetRSSurfaceHandlerOnDraw();
391     RSUniRenderThread::Instance().SetAcquireFence(surfaceHandler->GetAcquireFence());
392 }
393 
ProcessDisplaySurfaceForRenderThread(DrawableV2::RSDisplayRenderNodeDrawable & displayDrawable)394 void RSUniRenderProcessor::ProcessDisplaySurfaceForRenderThread(
395     DrawableV2::RSDisplayRenderNodeDrawable& displayDrawable)
396 {
397     auto layer = uniComposerAdapter_->CreateLayer(displayDrawable);
398     if (layer == nullptr) {
399         RS_LOGE("RSUniRenderProcessor::ProcessDisplaySurface: failed to createLayer for node(id: %{public}" PRIu64 ")",
400             displayDrawable.GetId());
401         return;
402     }
403     auto& params = displayDrawable.GetRenderParams();
404     if (!params) {
405         return;
406     }
407     if (params->GetFingerprint()) {
408         layer->SetLayerMaskInfo(HdiLayerInfo::LayerMask::LAYER_MASK_HBM_SYNC);
409         RS_LOGD("RSUniRenderProcessor::ProcessDisplaySurface, set layer mask hbm sync");
410     } else {
411         layer->SetLayerMaskInfo(HdiLayerInfo::LayerMask::LAYER_MASK_NORMAL);
412     }
413     layers_.emplace_back(layer);
414     auto displayParams = static_cast<RSDisplayRenderParams*>(params.get());
415     for (const auto& drawable : displayParams->GetAllMainAndLeashSurfaceDrawables()) {
416         auto surfaceDrawable = std::static_pointer_cast<DrawableV2::RSSurfaceRenderNodeDrawable>(drawable);
417         if (!surfaceDrawable || !surfaceDrawable->GetRenderParams() ||
418             !surfaceDrawable->GetRenderParams()->GetOcclusionVisible() ||
419             surfaceDrawable->GetRenderParams()->IsLeashWindow()) {
420             continue;
421         }
422         layerNum_++;
423     }
424     auto surfaceHandler = displayDrawable.GetRSSurfaceHandlerOnDraw();
425     if (!surfaceHandler) {
426         return;
427     }
428     RSUniRenderThread::Instance().SetAcquireFence(surfaceHandler->GetAcquireFence());
429 }
430 
ProcessRcdSurface(RSRcdSurfaceRenderNode & node)431 void RSUniRenderProcessor::ProcessRcdSurface(RSRcdSurfaceRenderNode& node)
432 {
433     auto layer = uniComposerAdapter_->CreateLayer(node);
434     if (layer == nullptr) {
435         RS_LOGE("RSUniRenderProcessor::ProcessRcdSurface: failed to createLayer for node(id: %{public}" PRIu64 ")",
436             node.GetId());
437         return;
438     }
439     layers_.emplace_back(layer);
440 }
441 
442 #ifdef OHOS_BUILD_ENABLE_MAGICCURSOR
GetLayers() const443 std::vector<LayerInfoPtr> RSUniRenderProcessor::GetLayers() const
444 {
445     return layers_;
446 }
447 #endif
448 } // namespace Rosen
449 } // namespace OHOS
450