plane.plane()->GetFormatForFrameBuffer(layer_.GetBuffer()->GetFormat());
const HwcRect<int> &display_rect = plane.GetDisplayFrame();
- layer_.SetSourceCrop(HwcRect<float>(display_rect));
- layer_.SetDisplayFrame(HwcRect<int>(display_rect));
surface_damage_ = display_rect;
last_surface_damage_ = surface_damage_;
width_ = display_rect.right - display_rect.left;
height_ = display_rect.bottom - display_rect.top;
+ layer_.SetSourceCrop(HwcRect<float>(0, 0, width_, height_));
+ layer_.SetDisplayFrame(HwcRect<int>(display_rect));
plane.SetOverlayLayer(&layer_);
SetInUse(true);
SetInUse(true);
layer_.SetAcquireFence(-1);
const HwcRect<int> &display_rect = plane.GetDisplayFrame();
- layer_.SetSourceCrop(HwcRect<float>(display_rect));
- layer_.SetDisplayFrame(HwcRect<int>(display_rect));
width_ = display_rect.right - display_rect.left;
height_ = display_rect.bottom - display_rect.top;
+ layer_.SetSourceCrop(HwcRect<float>(0, 0, width_, height_));
+ layer_.SetDisplayFrame(HwcRect<int>(display_rect));
}
void NativeSurface::UpdateSurfaceDamage(
HwcLayer* layer) {
OverlayBuffer* buffer = imported_buffer_->buffer_.get();
surface_damage_ = layer->GetSurfaceDamage();
+ gpu_rendered_ = rhs.gpu_rendered_;
if (!prefer_separate_plane_)
prefer_separate_plane_ = rhs.prefer_separate_plane_;
return;
bool content_changed = false;
+ bool rect_changed = layer->HasDisplayRectChanged();
// We expect cursor plane to support alpha always.
- if (rhs.gpu_rendered_ || (buffer->GetUsage() & kLayerCursor)) {
- content_changed = alpha_ != rhs.alpha_ || layer->HasDisplayRectChanged() ||
+ if ((gpu_rendered_ && !rect_changed) || (buffer->GetUsage() & kLayerCursor)) {
+ content_changed = (alpha_ != rhs.alpha_) || rect_changed ||
layer->HasContentAttributesChanged() ||
layer->HasLayerAttributesChanged();
- gpu_rendered_ = rhs.gpu_rendered_;
} else {
- if (alpha_ != rhs.alpha_ || layer->HasDisplayRectChanged() ||
+ if (alpha_ != rhs.alpha_ || rect_changed ||
layer->HasContentAttributesChanged() ||
layer->HasLayerAttributesChanged())
return;
state_ &= ~kLayerAttributesChanged;
- if (!layer->HasDisplayRectChanged()) {
+ if (!rect_changed) {
state_ &= ~kDimensionsChanged;
}
void DisplayPlaneManager::EnsureOffScreenTarget(DisplayPlaneState &plane) {
NativeSurface *surface = NULL;
+ const HwcRect<int> &rect = plane.GetDisplayFrame();
+ int width = rect.right - rect.left;
+ int height = rect.bottom - rect.top;
for (auto &fb : surfaces_) {
- if (!fb->InUse()) {
+ if (!fb->InUse() && (width == fb->GetWidth()) &&
+ (height == fb->GetHeight())) {
surface = fb.get();
break;
}
}
if (!surface) {
- NativeSurface *new_surface = CreateBackBuffer(width_, height_);
+ NativeSurface *new_surface = CreateBackBuffer(width, height);
new_surface->Init(buffer_handler_);
surfaces_.emplace_back(std::move(new_surface));
surface = surfaces_.back().get();
}
}
- plane.TransferSurfaces(
- last_plane, content_changed || region_changed || reset_regions);
+ if (!region_changed && !reset_regions) {
+ plane.TransferSurfaces(last_plane, content_changed);
+ const std::vector<CompositionRegion>& comp_regions =
+ plane.GetCompositionRegion();
+ last_plane.GetCompositionRegion().assign(comp_regions.begin(),
+ comp_regions.end());
+ }
+
if (content_changed || region_changed || reset_regions) {
if (last_plane.GetSurfaces().size() == 3) {
NativeSurface* surface = last_plane.GetOffScreenTarget();
surface->RecycleSurface(last_plane);
last_plane.ReUseOffScreenTarget();
}
-
- if (!region_changed && !reset_regions) {
- const std::vector<CompositionRegion>& comp_regions =
- plane.GetCompositionRegion();
- last_plane.GetCompositionRegion().assign(comp_regions.begin(),
- comp_regions.end());
- }
} else {
const OverlayLayer* layer =
&(*(layers.begin() + last_plane.source_layers().front()));
void VblankEventHandler::HandlePageFlipEvent(unsigned int sec,
unsigned int usec) {
- int64_t timestamp = (int64_t)sec * kOneSecondNs + (int64_t)usec * 1000;
+ int64_t timestamp = ((int64_t)sec * kOneSecondNs) + ((int64_t)usec * 1000);
IPAGEFLIPEVENTTRACE("HandleVblankCallBack Frame Time %f",
static_cast<float>(timestamp - last_timestamp_) / (1000));
last_timestamp_ = timestamp;