HWC2::Error HWCDisplayPrimary::Validate(uint32_t *out_num_types, uint32_t *out_num_requests) { auto status = HWC2::Error::None; DisplayError error = kErrorNone; if (display_paused_) { MarkLayersForGPUBypass(); return status; } if (color_tranform_failed_) { // Must fall back to client composition MarkLayersForClientComposition(); } // Fill in the remaining blanks in the layers and add them to the SDM layerstack BuildLayerStack(); // Checks and replaces layer stack for solid fill SolidFillPrepare(); bool pending_output_dump = dump_frame_count_ && dump_output_to_file_; if (frame_capture_buffer_queued_ || pending_output_dump) { // RHS values were set in FrameCaptureAsync() called from a binder thread. They are picked up // here in a subsequent draw round. layer_stack_.output_buffer = &output_buffer_; layer_stack_.flags.post_processed_output = post_processed_output_; } bool one_updating_layer = SingleLayerUpdating(); ToggleCPUHint(one_updating_layer); uint32_t refresh_rate = GetOptimalRefreshRate(one_updating_layer); if (current_refresh_rate_ != refresh_rate) { error = display_intf_->SetRefreshRate(refresh_rate); } if (error == kErrorNone) { // On success, set current refresh rate to new refresh rate current_refresh_rate_ = refresh_rate; } if (handle_idle_timeout_) { handle_idle_timeout_ = false; } if (layer_set_.empty()) { flush_ = true; return status; } status = PrepareLayerStack(out_num_types, out_num_requests); return status; }
int HWCDisplayExternal::Prepare(hwc_display_contents_1_t *content_list) { int status = 0; status = AllocateLayerStack(content_list); if (status) { return status; } status = PrepareLayerStack(content_list); if (status) { return status; } return 0; }