(rect.right == 0)) {
state_ &= ~kLayerContentChanged;
state_ &= ~kSurfaceDamageChanged;
+ UpdateRenderingDamage(surface_damage_, rect, false);
surface_damage_.reset();
- current_rendering_damage_.reset();
return;
}
} else if (rects == 0) {
(surface_damage_.top == rect.top) &&
(surface_damage_.right == rect.right) &&
(surface_damage_.bottom == rect.bottom)) {
- UpdateRenderingDamage(surface_damage_, rect, true);
return;
}
(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;
}
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())
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 {
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_;
}
* API for getting damage area caused by this layer for current
* frame update.
*/
- const HwcRect<int>& ValidateDamage();
+ const HwcRect<int>& GetLayerDamage();
private:
void Validate();
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;
int state_ = kVisible | kSurfaceDamageChanged | kVisibleRegionChanged;
int layer_cache_ = kLayerAttributesChanged | kDisplayFrameRectChanged;
bool is_cursor_layer_ = false;
- bool damage_validated_ = false;
};
} // namespace hwcomposer