hwc2: Reset SDM layer per frame data while creating layer-stack
Sdm can modify layer transform and position on display while
adjusting for panel orientation. Reset transform and display frame
from hwc layer everytime while creating input layer-stack for SDM.
Change-Id: I8dcdc4f072012e50bae57f30ad261664e0e6b74d
CRs-fixed: 2051379
diff --git a/sdm/libs/hwc2/hwc_display.cpp b/sdm/libs/hwc2/hwc_display.cpp
index 9446b6c..30edaae 100644
--- a/sdm/libs/hwc2/hwc_display.cpp
+++ b/sdm/libs/hwc2/hwc_display.cpp
@@ -450,6 +450,9 @@
// Add one layer for fb target
// TODO(user): Add blit target layers
for (auto hwc_layer : layer_set_) {
+ // Reset layer data which SDM may change
+ hwc_layer->ResetPerFrameData();
+
Layer *layer = hwc_layer->GetSDMLayer();
layer->flags = {}; // Reset earlier flags
if (hwc_layer->GetClientRequestedCompositionType() == HWC2::Composition::Client) {
diff --git a/sdm/libs/hwc2/hwc_layers.cpp b/sdm/libs/hwc2/hwc_layers.cpp
index 51a8687..cb1c5f0 100644
--- a/sdm/libs/hwc2/hwc_layers.cpp
+++ b/sdm/libs/hwc2/hwc_layers.cpp
@@ -258,14 +258,21 @@
HWC2::Error HWCLayer::SetLayerDisplayFrame(hwc_rect_t frame) {
LayerRect dst_rect = {};
+
SetRect(frame, &dst_rect);
- if (layer_->dst_rect != dst_rect) {
+ if (dst_rect_ != dst_rect) {
geometry_changes_ |= kDisplayFrame;
- layer_->dst_rect = dst_rect;
+ dst_rect_ = dst_rect;
}
+
return HWC2::Error::None;
}
+void HWCLayer::ResetPerFrameData() {
+ layer_->dst_rect = dst_rect_;
+ layer_->transform = layer_transform_;
+}
+
HWC2::Error HWCLayer::SetLayerPlaneAlpha(float alpha) {
// Conversion of float alpha in range 0.0 to 1.0 similar to the HWC Adapter
uint8_t plane_alpha = static_cast<uint8_t>(std::round(255.0f * alpha));
@@ -322,10 +329,11 @@
break;
}
- if (layer_->transform != layer_transform) {
+ if (layer_transform_ != layer_transform) {
geometry_changes_ |= kTransform;
- layer_->transform = layer_transform;
+ layer_transform_ = layer_transform;
}
+
return HWC2::Error::None;
}
diff --git a/sdm/libs/hwc2/hwc_layers.h b/sdm/libs/hwc2/hwc_layers.h
index bc3d84d..82bf466 100644
--- a/sdm/libs/hwc2/hwc_layers.h
+++ b/sdm/libs/hwc2/hwc_layers.h
@@ -61,6 +61,7 @@
uint32_t GetZ() const { return z_; }
hwc2_layer_t GetId() const { return id_; }
Layer *GetSDMLayer() { return layer_; }
+ void ResetPerFrameData();
HWC2::Error SetLayerBlendMode(HWC2::BlendMode mode);
HWC2::Error SetLayerBuffer(buffer_handle_t buffer, int32_t acquire_fence);
@@ -96,6 +97,8 @@
int ion_fd_ = -1;
HWCBufferAllocator *buffer_allocator_ = NULL;
int32_t dataspace_ = HAL_DATASPACE_UNKNOWN;
+ LayerTransform layer_transform_ = {};
+ LayerRect dst_rect_ = {};
// Composition requested by client(SF)
HWC2::Composition client_requested_ = HWC2::Composition::Device;