OSDN Git Service

Avoid redundant test commits in case layer z-order has changed.
authorKalyan Kondapally <kalyan.kondapally@intel.com>
Tue, 15 May 2018 07:23:32 +0000 (00:23 -0700)
committerKalyan Kondapally <kalyan.kondapally@intel.com>
Tue, 15 May 2018 09:07:17 +0000 (02:07 -0700)
We can avoid redundant test commit in case previous layer is
GPU Composited. Instead, we can damage the display frame of
previous layer along with current layer damage to ensure
both regions are updated.

Jira: None.
Test: Launch different apps on Android and ensure no new rendering
      artifacts.

Signed-off-by: Kalyan Kondapally <kalyan.kondapally@intel.com>
common/core/overlaylayer.cpp

index a3ed665..aa0d0d6 100644 (file)
@@ -218,13 +218,25 @@ void OverlayLayer::InitializeState(HwcLayer* layer,
   source_crop_height_ = layer->GetSourceCropHeight();
   source_crop_ = layer->GetSourceCrop();
   blending_ = layer->GetBlending();
-  if (!layer->IsCursorLayer() && layer->HasZorderChanged() &&
-      (!previous_layer ||
-       (previous_layer && (previous_layer->z_order_ != z_order)))) {
-    state_ |= kLayerOrderChanged;
-  }
-
   surface_damage_ = layer->GetLayerDamage();
+  if (previous_layer && !layer->IsCursorLayer() && layer->HasZorderChanged()) {
+    if (previous_layer->actual_composition_ == kGpu) {
+      CalculateRect(previous_layer->display_frame_, surface_damage_);
+      bool force_partial_clear = true;
+      // We can skip Clear in case display frame, transforms are same.
+      if (previous_layer->display_frame_ == display_frame_ &&
+          transform_ == previous_layer->transform_ &&
+          plane_transform_ == previous_layer->plane_transform_) {
+        force_partial_clear = false;
+      }
+
+      if (force_partial_clear) {
+        state_ |= kForcePartialClear;
+      }
+    } else {
+      state_ |= kLayerOrderChanged;
+    }
+  }
 
   SetBuffer(layer->GetNativeHandle(), layer->GetAcquireFence(),
             resource_manager, true);