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