am a8026d21: Stop using transparent region for computing visible regions

* commit 'a8026d21f3f2f09e3416cbd33c277fbd15d8cf4e':
  Stop using transparent region for computing visible regions
This commit is contained in:
Jesse Hall 2012-09-26 14:48:22 -07:00 committed by Android Git Automerger
commit 975424a767
3 changed files with 35 additions and 10 deletions

View File

@ -193,6 +193,12 @@ void LayerBase::setCoveredRegion(const Region& coveredRegion) {
this->coveredRegion = coveredRegion;
}
void LayerBase::setVisibleNonTransparentRegion(const Region&
setVisibleNonTransparentRegion) {
// always called from main thread
this->visibleNonTransparentRegion = setVisibleNonTransparentRegion;
}
uint32_t LayerBase::doTransaction(uint32_t flags)
{
const Layer::State& front(drawingState());

View File

@ -60,6 +60,7 @@ public:
// regions below are in window-manager space
Region visibleRegion;
Region coveredRegion;
Region visibleNonTransparentRegion;
int32_t sequence;
struct Geometry {
@ -110,7 +111,7 @@ public:
bool setSize(uint32_t w, uint32_t h);
bool setAlpha(uint8_t alpha);
bool setMatrix(const layer_state_t::matrix22_t& matrix);
bool setTransparentRegionHint(const Region& opaque);
bool setTransparentRegionHint(const Region& transparent);
bool setFlags(uint8_t flags, uint8_t mask);
bool setCrop(const Rect& crop);
bool setLayerStack(uint32_t layerStack);
@ -176,6 +177,13 @@ public:
*/
virtual void setCoveredRegion(const Region& coveredRegion);
/**
* setVisibleNonTransparentRegion - called when the visible and
* non-transparent region changes.
*/
virtual void setVisibleNonTransparentRegion(const Region&
visibleNonTransparentRegion);
/**
* latchBuffer - called each time the screen is redrawn and returns whether
* the visible regions need to be recomputed (this is a fairly heavy

View File

@ -919,9 +919,10 @@ void SurfaceFlinger::rebuildLayerStacks() {
const sp<LayerBase>& layer(currentLayers[i]);
const Layer::State& s(layer->drawingState());
if (s.layerStack == hw->getLayerStack()) {
Region visibleRegion(tr.transform(layer->visibleRegion));
visibleRegion.andSelf(bounds);
if (!visibleRegion.isEmpty()) {
Region drawRegion(tr.transform(
layer->visibleNonTransparentRegion));
drawRegion.andSelf(bounds);
if (!drawRegion.isEmpty()) {
layersSortedByZ.add(layer);
}
}
@ -1294,6 +1295,16 @@ void SurfaceFlinger::computeVisibleRegions(
*/
Region coveredRegion;
/*
* transparentRegion: area of a surface that is hinted to be completely
* transparent. This is only used to tell when the layer has no visible
* non-transparent regions and can be removed from the layer list. It
* does not affect the visibleRegion of this layer or any layers
* beneath it. The hint may not be correct if apps don't respect the
* SurfaceView restrictions (which, sadly, some don't).
*/
Region transparentRegion;
// handle hidden surfaces by setting the visible region to empty
if (CC_LIKELY(layer->isVisible())) {
@ -1303,21 +1314,19 @@ void SurfaceFlinger::computeVisibleRegions(
if (!visibleRegion.isEmpty()) {
// Remove the transparent area from the visible region
if (translucent) {
Region transparentRegionScreen;
const Transform tr(s.transform);
if (tr.transformed()) {
if (tr.preserveRects()) {
// transform the transparent region
transparentRegionScreen = tr.transform(s.transparentRegion);
transparentRegion = tr.transform(s.transparentRegion);
} else {
// transformation too complex, can't do the
// transparent region optimization.
transparentRegionScreen.clear();
transparentRegion.clear();
}
} else {
transparentRegionScreen = s.transparentRegion;
transparentRegion = s.transparentRegion;
}
visibleRegion.subtractSelf(transparentRegionScreen);
}
// compute the opaque region
@ -1373,9 +1382,11 @@ void SurfaceFlinger::computeVisibleRegions(
// Update aboveOpaqueLayers for next (lower) layer
aboveOpaqueLayers.orSelf(opaqueRegion);
// Store the visible region is screen space
// Store the visible region in screen space
layer->setVisibleRegion(visibleRegion);
layer->setCoveredRegion(coveredRegion);
layer->setVisibleNonTransparentRegion(
visibleRegion.subtract(transparentRegion));
}
outOpaqueRegion = aboveOpaqueLayers;