OSDN Git Service

Transform surface damage to global co-ordinates
authorHarish Krupo <harish.krupo.kps@intel.com>
Fri, 4 May 2018 17:22:56 +0000 (22:52 +0530)
committerKalyan Kondapally <kalyan.kondapally@intel.com>
Tue, 15 May 2018 05:35:20 +0000 (22:35 -0700)
Surface damage for a layer is set in the layer local
co-ordintates. The surface damage has to be converted to the
display global co-ordinates before assigning it to the
current_rendering_damage variable.

Jira: None
Test: With the surface damage work around removed the contents of
      weston terminal should be updated properly for each frame.

Signed-off-by: Harish Krupo <harish.krupo.kps@intel.com>
common/core/hwclayer.cpp
common/core/overlaylayer.cpp

index eef4a3f..0636fae 100644 (file)
@@ -220,11 +220,24 @@ void HwcLayer::Validate() {
     layer_cache_ &= ~kForceClear;
     layer_cache_ &= ~kDisplayFrameRectChanged;
     layer_cache_ &= ~kSourceRectChanged;
+
+    // From observation: In Android, when the source crop doesn't
+    // begin from (0, 0) the surface damage is already translated
+    // to global display co-ordinates
     if (!surface_damage_.empty() &&
-        (display_frame_width_ < DAMAGE_THRESHOLD &&
-         display_frame_height_ < DAMAGE_THRESHOLD)) {
-      layer_cache_ |= kForceClear;
-      current_rendering_damage_ = display_frame_;
+        ((source_crop_.left == 0) && (source_crop_.top == 0))) {
+      if (display_frame_width_ < DAMAGE_THRESHOLD &&
+          display_frame_height_ < DAMAGE_THRESHOLD) {
+        layer_cache_ |= kForceClear;
+        current_rendering_damage_ = display_frame_;
+      }
+      current_rendering_damage_.left =
+          surface_damage_.left + display_frame_.left;
+      current_rendering_damage_.top = surface_damage_.top + display_frame_.top;
+      current_rendering_damage_.right =
+          surface_damage_.right + display_frame_.left;
+      current_rendering_damage_.bottom =
+          surface_damage_.bottom + display_frame_.top;
     } else {
       current_rendering_damage_ = surface_damage_;
     }
index 5e8fcfa..0a57bec 100644 (file)
@@ -229,14 +229,6 @@ void OverlayLayer::InitializeState(HwcLayer* layer,
   }
 
   surface_damage_ = layer->GetLayerDamage();
-  // In case of layer using blending we need to force partial clear. Otherwise
-  // we see content not getting updated correctly. For example:
-  // on Android enable, settings put system user_rotation 1 and
-  // navigate to settings on Android.
-  if (((blending_ != HWCBlending::kBlendingNone) && !surface_damage_.empty())) {
-    state_ |= kForcePartialClear;
-    surface_damage_ = layer->GetDisplayFrame();
-  }
 
   SetBuffer(layer->GetNativeHandle(), layer->GetAcquireFence(),
             resource_manager, true);