sometimes we would incorrectly scale the content of a surface
this would happen when a resize was pending (ie: we have received and processed a resize transaction but have not received a buffer with the right size) and a new transaction came in that didn't involve a resize, for instance a translate-only transaction. in this case, we would incorrectly update the drawing state with the pending size, eventhough we still don't have a buffer for it. the solution is quite simple, we never allow the size to propagate from current to drawing state during the regular transaction processing (unless we are in fixed-size mode -- meaning we don't need to have a matching size buffer), this propagation happens later once we receive the buffer. Bug: 6624163 Change-Id: I11a97e4b88a7f3a0571ddcfe99c86cb04ce01a4d
This commit is contained in:
parent
ba43e0a1fa
commit
0cd545f142
@ -469,18 +469,31 @@ uint32_t Layer::doTransaction(uint32_t flags)
|
|||||||
front.requested.crop.getWidth(),
|
front.requested.crop.getWidth(),
|
||||||
front.requested.crop.getHeight());
|
front.requested.crop.getHeight());
|
||||||
|
|
||||||
if (!isFixedSize()) {
|
|
||||||
// this will make sure LayerBase::doTransaction doesn't update
|
|
||||||
// the drawing state's geometry
|
|
||||||
flags |= eDontUpdateGeometryState;
|
|
||||||
}
|
|
||||||
|
|
||||||
// record the new size, form this point on, when the client request
|
// record the new size, form this point on, when the client request
|
||||||
// a buffer, it'll get the new size.
|
// a buffer, it'll get the new size.
|
||||||
mSurfaceTexture->setDefaultBufferSize(
|
mSurfaceTexture->setDefaultBufferSize(
|
||||||
temp.requested.w, temp.requested.h);
|
temp.requested.w, temp.requested.h);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!isFixedSize()) {
|
||||||
|
|
||||||
|
const bool resizePending = (temp.requested.w != temp.active.w) ||
|
||||||
|
(temp.requested.h != temp.active.h);
|
||||||
|
|
||||||
|
if (resizePending) {
|
||||||
|
// don't let LayerBase::doTransaction update the drawing state
|
||||||
|
// if we have a pending resize, unless we are in fixed-size mode.
|
||||||
|
// the drawing state will be updated only once we receive a buffer
|
||||||
|
// with the correct size.
|
||||||
|
//
|
||||||
|
// in particular, we want to make sure the clip (which is part
|
||||||
|
// of the geometry state) is latched together with the size but is
|
||||||
|
// latched immediately when no resizing is involved.
|
||||||
|
|
||||||
|
flags |= eDontUpdateGeometryState;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return LayerBase::doTransaction(flags);
|
return LayerBase::doTransaction(flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user