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