From 9900d30a7f031d9a06651f11c125d9f678488658 Mon Sep 17 00:00:00 2001 From: Harish Krupo Date: Fri, 4 May 2018 22:52:56 +0530 Subject: [PATCH] Transform surface damage to global co-ordinates 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 --- common/core/hwclayer.cpp | 21 +++++++++++++++++---- common/core/overlaylayer.cpp | 8 -------- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/common/core/hwclayer.cpp b/common/core/hwclayer.cpp index eef4a3f..0636fae 100644 --- a/common/core/hwclayer.cpp +++ b/common/core/hwclayer.cpp @@ -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_; } diff --git a/common/core/overlaylayer.cpp b/common/core/overlaylayer.cpp index 5e8fcfa..0a57bec 100644 --- a/common/core/overlaylayer.cpp +++ b/common/core/overlaylayer.cpp @@ -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); -- 2.11.0