• 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 <parameters.h>
19 #include <vector>
20 
21 #include "hdi_layer.h"
22 #include "hdi_layer_info.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_common_hook.h"
29 #include "common/rs_optional_trace.h"
30 #include "dirty_region/rs_gpu_dirty_collector.h"
31 #include "display_engine/rs_luminance_control.h"
32 #include "drawable/rs_screen_render_node_drawable.h"
33 #include "drawable/rs_surface_render_node_drawable.h"
34 #include "feature/dirty/rs_uni_dirty_compute_util.h"
35 #include "params/rs_screen_render_params.h"
36 #include "params/rs_surface_render_params.h"
37 #include "feature/round_corner_display/rs_rcd_surface_render_node.h"
38 #include "feature/round_corner_display/rs_rcd_surface_render_node_drawable.h"
39 #include "feature/anco_manager/rs_anco_manager.h"
40 #include "platform/common/rs_log.h"
41 // hpae offline
42 #include "feature/hwc/hpae_offline/rs_hpae_offline_processor.h"
43 #include "feature/hwc/hpae_offline/rs_hpae_offline_util.h"
44 
45 namespace OHOS {
46 namespace Rosen {
47 constexpr std::chrono::milliseconds HPAE_OFFLINE_TIMEOUT{100};
RSUniRenderProcessor()48 RSUniRenderProcessor::RSUniRenderProcessor()
49     : uniComposerAdapter_(std::make_unique<RSUniRenderComposerAdapter>())
50 {
51 }
52 
~RSUniRenderProcessor()53 RSUniRenderProcessor::~RSUniRenderProcessor() noexcept
54 {
55 }
56 
Init(RSScreenRenderNode & node,int32_t offsetX,int32_t offsetY,ScreenId mirroredId,std::shared_ptr<RSBaseRenderEngine> renderEngine)57 bool RSUniRenderProcessor::Init(RSScreenRenderNode& node, int32_t offsetX, int32_t offsetY, ScreenId mirroredId,
58                                 std::shared_ptr<RSBaseRenderEngine> renderEngine)
59 {
60     if (!RSProcessor::Init(node, offsetX, offsetY, mirroredId, renderEngine)) {
61         return false;
62     }
63     // In uni render mode, we can handle screen rotation in the rendering process,
64     // so we do not need to handle rotation in composer adapter any more,
65     // just pass the buffer to composer straightly.
66     screenInfo_.rotation = ScreenRotation::ROTATION_0;
67     return uniComposerAdapter_->Init(screenInfo_, offsetX_, offsetY_);
68 }
69 
InitForRenderThread(DrawableV2::RSScreenRenderNodeDrawable & screenDrawable,std::shared_ptr<RSBaseRenderEngine> renderEngine)70 bool RSUniRenderProcessor::InitForRenderThread(DrawableV2::RSScreenRenderNodeDrawable& screenDrawable,
71     std::shared_ptr<RSBaseRenderEngine> renderEngine)
72 {
73     if (!RSProcessor::InitForRenderThread(screenDrawable, renderEngine)) {
74         return false;
75     }
76     // In uni render mode, we can handle screen rotation in the rendering process,
77     // so we do not need to handle rotation in composer adapter any more,
78     // just pass the buffer to composer straightly.
79     screenInfo_.rotation = ScreenRotation::ROTATION_0;
80     return uniComposerAdapter_->Init(screenInfo_, offsetX_, offsetY_);
81 }
82 
UpdateMirrorInfo(DrawableV2::RSLogicalDisplayRenderNodeDrawable & displayDrawable)83 bool RSUniRenderProcessor::UpdateMirrorInfo(DrawableV2::RSLogicalDisplayRenderNodeDrawable& displayDrawable)
84 {
85     if (!RSProcessor::UpdateMirrorInfo(displayDrawable)) {
86         return false;
87     }
88     return uniComposerAdapter_->UpdateMirrorInfo(mirrorAdaptiveCoefficient_);
89 }
90 
PostProcess()91 void RSUniRenderProcessor::PostProcess()
92 {
93     uniComposerAdapter_->CommitLayers(layers_);
94     RS_LOGD("RSUniRenderProcessor::PostProcess layers_:%{public}zu", layers_.size());
95 }
96 
CreateLayer(const RSSurfaceRenderNode & node,RSSurfaceRenderParams & params)97 void RSUniRenderProcessor::CreateLayer(const RSSurfaceRenderNode& node, RSSurfaceRenderParams& params)
98 {
99     auto surfaceHandler = node.GetRSSurfaceHandler();
100     auto buffer = surfaceHandler->GetBuffer();
101     if (buffer == nullptr || surfaceHandler->GetConsumer() == nullptr) {
102         return;
103     }
104     auto& layerInfo = params.GetLayerInfo();
105     const Rect& dirtyRect = params.GetBufferDamage();
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     auto& layerRect = layer->GetLayerSize();
117     auto& cropRect = layer->GetCropRect();
118     RS_OPTIONAL_TRACE_NAME_FMT(
119         "CreateLayer name:%s ScreenId:%llu zorder:%d layerRect:[%d, %d, %d, %d] cropRect:[%d, %d, %d, %d]"
120         "dirty:[%d, %d, %d, %d] buffer:[%d, %d] alpha:[%f] type:[%d] transform:[%d]",
121         node.GetName().c_str(), screenInfo_.id, layerInfo.zOrder,
122         layerRect.x, layerRect.y, layerRect.w, layerRect.h,
123         cropRect.x, cropRect.y, cropRect.w, cropRect.h,
124         dirtyRect.x, dirtyRect.y, dirtyRect.w, dirtyRect.h, buffer->GetSurfaceBufferWidth(),
125         buffer->GetSurfaceBufferHeight(), layerInfo.alpha, layerInfo.layerType, layer->GetTransformType());
126     RS_LOGD_IF(DEBUG_PIPELINE,
127         "CreateLayer name:%{public}s ScreenId:%{public}" PRIu64 " zorder:%{public}d layerRect:[%{public}d, %{public}d, "
128         "%{public}d, %{public}d] cropRect:[%{public}d, %{public}d, %{public}d, %{public}d] "
129         "drity:[%{public}d, %{public}d, %{public}d, %{public}d] "
130         "buffer:[%{public}d, %{public}d] alpha:[%{public}f] transform:[%{public}d]",
131         node.GetName().c_str(), screenInfo_.id, layerInfo.zOrder, layerRect.x, layerRect.y, layerRect.w, layerRect.h,
132         cropRect.x, cropRect.y, cropRect.w, cropRect.h,
133         dirtyRect.x, dirtyRect.y, dirtyRect.w, dirtyRect.h, buffer->GetSurfaceBufferWidth(),
134         buffer->GetSurfaceBufferHeight(), layerInfo.alpha, layer->GetTransformType());
135     layers_.emplace_back(layer);
136     params.SetLayerCreated(true);
137 }
138 
CreateLayerForRenderThread(DrawableV2::RSSurfaceRenderNodeDrawable & surfaceDrawable)139 void RSUniRenderProcessor::CreateLayerForRenderThread(DrawableV2::RSSurfaceRenderNodeDrawable& surfaceDrawable)
140 {
141     auto& paramsSp = surfaceDrawable.GetRenderParams();
142     if (!paramsSp) {
143         return;
144     }
145     auto& params = *(static_cast<RSSurfaceRenderParams*>(paramsSp.get()));
146     auto buffer = params.GetBuffer();
147     if (buffer == nullptr) {
148         return;
149     }
150     auto& layerInfo = params.GetLayerInfo();
151     const Rect& dirtyRect = params.GetBufferDamage();
152     RS_OPTIONAL_TRACE_NAME_FMT(
153         "CreateLayer name:%s zorder:%d src:[%d, %d, %d, %d] dst:[%d, %d, %d, %d] dirty:[%d, %d, %d, %d] "
154         "buffer:[%d, %d] alpha:[%f] type:[%d]",
155         surfaceDrawable.GetName().c_str(), layerInfo.zOrder,
156         layerInfo.srcRect.x, layerInfo.srcRect.y, layerInfo.srcRect.w, layerInfo.srcRect.h,
157         layerInfo.dstRect.x, layerInfo.dstRect.y, layerInfo.dstRect.w, layerInfo.dstRect.h,
158         dirtyRect.x, dirtyRect.y, dirtyRect.w, dirtyRect.h,
159         buffer->GetSurfaceBufferWidth(), buffer->GetSurfaceBufferHeight(), layerInfo.alpha, layerInfo.layerType);
160     RS_LOGD("CreateLayer name:%{public}s zorder:%{public}d src:[%{public}d, %{public}d, %{public}d, %{public}d] "
161             "dst:[%{public}d, %{public}d, %{public}d, %{public}d] "
162             "drity:[%{public}d, %{public}d, %{public}d, %{public}d] "
163             "buffer:[%{public}d, %{public}d] alpha:[%{public}f] type:%{public}d]",
164         surfaceDrawable.GetName().c_str(), layerInfo.zOrder,
165         layerInfo.srcRect.x, layerInfo.srcRect.y, layerInfo.srcRect.w, layerInfo.srcRect.h,
166         layerInfo.dstRect.x, layerInfo.dstRect.y, layerInfo.dstRect.w, layerInfo.dstRect.h,
167         dirtyRect.x, dirtyRect.y, dirtyRect.w, dirtyRect.h,
168         buffer->GetSurfaceBufferWidth(), buffer->GetSurfaceBufferHeight(), layerInfo.alpha, layerInfo.layerType);
169     auto preBuffer = params.GetPreBuffer();
170     LayerInfoPtr layer = GetLayerInfo(static_cast<RSSurfaceRenderParams&>(params), buffer, preBuffer,
171         surfaceDrawable.GetConsumerOnDraw(), params.GetAcquireFence());
172     layer->SetNodeId(surfaceDrawable.GetId());
173     auto& renderParams = static_cast<RSSurfaceRenderParams&>(params);
174     layer->SetSdrNit(renderParams.GetSdrNit());
175     layer->SetDisplayNit(renderParams.GetDisplayNit());
176     layer->SetBrightnessRatio(renderParams.GetBrightnessRatio());
177     layer->SetLayerLinearMatrix(renderParams.GetLayerLinearMatrix());
178     uniComposerAdapter_->SetMetaDataInfoToLayer(layer, params.GetBuffer(), surfaceDrawable.GetConsumerOnDraw());
179     CreateSolidColorLayer(layer, params);
180     layers_.emplace_back(layer);
181     params.SetLayerCreated(true);
182 }
183 
CreateSolidColorLayer(LayerInfoPtr layer,RSSurfaceRenderParams & params)184 void RSUniRenderProcessor::CreateSolidColorLayer(LayerInfoPtr layer, RSSurfaceRenderParams& params)
185 {
186     // color can be APP Node color or XCOM color
187     auto color = params.GetSolidLayerColor();
188     if (!params.GetIsHwcEnabledBySolidLayer()) {
189         auto solidColorLayer = HdiLayerInfo::CreateHdiLayerInfo();
190         solidColorLayer->CopyLayerInfo(layer);
191         if (layer->GetZorder() > 0) {
192             solidColorLayer->SetZorder(layer->GetZorder() - 1);
193         } else {
194             RS_LOGW("CreateSolidColorLayer name:%{public}s Zorder error!", params.GetName().c_str());
195         }
196         solidColorLayer->SetTransform(GraphicTransformType::GRAPHIC_ROTATE_NONE);
197         auto dstRect = params.layerInfo_.dstRect;
198         GraphicIRect layerRect = {dstRect.x, dstRect.y, dstRect.w, dstRect.h};
199         RS_OPTIONAL_TRACE_NAME_FMT("CreateSolidColorLayer name:%s id:%" PRIu64 " dst:[%d, %d, %d, %d] color:%08x",
200             params.GetName().c_str(), params.GetId(), dstRect.x, dstRect.y, dstRect.w, dstRect.h, color.AsArgbInt());
201         solidColorLayer->SetLayerSize(layerRect);
202         solidColorLayer->SetCompositionType(GraphicCompositionType::GRAPHIC_COMPOSITION_SOLID_COLOR);
203         solidColorLayer->SetLayerColor({color.GetRed(), color.GetGreen(), color.GetBlue(), color.GetAlpha()});
204         solidColorLayer->SetSurface({});
205         solidColorLayer->SetBuffer({}, {});
206         solidColorLayer->SetPreBuffer({});
207         solidColorLayer->SetMetaData({});
208         layers_.emplace_back(solidColorLayer);
209     }
210 }
211 
GetForceClientForDRM(RSSurfaceRenderParams & params)212 bool RSUniRenderProcessor::GetForceClientForDRM(RSSurfaceRenderParams& params)
213 {
214     if (params.GetSpecialLayerMgr().Find(SpecialLayerType::PROTECTED) == false) {
215         return false;
216     }
217     if (params.GetAnimateState() == true ||
218         RSUniRenderUtil::GetRotationDegreeFromMatrix(params.GetTotalMatrix()) % RS_ROTATION_90 != 0) {
219         return true;
220     }
221     if (!params.GetCornerRadiusInfoForDRM().empty()) {
222         return true;
223     }
224     if (params.GetIsOutOfScreen() == true) {
225         return true;
226     }
227     bool forceClientForDRM = false;
228     auto ancestorDisplayDrawable =
229         std::static_pointer_cast<DrawableV2::RSScreenRenderNodeDrawable>(params.GetAncestorScreenDrawable().lock());
230     auto& uniParam = RSUniRenderThread::Instance().GetRSRenderThreadParams();
231     if (ancestorDisplayDrawable == nullptr || ancestorDisplayDrawable->GetRenderParams() == nullptr ||
232         uniParam == nullptr) {
233         RS_LOGE("%{public}s ancestorDisplayDrawable/ancestorDisplayDrawableParams/uniParam is nullptr", __func__);
234         return false;
235     } else {
236         auto screenParams = static_cast<RSScreenRenderParams*>(ancestorDisplayDrawable->GetRenderParams().get());
237         forceClientForDRM = screenParams->IsRotationChanged() || uniParam->GetCacheEnabledForRotation();
238     }
239     return forceClientForDRM;
240 }
241 
GetLayerInfo(RSSurfaceRenderParams & params,sptr<SurfaceBuffer> & buffer,sptr<SurfaceBuffer> & preBuffer,const sptr<IConsumerSurface> & consumer,const sptr<SyncFence> & acquireFence)242 LayerInfoPtr RSUniRenderProcessor::GetLayerInfo(RSSurfaceRenderParams& params, sptr<SurfaceBuffer>& buffer,
243     sptr<SurfaceBuffer>& preBuffer, const sptr<IConsumerSurface>& consumer, const sptr<SyncFence>& acquireFence)
244 {
245     LayerInfoPtr layer = HdiLayerInfo::CreateHdiLayerInfo();
246     auto layerInfo = params.layerInfo_;
247     if (params.GetHwcGlobalPositionEnabled()) {
248         // dst and matrix transform to screen position
249         layerInfo.matrix.PostTranslate(-offsetX_, -offsetY_);
250         layerInfo.dstRect.x -= offsetX_;
251         layerInfo.dstRect.y -= offsetY_;
252     }
253     if (params.GetSpecialLayerMgr().Find(SpecialLayerType::PROTECTED)) {
254         ScaleLayerIfNeeded(layerInfo);
255     }
256     layer->SetNeedBilinearInterpolation(params.NeedBilinearInterpolation());
257     layer->SetSurface(consumer);
258     layer->SetBuffer(buffer, acquireFence);
259     layer->SetPreBuffer(preBuffer);
260     params.SetPreBuffer(nullptr);
261     layer->SetZorder(layerInfo.zOrder);
262     if (params.GetTunnelLayerId()) {
263         RS_TRACE_NAME_FMT("%s lpp set tunnel layer type", __func__);
264         layerInfo.layerType = GraphicLayerType::GRAPHIC_LAYER_TYPE_TUNNEL;
265     }
266     layer->SetType(layerInfo.layerType);
267     layer->SetRotationFixed(params.GetFixRotationByUser());
268 
269     GraphicLayerAlpha alpha;
270     alpha.enGlobalAlpha = true;
271     // Alpha of 255 indicates opacity
272     alpha.gAlpha = static_cast<uint8_t>(std::clamp(layerInfo.alpha, 0.0f, 1.0f) * RGBA_MAX);
273     layer->SetAlpha(alpha);
274     GraphicIRect dstRect = layerInfo.dstRect;
275     if (layerInfo.layerType == GraphicLayerType::GRAPHIC_LAYER_TYPE_CURSOR &&
276         ((layerInfo.dstRect.w != layerInfo.srcRect.w) || (layerInfo.dstRect.h != layerInfo.srcRect.h))) {
277         dstRect = {layerInfo.dstRect.x, layerInfo.dstRect.y, layerInfo.srcRect.w, layerInfo.srcRect.h};
278     }
279     layer->SetLayerSize(dstRect);
280     layer->SetBoundSize(layerInfo.boundRect);
281     bool forceClientForDRM = GetForceClientForDRM(params);
282     RS_OPTIONAL_TRACE_NAME_FMT("%s nodeName[%s] forceClientForDRM[%d]",
283         __func__, params.GetName().c_str(), forceClientForDRM);
284     RS_LOGD("%{public}s nodeName[%{public}s] forceClientForDRM[%{public}d]",
285         __func__, params.GetName().c_str(), forceClientForDRM);
286     bool forceClient = RSSystemProperties::IsForceClient() || forceClientForDRM;
287     layer->SetCompositionType(forceClient ? GraphicCompositionType::GRAPHIC_COMPOSITION_CLIENT :
288         GraphicCompositionType::GRAPHIC_COMPOSITION_DEVICE);
289     layer->SetCornerRadiusInfoForDRM(params.GetCornerRadiusInfoForDRM());
290     auto bufferBackgroundColor = params.GetBackgroundColor();
291     GraphicLayerColor backgroundColor = {
292         .r = bufferBackgroundColor.GetRed(),
293         .g = bufferBackgroundColor.GetGreen(),
294         .b = bufferBackgroundColor.GetBlue(),
295         .a = bufferBackgroundColor.GetAlpha()
296     };
297     layer->SetBackgroundColor(backgroundColor);
298 
299     std::vector<GraphicIRect> visibleRegions;
300     visibleRegions.emplace_back(layerInfo.dstRect);
301     layer->SetVisibleRegions(visibleRegions);
302     std::vector<GraphicIRect> dirtyRegions;
303     if (RSSystemProperties::GetHwcDirtyRegionEnabled()) {
304         const auto& bufferDamage = params.GetBufferDamage();
305         Rect selfDrawingDirtyRect = bufferDamage;
306         // When the size of the damage region equals that of the buffer, use dirty region from gpu crc
307         bool isUseSelfDrawingDirtyRegion = buffer != nullptr && buffer->GetSurfaceBufferWidth() == bufferDamage.w &&
308             buffer->GetSurfaceBufferHeight() == bufferDamage.h && bufferDamage.x == 0 && bufferDamage.y == 0;
309         bool isSelfDrawingDirtyRegionValid = false;
310         if (isUseSelfDrawingDirtyRegion) {
311             isSelfDrawingDirtyRegionValid = RSGpuDirtyCollector::DirtyRegionCompute(buffer, selfDrawingDirtyRect);
312         }
313         if (isSelfDrawingDirtyRegionValid) {
314             RS_OPTIONAL_TRACE_NAME_FMT("selfDrawingDirtyRect:[%d, %d, %d, %d]",
315                 selfDrawingDirtyRect.x, selfDrawingDirtyRect.y, selfDrawingDirtyRect.w, selfDrawingDirtyRect.h);
316         }
317         bool isTargetedHwcDirtyRegion = params.GetIsBufferFlushed() ||
318             RsCommonHook::Instance().GetHardwareEnabledByHwcnodeBelowSelfInAppFlag();
319         GraphicIRect dirtyRect = isTargetedHwcDirtyRegion ? GraphicIRect { selfDrawingDirtyRect.x,
320             selfDrawingDirtyRect.y, selfDrawingDirtyRect.w, selfDrawingDirtyRect.h } : GraphicIRect { 0, 0, 0, 0 };
321         auto intersectRect = RSUniDirtyComputeUtil::IntersectRect(layerInfo.srcRect, dirtyRect);
322         RS_OPTIONAL_TRACE_NAME_FMT("intersectRect:[%d, %d, %d, %d]",
323             intersectRect.x, intersectRect.y, intersectRect.w, intersectRect.h);
324         dirtyRegions.emplace_back(intersectRect);
325     } else {
326         dirtyRegions.emplace_back(layerInfo.srcRect);
327     }
328     layer->SetDirtyRegions(dirtyRegions);
329 
330     layer->SetBlendType(layerInfo.blendType);
331     layer->SetAncoFlags(layerInfo.ancoFlags);
332     RSAncoManager::UpdateLayerSrcRectForAnco(layerInfo.ancoFlags, layerInfo.ancoCropRect, layerInfo.srcRect);
333     layer->SetCropRect(layerInfo.srcRect);
334     layer->SetGravity(layerInfo.gravity);
335     layer->SetTransform(layerInfo.transformType);
336     if (layerInfo.layerType == GraphicLayerType::GRAPHIC_LAYER_TYPE_CURSOR) {
337         layer->SetTransform(GraphicTransformType::GRAPHIC_ROTATE_NONE);
338         // Set the highest z-order for hardCursor
339         layer->SetZorder(static_cast<int32_t>(TopLayerZOrder::POINTER_WINDOW));
340     }
341     auto matrix = GraphicMatrix {layerInfo.matrix.Get(Drawing::Matrix::Index::SCALE_X),
342         layerInfo.matrix.Get(Drawing::Matrix::Index::SKEW_X), layerInfo.matrix.Get(Drawing::Matrix::Index::TRANS_X),
343         layerInfo.matrix.Get(Drawing::Matrix::Index::SKEW_Y), layerInfo.matrix.Get(Drawing::Matrix::Index::SCALE_Y),
344         layerInfo.matrix.Get(Drawing::Matrix::Index::TRANS_Y), layerInfo.matrix.Get(Drawing::Matrix::Index::PERSP_0),
345         layerInfo.matrix.Get(Drawing::Matrix::Index::PERSP_1), layerInfo.matrix.Get(Drawing::Matrix::Index::PERSP_2)};
346     layer->SetMatrix(matrix);
347     layer->SetLayerSourceTuning(params.GetLayerSourceTuning());
348     layer->SetLayerArsr(layerInfo.arsrTag);
349     layer->SetLayerCopybit(layerInfo.copybitTag);
350     HandleTunnelLayerParameters(params, layer);
351     return layer;
352 }
353 
ScaleLayerIfNeeded(RSLayerInfo & layerInfo)354 void RSUniRenderProcessor::ScaleLayerIfNeeded(RSLayerInfo& layerInfo)
355 {
356     // dstRect transforms to physical screen
357     if (!screenInfo_.isSamplingOn) {
358         return;
359     }
360     Drawing::Matrix matrix;
361     matrix.PostTranslate(screenInfo_.samplingTranslateX, screenInfo_.samplingTranslateY);
362     matrix.PostScale(screenInfo_.samplingScale, screenInfo_.samplingScale);
363     Drawing::Rect dstRect = { layerInfo.dstRect.x, layerInfo.dstRect.y, layerInfo.dstRect.x + layerInfo.dstRect.w,
364         layerInfo.dstRect.y + layerInfo.dstRect.h };
365     matrix.MapRect(dstRect, dstRect);
366     layerInfo.dstRect.x = static_cast<int>(std::floor(dstRect.left_));
367     layerInfo.dstRect.y = static_cast<int>(std::floor(dstRect.top_));
368     layerInfo.dstRect.w = static_cast<int>(std::ceil(dstRect.right_ - dstRect.left_));
369     layerInfo.dstRect.h = static_cast<int>(std::ceil(dstRect.bottom_ - dstRect.top_));
370 }
371 
ProcessOfflineLayer(std::shared_ptr<DrawableV2::RSSurfaceRenderNodeDrawable> & surfaceDrawable,bool async)372 bool RSUniRenderProcessor::ProcessOfflineLayer(
373     std::shared_ptr<DrawableV2::RSSurfaceRenderNodeDrawable>& surfaceDrawable, bool async)
374 {
375     RS_OFFLINE_LOGD("ProcessOfflineLayer(drawable)");
376     uint64_t taskId = RSUniRenderThread::Instance().GetVsyncId();
377     if (!async) {
378         if (!RSHpaeOfflineProcessor::GetOfflineProcessor().PostProcessOfflineTask(surfaceDrawable, taskId)) {
379             RS_LOGW("RSUniRenderProcessor::ProcessOfflineLayer: post offline task failed, go redraw");
380             return false;
381         }
382     }
383     ProcessOfflineResult processOfflineResult;
384     bool waitSuccess = RSHpaeOfflineProcessor::GetOfflineProcessor().WaitForProcessOfflineResult(
385         taskId, HPAE_OFFLINE_TIMEOUT, processOfflineResult);
386     if (waitSuccess && processOfflineResult.taskSuccess) {
387         auto layer = uniComposerAdapter_->CreateOfflineLayer(*surfaceDrawable, processOfflineResult);
388         if (layer == nullptr) {
389             RS_LOGE("RSUniRenderProcessor::ProcessOfflineLayer: failed to createLayer for node: %{public}" PRIu64 ")",
390                 surfaceDrawable->GetId());
391             return false;
392         }
393         layers_.emplace_back(layer);
394         return true;
395     } else {
396         RS_LOGE("offline processor process failed!");
397         return false;
398     }
399 }
400 
ProcessOfflineLayer(std::shared_ptr<RSSurfaceRenderNode> & node)401 bool RSUniRenderProcessor::ProcessOfflineLayer(std::shared_ptr<RSSurfaceRenderNode>& node)
402 {
403     RS_OFFLINE_LOGD("ProcessOfflineLayer(node)");
404     uint64_t taskId = RSUniRenderThread::Instance().GetVsyncId();
405     if (!RSHpaeOfflineProcessor::GetOfflineProcessor().PostProcessOfflineTask(node, taskId)) {
406         RS_LOGW("RSUniRenderProcessor::ProcessOfflineLayer: post offline task failed, go redraw");
407         return false;
408     }
409     ProcessOfflineResult processOfflineResult;
410     bool waitSuccess = RSHpaeOfflineProcessor::GetOfflineProcessor().WaitForProcessOfflineResult(
411         taskId, HPAE_OFFLINE_TIMEOUT, processOfflineResult);
412     if (waitSuccess && processOfflineResult.taskSuccess) {
413         auto layer = uniComposerAdapter_->CreateOfflineLayer(*node, processOfflineResult);
414         if (layer == nullptr) {
415             RS_LOGE("RSUniRenderProcessor::ProcessOfflineLayer: failed to createLayer for node: %{public}" PRIu64 ")",
416                 node->GetId());
417             return false;
418         }
419         layers_.emplace_back(layer);
420         return true;
421     } else {
422         RS_LOGE("offline processor process failed!");
423         return false;
424     }
425 }
426 
ProcessSurface(RSSurfaceRenderNode & node)427 void RSUniRenderProcessor::ProcessSurface(RSSurfaceRenderNode &node)
428 {
429     RS_LOGE("It is update to DrawableV2 to process node now!!");
430 }
431 
ProcessScreenSurface(RSScreenRenderNode & node)432 void RSUniRenderProcessor::ProcessScreenSurface(RSScreenRenderNode& node)
433 {
434     auto layer = uniComposerAdapter_->CreateLayer(node);
435     if (layer == nullptr) {
436         RS_LOGE("RSUniRenderProcessor::ProcessScreenSurface: failed to createLayer for node(id: %{public}" PRIu64 ")",
437             node.GetId());
438         return;
439     }
440     if (node.GetFingerprint()) {
441         layer->SetLayerMaskInfo(HdiLayerInfo::LayerMask::LAYER_MASK_HBM_SYNC);
442         RS_LOGD("RSUniRenderProcessor::ProcessScreenSurface, set layer mask hbm sync");
443     } else {
444         layer->SetLayerMaskInfo(HdiLayerInfo::LayerMask::LAYER_MASK_NORMAL);
445     }
446     layers_.emplace_back(layer);
447     auto drawable = node.GetRenderDrawable();
448     if (!drawable) {
449         return;
450     }
451     auto screenDrawable = std::static_pointer_cast<DrawableV2::RSScreenRenderNodeDrawable>(drawable);
452     auto surfaceHandler = screenDrawable->GetRSSurfaceHandlerOnDraw();
453     RSUniRenderThread::Instance().SetAcquireFence(surfaceHandler->GetAcquireFence());
454 }
455 
ProcessScreenSurfaceForRenderThread(DrawableV2::RSScreenRenderNodeDrawable & screenDrawable)456 void RSUniRenderProcessor::ProcessScreenSurfaceForRenderThread(
457     DrawableV2::RSScreenRenderNodeDrawable& screenDrawable)
458 {
459     auto layer = uniComposerAdapter_->CreateLayer(screenDrawable);
460     if (layer == nullptr) {
461         RS_LOGE("RSUniRenderProcessor::ProcessScreenSurface: failed to createLayer for node(id: %{public}" PRIu64 ")",
462             screenDrawable.GetId());
463         return;
464     }
465     auto& params = screenDrawable.GetRenderParams();
466     if (!params) {
467         return;
468     }
469     if (params->GetFingerprint()) {
470         layer->SetLayerMaskInfo(HdiLayerInfo::LayerMask::LAYER_MASK_HBM_SYNC);
471         RS_LOGD("RSUniRenderProcessor::ProcessScreenSurface, set layer mask hbm sync");
472     } else {
473         layer->SetLayerMaskInfo(HdiLayerInfo::LayerMask::LAYER_MASK_NORMAL);
474     }
475     layers_.emplace_back(layer);
476     auto surfaceHandler = screenDrawable.GetRSSurfaceHandlerOnDraw();
477     if (!surfaceHandler) {
478         return;
479     }
480     RSUniRenderThread::Instance().SetAcquireFence(surfaceHandler->GetAcquireFence());
481 }
482 
ProcessRcdSurface(RSRcdSurfaceRenderNode & node)483 void RSUniRenderProcessor::ProcessRcdSurface(RSRcdSurfaceRenderNode& node)
484 {
485     auto layer = uniComposerAdapter_->CreateLayer(node);
486     if (layer == nullptr) {
487         RS_LOGE("RSUniRenderProcessor::ProcessRcdSurface: failed to createLayer for node(id: %{public}" PRIu64 ")",
488             node.GetId());
489         return;
490     }
491     layers_.emplace_back(layer);
492 }
493 
ProcessRcdSurfaceForRenderThread(DrawableV2::RSRcdSurfaceRenderNodeDrawable & rcdDrawable)494 void RSUniRenderProcessor::ProcessRcdSurfaceForRenderThread(DrawableV2::RSRcdSurfaceRenderNodeDrawable &rcdDrawable)
495 {
496     auto layer = uniComposerAdapter_->CreateLayer(rcdDrawable);
497     if (layer == nullptr) {
498         RS_LOGE("RSUniRenderProcessor::ProcessRcdSurfaceForRenderThread: failed to createLayer for node(id: "
499                 "%{public}" PRIu64 ")",
500             rcdDrawable.GetId());
501         return;
502     }
503     layers_.emplace_back(layer);
504 }
505 
HandleTunnelLayerParameters(RSSurfaceRenderParams & params,LayerInfoPtr & layer)506 void RSUniRenderProcessor::HandleTunnelLayerParameters(RSSurfaceRenderParams& params, LayerInfoPtr& layer)
507 {
508     if (!layer || !params.GetTunnelLayerId()) {
509         return;
510     }
511     layer->SetTunnelLayerId(params.GetTunnelLayerId());
512     layer->SetTunnelLayerProperty(TunnelLayerProperty::TUNNEL_PROP_BUFFER_ADDR |
513         TunnelLayerProperty::TUNNEL_PROP_DEVICE_COMMIT);
514 }
515 
516 #ifdef OHOS_BUILD_ENABLE_MAGICCURSOR
GetLayers() const517 std::vector<LayerInfoPtr> RSUniRenderProcessor::GetLayers() const
518 {
519     return layers_;
520 }
521 #endif
522 } // namespace Rosen
523 } // namespace OHOS
524