OSDN Git Service

Dont reset Damage more than we should do.
authorKalyan Kondapally <kalyan.kondapally@intel.com>
Mon, 8 Jan 2018 04:14:02 +0000 (20:14 -0800)
committerKalyan Kondapally <kalyan.kondapally@intel.com>
Mon, 8 Jan 2018 04:21:13 +0000 (20:21 -0800)
Jira: None.
Test: Popups showup fine on Android.
Signed-off-by: Kalyan Kondapally <kalyan.kondapally@intel.com>
common/core/hwclayer.cpp
common/core/overlaylayer.cpp
public/hwclayer.h

index fae2ba6..7d82e1d 100644 (file)
@@ -107,8 +107,8 @@ void HwcLayer::SetSurfaceDamage(const HwcRegion& surface_damage) {
         (rect.right == 0)) {
       state_ &= ~kLayerContentChanged;
       state_ &= ~kSurfaceDamageChanged;
+      UpdateRenderingDamage(surface_damage_, rect, false);
       surface_damage_.reset();
-      current_rendering_damage_.reset();
       return;
     }
   } else if (rects == 0) {
@@ -119,7 +119,6 @@ void HwcLayer::SetSurfaceDamage(const HwcRegion& surface_damage) {
       (surface_damage_.top == rect.top) &&
       (surface_damage_.right == rect.right) &&
       (surface_damage_.bottom == rect.bottom)) {
-    UpdateRenderingDamage(surface_damage_, rect, true);
     return;
   }
 
@@ -147,6 +146,11 @@ void HwcLayer::SetVisibleRegion(const HwcRegion& visible_region) {
       (visible_rect_.top == new_visible_rect.top) &&
       (visible_rect_.right == new_visible_rect.right) &&
       (visible_rect_.bottom == new_visible_rect.bottom)) {
+    // If SurfaceDamage is not empty and Visible Rect is called,
+    // go ahead and mark this region as damaged. This happens in
+    // case of drop down menus etc.
+    if (!surface_damage_.empty())
+      UpdateRenderingDamage(visible_rect_, new_visible_rect, true);
     return;
   }
 
@@ -201,21 +205,7 @@ void HwcLayer::Validate() {
     layer_cache_ &= ~kLayerAttributesChanged;
     layer_cache_ &= ~kDisplayFrameRectChanged;
     layer_cache_ &= ~kSourceRectChanged;
-    if (!last_rendering_damage_.empty()) {
-      last_rendering_damage_.reset();
-    }
-
-    if (!previous_rendering_damage_.empty()) {
-      last_rendering_damage_ = previous_rendering_damage_;
-      previous_rendering_damage_.reset();
-    }
-
-    if (!current_rendering_damage_.empty()) {
-      previous_rendering_damage_ = current_rendering_damage_;
-    }
-
     current_rendering_damage_ = surface_damage_;
-    damage_validated_ = false;
   }
 
   if (left_constraint_.empty() && left_source_constraint_.empty())
@@ -343,7 +333,6 @@ bool HwcLayer::IsCursorLayer() const {
 void HwcLayer::UpdateRenderingDamage(const HwcRect<int>& old_rect,
                                      const HwcRect<int>& newrect,
                                      bool same_rect) {
-  damage_validated_ = false;
   if (current_rendering_damage_.empty()) {
     current_rendering_damage_ = old_rect;
   } else {
@@ -370,53 +359,7 @@ void HwcLayer::UpdateRenderingDamage(const HwcRect<int>& old_rect,
       std::max(current_rendering_damage_.bottom, newrect.bottom);
 }
 
-const HwcRect<int>& HwcLayer::ValidateDamage() {
-  if (damage_validated_) {
-    return current_rendering_damage_;
-  }
-
-  damage_validated_ = true;
-  if (current_rendering_damage_.empty()) {
-    current_rendering_damage_ = previous_rendering_damage_;
-
-    if (current_rendering_damage_.empty()) {
-      current_rendering_damage_ = last_rendering_damage_;
-    } else {
-      current_rendering_damage_.left =
-          std::min(current_rendering_damage_.left, last_rendering_damage_.left);
-      current_rendering_damage_.top =
-          std::min(current_rendering_damage_.top, last_rendering_damage_.top);
-      current_rendering_damage_.right = std::max(
-          current_rendering_damage_.right, last_rendering_damage_.right);
-      current_rendering_damage_.bottom = std::max(
-          current_rendering_damage_.bottom, last_rendering_damage_.bottom);
-    }
-
-    return current_rendering_damage_;
-  }
-
-  if (!previous_rendering_damage_.empty()) {
-    current_rendering_damage_.left = std::min(current_rendering_damage_.left,
-                                              previous_rendering_damage_.left);
-    current_rendering_damage_.top =
-        std::min(current_rendering_damage_.top, previous_rendering_damage_.top);
-    current_rendering_damage_.right = std::max(
-        current_rendering_damage_.right, previous_rendering_damage_.right);
-    current_rendering_damage_.bottom = std::max(
-        current_rendering_damage_.bottom, previous_rendering_damage_.bottom);
-  }
-
-  if (!last_rendering_damage_.empty()) {
-    current_rendering_damage_.left =
-        std::min(current_rendering_damage_.left, last_rendering_damage_.left);
-    current_rendering_damage_.top =
-        std::min(current_rendering_damage_.top, last_rendering_damage_.top);
-    current_rendering_damage_.right =
-        std::max(current_rendering_damage_.right, last_rendering_damage_.right);
-    current_rendering_damage_.bottom = std::max(
-        current_rendering_damage_.bottom, last_rendering_damage_.bottom);
-  }
-
+const HwcRect<int>& HwcLayer::GetLayerDamage() {
   return current_rendering_damage_;
 }
 
index 6800d83..61526da 100644 (file)
@@ -213,7 +213,7 @@ void OverlayLayer::InitializeState(HwcLayer* layer,
     ValidatePreviousFrameState(previous_layer, layer);
   }
 
-  surface_damage_ = layer->ValidateDamage();
+  surface_damage_ = layer->GetLayerDamage();
 
   if (!handle_constraints) {
     return;
index eb0a930..ab88204 100644 (file)
@@ -246,7 +246,7 @@ struct HwcLayer {
    * API for getting damage area caused by this layer for current
    * frame update.
    */
-  const HwcRect<int>& ValidateDamage();
+  const HwcRect<int>& GetLayerDamage();
 
  private:
   void Validate();
@@ -284,8 +284,6 @@ struct HwcLayer {
   HwcRect<int> surface_damage_;
   HwcRect<int> visible_rect_;
   HwcRect<int> current_rendering_damage_;
-  HwcRect<int> previous_rendering_damage_;
-  HwcRect<int> last_rendering_damage_;
   HWCBlending blending_ = HWCBlending::kBlendingNone;
   HWCNativeHandle sf_handle_ = 0;
   int32_t release_fd_ = -1;
@@ -299,7 +297,6 @@ struct HwcLayer {
   int state_ = kVisible | kSurfaceDamageChanged | kVisibleRegionChanged;
   int layer_cache_ = kLayerAttributesChanged | kDisplayFrameRectChanged;
   bool is_cursor_layer_ = false;
-  bool damage_validated_ = false;
 };
 
 }  // namespace hwcomposer