summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJesse Hall <jessehall@google.com>2012-10-11 15:06:07 -0700
committerGerrit Code Review <noreply-gerritcodereview@google.com>2012-10-11 15:06:07 -0700
commite3a669656ae891a510ccbd73d26559a20f5f466b (patch)
tree96cafcc67e50b5e35ba7f6d8fd18305753bf836e
parentf29b86b26aad5f50c2cae829bcce55fbb9fd8f8b (diff)
parent0de75f3f53ad2e3eb4c6820446c5175191b6631a (diff)
downloadnative-e3a669656ae891a510ccbd73d26559a20f5f466b.tar.gz
Merge "Stop using transparent region for computing visible regions (DO NOT MERGE)"
-rw-r--r--services/surfaceflinger/LayerBase.cpp6
-rw-r--r--services/surfaceflinger/LayerBase.h10
-rw-r--r--services/surfaceflinger/SurfaceFlinger.cpp16
3 files changed, 29 insertions, 3 deletions
diff --git a/services/surfaceflinger/LayerBase.cpp b/services/surfaceflinger/LayerBase.cpp
index 16bac8f79c..a4da92f2c4 100644
--- a/services/surfaceflinger/LayerBase.cpp
+++ b/services/surfaceflinger/LayerBase.cpp
@@ -196,6 +196,12 @@ void LayerBase::setCoveredRegion(const Region& coveredRegion) {
coveredRegionScreen = coveredRegion;
}
+void LayerBase::setVisibleNonTransparentRegion(const Region&
+ visibleNonTransparentRegion) {
+ // always called from main thread
+ this->visibleNonTransparentRegion = visibleNonTransparentRegion;
+}
+
uint32_t LayerBase::doTransaction(uint32_t flags)
{
const Layer::State& front(drawingState());
diff --git a/services/surfaceflinger/LayerBase.h b/services/surfaceflinger/LayerBase.h
index c547a40725..94d074abf7 100644
--- a/services/surfaceflinger/LayerBase.h
+++ b/services/surfaceflinger/LayerBase.h
@@ -63,6 +63,7 @@ public:
Region visibleRegionScreen;
Region transparentRegionScreen;
Region coveredRegionScreen;
+ Region visibleNonTransparentRegion;
int32_t sequence;
struct Geometry {
@@ -98,7 +99,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);
@@ -159,6 +160,13 @@ public:
virtual void setCoveredRegion(const Region& coveredRegion);
/**
+ * setVisibleNonTransparentRegion - called when the visible and
+ * non-transparent region changes.
+ */
+ virtual void setVisibleNonTransparentRegion(const Region&
+ visibleNonTransparentRegion);
+
+ /**
* validateVisibility - cache a bunch of things
*/
virtual void validateVisibility(const Transform& globalTransform);
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 51fcce43e6..859db58bcb 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -620,6 +620,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(!(s.flags & ISurfaceComposer::eLayerHidden) && s.alpha)) {
@@ -630,7 +640,7 @@ void SurfaceFlinger::computeVisibleRegions(
if (!visibleRegion.isEmpty()) {
// Remove the transparent area from the visible region
if (translucent) {
- visibleRegion.subtractSelf(layer->transparentRegionScreen);
+ transparentRegion = layer->transparentRegionScreen;
}
// compute the opaque region
@@ -689,6 +699,8 @@ void SurfaceFlinger::computeVisibleRegions(
// Store the visible region is screen space
layer->setVisibleRegion(visibleRegion);
layer->setCoveredRegion(coveredRegion);
+ layer->setVisibleNonTransparentRegion(
+ visibleRegion.subtract(transparentRegion));
// If a secure layer is partially visible, lock-down the screen!
if (layer->isSecure() && !visibleRegion.isEmpty()) {
@@ -740,7 +752,7 @@ void SurfaceFlinger::handlePageFlip()
mVisibleLayersSortedByZ.clear();
mVisibleLayersSortedByZ.setCapacity(count);
for (size_t i=0 ; i<count ; i++) {
- if (!currentLayers[i]->visibleRegionScreen.isEmpty())
+ if (!currentLayers[i]->visibleNonTransparentRegion.isEmpty())
mVisibleLayersSortedByZ.add(currentLayers[i]);
}