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),
585c6e46353676b4fd647317fde28c413d8ffe3565Chia-I Wu    mIsStale(false),
595c6e46353676b4fd647317fde28c413d8ffe3565Chia-I Wu    mApi(0) {
60289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza}
61289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
628dc55396fc9bc425b5e2c82e76a38080f2a655ffDan StozaBufferItem::~BufferItem() {}
638dc55396fc9bc425b5e2c82e76a38080f2a655ffDan Stoza
64eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stozatemplate <typename T>
65eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stozastatic void addAligned(size_t& size, T /* value */) {
66eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    size = FlattenableUtils::align<sizeof(T)>(size);
67eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    size += sizeof(T);
68eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza}
69eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza
70289ade165e60b5f71734d30e535f16eb1f4313adDan Stozasize_t BufferItem::getPodSize() const {
71eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    size_t size = 0;
72eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    addAligned(size, mCrop);
73eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    addAligned(size, mTransform);
74eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    addAligned(size, mScalingMode);
75b1f30bae12a0df810a62f819ab3ac680b00768b9Colin Cross    addAligned(size, low32(mTimestamp));
76b1f30bae12a0df810a62f819ab3ac680b00768b9Colin Cross    addAligned(size, high32(mTimestamp));
77eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    addAligned(size, mIsAutoTimestamp);
78eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    addAligned(size, mDataSpace);
79b1f30bae12a0df810a62f819ab3ac680b00768b9Colin Cross    addAligned(size, low32(mFrameNumber));
80b1f30bae12a0df810a62f819ab3ac680b00768b9Colin Cross    addAligned(size, high32(mFrameNumber));
81eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    addAligned(size, mSlot);
82eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    addAligned(size, mIsDroppable);
83eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    addAligned(size, mAcquireCalled);
84eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    addAligned(size, mTransformToDisplayInverse);
85bd3577ef5bae7d65e54bddc04f90b619330edb89Pablo Ceballos    addAligned(size, mAutoRefresh);
86bd3577ef5bae7d65e54bddc04f90b619330edb89Pablo Ceballos    addAligned(size, mQueuedBuffer);
87bd3577ef5bae7d65e54bddc04f90b619330edb89Pablo Ceballos    addAligned(size, mIsStale);
885c6e46353676b4fd647317fde28c413d8ffe3565Chia-I Wu    addAligned(size, mApi);
89eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    return size;
90289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza}
91289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
92289ade165e60b5f71734d30e535f16eb1f4313adDan Stozasize_t BufferItem::getFlattenedSize() const {
93eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    size_t size = sizeof(uint32_t); // Flags
94289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    if (mGraphicBuffer != 0) {
95eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza        size += mGraphicBuffer->getFlattenedSize();
960f056f080d4766523a396c6efb3ae224f287e9caBrian Anderson        size = FlattenableUtils::align<4>(size);
97289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    }
98289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    if (mFence != 0) {
99eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza        size += mFence->getFlattenedSize();
1000f056f080d4766523a396c6efb3ae224f287e9caBrian Anderson        size = FlattenableUtils::align<4>(size);
101289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    }
102eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    size += mSurfaceDamage.getFlattenedSize();
1039bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter    size += mHdrMetadata.getFlattenedSize();
104eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    size = FlattenableUtils::align<8>(size);
105eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    return size + getPodSize();
106289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza}
107289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
108289ade165e60b5f71734d30e535f16eb1f4313adDan Stozasize_t BufferItem::getFdCount() const {
109eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    size_t count = 0;
110289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    if (mGraphicBuffer != 0) {
111eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza        count += mGraphicBuffer->getFdCount();
112289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    }
113289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    if (mFence != 0) {
114eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza        count += mFence->getFdCount();
115289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    }
116eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    return count;
117eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza}
118eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza
119eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stozatemplate <typename T>
120eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stozastatic void writeAligned(void*& buffer, size_t& size, T value) {
121eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    size -= FlattenableUtils::align<alignof(T)>(buffer);
122eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    FlattenableUtils::write(buffer, size, value);
123289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza}
124289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
125289ade165e60b5f71734d30e535f16eb1f4313adDan Stozastatus_t BufferItem::flatten(
126289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        void*& buffer, size_t& size, int*& fds, size_t& count) const {
127289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
128289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    // make sure we have enough space
129eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    if (size < BufferItem::getFlattenedSize()) {
130289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        return NO_MEMORY;
131289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    }
132289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
133289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    // content flags are stored first
134289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    uint32_t& flags = *static_cast<uint32_t*>(buffer);
135289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
136289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    // advance the pointer
137289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    FlattenableUtils::advance(buffer, size, sizeof(uint32_t));
138289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
139289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    flags = 0;
140289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    if (mGraphicBuffer != 0) {
141289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        status_t err = mGraphicBuffer->flatten(buffer, size, fds, count);
142289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        if (err) return err;
143289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        size -= FlattenableUtils::align<4>(buffer);
144289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        flags |= 1;
145289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    }
146289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    if (mFence != 0) {
147289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        status_t err = mFence->flatten(buffer, size, fds, count);
148289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        if (err) return err;
149289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        size -= FlattenableUtils::align<4>(buffer);
150289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        flags |= 2;
151289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    }
152eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza
1535065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza    status_t err = mSurfaceDamage.flatten(buffer, size);
1545065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza    if (err) return err;
155eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    FlattenableUtils::advance(buffer, size, mSurfaceDamage.getFlattenedSize());
156eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza
1579bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter    err = mHdrMetadata.flatten(buffer, size);
1589bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter    if (err) return err;
1599bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter    FlattenableUtils::advance(buffer, size, mHdrMetadata.getFlattenedSize());
1609bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter
161eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    // Check we still have enough space
162289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    if (size < getPodSize()) {
163289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        return NO_MEMORY;
164289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    }
165289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
166eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    writeAligned(buffer, size, mCrop);
167eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    writeAligned(buffer, size, mTransform);
168eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    writeAligned(buffer, size, mScalingMode);
169b1f30bae12a0df810a62f819ab3ac680b00768b9Colin Cross    writeAligned(buffer, size, low32(mTimestamp));
170b1f30bae12a0df810a62f819ab3ac680b00768b9Colin Cross    writeAligned(buffer, size, high32(mTimestamp));
171eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    writeAligned(buffer, size, mIsAutoTimestamp);
172eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    writeAligned(buffer, size, mDataSpace);
173b1f30bae12a0df810a62f819ab3ac680b00768b9Colin Cross    writeAligned(buffer, size, low32(mFrameNumber));
174b1f30bae12a0df810a62f819ab3ac680b00768b9Colin Cross    writeAligned(buffer, size, high32(mFrameNumber));
175eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    writeAligned(buffer, size, mSlot);
176eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    writeAligned(buffer, size, mIsDroppable);
177eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    writeAligned(buffer, size, mAcquireCalled);
178eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    writeAligned(buffer, size, mTransformToDisplayInverse);
179bd3577ef5bae7d65e54bddc04f90b619330edb89Pablo Ceballos    writeAligned(buffer, size, mAutoRefresh);
180bd3577ef5bae7d65e54bddc04f90b619330edb89Pablo Ceballos    writeAligned(buffer, size, mQueuedBuffer);
181bd3577ef5bae7d65e54bddc04f90b619330edb89Pablo Ceballos    writeAligned(buffer, size, mIsStale);
1825c6e46353676b4fd647317fde28c413d8ffe3565Chia-I Wu    writeAligned(buffer, size, mApi);
183289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
184289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    return NO_ERROR;
185289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza}
186289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
187eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stozatemplate <typename T>
188eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stozastatic void readAligned(const void*& buffer, size_t& size, T& value) {
189eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    size -= FlattenableUtils::align<alignof(T)>(buffer);
190eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    FlattenableUtils::read(buffer, size, value);
191eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza}
192eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza
193289ade165e60b5f71734d30e535f16eb1f4313adDan Stozastatus_t BufferItem::unflatten(
194289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        void const*& buffer, size_t& size, int const*& fds, size_t& count) {
195289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
196eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    if (size < sizeof(uint32_t)) {
197289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        return NO_MEMORY;
198eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    }
199289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
200289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    uint32_t flags = 0;
201289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    FlattenableUtils::read(buffer, size, flags);
202289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
203289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    if (flags & 1) {
204289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        mGraphicBuffer = new GraphicBuffer();
205289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        status_t err = mGraphicBuffer->unflatten(buffer, size, fds, count);
206289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        if (err) return err;
207289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        size -= FlattenableUtils::align<4>(buffer);
208289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    }
209289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
210289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    if (flags & 2) {
211289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        mFence = new Fence();
212289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        status_t err = mFence->unflatten(buffer, size, fds, count);
213289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        if (err) return err;
214289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        size -= FlattenableUtils::align<4>(buffer);
2153d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson
2163d4039d7a291cd9b6f2dd4b46fcdb576f2db3356Brian Anderson        mFenceTime = std::make_shared<FenceTime>(mFence);
217289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    }
218eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza
2195065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza    status_t err = mSurfaceDamage.unflatten(buffer, size);
2205065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza    if (err) return err;
221eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    FlattenableUtils::advance(buffer, size, mSurfaceDamage.getFlattenedSize());
222eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza
2239bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter    err = mHdrMetadata.unflatten(buffer, size);
2249bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter    if (err) return err;
2259bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter    FlattenableUtils::advance(buffer, size, mHdrMetadata.getFlattenedSize());
2269bad0d7e726e6b264c528a3dd13d0c58fd92c0e1Courtney Goeltzenleuchter
227eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    // Check we still have enough space
228289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    if (size < getPodSize()) {
229289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        return NO_MEMORY;
230289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    }
231289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
232b1f30bae12a0df810a62f819ab3ac680b00768b9Colin Cross    uint32_t timestampLo = 0, timestampHi = 0;
233b1f30bae12a0df810a62f819ab3ac680b00768b9Colin Cross    uint32_t frameNumberLo = 0, frameNumberHi = 0;
234b1f30bae12a0df810a62f819ab3ac680b00768b9Colin Cross
235eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    readAligned(buffer, size, mCrop);
236eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    readAligned(buffer, size, mTransform);
237eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    readAligned(buffer, size, mScalingMode);
238b1f30bae12a0df810a62f819ab3ac680b00768b9Colin Cross    readAligned(buffer, size, timestampLo);
239b1f30bae12a0df810a62f819ab3ac680b00768b9Colin Cross    readAligned(buffer, size, timestampHi);
240b1f30bae12a0df810a62f819ab3ac680b00768b9Colin Cross    mTimestamp = to64<int64_t>(timestampLo, timestampHi);
241eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    readAligned(buffer, size, mIsAutoTimestamp);
242eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    readAligned(buffer, size, mDataSpace);
243b1f30bae12a0df810a62f819ab3ac680b00768b9Colin Cross    readAligned(buffer, size, frameNumberLo);
244b1f30bae12a0df810a62f819ab3ac680b00768b9Colin Cross    readAligned(buffer, size, frameNumberHi);
245b1f30bae12a0df810a62f819ab3ac680b00768b9Colin Cross    mFrameNumber = to64<uint64_t>(frameNumberLo, frameNumberHi);
246eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    readAligned(buffer, size, mSlot);
247eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    readAligned(buffer, size, mIsDroppable);
248eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    readAligned(buffer, size, mAcquireCalled);
249eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza    readAligned(buffer, size, mTransformToDisplayInverse);
250bd3577ef5bae7d65e54bddc04f90b619330edb89Pablo Ceballos    readAligned(buffer, size, mAutoRefresh);
251bd3577ef5bae7d65e54bddc04f90b619330edb89Pablo Ceballos    readAligned(buffer, size, mQueuedBuffer);
252bd3577ef5bae7d65e54bddc04f90b619330edb89Pablo Ceballos    readAligned(buffer, size, mIsStale);
2535c6e46353676b4fd647317fde28c413d8ffe3565Chia-I Wu    readAligned(buffer, size, mApi);
254289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
255289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    return NO_ERROR;
256289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza}
257289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
258289ade165e60b5f71734d30e535f16eb1f4313adDan Stozaconst char* BufferItem::scalingModeName(uint32_t scalingMode) {
259289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    switch (scalingMode) {
260289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        case NATIVE_WINDOW_SCALING_MODE_FREEZE: return "FREEZE";
261289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        case NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW: return "SCALE_TO_WINDOW";
262289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        case NATIVE_WINDOW_SCALING_MODE_SCALE_CROP: return "SCALE_CROP";
263289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza        default: return "Unknown";
264289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza    }
265289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza}
266289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza
267289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza} // namespace android
268