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