SurfaceFlinger: don't always set HWC_GEOM_CHGD
This change fixes a bug in SurfaceFlinger that caused the HWC_GEOMETRY_CHANGED flag to be set every flip. Change-Id: I4f395a2883bcbb53b23b3d14941aff108739c9f0 Bug: 7234237
This commit is contained in:
parent
cb094a783f
commit
a4310c8be2
@ -940,7 +940,7 @@ void SurfaceFlinger::setUpHWComposer() {
|
|||||||
HWComposer& hwc(getHwComposer());
|
HWComposer& hwc(getHwComposer());
|
||||||
if (hwc.initCheck() == NO_ERROR) {
|
if (hwc.initCheck() == NO_ERROR) {
|
||||||
// build the h/w work list
|
// build the h/w work list
|
||||||
const bool workListsDirty = mHwWorkListDirty;
|
if (CC_UNLIKELY(mHwWorkListDirty)) {
|
||||||
mHwWorkListDirty = false;
|
mHwWorkListDirty = false;
|
||||||
for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
|
for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
|
||||||
sp<const DisplayDevice> hw(mDisplays[dpy]);
|
sp<const DisplayDevice> hw(mDisplays[dpy]);
|
||||||
@ -949,28 +949,42 @@ void SurfaceFlinger::setUpHWComposer() {
|
|||||||
const Vector< sp<LayerBase> >& currentLayers(
|
const Vector< sp<LayerBase> >& currentLayers(
|
||||||
hw->getVisibleLayersSortedByZ());
|
hw->getVisibleLayersSortedByZ());
|
||||||
const size_t count = currentLayers.size();
|
const size_t count = currentLayers.size();
|
||||||
if (hwc.createWorkList(id, count) >= 0) {
|
if (hwc.createWorkList(id, count) == NO_ERROR) {
|
||||||
HWComposer::LayerListIterator cur = hwc.begin(id);
|
HWComposer::LayerListIterator cur = hwc.begin(id);
|
||||||
const HWComposer::LayerListIterator end = hwc.end(id);
|
const HWComposer::LayerListIterator end = hwc.end(id);
|
||||||
for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
|
for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
|
||||||
const sp<LayerBase>& layer(currentLayers[i]);
|
const sp<LayerBase>& layer(currentLayers[i]);
|
||||||
|
|
||||||
if (CC_UNLIKELY(workListsDirty)) {
|
|
||||||
layer->setGeometry(hw, *cur);
|
layer->setGeometry(hw, *cur);
|
||||||
if (mDebugDisableHWC || mDebugRegion) {
|
if (mDebugDisableHWC || mDebugRegion) {
|
||||||
cur->setSkip(true);
|
cur->setSkip(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// set the per-frame data
|
||||||
|
for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
|
||||||
|
sp<const DisplayDevice> hw(mDisplays[dpy]);
|
||||||
|
const int32_t id = hw->getHwcDisplayId();
|
||||||
|
if (id >= 0) {
|
||||||
|
const Vector< sp<LayerBase> >& currentLayers(
|
||||||
|
hw->getVisibleLayersSortedByZ());
|
||||||
|
const size_t count = currentLayers.size();
|
||||||
|
HWComposer::LayerListIterator cur = hwc.begin(id);
|
||||||
|
const HWComposer::LayerListIterator end = hwc.end(id);
|
||||||
|
for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
|
||||||
/*
|
/*
|
||||||
* update the per-frame h/w composer data for each layer
|
* update the per-frame h/w composer data for each layer
|
||||||
* and build the transparent region of the FB
|
* and build the transparent region of the FB
|
||||||
*/
|
*/
|
||||||
|
const sp<LayerBase>& layer(currentLayers[i]);
|
||||||
layer->setPerFrameData(hw, *cur);
|
layer->setPerFrameData(hw, *cur);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
status_t err = hwc.prepare();
|
status_t err = hwc.prepare();
|
||||||
ALOGE_IF(err, "HWComposer::prepare failed (%s)", strerror(-err));
|
ALOGE_IF(err, "HWComposer::prepare failed (%s)", strerror(-err));
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user