Merge "fix [3369743] SurfaceFlinger reads hardware composer hints before calling hwc.prepare()" into honeycomb

This commit is contained in:
Mathias Agopian 2011-01-20 12:25:33 -08:00 committed by Android (Google) Code Review
commit a9f54a77cd
1 changed files with 26 additions and 20 deletions

View File

@ -868,30 +868,36 @@ void SurfaceFlinger::composeSurfaces(const Region& dirty)
for (size_t i=0 ; i<count ; i++) {
const sp<LayerBase>& layer(layers[i]);
layer->setPerFrameData(&cur[i]);
if (cur[i].hints & HWC_HINT_CLEAR_FB) {
if (!(layer->needsBlending())) {
transparent.orSelf(layer->visibleRegionScreen);
}
}
}
err = hwc.prepare();
LOGE_IF(err, "HWComposer::prepare failed (%s)", strerror(-err));
}
/*
* clear the area of the FB that need to be transparent
*/
transparent.andSelf(dirty);
if (!transparent.isEmpty()) {
glClearColor(0,0,0,0);
Region::const_iterator it = transparent.begin();
Region::const_iterator const end = transparent.end();
const int32_t height = hw.getHeight();
while (it != end) {
const Rect& r(*it++);
const GLint sy = height - (r.top + r.height());
glScissor(r.left, sy, r.width(), r.height());
glClear(GL_COLOR_BUFFER_BIT);
if (err == NO_ERROR) {
for (size_t i=0 ; i<count ; i++) {
if (cur[i].hints & HWC_HINT_CLEAR_FB) {
const sp<LayerBase>& layer(layers[i]);
if (!(layer->needsBlending())) {
transparent.orSelf(layer->visibleRegionScreen);
}
}
}
/*
* clear the area of the FB that need to be transparent
*/
transparent.andSelf(dirty);
if (!transparent.isEmpty()) {
glClearColor(0,0,0,0);
Region::const_iterator it = transparent.begin();
Region::const_iterator const end = transparent.end();
const int32_t height = hw.getHeight();
while (it != end) {
const Rect& r(*it++);
const GLint sy = height - (r.top + r.height());
glScissor(r.left, sy, r.width(), r.height());
glClear(GL_COLOR_BUFFER_BIT);
}
}
}
}