hwc: external: Add screen-fitting to external panel.
Screen fitting for out-of-bounds videos (with overlays) exists for primary
panel. Add this same support for external panels, so that GPU won't be needed
in panning use-cases.
Bug: 7313955
Change-Id: I274a821264d87098227b144752f4d0b89d342cd9
Signed-off-by: Iliyan Malchev <malchev@google.com>
diff --git a/libhwcomposer/hwc_video.cpp b/libhwcomposer/hwc_video.cpp
index 77c9328..aad2939 100644
--- a/libhwcomposer/hwc_video.cpp
+++ b/libhwcomposer/hwc_video.cpp
@@ -152,10 +152,8 @@
//Calculate the rect for primary based on whether the supplied position
//is within or outside bounds.
- const int fbWidth =
- ovutils::FrameBufferInfo::getInstance()->getWidth();
- const int fbHeight =
- ovutils::FrameBufferInfo::getInstance()->getHeight();
+ const int fbWidth = ctx->dpyAttr[HWC_DISPLAY_PRIMARY].xres;
+ const int fbHeight = ctx->dpyAttr[HWC_DISPLAY_PRIMARY].yres;
if( displayFrame.left < 0 ||
displayFrame.top < 0 ||
@@ -217,7 +215,26 @@
ovutils::PipeArgs pargs[ovutils::MAX_PIPES] = { parg, parg, parg };
ov.setSource(pargs, ovutils::OV_PIPE1);
+ int transform = layer->transform;
+ ovutils::eTransform orient =
+ static_cast<ovutils::eTransform>(transform);
+
hwc_rect_t sourceCrop = layer->sourceCrop;
+ hwc_rect_t displayFrame = layer->displayFrame;
+
+ //Calculate the rect for primary based on whether the supplied position
+ //is within or outside bounds.
+ const int fbWidth = ctx->dpyAttr[HWC_DISPLAY_EXTERNAL].xres;
+ const int fbHeight = ctx->dpyAttr[HWC_DISPLAY_EXTERNAL].yres;
+
+ if( displayFrame.left < 0 ||
+ displayFrame.top < 0 ||
+ displayFrame.right > fbWidth ||
+ displayFrame.bottom > fbHeight) {
+ calculate_crop_rects(sourceCrop, displayFrame, fbWidth, fbHeight,
+ transform);
+ }
+
// x,y,w,h
ovutils::Dim dcrop(sourceCrop.left, sourceCrop.top,
sourceCrop.right - sourceCrop.left,
@@ -225,17 +242,12 @@
//Only for External
ov.setCrop(dcrop, ovutils::OV_PIPE1);
- int transform = layer->transform;
- ovutils::eTransform orient =
- static_cast<ovutils::eTransform>(transform);
ov.setTransform(orient, ovutils::OV_PIPE1);
- ovutils::Dim dpos;
- hwc_rect_t displayFrame = layer->displayFrame;
- dpos.x = displayFrame.left;
- dpos.y = displayFrame.top;
- dpos.w = (displayFrame.right - displayFrame.left);
- dpos.h = (displayFrame.bottom - displayFrame.top);
+ ovutils::Dim dpos(displayFrame.left,
+ displayFrame.top,
+ (displayFrame.right - displayFrame.left),
+ (displayFrame.bottom - displayFrame.top));
//Only for External
ov.setPosition(dpos, ovutils::OV_PIPE1);