partially implement external display clipping

we perform external display clipping only on the GL
side (ie: not done on the h/w composer side, which is
harder and would be too risky). in practice this means
that WFD will be clipped properly, while HDMI *may* or
may not depending on how hwc is used.

Bug: 7149437
Change-Id: I92d4d04220db72b6ffb134c7fa7a93af569723a5
This commit is contained in:
Mathias Agopian 2012-10-24 16:29:17 -07:00
parent 04075569b5
commit f45c510009
1 changed files with 25 additions and 0 deletions

View File

@ -1500,6 +1500,28 @@ void SurfaceFlinger::doComposeSurfaces(const sp<const DisplayDevice>& hw, const
drawWormhole(hw, region);
}
}
if (hw->getDisplayType() >= DisplayDevice::DISPLAY_EXTERNAL) {
// TODO: just to be on the safe side, we don't set the
// scissor on the main display. It should never be needed
// anyways (though in theory it could since the API allows it).
const Rect& bounds(hw->getBounds());
const Transform& tr(hw->getTransform());
const Rect scissor(tr.transform(hw->getViewport()));
if (scissor != bounds) {
// scissor doesn't match the screen's dimensions, so we
// need to clear everything outside of it and enable
// the GL scissor so we don't draw anything where we shouldn't
const GLint height = hw->getHeight();
glScissor(scissor.left, height - scissor.bottom,
scissor.getWidth(), scissor.getHeight());
// clear everything unscissored
glClearColor(0, 0, 0, 0);
glClear(GL_COLOR_BUFFER_BIT);
// enable scissor for this frame
glEnable(GL_SCISSOR_TEST);
}
}
}
/*
@ -1552,6 +1574,9 @@ void SurfaceFlinger::doComposeSurfaces(const sp<const DisplayDevice>& hw, const
}
}
}
// disable scissor at the end of the frame
glDisable(GL_SCISSOR_TEST);
}
void SurfaceFlinger::drawWormhole(const sp<const DisplayDevice>& hw,