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