BufferItem.cpp revision 9bad0d7e726e6b264c528a3dd13d0c58fd92c0e1
1289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza/*
2289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza * Copyright 2014 The Android Open Source Project
3289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza *
4289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza * Licensed under the Apache License, Version 2.0 (the "License");
5289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza * you may not use this file except in compliance with the License.
6289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza * You may obtain a copy of the License at
7289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza *
8289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza *      http://www.apache.org/licenses/LICENSE-2.0
9289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza *
10289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza * Unless required by applicable law or agreed to in writing, software
11289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza * distributed under the License is distributed on an "AS IS" BASIS,
12289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza * See the License for the specific language governing permissions and
14289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza * limitations under the License.
15289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza */
16289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
17289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza#include <gui/BufferItem.h>
18289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
19289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza#include <ui/Fence.h>
20289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza#include <ui/GraphicBuffer.h>
21289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
22289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza#include <system/window.h>
23289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
24289ade165e60b5f71734d30e535f16eb1f4313adDan Stozanamespace android {
25289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
26b1f30bae12a0df810a62f819ab3ac680b00768b9Colin Crosstemplate<typename T>
27b1f30bae12a0df810a62f819ab3ac680b00768b9Colin Crossstatic inline constexpr uint32_t low32(const T n) {
28b1f30bae12a0df810a62f819ab3ac680b00768b9Colin Cross    return static_cast<uint32_t>(static_cast<uint64_t>(n));
29b1f30bae12a0df810a62f819ab3ac680b00768b9Colin Cross}
30b1f30bae12a0df810a62f819ab3ac680b00768b9Colin Cross
31b1f30bae12a0df810a62f819ab3ac680b00768b9Colin Crosstemplate<typename T>
32b1f30bae12a0df810a62f819ab3ac680b00768b9Colin Crossstatic inline constexpr uint32_t high32(const T n) {
33b1f30bae12a0df810a62f819ab3ac680b00768b9Colin Cross    return static_cast<uint32_t>(static_cast<uint64_t>(n)>>32);
34b1f30bae12a0df810a62f819ab3ac680b00768b9Colin Cross}
35b1f30bae12a0df810a62f819ab3ac680b00768b9Colin Cross
36b1f30bae12a0df810a62f819ab3ac680b00768b9Colin Crosstemplate<typename T>
37b1f30bae12a0df810a62f819ab3ac680b00768b9Colin Crossstatic inline constexpr T to64(const uint32_t lo, const uint32_t hi) {
38b1f30bae12a0df810a62f819ab3ac680b00768b9Colin Cross    return static_cast<T>(static_cast<uint64_t>(hi)<<32 | lo);
39b1f30bae12a0df810a62f819ab3ac680b00768b9Colin Cross}
40b1f30bae12a0df810a62f819ab3ac680b00768b9Colin Cross
41289ade165e60b5f71734d30e535f16eb1f4313adDan StozaBufferItem::BufferItem() :
42ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos    mGraphicBuffer(NULL),
43ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos    mFence(NULL),
4460d6922a011fe18c111b8d30fb6ef1f655b6b15ePablo Ceballos    mCrop(Rect::INVALID_RECT),
45289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    mTransform(0),
46289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    mScalingMode(NATIVE_WINDOW_SCALING_MODE_FREEZE),
47289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    mTimestamp(0),
48289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    mIsAutoTimestamp(false),
4982c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala    mDataSpace(HAL_DATASPACE_UNKNOWN),
50289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    mFrameNumber(0),
51289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    mSlot(INVALID_BUFFER_SLOT),
52289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    mIsDroppable(false),
53289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    mAcquireCalled(false),
54ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos    mTransformToDisplayInverse(false),
55063121849890da78b1ad7fb96c54c795de5d1fd6Pablo Ceballos    mSurfaceDamage(),
56ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    mAutoRefresh(false),
5723b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos    mQueuedBuffer(true),
5823b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos    mIsStale(false) {
59289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza}
60289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
618dc55396fc9bc425b5e2c82e76a38080f2a655ffDan StozaBufferItem::~BufferItem() {}
628dc55396fc9bc425b5e2c82e76a38080f2a655ffDan Stoza
63eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stozatemplate <typename T>
64eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stozastatic void addAligned(size_t& size, T /* value */) {
65eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    size = FlattenableUtils::align<sizeof(T)>(size);
66eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    size += sizeof(T);
67eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza}
68eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza
69289ade165e60b5f71734d30e535f16eb1f4313adDan Stozasize_t BufferItem::getPodSize() const {
70eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    size_t size = 0;
71eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    addAligned(size, mCrop);
72eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    addAligned(size, mTransform);
73eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    addAligned(size, mScalingMode);
74b1f30bae12a0df810a62f819ab3ac680b00768b9Colin Cross    addAligned(size, low32(mTimestamp));
75b1f30bae12a0df810a62f819ab3ac680b00768b9Colin Cross    addAligned(size, high32(mTimestamp));
76eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    addAligned(size, mIsAutoTimestamp);
77eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    addAligned(size, mDataSpace);
78b1f30bae12a0df810a62f819ab3ac680b00768b9Colin Cross    addAligned(size, low32(mFrameNumber));
79b1f30bae12a0df810a62f819ab3ac680b00768b9Colin Cross    addAligned(size, high32(mFrameNumber));
80eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    addAligned(size, mSlot);
81eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    addAligned(size, mIsDroppable);
82eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    addAligned(size, mAcquireCalled);
83eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    addAligned(size, mTransformToDisplayInverse);
84bd3577ef5bae7d65e54bddc04f90b619330edb89Pablo Ceballos    addAligned(size, mAutoRefresh);
85bd3577ef5bae7d65e54bddc04f90b619330edb89Pablo Ceballos    addAligned(size, mQueuedBuffer);
86bd3577ef5bae7d65e54bddc04f90b619330edb89Pablo Ceballos    addAligned(size, mIsStale);
87eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    return size;
88289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza}
89289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
90289ade165e60b5f71734d30e535f16eb1f4313adDan Stozasize_t BufferItem::getFlattenedSize() const {
91eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    size_t size = sizeof(uint32_t); // Flags
92289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    if (mGraphicBuffer != 0) {
93eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza        size += mGraphicBuffer->getFlattenedSize();
940f056f080d4766523a396c6efb3ae224f287e9caBrian Anderson        size = FlattenableUtils::align<4>(size);
95289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    }
96289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    if (mFence != 0) {
97eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza        size += mFence->getFlattenedSize();
980f056f080d4766523a396c6efb3ae224f287e9caBrian Anderson        size = FlattenableUtils::align<4>(size);
99289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    }
100eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    size += mSurfaceDamage.getFlattenedSize();
1019bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter    size += mHdrMetadata.getFlattenedSize();
102eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    size = FlattenableUtils::align<8>(size);
103eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    return size + getPodSize();
104289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza}
105289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
106289ade165e60b5f71734d30e535f16eb1f4313adDan Stozasize_t BufferItem::getFdCount() const {
107eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    size_t count = 0;
108289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    if (mGraphicBuffer != 0) {
109eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza        count += mGraphicBuffer->getFdCount();
110289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    }
111289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    if (mFence != 0) {
112eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza        count += mFence->getFdCount();
113289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    }
114eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    return count;
115eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza}
116eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza
117eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stozatemplate <typename T>
118eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stozastatic void writeAligned(void*& buffer, size_t& size, T value) {
119eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    size -= FlattenableUtils::align<alignof(T)>(buffer);
120eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    FlattenableUtils::write(buffer, size, value);
121289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza}
122289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
123289ade165e60b5f71734d30e535f16eb1f4313adDan Stozastatus_t BufferItem::flatten(
124289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        void*& buffer, size_t& size, int*& fds, size_t& count) const {
125289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
126289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    // make sure we have enough space
127eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    if (size < BufferItem::getFlattenedSize()) {
128289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        return NO_MEMORY;
129289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    }
130289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
131289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    // content flags are stored first
132289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    uint32_t& flags = *static_cast<uint32_t*>(buffer);
133289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
134289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    // advance the pointer
135289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    FlattenableUtils::advance(buffer, size, sizeof(uint32_t));
136289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
137289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    flags = 0;
138289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    if (mGraphicBuffer != 0) {
139289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        status_t err = mGraphicBuffer->flatten(buffer, size, fds, count);
140289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        if (err) return err;
141289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        size -= FlattenableUtils::align<4>(buffer);
142289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        flags |= 1;
143289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    }
144289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    if (mFence != 0) {
145289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        status_t err = mFence->flatten(buffer, size, fds, count);
146289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        if (err) return err;
147289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        size -= FlattenableUtils::align<4>(buffer);
148289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        flags |= 2;
149289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    }
150eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza
1515065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza    status_t err = mSurfaceDamage.flatten(buffer, size);
1525065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza    if (err) return err;
153eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    FlattenableUtils::advance(buffer, size, mSurfaceDamage.getFlattenedSize());
154eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza
1559bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter    err = mHdrMetadata.flatten(buffer, size);
1569bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter    if (err) return err;
1579bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter    FlattenableUtils::advance(buffer, size, mHdrMetadata.getFlattenedSize());
1589bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter
159eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    // Check we still have enough space
160289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    if (size < getPodSize()) {
161289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        return NO_MEMORY;
162289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    }
163289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
164eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    writeAligned(buffer, size, mCrop);
165eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    writeAligned(buffer, size, mTransform);
166eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    writeAligned(buffer, size, mScalingMode);
167b1f30bae12a0df810a62f819ab3ac680b00768b9Colin Cross    writeAligned(buffer, size, low32(mTimestamp));
168b1f30bae12a0df810a62f819ab3ac680b00768b9Colin Cross    writeAligned(buffer, size, high32(mTimestamp));
169eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    writeAligned(buffer, size, mIsAutoTimestamp);
170eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    writeAligned(buffer, size, mDataSpace);
171b1f30bae12a0df810a62f819ab3ac680b00768b9Colin Cross    writeAligned(buffer, size, low32(mFrameNumber));
172b1f30bae12a0df810a62f819ab3ac680b00768b9Colin Cross    writeAligned(buffer, size, high32(mFrameNumber));
173eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    writeAligned(buffer, size, mSlot);
174eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    writeAligned(buffer, size, mIsDroppable);
175eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    writeAligned(buffer, size, mAcquireCalled);
176eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    writeAligned(buffer, size, mTransformToDisplayInverse);
177bd3577ef5bae7d65e54bddc04f90b619330edb89Pablo Ceballos    writeAligned(buffer, size, mAutoRefresh);
178bd3577ef5bae7d65e54bddc04f90b619330edb89Pablo Ceballos    writeAligned(buffer, size, mQueuedBuffer);
179bd3577ef5bae7d65e54bddc04f90b619330edb89Pablo Ceballos    writeAligned(buffer, size, mIsStale);
180289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
181289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    return NO_ERROR;
182289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza}
183289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
184eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stozatemplate <typename T>
185eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stozastatic void readAligned(const void*& buffer, size_t& size, T& value) {
186eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    size -= FlattenableUtils::align<alignof(T)>(buffer);
187eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    FlattenableUtils::read(buffer, size, value);
188eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza}
189eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza
190289ade165e60b5f71734d30e535f16eb1f4313adDan Stozastatus_t BufferItem::unflatten(
191289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        void const*& buffer, size_t& size, int const*& fds, size_t& count) {
192289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
193eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    if (size < sizeof(uint32_t)) {
194289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        return NO_MEMORY;
195eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    }
196289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
197289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    uint32_t flags = 0;
198289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    FlattenableUtils::read(buffer, size, flags);
199289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
200289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    if (flags & 1) {
201289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        mGraphicBuffer = new GraphicBuffer();
202289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        status_t err = mGraphicBuffer->unflatten(buffer, size, fds, count);
203289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        if (err) return err;
204289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        size -= FlattenableUtils::align<4>(buffer);
205289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    }
206289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
207289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    if (flags & 2) {
208289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        mFence = new Fence();
209289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        status_t err = mFence->unflatten(buffer, size, fds, count);
210289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        if (err) return err;
211289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        size -= FlattenableUtils::align<4>(buffer);
2123d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson
2133d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        mFenceTime = std::make_shared<FenceTime>(mFence);
214289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    }
215eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza
2165065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza    status_t err = mSurfaceDamage.unflatten(buffer, size);
2175065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza    if (err) return err;
218eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    FlattenableUtils::advance(buffer, size, mSurfaceDamage.getFlattenedSize());
219eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza
2209bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter    err = mHdrMetadata.unflatten(buffer, size);
2219bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter    if (err) return err;
2229bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter    FlattenableUtils::advance(buffer, size, mHdrMetadata.getFlattenedSize());
2239bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter
224eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    // Check we still have enough space
225289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    if (size < getPodSize()) {
226289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        return NO_MEMORY;
227289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    }
228289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
229b1f30bae12a0df810a62f819ab3ac680b00768b9Colin Cross    uint32_t timestampLo = 0, timestampHi = 0;
230b1f30bae12a0df810a62f819ab3ac680b00768b9Colin Cross    uint32_t frameNumberLo = 0, frameNumberHi = 0;
231b1f30bae12a0df810a62f819ab3ac680b00768b9Colin Cross
232eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    readAligned(buffer, size, mCrop);
233eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    readAligned(buffer, size, mTransform);
234eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    readAligned(buffer, size, mScalingMode);
235b1f30bae12a0df810a62f819ab3ac680b00768b9Colin Cross    readAligned(buffer, size, timestampLo);
236b1f30bae12a0df810a62f819ab3ac680b00768b9Colin Cross    readAligned(buffer, size, timestampHi);
237b1f30bae12a0df810a62f819ab3ac680b00768b9Colin Cross    mTimestamp = to64<int64_t>(timestampLo, timestampHi);
238eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    readAligned(buffer, size, mIsAutoTimestamp);
239eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    readAligned(buffer, size, mDataSpace);
240b1f30bae12a0df810a62f819ab3ac680b00768b9Colin Cross    readAligned(buffer, size, frameNumberLo);
241b1f30bae12a0df810a62f819ab3ac680b00768b9Colin Cross    readAligned(buffer, size, frameNumberHi);
242b1f30bae12a0df810a62f819ab3ac680b00768b9Colin Cross    mFrameNumber = to64<uint64_t>(frameNumberLo, frameNumberHi);
243eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    readAligned(buffer, size, mSlot);
244eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    readAligned(buffer, size, mIsDroppable);
245eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    readAligned(buffer, size, mAcquireCalled);
246eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    readAligned(buffer, size, mTransformToDisplayInverse);
247bd3577ef5bae7d65e54bddc04f90b619330edb89Pablo Ceballos    readAligned(buffer, size, mAutoRefresh);
248bd3577ef5bae7d65e54bddc04f90b619330edb89Pablo Ceballos    readAligned(buffer, size, mQueuedBuffer);
249bd3577ef5bae7d65e54bddc04f90b619330edb89Pablo Ceballos    readAligned(buffer, size, mIsStale);
250289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
251289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    return NO_ERROR;
252289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza}
253289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
254289ade165e60b5f71734d30e535f16eb1f4313adDan Stozaconst char* BufferItem::scalingModeName(uint32_t scalingMode) {
255289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    switch (scalingMode) {
256289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        case NATIVE_WINDOW_SCALING_MODE_FREEZE: return "FREEZE";
257289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        case NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW: return "SCALE_TO_WINDOW";
258289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        case NATIVE_WINDOW_SCALING_MODE_SCALE_CROP: return "SCALE_CROP";
259289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        default: return "Unknown";
260289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    }
261289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza}
262289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
263289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza} // namespace android
264