Skip to content

Commit

Permalink
Fix alignment/sizing issues in the marshalling code for GraphicBuffer…
Browse files Browse the repository at this point in the history
…s and Fences

IGraphicBufferConsumer was non-functioning due to broken flattening/unflattening
assumptions, as well as general alignment issues under ARM. Also, some size calculations
for buffer Fences reported wrong values. This fix re-enables cross-process buffer
Producer/Consumer communication.

Change-Id: I1a0fb42ad28ac10e7c46f7f651dd331ca91ecf05
Signed-off-by: Ricardo Mendoza <[email protected]>
Signed-off-by: Ondrej Kubik <[email protected]>
  • Loading branch information
Ricardo Mendoza authored and mariogrip committed Nov 2, 2015
1 parent 50f14f2 commit fc4194e
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 8 deletions.
18 changes: 13 additions & 5 deletions libs/gui/IGraphicBufferConsumer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,11 +53,11 @@ size_t IGraphicBufferConsumer::BufferItem::getPodSize() const {
sizeof(mScalingMode) +
sizeof(mTimestamp) +
sizeof(mIsAutoTimestamp) +
sizeof(mFrameNumber) +
FlattenableUtils::align<4>(sizeof(mFrameNumber)) +
sizeof(mBuf) +
sizeof(mIsDroppable) +
sizeof(mAcquireCalled) +
sizeof(mTransformToDisplayInverse);
FlattenableUtils::align<4>(sizeof(mIsDroppable)) +
FlattenableUtils::align<4>(sizeof(mAcquireCalled)) +
FlattenableUtils::align<4>(sizeof(mTransformToDisplayInverse));
return c;
}

Expand Down Expand Up @@ -133,11 +133,15 @@ status_t IGraphicBufferConsumer::BufferItem::flatten(
FlattenableUtils::write(buffer, size, mScalingMode);
FlattenableUtils::write(buffer, size, mTimestamp);
writeBoolAsInt(buffer, size, mIsAutoTimestamp);
size -= FlattenableUtils::align<4>(buffer);
FlattenableUtils::write(buffer, size, mFrameNumber);
FlattenableUtils::write(buffer, size, mBuf);
writeBoolAsInt(buffer, size, mIsDroppable);
size -= FlattenableUtils::align<4>(buffer);
writeBoolAsInt(buffer, size, mAcquireCalled);
size -= FlattenableUtils::align<4>(buffer);
writeBoolAsInt(buffer, size, mTransformToDisplayInverse);
size -= FlattenableUtils::align<4>(buffer);

return NO_ERROR;
}
Expand All @@ -149,7 +153,7 @@ status_t IGraphicBufferConsumer::BufferItem::unflatten(
return NO_MEMORY;

uint32_t flags = 0;
FlattenableUtils::read(buffer, size, flags);
FlattenableUtils::read<uint32_t>(buffer, size, flags);

if (flags & 1) {
mGraphicBuffer = new GraphicBuffer();
Expand All @@ -175,11 +179,15 @@ status_t IGraphicBufferConsumer::BufferItem::unflatten(
FlattenableUtils::read(buffer, size, mScalingMode);
FlattenableUtils::read(buffer, size, mTimestamp);
mIsAutoTimestamp = readBoolFromInt(buffer, size);
size -= FlattenableUtils::align<4>(buffer);
FlattenableUtils::read(buffer, size, mFrameNumber);
FlattenableUtils::read(buffer, size, mBuf);
mIsDroppable = readBoolFromInt(buffer, size);
size -= FlattenableUtils::align<4>(buffer);
mAcquireCalled = readBoolFromInt(buffer, size);
size -= FlattenableUtils::align<4>(buffer);
mTransformToDisplayInverse = readBoolFromInt(buffer, size);
size -= FlattenableUtils::align<4>(buffer);

return NO_ERROR;
}
Expand Down
2 changes: 1 addition & 1 deletion libs/ui/Fence.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ nsecs_t Fence::getSignalTime() const {
}

size_t Fence::getFlattenedSize() const {
return 1;
return sizeof(getFdCount());
}

size_t Fence::getFdCount() const {
Expand Down
4 changes: 2 additions & 2 deletions libs/ui/GraphicBuffer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -323,7 +323,7 @@ status_t GraphicBuffer::flatten(void*& buffer, size_t& size, int*& fds, size_t&
memcpy(&buf[10], h->data + h->numFds, h->numInts*sizeof(int));
}

buffer = reinterpret_cast<void*>(static_cast<int*>(buffer) + sizeNeeded);
buffer = reinterpret_cast<void*>(static_cast<int*>(buffer + sizeNeeded));
size -= sizeNeeded;
if (handle) {
fds += handle->numFds;
Expand Down Expand Up @@ -404,7 +404,7 @@ status_t GraphicBuffer::unflatten(
}
}

buffer = reinterpret_cast<void const*>(static_cast<int const*>(buffer) + sizeNeeded);
buffer = reinterpret_cast<void const*>(static_cast<int const*>(buffer + sizeNeeded));
size -= sizeNeeded;
fds += numFds;
count -= numFds;
Expand Down

0 comments on commit fc4194e

Please sign in to comment.