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:
parent
04075569b5
commit
f45c510009
@ -1500,6 +1500,28 @@ void SurfaceFlinger::doComposeSurfaces(const sp<const DisplayDevice>& hw, const
|
|||||||
drawWormhole(hw, region);
|
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,
|
void SurfaceFlinger::drawWormhole(const sp<const DisplayDevice>& hw,
|
||||||
|
Loading…
Reference in New Issue
Block a user