summaryrefslogtreecommitdiff
path: root/services/surfaceflinger/Layer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'services/surfaceflinger/Layer.cpp')
-rw-r--r--services/surfaceflinger/Layer.cpp53
1 files changed, 34 insertions, 19 deletions
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp
index f8925b840f7a..edbc7b023503 100644
--- a/services/surfaceflinger/Layer.cpp
+++ b/services/surfaceflinger/Layer.cpp
@@ -212,19 +212,6 @@ void Layer::setGeometry(hwc_layer_t* hwcl)
} else {
hwcl->transform = finalTransform;
}
-}
-
-void Layer::setPerFrameData(hwc_layer_t* hwcl) {
- const sp<GraphicBuffer>& buffer(mActiveBuffer);
- if (buffer == NULL) {
- // this can happen if the client never drew into this layer yet,
- // or if we ran out of memory. In that case, don't let
- // HWC handle it.
- hwcl->flags |= HWC_SKIP_LAYER;
- hwcl->handle = NULL;
- } else {
- hwcl->handle = buffer->handle;
- }
if (isCropped()) {
hwcl->sourceCrop.left = mCurrentCrop.left;
@@ -232,6 +219,7 @@ void Layer::setPerFrameData(hwc_layer_t* hwcl) {
hwcl->sourceCrop.right = mCurrentCrop.right;
hwcl->sourceCrop.bottom = mCurrentCrop.bottom;
} else {
+ const sp<GraphicBuffer>& buffer(mActiveBuffer);
hwcl->sourceCrop.left = 0;
hwcl->sourceCrop.top = 0;
if (buffer != NULL) {
@@ -244,6 +232,19 @@ void Layer::setPerFrameData(hwc_layer_t* hwcl) {
}
}
+void Layer::setPerFrameData(hwc_layer_t* hwcl) {
+ const sp<GraphicBuffer>& buffer(mActiveBuffer);
+ if (buffer == NULL) {
+ // this can happen if the client never drew into this layer yet,
+ // or if we ran out of memory. In that case, don't let
+ // HWC handle it.
+ hwcl->flags |= HWC_SKIP_LAYER;
+ hwcl->handle = NULL;
+ } else {
+ hwcl->handle = buffer->handle;
+ }
+}
+
void Layer::onDraw(const Region& clip) const
{
if (CC_UNLIKELY(mActiveBuffer == 0)) {
@@ -416,8 +417,7 @@ void Layer::lockPageFlip(bool& recomputeVisibleRegions)
return;
}
- mActiveBuffer = mSurfaceTexture->getCurrentBuffer();
- mSurfaceTexture->getTransformMatrix(mTextureMatrix);
+ sp<GraphicBuffer> 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<GraphicBuffer> newFrontBuffer(mActiveBuffer);
- uint32_t bufWidth = newFrontBuffer->getWidth();
- uint32_t bufHeight = newFrontBuffer->getHeight();
if (mCurrentTransform & Transform::ROT_90) {
swap(bufWidth, bufHeight);
}