Merge "sde: Add support for flush."
This commit is contained in:
committed by
Gerrit - the friendly Code Review server
commit
c56295232f
@@ -207,6 +207,19 @@ class DisplayInterface {
|
|||||||
*/
|
*/
|
||||||
virtual DisplayError Commit(LayerStack *layer_stack) = 0;
|
virtual DisplayError Commit(LayerStack *layer_stack) = 0;
|
||||||
|
|
||||||
|
/*! @brief Method to flush any pending buffers/fences submitted previously via Commit() call.
|
||||||
|
|
||||||
|
@details Client shall call this method to request the Display Engine to release all buffers and
|
||||||
|
respective fences currently in use. This operation may result in a blank display on the panel
|
||||||
|
until a new frame is submitted for composition.
|
||||||
|
|
||||||
|
@return \link DisplayError \endlink
|
||||||
|
|
||||||
|
@sa Prepare
|
||||||
|
@sa Commit
|
||||||
|
*/
|
||||||
|
virtual DisplayError Flush() = 0;
|
||||||
|
|
||||||
/*! @brief Method to get current state of the display device.
|
/*! @brief Method to get current state of the display device.
|
||||||
|
|
||||||
@param[out] state \link DisplayState \endlink
|
@param[out] state \link DisplayState \endlink
|
||||||
|
|||||||
@@ -135,6 +135,8 @@ DisplayError DisplayBase::Prepare(LayerStack *layer_stack) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
comp_manager_->PostPrepare(display_comp_ctx_, &hw_layers_);
|
comp_manager_->PostPrepare(display_comp_ctx_, &hw_layers_);
|
||||||
|
} else {
|
||||||
|
return kErrorNotSupported;
|
||||||
}
|
}
|
||||||
|
|
||||||
return error;
|
return error;
|
||||||
@@ -149,18 +151,19 @@ DisplayError DisplayBase::Commit(LayerStack *layer_stack) {
|
|||||||
return kErrorParameters;
|
return kErrorParameters;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (state_ == kStateOn) {
|
||||||
if (!pending_commit_) {
|
if (!pending_commit_) {
|
||||||
DLOGE("Commit: Corresponding Prepare() is not called for display = %d", display_type_);
|
DLOGE("Commit: Corresponding Prepare() is not called for display = %d", display_type_);
|
||||||
return kErrorUndefined;
|
return kErrorUndefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (state_ == kStateOn) {
|
|
||||||
error = hw_intf_->Commit(hw_device_, &hw_layers_);
|
error = hw_intf_->Commit(hw_device_, &hw_layers_);
|
||||||
if (error == kErrorNone) {
|
if (error == kErrorNone) {
|
||||||
comp_manager_->PostCommit(display_comp_ctx_, &hw_layers_);
|
comp_manager_->PostCommit(display_comp_ctx_, &hw_layers_);
|
||||||
} else {
|
} else {
|
||||||
DLOGE("Unexpected error. Commit failed on driver.");
|
DLOGE("Unexpected error. Commit failed on driver.");
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
return kErrorNotSupported;
|
||||||
}
|
}
|
||||||
|
|
||||||
pending_commit_ = false;
|
pending_commit_ = false;
|
||||||
@@ -168,6 +171,27 @@ DisplayError DisplayBase::Commit(LayerStack *layer_stack) {
|
|||||||
return kErrorNone;
|
return kErrorNone;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DisplayError DisplayBase::Flush() {
|
||||||
|
SCOPE_LOCK(locker_);
|
||||||
|
|
||||||
|
DisplayError error = kErrorNone;
|
||||||
|
|
||||||
|
if (state_ != kStateOn) {
|
||||||
|
return kErrorNone;
|
||||||
|
}
|
||||||
|
|
||||||
|
hw_layers_.info.count = 0;
|
||||||
|
error = hw_intf_->Flush(hw_device_);
|
||||||
|
if (error == kErrorNone) {
|
||||||
|
comp_manager_->Purge(display_comp_ctx_);
|
||||||
|
pending_commit_ = false;
|
||||||
|
} else {
|
||||||
|
DLOGV("Failed to flush device.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
DisplayError DisplayBase::GetDisplayState(DisplayState *state) {
|
DisplayError DisplayBase::GetDisplayState(DisplayState *state) {
|
||||||
SCOPE_LOCK(locker_);
|
SCOPE_LOCK(locker_);
|
||||||
|
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ class DisplayBase : public DisplayInterface, HWEventHandler, DumpImpl {
|
|||||||
virtual DisplayError Deinit();
|
virtual DisplayError Deinit();
|
||||||
virtual DisplayError Prepare(LayerStack *layer_stack);
|
virtual DisplayError Prepare(LayerStack *layer_stack);
|
||||||
virtual DisplayError Commit(LayerStack *layer_stack);
|
virtual DisplayError Commit(LayerStack *layer_stack);
|
||||||
|
virtual DisplayError Flush();
|
||||||
virtual DisplayError GetDisplayState(DisplayState *state);
|
virtual DisplayError GetDisplayState(DisplayState *state);
|
||||||
virtual DisplayError GetNumVariableInfoConfigs(uint32_t *count);
|
virtual DisplayError GetNumVariableInfoConfigs(uint32_t *count);
|
||||||
virtual DisplayError GetConfig(DisplayConfigFixedInfo *fixed_info);
|
virtual DisplayError GetConfig(DisplayConfigFixedInfo *fixed_info);
|
||||||
|
|||||||
@@ -77,5 +77,29 @@ int DisplayHDMI::GetBestConfig() {
|
|||||||
return best_config_mode;
|
return best_config_mode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DisplayError DisplayHDMI::SetDisplayState(DisplayState state) {
|
||||||
|
DisplayError error = kErrorNone;
|
||||||
|
|
||||||
|
DLOGI("Set state = %d", state);
|
||||||
|
|
||||||
|
if (state == kStateOff) {
|
||||||
|
SCOPE_LOCK(locker_);
|
||||||
|
if (state == state_) {
|
||||||
|
DLOGI("Same state transition is requested.");
|
||||||
|
return kErrorNone;
|
||||||
|
}
|
||||||
|
error = hw_intf_->Flush(hw_device_);
|
||||||
|
if (error == kErrorNone) {
|
||||||
|
comp_manager_->Purge(display_comp_ctx_);
|
||||||
|
state_ = state;
|
||||||
|
hw_layers_.info.count = 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
error = DisplayBase::SetDisplayState(state);
|
||||||
|
}
|
||||||
|
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace sde
|
} // namespace sde
|
||||||
|
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ class DisplayHDMI : public DisplayBase {
|
|||||||
public:
|
public:
|
||||||
DisplayHDMI(DisplayEventHandler *event_handler, HWInterface *hw_intf, CompManager *comp_manager);
|
DisplayHDMI(DisplayEventHandler *event_handler, HWInterface *hw_intf, CompManager *comp_manager);
|
||||||
virtual int GetBestConfig();
|
virtual int GetBestConfig();
|
||||||
|
virtual DisplayError SetDisplayState(DisplayState state);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace sde
|
} // namespace sde
|
||||||
|
|||||||
@@ -392,17 +392,19 @@ DisplayError HWFrameBuffer::SetDisplayAttributes(Handle device, uint32_t index)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (MapHDMIDisplayTiming(timing_mode, &vscreeninfo) == false) {
|
if (MapHDMIDisplayTiming(timing_mode, &vscreeninfo) == false) {
|
||||||
return kErrorParameters;
|
return kErrorParameters;
|
||||||
}
|
}
|
||||||
|
|
||||||
STRUCT_VAR(msmfb_metadata, metadata);
|
STRUCT_VAR(msmfb_metadata, metadata);
|
||||||
memset(&metadata, 0 , sizeof(metadata));
|
|
||||||
metadata.op = metadata_op_vic;
|
metadata.op = metadata_op_vic;
|
||||||
metadata.data.video_info_code = timing_mode->video_format;
|
metadata.data.video_info_code = timing_mode->video_format;
|
||||||
if (ioctl(hw_context->device_fd, MSMFB_METADATA_SET, &metadata) == -1) {
|
if (ioctl(hw_context->device_fd, MSMFB_METADATA_SET, &metadata) == -1) {
|
||||||
IOCTL_LOGE(MSMFB_METADATA_SET, hw_context->type);
|
IOCTL_LOGE(MSMFB_METADATA_SET, hw_context->type);
|
||||||
return kErrorHardware;
|
return kErrorHardware;
|
||||||
}
|
}
|
||||||
|
|
||||||
DLOGI("SetInfo<Mode=%d %dx%d (%d,%d,%d),(%d,%d,%d) %dMHz>", vscreeninfo.reserved[3] & 0xFF00,
|
DLOGI("SetInfo<Mode=%d %dx%d (%d,%d,%d),(%d,%d,%d) %dMHz>", vscreeninfo.reserved[3] & 0xFF00,
|
||||||
vscreeninfo.xres, vscreeninfo.yres, vscreeninfo.right_margin, vscreeninfo.hsync_len,
|
vscreeninfo.xres, vscreeninfo.yres, vscreeninfo.right_margin, vscreeninfo.hsync_len,
|
||||||
vscreeninfo.left_margin, vscreeninfo.lower_margin, vscreeninfo.vsync_len,
|
vscreeninfo.left_margin, vscreeninfo.lower_margin, vscreeninfo.vsync_len,
|
||||||
@@ -476,19 +478,6 @@ DisplayError HWFrameBuffer::PowerOff(Handle device) {
|
|||||||
return kErrorHardware;
|
return kErrorHardware;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case kDeviceHDMI:
|
|
||||||
{
|
|
||||||
hw_context->ResetMDPCommit();
|
|
||||||
mdp_layer_commit_v1 &mdp_commit = hw_context->mdp_commit.commit_v1;
|
|
||||||
mdp_commit.input_layer_cnt = 0;
|
|
||||||
mdp_commit.flags &= ~MDP_VALIDATE_LAYER;
|
|
||||||
if (ioctl_(hw_context->device_fd, MSMFB_ATOMIC_COMMIT, &hw_context->mdp_commit) == -1) {
|
|
||||||
IOCTL_LOGE(MSMFB_ATOMIC_COMMIT, hw_context->type);
|
|
||||||
return kErrorHardware;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case kDeviceVirtual:
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -638,6 +627,22 @@ DisplayError HWFrameBuffer::Commit(Handle device, HWLayers *hw_layers) {
|
|||||||
return kErrorNone;
|
return kErrorNone;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DisplayError HWFrameBuffer::Flush(Handle device) {
|
||||||
|
HWContext *hw_context = reinterpret_cast<HWContext *>(device);
|
||||||
|
|
||||||
|
hw_context->ResetMDPCommit();
|
||||||
|
mdp_layer_commit_v1 &mdp_commit = hw_context->mdp_commit.commit_v1;
|
||||||
|
mdp_commit.input_layer_cnt = 0;
|
||||||
|
mdp_commit.flags &= ~MDP_VALIDATE_LAYER;
|
||||||
|
|
||||||
|
if (ioctl_(hw_context->device_fd, MSMFB_ATOMIC_COMMIT, &hw_context->mdp_commit) == -1) {
|
||||||
|
IOCTL_LOGE(MSMFB_ATOMIC_COMMIT, hw_context->type);
|
||||||
|
return kErrorHardware;
|
||||||
|
}
|
||||||
|
|
||||||
|
return kErrorNone;
|
||||||
|
}
|
||||||
|
|
||||||
DisplayError HWFrameBuffer::SetFormat(const LayerBufferFormat &source, uint32_t *target) {
|
DisplayError HWFrameBuffer::SetFormat(const LayerBufferFormat &source, uint32_t *target) {
|
||||||
switch (source) {
|
switch (source) {
|
||||||
case kFormatARGB8888: *target = MDP_ARGB_8888; break;
|
case kFormatARGB8888: *target = MDP_ARGB_8888; break;
|
||||||
@@ -782,16 +787,16 @@ void HWFrameBuffer::PopulateFBNodeIndex() {
|
|||||||
// TODO(user): For now, assume primary to be cmd/video/lvds/edp mode panel only
|
// TODO(user): For now, assume primary to be cmd/video/lvds/edp mode panel only
|
||||||
// Need more concrete info from driver
|
// Need more concrete info from driver
|
||||||
if ((strncmp(line, "mipi dsi cmd panel", strlen("mipi dsi cmd panel")) == 0)) {
|
if ((strncmp(line, "mipi dsi cmd panel", strlen("mipi dsi cmd panel")) == 0)) {
|
||||||
pri_panel_info_.type = kCommandModePanel;
|
primary_panel_info_.type = kCommandModePanel;
|
||||||
fb_node_index_[kDevicePrimary] = i;
|
fb_node_index_[kDevicePrimary] = i;
|
||||||
} else if ((strncmp(line, "mipi dsi video panel", strlen("mipi dsi video panel")) == 0)) {
|
} else if ((strncmp(line, "mipi dsi video panel", strlen("mipi dsi video panel")) == 0)) {
|
||||||
pri_panel_info_.type = kVideoModePanel;
|
primary_panel_info_.type = kVideoModePanel;
|
||||||
fb_node_index_[kDevicePrimary] = i;
|
fb_node_index_[kDevicePrimary] = i;
|
||||||
} else if ((strncmp(line, "lvds panel", strlen("lvds panel")) == 0)) {
|
} else if ((strncmp(line, "lvds panel", strlen("lvds panel")) == 0)) {
|
||||||
pri_panel_info_.type = kLVDSPanel;
|
primary_panel_info_.type = kLVDSPanel;
|
||||||
fb_node_index_[kDevicePrimary] = i;
|
fb_node_index_[kDevicePrimary] = i;
|
||||||
} else if ((strncmp(line, "edp panel", strlen("edp panel")) == 0)) {
|
} else if ((strncmp(line, "edp panel", strlen("edp panel")) == 0)) {
|
||||||
pri_panel_info_.type = kEDPPanel;
|
primary_panel_info_.type = kEDPPanel;
|
||||||
fb_node_index_[kDevicePrimary] = i;
|
fb_node_index_[kDevicePrimary] = i;
|
||||||
} else if ((strncmp(line, "dtv panel", strlen("dtv panel")) == 0)) {
|
} else if ((strncmp(line, "dtv panel", strlen("dtv panel")) == 0)) {
|
||||||
fb_node_index_[kDeviceHDMI] = i;
|
fb_node_index_[kDeviceHDMI] = i;
|
||||||
@@ -823,27 +828,27 @@ void HWFrameBuffer::PopulatePanelInfo(int fb_index) {
|
|||||||
char *tokens[max_count] = { NULL };
|
char *tokens[max_count] = { NULL };
|
||||||
if (!ParseLine(line, tokens, max_count, &token_count)) {
|
if (!ParseLine(line, tokens, max_count, &token_count)) {
|
||||||
if (!strncmp(tokens[0], "pu_en", strlen("pu_en"))) {
|
if (!strncmp(tokens[0], "pu_en", strlen("pu_en"))) {
|
||||||
pri_panel_info_.partial_update = atoi(tokens[1]);
|
primary_panel_info_.partial_update = atoi(tokens[1]);
|
||||||
} else if (!strncmp(tokens[0], "xstart", strlen("xstart"))) {
|
} else if (!strncmp(tokens[0], "xstart", strlen("xstart"))) {
|
||||||
pri_panel_info_.left_align = atoi(tokens[1]);
|
primary_panel_info_.left_align = atoi(tokens[1]);
|
||||||
} else if (!strncmp(tokens[0], "walign", strlen("walign"))) {
|
} else if (!strncmp(tokens[0], "walign", strlen("walign"))) {
|
||||||
pri_panel_info_.width_align = atoi(tokens[1]);
|
primary_panel_info_.width_align = atoi(tokens[1]);
|
||||||
} else if (!strncmp(tokens[0], "ystart", strlen("ystart"))) {
|
} else if (!strncmp(tokens[0], "ystart", strlen("ystart"))) {
|
||||||
pri_panel_info_.top_align = atoi(tokens[1]);
|
primary_panel_info_.top_align = atoi(tokens[1]);
|
||||||
} else if (!strncmp(tokens[0], "halign", strlen("halign"))) {
|
} else if (!strncmp(tokens[0], "halign", strlen("halign"))) {
|
||||||
pri_panel_info_.height_align = atoi(tokens[1]);
|
primary_panel_info_.height_align = atoi(tokens[1]);
|
||||||
} else if (!strncmp(tokens[0], "min_w", strlen("min_w"))) {
|
} else if (!strncmp(tokens[0], "min_w", strlen("min_w"))) {
|
||||||
pri_panel_info_.min_roi_width = atoi(tokens[1]);
|
primary_panel_info_.min_roi_width = atoi(tokens[1]);
|
||||||
} else if (!strncmp(tokens[0], "min_h", strlen("min_h"))) {
|
} else if (!strncmp(tokens[0], "min_h", strlen("min_h"))) {
|
||||||
pri_panel_info_.min_roi_height = atoi(tokens[1]);
|
primary_panel_info_.min_roi_height = atoi(tokens[1]);
|
||||||
} else if (!strncmp(tokens[0], "roi_merge", strlen("roi_merge"))) {
|
} else if (!strncmp(tokens[0], "roi_merge", strlen("roi_merge"))) {
|
||||||
pri_panel_info_.needs_roi_merge = atoi(tokens[1]);
|
primary_panel_info_.needs_roi_merge = atoi(tokens[1]);
|
||||||
} else if (!strncmp(tokens[0], "dynamic_fps_en", strlen("dyn_fps_en"))) {
|
} else if (!strncmp(tokens[0], "dynamic_fps_en", strlen("dyn_fps_en"))) {
|
||||||
pri_panel_info_.dynamic_fps = atoi(tokens[1]);
|
primary_panel_info_.dynamic_fps = atoi(tokens[1]);
|
||||||
} else if (!strncmp(tokens[0], "min_fps", strlen("min_fps"))) {
|
} else if (!strncmp(tokens[0], "min_fps", strlen("min_fps"))) {
|
||||||
pri_panel_info_.min_fps = atoi(tokens[1]);
|
primary_panel_info_.min_fps = atoi(tokens[1]);
|
||||||
} else if (!strncmp(tokens[0], "max_fps", strlen("max_fps"))) {
|
} else if (!strncmp(tokens[0], "max_fps", strlen("max_fps"))) {
|
||||||
pri_panel_info_.max_fps= atoi(tokens[1]);
|
primary_panel_info_.max_fps= atoi(tokens[1]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1077,3 +1082,4 @@ bool HWFrameBuffer::MapHDMIDisplayTiming(const msm_hdmi_mode_timing_info *mode,
|
|||||||
}
|
}
|
||||||
|
|
||||||
} // namespace sde
|
} // namespace sde
|
||||||
|
|
||||||
|
|||||||
@@ -58,6 +58,7 @@ class HWFrameBuffer : public HWInterface {
|
|||||||
virtual DisplayError Standby(Handle device);
|
virtual DisplayError Standby(Handle device);
|
||||||
virtual DisplayError Validate(Handle device, HWLayers *hw_layers);
|
virtual DisplayError Validate(Handle device, HWLayers *hw_layers);
|
||||||
virtual DisplayError Commit(Handle device, HWLayers *hw_layers);
|
virtual DisplayError Commit(Handle device, HWLayers *hw_layers);
|
||||||
|
virtual DisplayError Flush(Handle device);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct HWContext {
|
struct HWContext {
|
||||||
@@ -141,7 +142,6 @@ class HWFrameBuffer : public HWInterface {
|
|||||||
bool EnableHotPlugDetection(int enable);
|
bool EnableHotPlugDetection(int enable);
|
||||||
int GetHDMIModeCount();
|
int GetHDMIModeCount();
|
||||||
bool MapHDMIDisplayTiming(const msm_hdmi_mode_timing_info *mode, fb_var_screeninfo *info);
|
bool MapHDMIDisplayTiming(const msm_hdmi_mode_timing_info *mode, fb_var_screeninfo *info);
|
||||||
void ResetHDMIModes();
|
|
||||||
|
|
||||||
// Pointers to system calls which are either mapped to actual system call or virtual driver.
|
// Pointers to system calls which are either mapped to actual system call or virtual driver.
|
||||||
int (*ioctl_)(int, int, ...);
|
int (*ioctl_)(int, int, ...);
|
||||||
@@ -166,7 +166,7 @@ class HWFrameBuffer : public HWInterface {
|
|||||||
HWResourceInfo hw_resource_;
|
HWResourceInfo hw_resource_;
|
||||||
int fb_node_index_[kDeviceMax];
|
int fb_node_index_[kDeviceMax];
|
||||||
const char* fb_path_;
|
const char* fb_path_;
|
||||||
PanelInfo pri_panel_info_;
|
PanelInfo primary_panel_info_;
|
||||||
bool hotplug_enabled_;
|
bool hotplug_enabled_;
|
||||||
uint32_t hdmi_mode_count_;
|
uint32_t hdmi_mode_count_;
|
||||||
uint32_t hdmi_modes_[256];
|
uint32_t hdmi_modes_[256];
|
||||||
|
|||||||
@@ -169,6 +169,7 @@ class HWInterface {
|
|||||||
virtual DisplayError Standby(Handle device) = 0;
|
virtual DisplayError Standby(Handle device) = 0;
|
||||||
virtual DisplayError Validate(Handle device, HWLayers *hw_layers) = 0;
|
virtual DisplayError Validate(Handle device, HWLayers *hw_layers) = 0;
|
||||||
virtual DisplayError Commit(Handle device, HWLayers *hw_layers) = 0;
|
virtual DisplayError Commit(Handle device, HWLayers *hw_layers) = 0;
|
||||||
|
virtual DisplayError Flush(Handle device) = 0;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual ~HWInterface() { }
|
virtual ~HWInterface() { }
|
||||||
|
|||||||
@@ -35,7 +35,8 @@ namespace sde {
|
|||||||
|
|
||||||
HWCDisplay::HWCDisplay(CoreInterface *core_intf, hwc_procs_t const **hwc_procs, DisplayType type,
|
HWCDisplay::HWCDisplay(CoreInterface *core_intf, hwc_procs_t const **hwc_procs, DisplayType type,
|
||||||
int id)
|
int id)
|
||||||
: core_intf_(core_intf), hwc_procs_(hwc_procs), type_(type), id_(id), display_intf_(NULL) {
|
: core_intf_(core_intf), hwc_procs_(hwc_procs), type_(type), id_(id), display_intf_(NULL),
|
||||||
|
flush_(false) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int HWCDisplay::Init() {
|
int HWCDisplay::Init() {
|
||||||
@@ -282,6 +283,7 @@ int HWCDisplay::PrepareLayerStack(hwc_display_contents_1_t *content_list) {
|
|||||||
|
|
||||||
size_t num_hw_layers = content_list->numHwLayers;
|
size_t num_hw_layers = content_list->numHwLayers;
|
||||||
if (num_hw_layers <= 1) {
|
if (num_hw_layers <= 1) {
|
||||||
|
flush_ = true;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -338,9 +340,14 @@ int HWCDisplay::PrepareLayerStack(hwc_display_contents_1_t *content_list) {
|
|||||||
layer_stack_.flags.geometry_changed = ((content_list->flags & HWC_GEOMETRY_CHANGED) > 0);
|
layer_stack_.flags.geometry_changed = ((content_list->flags & HWC_GEOMETRY_CHANGED) > 0);
|
||||||
|
|
||||||
DisplayError error = display_intf_->Prepare(&layer_stack_);
|
DisplayError error = display_intf_->Prepare(&layer_stack_);
|
||||||
if (UNLIKELY(error != kErrorNone)) {
|
if (error != kErrorNone) {
|
||||||
DLOGE("Prepare failed. Error = %d", error);
|
DLOGE("Prepare failed. Error = %d", error);
|
||||||
return -EINVAL;
|
|
||||||
|
// To prevent surfaceflinger infinite wait, flush the previous frame during Commit() so that
|
||||||
|
// previous buffer and fences are released, and override the error.
|
||||||
|
flush_ = true;
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool needs_fb_refresh = NeedsFrameBufferRefresh(content_list);
|
bool needs_fb_refresh = NeedsFrameBufferRefresh(content_list);
|
||||||
@@ -378,20 +385,8 @@ int HWCDisplay::CommitLayerStack(hwc_display_contents_1_t *content_list) {
|
|||||||
int status = 0;
|
int status = 0;
|
||||||
|
|
||||||
size_t num_hw_layers = content_list->numHwLayers;
|
size_t num_hw_layers = content_list->numHwLayers;
|
||||||
if (num_hw_layers <= 1) {
|
|
||||||
if (!num_hw_layers) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO(user): handle if only 1 layer(fb target) is received.
|
|
||||||
int &acquireFenceFd = content_list->hwLayers[0].acquireFenceFd;
|
|
||||||
if (acquireFenceFd >= 0) {
|
|
||||||
close(acquireFenceFd);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
if (!flush_) {
|
||||||
for (size_t i = 0; i < num_hw_layers; i++) {
|
for (size_t i = 0; i < num_hw_layers; i++) {
|
||||||
hwc_layer_1_t &hwc_layer = content_list->hwLayers[i];
|
hwc_layer_1_t &hwc_layer = content_list->hwLayers[i];
|
||||||
const private_handle_t *pvt_handle = static_cast<const private_handle_t *>(hwc_layer.handle);
|
const private_handle_t *pvt_handle = static_cast<const private_handle_t *>(hwc_layer.handle);
|
||||||
@@ -407,9 +402,22 @@ int HWCDisplay::CommitLayerStack(hwc_display_contents_1_t *content_list) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
DisplayError error = display_intf_->Commit(&layer_stack_);
|
DisplayError error = display_intf_->Commit(&layer_stack_);
|
||||||
if (UNLIKELY(error != kErrorNone)) {
|
if (error != kErrorNone) {
|
||||||
DLOGE("Commit failed. Error = %d", error);
|
DLOGE("Commit failed. Error = %d", error);
|
||||||
status = -EINVAL;
|
|
||||||
|
// To prevent surfaceflinger infinite wait, flush the previous frame during Commit() so that
|
||||||
|
// previous buffer and fences are released, and override the error.
|
||||||
|
flush_ = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flush_) {
|
||||||
|
DisplayError error = display_intf_->Flush();
|
||||||
|
if (error != kErrorNone) {
|
||||||
|
DLOGE("Flush failed. Error = %d", error);
|
||||||
|
}
|
||||||
|
|
||||||
|
flush_ = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (size_t i = 0; i < num_hw_layers; i++) {
|
for (size_t i = 0; i < num_hw_layers; i++) {
|
||||||
|
|||||||
@@ -97,6 +97,7 @@ class HWCDisplay : public DisplayEventHandler {
|
|||||||
LayerStackMemory layer_stack_memory_;
|
LayerStackMemory layer_stack_memory_;
|
||||||
LayerStack layer_stack_;
|
LayerStack layer_stack_;
|
||||||
LayerStackCache layer_stack_cache_;
|
LayerStackCache layer_stack_cache_;
|
||||||
|
bool flush_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace sde
|
} // namespace sde
|
||||||
|
|||||||
Reference in New Issue
Block a user