hwc: Fix framebuffer resolution for virtual display
Rely on content list to deduce width and height of frame buffer target.
In case of WFD/Screen Record/Screen cast, output buffer and framebuffer
are configured to different formats. In such cases, Panel resolution
reflects output buffer configuration and might not be same as that of
framebuffer target.
CRs-Fixed: 880367
Change-Id: I58b09a1053ce7625c5f7b08f1f943d6b16040ed2
diff --git a/sdm/libs/hwc/hwc_display.cpp b/sdm/libs/hwc/hwc_display.cpp
index ad4de0c..09aa779 100644
--- a/sdm/libs/hwc/hwc_display.cpp
+++ b/sdm/libs/hwc/hwc_display.cpp
@@ -55,25 +55,6 @@
}
}
-static void AdjustSourceResolution(uint32_t dst_width, uint32_t dst_height, uint32_t *src_width,
- uint32_t *src_height) {
- *src_height = (dst_width * (*src_height)) / (*src_width);
- *src_width = dst_width;
-}
-
-void HWCDisplay::GetDownscaleResolution(uint32_t primary_width, uint32_t primary_height,
- uint32_t *non_primary_width, uint32_t *non_primary_height) {
- uint32_t primary_area = primary_width * primary_height;
- uint32_t non_primary_area = (*non_primary_width) * (*non_primary_height);
-
- if (primary_area > non_primary_area) {
- if (primary_height > primary_width) {
- Swap(primary_height, primary_width);
- }
- AdjustSourceResolution(primary_width, primary_height, non_primary_width, non_primary_height);
- }
-}
-
HWCDisplay::HWCDisplay(CoreInterface *core_intf, hwc_procs_t const **hwc_procs, DisplayType type,
int id, bool needs_blit)
: core_intf_(core_intf), hwc_procs_(hwc_procs), type_(type), id_(id), needs_blit_(needs_blit) {
diff --git a/sdm/libs/hwc/hwc_display.h b/sdm/libs/hwc/hwc_display.h
index 1eab212..74cdc46 100644
--- a/sdm/libs/hwc/hwc_display.h
+++ b/sdm/libs/hwc/hwc_display.h
@@ -148,9 +148,6 @@
bool SingleLayerUpdating(uint32_t app_layer_count);
uint32_t SanitizeRefreshRate(uint32_t req_refresh_rate);
- static void GetDownscaleResolution(uint32_t primary_width, uint32_t primary_height,
- uint32_t *virtual_width, uint32_t *virtual_height);
-
enum {
INPUT_LAYER_DUMP,
OUTPUT_LAYER_DUMP,
diff --git a/sdm/libs/hwc/hwc_display_external.cpp b/sdm/libs/hwc/hwc_display_external.cpp
index 606227b..2e91750 100644
--- a/sdm/libs/hwc/hwc_display_external.cpp
+++ b/sdm/libs/hwc/hwc_display_external.cpp
@@ -168,5 +168,24 @@
return;
}
+static void AdjustSourceResolution(uint32_t dst_width, uint32_t dst_height, uint32_t *src_width,
+ uint32_t *src_height) {
+ *src_height = (dst_width * (*src_height)) / (*src_width);
+ *src_width = dst_width;
+}
+
+void HWCDisplayExternal::GetDownscaleResolution(uint32_t primary_width, uint32_t primary_height,
+ uint32_t *non_primary_width, uint32_t *non_primary_height) {
+ uint32_t primary_area = primary_width * primary_height;
+ uint32_t non_primary_area = (*non_primary_width) * (*non_primary_height);
+
+ if (primary_area > non_primary_area) {
+ if (primary_height > primary_width) {
+ Swap(primary_height, primary_width);
+ }
+ AdjustSourceResolution(primary_width, primary_height, non_primary_width, non_primary_height);
+ }
+}
+
} // namespace sdm
diff --git a/sdm/libs/hwc/hwc_display_external.h b/sdm/libs/hwc/hwc_display_external.h
index f6c5f42..ba00d4d 100644
--- a/sdm/libs/hwc/hwc_display_external.h
+++ b/sdm/libs/hwc/hwc_display_external.h
@@ -41,6 +41,8 @@
private:
HWCDisplayExternal(CoreInterface *core_intf, hwc_procs_t const **hwc_procs);
void ApplyScanAdjustment(hwc_rect_t *display_frame);
+ static void GetDownscaleResolution(uint32_t primary_width, uint32_t primary_height,
+ uint32_t *virtual_width, uint32_t *virtual_height);
};
} // namespace sdm
diff --git a/sdm/libs/hwc/hwc_display_virtual.cpp b/sdm/libs/hwc/hwc_display_virtual.cpp
index cd1f5ff..4dfa1ee 100644
--- a/sdm/libs/hwc/hwc_display_virtual.cpp
+++ b/sdm/libs/hwc/hwc_display_virtual.cpp
@@ -59,6 +59,7 @@
return status;
}
+ // TODO(user): Need to update resolution(and not aligned resolution) on writeback.
status = hwc_display_virtual->SetOutputSliceFromMetadata(content_list);
if (status) {
Destroy(hwc_display_virtual);
@@ -67,13 +68,17 @@
hwc_display_virtual->GetPanelResolution(&virtual_width, &virtual_height);
- int downscale_enabled = 0;
- HWCDebugHandler::Get()->GetProperty("sdm.debug.sde_downscale_virtual", &downscale_enabled);
- if (downscale_enabled) {
- GetDownscaleResolution(primary_width, primary_height, &virtual_width, &virtual_height);
+ if (content_list->numHwLayers < 1) {
+ Destroy(hwc_display_virtual);
+ return -1;
}
- status = hwc_display_virtual->SetFrameBufferResolution(virtual_width, virtual_height);
+ hwc_layer_1_t &fb_layer = content_list->hwLayers[content_list->numHwLayers-1];
+ int fb_width = fb_layer.displayFrame.right - fb_layer.displayFrame.left;
+ int fb_height = fb_layer.displayFrame.bottom - fb_layer.displayFrame.top;
+
+ status = hwc_display_virtual->SetFrameBufferResolution(fb_width, fb_height);
+
if (status) {
Destroy(hwc_display_virtual);
return status;