From ce8e0baeff412f3581f39d0361156037386f4ecb Mon Sep 17 00:00:00 2001 From: Mathias Agopian Date: Tue, 30 Aug 2011 15:02:41 -0700 Subject: [PATCH] fix display artifacts in preview screen in timelapse video mode We were not updating the h/w composer state when the buffer size changed. We also didn't update the h/w composer state when the transformation matrix changed (which is related to the above issue, since it would probably change when the buffer size changes). Also moved updating the crop to setGeometry(), since we decided that the "crop" change requires the GEOMETRY_CHANGED flag (ie: not need to do this every frame) Bug: 5238473 Change-Id: Ia7b47e145b48581b568d89d9aa2c14ff778be862 --- services/surfaceflinger/Layer.cpp | 61 +++++++++++++++++---------- services/surfaceflinger/LayerBase.cpp | 9 ++-- 2 files changed, 43 insertions(+), 27 deletions(-) diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index f8925b840f7a9..edbc7b0235038 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -212,6 +212,24 @@ void Layer::setGeometry(hwc_layer_t* hwcl) } else { hwcl->transform = finalTransform; } + + if (isCropped()) { + hwcl->sourceCrop.left = mCurrentCrop.left; + hwcl->sourceCrop.top = mCurrentCrop.top; + hwcl->sourceCrop.right = mCurrentCrop.right; + hwcl->sourceCrop.bottom = mCurrentCrop.bottom; + } else { + const sp& buffer(mActiveBuffer); + hwcl->sourceCrop.left = 0; + hwcl->sourceCrop.top = 0; + if (buffer != NULL) { + hwcl->sourceCrop.right = buffer->width; + hwcl->sourceCrop.bottom = buffer->height; + } else { + hwcl->sourceCrop.right = mTransformedBounds.width(); + hwcl->sourceCrop.bottom = mTransformedBounds.height(); + } + } } void Layer::setPerFrameData(hwc_layer_t* hwcl) { @@ -225,23 +243,6 @@ void Layer::setPerFrameData(hwc_layer_t* hwcl) { } else { hwcl->handle = buffer->handle; } - - if (isCropped()) { - hwcl->sourceCrop.left = mCurrentCrop.left; - hwcl->sourceCrop.top = mCurrentCrop.top; - hwcl->sourceCrop.right = mCurrentCrop.right; - hwcl->sourceCrop.bottom = mCurrentCrop.bottom; - } else { - hwcl->sourceCrop.left = 0; - hwcl->sourceCrop.top = 0; - if (buffer != NULL) { - hwcl->sourceCrop.right = buffer->width; - hwcl->sourceCrop.bottom = buffer->height; - } else { - hwcl->sourceCrop.right = mTransformedBounds.width(); - hwcl->sourceCrop.bottom = mTransformedBounds.height(); - } - } } void Layer::onDraw(const Region& clip) const @@ -416,8 +417,7 @@ void Layer::lockPageFlip(bool& recomputeVisibleRegions) return; } - mActiveBuffer = mSurfaceTexture->getCurrentBuffer(); - mSurfaceTexture->getTransformMatrix(mTextureMatrix); + sp newFrontBuffer(mSurfaceTexture->getCurrentBuffer()); const Rect crop(mSurfaceTexture->getCurrentCrop()); const uint32_t transform(mSurfaceTexture->getCurrentTransform()); @@ -432,7 +432,23 @@ void Layer::lockPageFlip(bool& recomputeVisibleRegions) mFlinger->invalidateHwcGeometry(); } - mCurrentOpacity = getOpacityForFormat(mActiveBuffer->format); + GLfloat textureMatrix[16]; + mSurfaceTexture->getTransformMatrix(textureMatrix); + if (memcmp(textureMatrix, mTextureMatrix, sizeof(textureMatrix))) { + memcpy(mTextureMatrix, textureMatrix, sizeof(textureMatrix)); + mFlinger->invalidateHwcGeometry(); + } + + uint32_t bufWidth = newFrontBuffer->getWidth(); + uint32_t bufHeight = newFrontBuffer->getHeight(); + if (mActiveBuffer != NULL) { + if (bufWidth != uint32_t(mActiveBuffer->width) || + bufHeight != uint32_t(mActiveBuffer->height)) { + mFlinger->invalidateHwcGeometry(); + } + } + + mCurrentOpacity = getOpacityForFormat(newFrontBuffer->format); if (oldOpacity != isOpaque()) { recomputeVisibleRegions = true; } @@ -446,15 +462,14 @@ void Layer::lockPageFlip(bool& recomputeVisibleRegions) // FIXME: mPostedDirtyRegion = dirty & bounds mPostedDirtyRegion.set(front.w, front.h); + // update active buffer + mActiveBuffer = newFrontBuffer; if ((front.w != front.requested_w) || (front.h != front.requested_h)) { // check that we received a buffer of the right size // (Take the buffer's orientation into account) - sp newFrontBuffer(mActiveBuffer); - uint32_t bufWidth = newFrontBuffer->getWidth(); - uint32_t bufHeight = newFrontBuffer->getHeight(); if (mCurrentTransform & Transform::ROT_90) { swap(bufWidth, bufHeight); } diff --git a/services/surfaceflinger/LayerBase.cpp b/services/surfaceflinger/LayerBase.cpp index 4cc245a11076e..6a5c8e522e62c 100644 --- a/services/surfaceflinger/LayerBase.cpp +++ b/services/surfaceflinger/LayerBase.cpp @@ -335,15 +335,16 @@ void LayerBase::setGeometry(hwc_layer_t* hwcl) reinterpret_cast( visibleRegionScreen.getArray( &hwcl->visibleRegionScreen.numRects)); + + hwcl->sourceCrop.left = 0; + hwcl->sourceCrop.top = 0; + hwcl->sourceCrop.right = mTransformedBounds.width(); + hwcl->sourceCrop.bottom = mTransformedBounds.height(); } void LayerBase::setPerFrameData(hwc_layer_t* hwcl) { hwcl->compositionType = HWC_FRAMEBUFFER; hwcl->handle = NULL; - hwcl->sourceCrop.left = 0; - hwcl->sourceCrop.top = 0; - hwcl->sourceCrop.right = mTransformedBounds.width(); - hwcl->sourceCrop.bottom = mTransformedBounds.height(); } void LayerBase::setFiltering(bool filtering)