ValidatePreviousFrameState(previous_layer, layer);
}
- if (layer->HasContentAttributesChanged() ||
- layer->HasLayerAttributesChanged() || !layer->IsValidated()) {
+ if (layer->HasLayerAttributesChanged() || !layer->IsValidated()) {
state_ |= kClearSurface;
state_ |= kLayerContentChanged;
}
}
// We expect cursor plane to support alpha always.
- if (rhs->gpu_rendered_ || (type_ == kLayerCursor)) {
+ if (gpu_rendered_ || (type_ == kLayerCursor)) {
content_changed = rect_changed || source_rect_changed;
+
+ if (!content_changed) {
+ if (alpha_ != rhs->alpha_) {
+ content_changed = true;
+ }
+
+ if (blending_ != rhs->blending_) {
+ content_changed = true;
+ }
+ }
} else {
// If previous layer was opaque and we have alpha now,
// let's mark this layer for re-validation. Plane
}
if (rect_changed || layer->HasLayerAttributesChanged()) {
- if (layer->IsValidated()) {
- state_ |= kNeedsReValidation;
- return;
- }
-
- if (rhs->transform_ != transform_) {
- state_ |= kNeedsReValidation;
- return;
- }
-
- if ((rhs->display_frame_.left != display_frame_.left) ||
- (rhs->display_frame_.right != display_frame_.right) ||
- (rhs->display_frame_.top != display_frame_.top) ||
- (rhs->display_frame_.bottom != display_frame_.bottom)) {
- state_ |= kNeedsReValidation;
- return;
- }
+ state_ |= kNeedsReValidation;
+ return;
}
if (source_rect_changed) {
std::vector<OverlayLayer *> &cursor_layers, bool pending_modeset,
bool disable_overlay, DisplayPlaneStateList &composition) {
CTRACE();
- // Let's mark all planes as free to be used.
- for (auto j = overlay_planes_.begin(); j != overlay_planes_.end(); ++j) {
- j->get()->SetInUse(false);
- }
bool force_gpu = disable_overlay || (pending_modeset && (layers.size() > 1));
return true;
}
+ // Let's mark all planes as free to be used.
+ for (auto j = overlay_planes_.begin(); j != overlay_planes_.end(); ++j) {
+ j->get()->SetInUse(false);
+ }
+
+ // Let's reset some of the layer's state.
+ size_t size = layers.size();
+ for (size_t i = 0; i != size; ++i) {
+ OverlayLayer &layer = layers.at(i);
+ layer.GPURendered(false);
+ layer.UsePlaneScalar(false);
+ }
+
std::vector<OverlayPlane> commit_planes;
auto layer_begin = layers.begin();
auto layer_end = layers.end();
for (size_t i = 0; i < layers_size; i++) {
size_t source_index = source_layers.at(i);
OverlayLayer &layer = layers.at(source_index);
- layer.GPURendered();
+ layer.GPURendered(true);
layer.UsePlaneScalar(useplanescalar);
}
}
}
bool render_layers = false;
- // If this combination fails just fall back to 3D for all layers.
+ // If this combination fails just fall back to full validation.
if (plane_handler_->TestCommit(commit_planes)) {
*request_full_validation = false;
for (DisplayPlaneState &plane : composition) {
- if (plane.NeedsOffScreenComposition()) {
+ const std::vector<size_t> &source_layers = plane.GetSourceLayers();
+ size_t layers_size = source_layers.size();
+ bool useplanescalar = plane.IsUsingPlaneScalar();
+ bool use_gpu = plane.NeedsOffScreenComposition();
+ if (use_gpu) {
render_layers = true;
- const std::vector<size_t> &source_layers = plane.GetSourceLayers();
- size_t layers_size = source_layers.size();
- bool useplanescalar = plane.IsUsingPlaneScalar();
- for (size_t i = 0; i < layers_size; i++) {
- size_t source_index = source_layers.at(i);
- OverlayLayer &layer = layers.at(source_index);
- layer.GPURendered();
- layer.UsePlaneScalar(useplanescalar);
- }
+ }
+
+ for (size_t i = 0; i < layers_size; i++) {
+ size_t source_index = source_layers.at(i);
+ OverlayLayer &layer = layers.at(source_index);
+ layer.GPURendered(use_gpu);
+ layer.UsePlaneScalar(useplanescalar);
}
}
} else {
// cursor layer cannot be scanned out directly.
if (FallbacktoGPU(plane, cursor_layer, commit_planes)) {
commit_planes.pop_back();
- cursor_layer->GPURendered();
+ cursor_layer->GPURendered(true);
last_plane->AddLayer(cursor_layer);
bool reset_overlay = false;
if (!last_plane->GetOffScreenTarget() || is_video)
for (uint32_t i = cursor_index; i < total_size; i++) {
OverlayLayer *cursor_layer = cursor_layers.at(i);
last_plane->AddLayer(cursor_layer);
- cursor_layer->GPURendered();
+ cursor_layer->GPURendered(true);
status = true;
last_layer = cursor_layer;
}
// If this combination fails just fall back to 3D for all layers.
if (!plane_handler_->TestCommit(commit_planes)) {
- // We start off with Primary plane.
- DisplayPlane *current_plane = overlay_planes_.at(0).get();
- for (DisplayPlaneState &plane : composition) {
- if (plane.GetOffScreenTarget()) {
- plane.GetOffScreenTarget()->SetInUse(false);
- }
- }
-
ForceGpuForAllLayers(composition, layers);
- ReleaseFreeOffScreenTargets();
}
}
void DisplayPlaneManager::ForceGpuForAllLayers(
DisplayPlaneStateList &composition, std::vector<OverlayLayer> &layers) {
+ // Let's mark all planes as free to be used.
+ for (auto j = overlay_planes_.begin(); j != overlay_planes_.end(); ++j) {
+ j->get()->SetInUse(false);
+ }
+
+ bool free_surfaces = !composition.empty();
+
+ if (free_surfaces) {
+ for (DisplayPlaneState &plane : composition) {
+ if (plane.GetOffScreenTarget()) {
+ plane.GetOffScreenTarget()->SetInUse(false);
+ }
+ }
+ }
+
auto layer_begin = layers.begin();
auto layer_end = layers.end();
DisplayPlaneStateList().swap(composition);
for (auto i = layer_begin; i != layer_end; ++i) {
last_plane.AddLayer(&(*(i)));
- i->GPURendered();
+ i->GPURendered(true);
}
EnsureOffScreenTarget(last_plane);
current_plane->SetInUse(true);
+
+ if (free_surfaces) {
+ ReleaseFreeOffScreenTargets();
+ }
}
} // namespace hwcomposer
}
/**
- * API for querying if layer attributes has
- * changed from last Present call to NativeDisplay.
- * This takes into consideration any changes to
- * alpha and blending.
- */
- bool HasContentAttributesChanged() const {
- return layer_cache_ & kDIsplayContentAttributesChanged;
- }
-
- /**
* API for setting release fence for this layer.
* @param fd will be populated with Native Fence object.
* When fd is signalled, any previous frame
enum LayerCache {
kLayerAttributesChanged = 1 << 0,
kDisplayFrameRectChanged = 1 << 1,
- kDIsplayContentAttributesChanged = 1 << 2,
- kSourceRectChanged = 1 << 3
+ kSourceRectChanged = 1 << 2
};
int32_t transform_ = 0;
std::vector<int32_t> right_source_constraint_;
uint32_t z_order_ = 0;
int state_ = kVisible | kSurfaceDamageChanged | kVisibleRegionChanged;
- int layer_cache_ = kLayerAttributesChanged | kDisplayFrameRectChanged |
- kDIsplayContentAttributesChanged;
+ int layer_cache_ = kLayerAttributesChanged | kDisplayFrameRectChanged;
};
} // namespace hwcomposer