sdm: Update layer parameters based on panel orientation
Update layer rotation parameters with panel orientation. Recalculate destination rect for all layers. CRs-fixed: 1112326 Change-Id: I95f6428c77b23cf2437c319f6ab519aa3ad245e9
This commit is contained in:
committed by
Gerrit - the friendly Code Review server
parent
9b50abe92f
commit
1494a93fc8
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2015-2016, The Linux Foundation. All rights reserved.
|
* Copyright (c) 2015-2017, The Linux Foundation. All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification, are permitted
|
* Redistribution and use in source and binary forms, with or without modification, are permitted
|
||||||
* provided that the following conditions are met:
|
* provided that the following conditions are met:
|
||||||
@@ -224,6 +224,12 @@ struct HWColorPrimaries {
|
|||||||
uint32_t blue[2] = {}; // Blue color primary
|
uint32_t blue[2] = {}; // Blue color primary
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct HWPanelOrientation {
|
||||||
|
bool rotation = false;
|
||||||
|
bool flip_horizontal = false;
|
||||||
|
bool flip_vertical = false;
|
||||||
|
};
|
||||||
|
|
||||||
struct HWPanelInfo {
|
struct HWPanelInfo {
|
||||||
DisplayPort port = kPortDefault; // Display port
|
DisplayPort port = kPortDefault; // Display port
|
||||||
HWDisplayMode mode = kModeDefault; // Display mode
|
HWDisplayMode mode = kModeDefault; // Display mode
|
||||||
@@ -253,6 +259,7 @@ struct HWPanelInfo {
|
|||||||
uint32_t average_luminance = 0; // Panel's average luminance level
|
uint32_t average_luminance = 0; // Panel's average luminance level
|
||||||
uint32_t blackness_level = 0; // Panel's blackness level
|
uint32_t blackness_level = 0; // Panel's blackness level
|
||||||
HWColorPrimaries primaries = {}; // WRGB color primaries
|
HWColorPrimaries primaries = {}; // WRGB color primaries
|
||||||
|
HWPanelOrientation panel_orientation = {}; // Panel Orientation
|
||||||
|
|
||||||
bool operator !=(const HWPanelInfo &panel_info) {
|
bool operator !=(const HWPanelInfo &panel_info) {
|
||||||
return ((port != panel_info.port) || (mode != panel_info.mode) ||
|
return ((port != panel_info.port) || (mode != panel_info.mode) ||
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2015-2016, The Linux Foundation. All rights reserved.
|
* Copyright (c) 2015-2017, The Linux Foundation. All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are
|
* modification, are permitted provided that the following conditions are
|
||||||
@@ -57,6 +57,7 @@ namespace sdm {
|
|||||||
bool flip_horizontal, LayerRect *out_rects);
|
bool flip_horizontal, LayerRect *out_rects);
|
||||||
void MapRect(const LayerRect &src_domain, const LayerRect &dst_domain, const LayerRect &in_rect,
|
void MapRect(const LayerRect &src_domain, const LayerRect &dst_domain, const LayerRect &in_rect,
|
||||||
LayerRect *out_rect);
|
LayerRect *out_rect);
|
||||||
|
void TransformHV(const LayerRect &src_domain, const LayerRect &in_rect, LayerRect *out_rect);
|
||||||
RectOrientation GetOrientation(const LayerRect &in_rect);
|
RectOrientation GetOrientation(const LayerRect &in_rect);
|
||||||
} // namespace sdm
|
} // namespace sdm
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2014 - 2016, The Linux Foundation. All rights reserved.
|
* Copyright (c) 2014 - 2017, The Linux Foundation. All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without modification, are permitted
|
* Redistribution and use in source and binary forms, with or without modification, are permitted
|
||||||
* provided that the following conditions are met:
|
* provided that the following conditions are met:
|
||||||
@@ -88,6 +88,29 @@ DisplayError DisplayPrimary::Prepare(LayerStack *layer_stack) {
|
|||||||
uint32_t new_mixer_height = 0;
|
uint32_t new_mixer_height = 0;
|
||||||
uint32_t display_width = display_attributes_.x_pixels;
|
uint32_t display_width = display_attributes_.x_pixels;
|
||||||
uint32_t display_height = display_attributes_.y_pixels;
|
uint32_t display_height = display_attributes_.y_pixels;
|
||||||
|
bool needs_hv_flip = hw_panel_info_.panel_orientation.flip_horizontal &&
|
||||||
|
hw_panel_info_.panel_orientation.flip_vertical;
|
||||||
|
LayerRect src_domain = {};
|
||||||
|
DisplayConfigVariableInfo variable_info = {};
|
||||||
|
|
||||||
|
if (needs_hv_flip) {
|
||||||
|
DisplayBase::GetFrameBufferConfig(&variable_info);
|
||||||
|
src_domain.right = variable_info.x_pixels;
|
||||||
|
src_domain.bottom = variable_info.y_pixels;
|
||||||
|
|
||||||
|
for (Layer *layer : layer_stack->layers) {
|
||||||
|
// Modify destination based on panel flip
|
||||||
|
TransformHV(src_domain, layer->dst_rect, &layer->dst_rect);
|
||||||
|
|
||||||
|
if (layer->flags.solid_fill) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
layer->transform.flip_horizontal ^= (hw_panel_info_.panel_orientation.flip_horizontal);
|
||||||
|
layer->transform.flip_vertical ^= (hw_panel_info_.panel_orientation.flip_vertical);
|
||||||
|
// TODO(user): Check how to handle rotation, if panel has rotation.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (NeedsMixerReconfiguration(layer_stack, &new_mixer_width, &new_mixer_height)) {
|
if (NeedsMixerReconfiguration(layer_stack, &new_mixer_width, &new_mixer_height)) {
|
||||||
error = ReconfigureMixer(new_mixer_width, new_mixer_height);
|
error = ReconfigureMixer(new_mixer_width, new_mixer_height);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2014 - 2016, The Linux Foundation. All rights reserved.
|
* Copyright (c) 2014 - 2017, The Linux Foundation. All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are
|
* modification, are permitted provided that the following conditions are
|
||||||
@@ -899,6 +899,11 @@ void HWDevice::GetHWPanelInfoByNode(int device_node, HWPanelInfo *panel_info) {
|
|||||||
panel_info->primaries.blue[0] = UINT32(atoi(tokens[1]));
|
panel_info->primaries.blue[0] = UINT32(atoi(tokens[1]));
|
||||||
} else if (!strncmp(tokens[0], "blue_chromaticity_y", strlen("blue_chromaticity_y"))) {
|
} else if (!strncmp(tokens[0], "blue_chromaticity_y", strlen("blue_chromaticity_y"))) {
|
||||||
panel_info->primaries.blue[1] = UINT32(atoi(tokens[1]));
|
panel_info->primaries.blue[1] = UINT32(atoi(tokens[1]));
|
||||||
|
} else if (!strncmp(tokens[0], "panel_orientation", strlen("panel_orientation"))) {
|
||||||
|
int32_t panel_orient = atoi(tokens[1]);
|
||||||
|
panel_info->panel_orientation.flip_horizontal = ((panel_orient & MDP_FLIP_LR) > 0);
|
||||||
|
panel_info->panel_orientation.flip_vertical = ((panel_orient & MDP_FLIP_UD) > 0);
|
||||||
|
panel_info->panel_orientation.rotation = ((panel_orient & MDP_ROT_90) > 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2015-2016, The Linux Foundation. All rights reserved.
|
* Copyright (c) 2015-2017, The Linux Foundation. All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are
|
* modification, are permitted provided that the following conditions are
|
||||||
@@ -223,6 +223,20 @@ void MapRect(const LayerRect &src_domain, const LayerRect &dst_domain, const Lay
|
|||||||
out_rect->bottom = dst_domain.top + (height_ratio * modified_in_rect.bottom);
|
out_rect->bottom = dst_domain.top + (height_ratio * modified_in_rect.bottom);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TransformHV(const LayerRect &src_domain, const LayerRect &in_rect, LayerRect *out_rect) {
|
||||||
|
if (!IsValid(src_domain) || !IsValid(in_rect)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
float in_width = in_rect.right - in_rect.left;
|
||||||
|
float in_height = in_rect.bottom - in_rect.top;
|
||||||
|
|
||||||
|
out_rect->right = src_domain.right - in_rect.left;
|
||||||
|
out_rect->bottom = src_domain.bottom - in_rect.top;
|
||||||
|
out_rect->left = out_rect->right - in_width;
|
||||||
|
out_rect->top = out_rect->bottom - in_height;
|
||||||
|
}
|
||||||
|
|
||||||
RectOrientation GetOrientation(const LayerRect &in_rect) {
|
RectOrientation GetOrientation(const LayerRect &in_rect) {
|
||||||
if (!IsValid(in_rect)) {
|
if (!IsValid(in_rect)) {
|
||||||
return kOrientationUnknown;
|
return kOrientationUnknown;
|
||||||
|
|||||||
Reference in New Issue
Block a user