Merge "libgui: Fix CPU rendering on Surface"

This commit is contained in:
Dan Stoza 2015-04-22 00:07:51 +00:00 committed by Gerrit Code Review
commit e647dddebb
2 changed files with 11 additions and 9 deletions

View File

@ -298,12 +298,12 @@ private:
sp<GraphicBuffer> mPostedBuffer; sp<GraphicBuffer> mPostedBuffer;
bool mConnectedToCpu; bool mConnectedToCpu;
// In the lock/unlock context, this reflects the region that the producer // When a CPU producer is attached, this reflects the region that the
// wished to update and whether the Surface was able to copy the previous // producer wished to update as well as whether the Surface was able to copy
// buffer back to allow a partial update. // the previous buffer back to allow a partial update.
// //
// In the dequeue/queue context, this reflects the surface damage (the // When a non-CPU producer is attached, this reflects the surface damage
// damage since the last frame) passed in by the producer. // (the change since the previous frame) passed in by the producer.
Region mDirtyRegion; Region mDirtyRegion;
}; };

View File

@ -322,7 +322,7 @@ int Surface::queueBuffer(android_native_buffer_t* buffer, int fenceFd) {
mDataSpace, crop, mScalingMode, mTransform ^ mStickyTransform, mDataSpace, crop, mScalingMode, mTransform ^ mStickyTransform,
mSwapIntervalZero, fence, mStickyTransform); mSwapIntervalZero, fence, mStickyTransform);
if (mDirtyRegion.bounds() == Rect::INVALID_RECT) { if (mConnectedToCpu || mDirtyRegion.bounds() == Rect::INVALID_RECT) {
input.setSurfaceDamage(Region::INVALID_REGION); input.setSurfaceDamage(Region::INVALID_REGION);
} else { } else {
// The surface damage was specified using the OpenGL ES convention of // The surface damage was specified using the OpenGL ES convention of
@ -356,8 +356,10 @@ int Surface::queueBuffer(android_native_buffer_t* buffer, int fenceFd) {
mConsumerRunningBehind = (numPendingBuffers >= 2); mConsumerRunningBehind = (numPendingBuffers >= 2);
// Clear surface damage back to full-buffer if (!mConnectedToCpu) {
mDirtyRegion = Region::INVALID_REGION; // Clear surface damage back to full-buffer
mDirtyRegion = Region::INVALID_REGION;
}
return err; return err;
} }
@ -844,7 +846,7 @@ void Surface::setSurfaceDamage(android_native_rect_t* rects, size_t numRects) {
ALOGV("Surface::setSurfaceDamage"); ALOGV("Surface::setSurfaceDamage");
Mutex::Autolock lock(mMutex); Mutex::Autolock lock(mMutex);
if (numRects == 0) { if (mConnectedToCpu || numRects == 0) {
mDirtyRegion = Region::INVALID_REGION; mDirtyRegion = Region::INVALID_REGION;
return; return;
} }