Merge "keep a list of visible sorted surfaces" into gingerbread
This commit is contained in:
committed by
Android (Google) Code Review
commit
025822a03a
@@ -521,6 +521,10 @@ void SurfaceFlinger::handleTransaction(uint32_t transactionFlags)
|
|||||||
{
|
{
|
||||||
Vector< sp<LayerBase> > ditchedLayers;
|
Vector< sp<LayerBase> > ditchedLayers;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Perform and commit the transaction
|
||||||
|
*/
|
||||||
|
|
||||||
{ // scope for the lock
|
{ // scope for the lock
|
||||||
Mutex::Autolock _l(mStateLock);
|
Mutex::Autolock _l(mStateLock);
|
||||||
const nsecs_t now = systemTime();
|
const nsecs_t now = systemTime();
|
||||||
@@ -528,9 +532,13 @@ void SurfaceFlinger::handleTransaction(uint32_t transactionFlags)
|
|||||||
handleTransactionLocked(transactionFlags, ditchedLayers);
|
handleTransactionLocked(transactionFlags, ditchedLayers);
|
||||||
mLastTransactionTime = systemTime() - now;
|
mLastTransactionTime = systemTime() - now;
|
||||||
mDebugInTransaction = 0;
|
mDebugInTransaction = 0;
|
||||||
|
// here the transaction has been committed
|
||||||
}
|
}
|
||||||
|
|
||||||
// do this without lock held
|
/*
|
||||||
|
* Clean-up all layers that went away
|
||||||
|
* (do this without the lock held)
|
||||||
|
*/
|
||||||
const size_t count = ditchedLayers.size();
|
const size_t count = ditchedLayers.size();
|
||||||
for (size_t i=0 ; i<count ; i++) {
|
for (size_t i=0 ; i<count ; i++) {
|
||||||
if (ditchedLayers[i] != 0) {
|
if (ditchedLayers[i] != 0) {
|
||||||
@@ -773,6 +781,19 @@ void SurfaceFlinger::handlePageFlip()
|
|||||||
if (visibleRegions) {
|
if (visibleRegions) {
|
||||||
Region opaqueRegion;
|
Region opaqueRegion;
|
||||||
computeVisibleRegions(currentLayers, mDirtyRegion, opaqueRegion);
|
computeVisibleRegions(currentLayers, mDirtyRegion, opaqueRegion);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* rebuild the visible layer list
|
||||||
|
*/
|
||||||
|
mVisibleLayersSortedByZ.clear();
|
||||||
|
const LayerVector& currentLayers(mDrawingState.layersSortedByZ);
|
||||||
|
size_t count = currentLayers.size();
|
||||||
|
mVisibleLayersSortedByZ.setCapacity(count);
|
||||||
|
for (size_t i=0 ; i<count ; i++) {
|
||||||
|
if (!currentLayers[i]->visibleRegionScreen.isEmpty())
|
||||||
|
mVisibleLayersSortedByZ.add(currentLayers[i]);
|
||||||
|
}
|
||||||
|
|
||||||
mWormholeRegion = screenRegion.subtract(opaqueRegion);
|
mWormholeRegion = screenRegion.subtract(opaqueRegion);
|
||||||
mVisibleRegionsDirty = false;
|
mVisibleRegionsDirty = false;
|
||||||
}
|
}
|
||||||
@@ -869,18 +890,13 @@ void SurfaceFlinger::composeSurfaces(const Region& dirty)
|
|||||||
// draw something...
|
// draw something...
|
||||||
drawWormhole();
|
drawWormhole();
|
||||||
}
|
}
|
||||||
const SurfaceFlinger& flinger(*this);
|
const Vector< sp<LayerBase> >& layers(mVisibleLayersSortedByZ);
|
||||||
const LayerVector& drawingLayers(mDrawingState.layersSortedByZ);
|
const size_t count = layers.size();
|
||||||
const size_t count = drawingLayers.size();
|
|
||||||
sp<LayerBase> const* const layers = drawingLayers.array();
|
|
||||||
for (size_t i=0 ; i<count ; ++i) {
|
for (size_t i=0 ; i<count ; ++i) {
|
||||||
const sp<LayerBase>& layer = layers[i];
|
const sp<LayerBase>& layer(layers[i]);
|
||||||
const Region& visibleRegion(layer->visibleRegionScreen);
|
const Region clip(dirty.intersect(layer->visibleRegionScreen));
|
||||||
if (!visibleRegion.isEmpty()) {
|
if (!clip.isEmpty()) {
|
||||||
const Region clip(dirty.intersect(visibleRegion));
|
layer->draw(clip);
|
||||||
if (!clip.isEmpty()) {
|
|
||||||
layer->draw(clip);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,9 +40,6 @@
|
|||||||
|
|
||||||
#include "MessageQueue.h"
|
#include "MessageQueue.h"
|
||||||
|
|
||||||
struct copybit_device_t;
|
|
||||||
struct overlay_device_t;
|
|
||||||
|
|
||||||
namespace android {
|
namespace android {
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
@@ -379,6 +376,8 @@ private:
|
|||||||
bool mFreezeDisplay;
|
bool mFreezeDisplay;
|
||||||
int32_t mFreezeCount;
|
int32_t mFreezeCount;
|
||||||
nsecs_t mFreezeDisplayTime;
|
nsecs_t mFreezeDisplayTime;
|
||||||
|
Vector< sp<LayerBase> > mVisibleLayersSortedByZ;
|
||||||
|
|
||||||
|
|
||||||
// don't use a lock for these, we don't care
|
// don't use a lock for these, we don't care
|
||||||
int mDebugRegion;
|
int mDebugRegion;
|
||||||
|
|||||||
Reference in New Issue
Block a user