BufferItem.cpp revision eea6d682b8b0f7081f0fe8fab8feadb16e22b30b
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 26289ade165e60b5f71734d30e535f16eb1f4313adDan StozaBufferItem::BufferItem() : 27289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza mTransform(0), 28289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza mScalingMode(NATIVE_WINDOW_SCALING_MODE_FREEZE), 29289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza mTimestamp(0), 30289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza mIsAutoTimestamp(false), 3182c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala mDataSpace(HAL_DATASPACE_UNKNOWN), 32289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza mFrameNumber(0), 33289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza mSlot(INVALID_BUFFER_SLOT), 34289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza mIsDroppable(false), 35289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza mAcquireCalled(false), 36289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza mTransformToDisplayInverse(false) { 37289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza mCrop.makeInvalid(); 38289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza} 39289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 408dc55396fc9bc425b5e2c82e76a38080f2a655ffDan StozaBufferItem::~BufferItem() {} 418dc55396fc9bc425b5e2c82e76a38080f2a655ffDan Stoza 42eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stozatemplate <typename T> 43eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stozastatic void addAligned(size_t& size, T /* value */) { 44eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza size = FlattenableUtils::align<sizeof(T)>(size); 45eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza size += sizeof(T); 46eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza} 47eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza 48289ade165e60b5f71734d30e535f16eb1f4313adDan Stozasize_t BufferItem::getPodSize() const { 49eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza // Must align<8> before writing these fields for this to be correct 50eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza size_t size = 0; 51eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza addAligned(size, mCrop); 52eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza addAligned(size, mTransform); 53eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza addAligned(size, mScalingMode); 54eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza addAligned(size, mTimestamp); 55eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza addAligned(size, mIsAutoTimestamp); 56eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza addAligned(size, mDataSpace); 57eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza addAligned(size, mFrameNumber); 58eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza addAligned(size, mSlot); 59eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza addAligned(size, mIsDroppable); 60eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza addAligned(size, mAcquireCalled); 61eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza addAligned(size, mTransformToDisplayInverse); 62eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza return size; 63289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza} 64289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 65289ade165e60b5f71734d30e535f16eb1f4313adDan Stozasize_t BufferItem::getFlattenedSize() const { 66eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza size_t size = sizeof(uint32_t); // Flags 67289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza if (mGraphicBuffer != 0) { 68eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza size += mGraphicBuffer->getFlattenedSize(); 69eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza FlattenableUtils::align<4>(size); 70289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza } 71289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza if (mFence != 0) { 72eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza size += mFence->getFlattenedSize(); 73eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza FlattenableUtils::align<4>(size); 74289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza } 75eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza size += mSurfaceDamage.getFlattenedSize(); 76eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza size = FlattenableUtils::align<8>(size); 77eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza return size + getPodSize(); 78289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza} 79289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 80289ade165e60b5f71734d30e535f16eb1f4313adDan Stozasize_t BufferItem::getFdCount() const { 81eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza size_t count = 0; 82289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza if (mGraphicBuffer != 0) { 83eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza count += mGraphicBuffer->getFdCount(); 84289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza } 85289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza if (mFence != 0) { 86eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza count += mFence->getFdCount(); 87289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza } 88eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza return count; 89eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza} 90eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza 91eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stozatemplate <typename T> 92eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stozastatic void writeAligned(void*& buffer, size_t& size, T value) { 93eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza size -= FlattenableUtils::align<alignof(T)>(buffer); 94eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza FlattenableUtils::write(buffer, size, value); 95289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza} 96289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 97289ade165e60b5f71734d30e535f16eb1f4313adDan Stozastatus_t BufferItem::flatten( 98289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza void*& buffer, size_t& size, int*& fds, size_t& count) const { 99289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 100289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza // make sure we have enough space 101eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza if (size < BufferItem::getFlattenedSize()) { 102289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza return NO_MEMORY; 103289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza } 104289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 105289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza // content flags are stored first 106289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza uint32_t& flags = *static_cast<uint32_t*>(buffer); 107289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 108289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza // advance the pointer 109289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza FlattenableUtils::advance(buffer, size, sizeof(uint32_t)); 110289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 111289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza flags = 0; 112289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza if (mGraphicBuffer != 0) { 113289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza status_t err = mGraphicBuffer->flatten(buffer, size, fds, count); 114289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza if (err) return err; 115289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza size -= FlattenableUtils::align<4>(buffer); 116289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza flags |= 1; 117289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza } 118289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza if (mFence != 0) { 119289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza status_t err = mFence->flatten(buffer, size, fds, count); 120289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza if (err) return err; 121289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza size -= FlattenableUtils::align<4>(buffer); 122289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza flags |= 2; 123289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza } 124eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza 1255065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza status_t err = mSurfaceDamage.flatten(buffer, size); 1265065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza if (err) return err; 127eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza FlattenableUtils::advance(buffer, size, mSurfaceDamage.getFlattenedSize()); 128eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza 129eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza // Must align<8> so that getPodSize returns the correct value 130eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza size -= FlattenableUtils::align<8>(buffer); 131289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 132eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza // Check we still have enough space 133289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza if (size < getPodSize()) { 134289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza return NO_MEMORY; 135289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza } 136289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 137eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza writeAligned(buffer, size, mCrop); 138eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza writeAligned(buffer, size, mTransform); 139eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza writeAligned(buffer, size, mScalingMode); 140eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza writeAligned(buffer, size, mTimestamp); 141eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza writeAligned(buffer, size, mIsAutoTimestamp); 142eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza writeAligned(buffer, size, mDataSpace); 143eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza writeAligned(buffer, size, mFrameNumber); 144eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza writeAligned(buffer, size, mSlot); 145eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza writeAligned(buffer, size, mIsDroppable); 146eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza writeAligned(buffer, size, mAcquireCalled); 147eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza writeAligned(buffer, size, mTransformToDisplayInverse); 148289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 149289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza return NO_ERROR; 150289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza} 151289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 152eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stozatemplate <typename T> 153eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stozastatic void readAligned(const void*& buffer, size_t& size, T& value) { 154eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza size -= FlattenableUtils::align<alignof(T)>(buffer); 155eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza FlattenableUtils::read(buffer, size, value); 156eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza} 157eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza 158289ade165e60b5f71734d30e535f16eb1f4313adDan Stozastatus_t BufferItem::unflatten( 159289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza void const*& buffer, size_t& size, int const*& fds, size_t& count) { 160289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 161eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza if (size < sizeof(uint32_t)) { 162289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza return NO_MEMORY; 163eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza } 164289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 165289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza uint32_t flags = 0; 166289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza FlattenableUtils::read(buffer, size, flags); 167289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 168289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza if (flags & 1) { 169289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza mGraphicBuffer = new GraphicBuffer(); 170289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza status_t err = mGraphicBuffer->unflatten(buffer, size, fds, count); 171289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza if (err) return err; 172289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza size -= FlattenableUtils::align<4>(buffer); 173289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza } 174289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 175289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza if (flags & 2) { 176289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza mFence = new Fence(); 177289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza status_t err = mFence->unflatten(buffer, size, fds, count); 178289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza if (err) return err; 179289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza size -= FlattenableUtils::align<4>(buffer); 180289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza } 181eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza 1825065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza status_t err = mSurfaceDamage.unflatten(buffer, size); 1835065a55291b67f584d7b0be3fa3cfc4e29a3cd1cDan Stoza if (err) return err; 184eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza FlattenableUtils::advance(buffer, size, mSurfaceDamage.getFlattenedSize()); 185eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza 186eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza // Must align<8> so that getPodSize returns the correct value 187eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza size -= FlattenableUtils::align<8>(buffer); 188289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 189eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza // Check we still have enough space 190289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza if (size < getPodSize()) { 191289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza return NO_MEMORY; 192289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza } 193289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 194eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza readAligned(buffer, size, mCrop); 195eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza readAligned(buffer, size, mTransform); 196eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza readAligned(buffer, size, mScalingMode); 197eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza readAligned(buffer, size, mTimestamp); 198eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza readAligned(buffer, size, mIsAutoTimestamp); 199eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza readAligned(buffer, size, mDataSpace); 200eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza readAligned(buffer, size, mFrameNumber); 201eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza readAligned(buffer, size, mSlot); 202eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza readAligned(buffer, size, mIsDroppable); 203eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza readAligned(buffer, size, mAcquireCalled); 204eea6d682b8b0f7081f0fe8fab8feadb16e22b30bDan Stoza readAligned(buffer, size, mTransformToDisplayInverse); 205289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 206289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza return NO_ERROR; 207289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza} 208289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 209289ade165e60b5f71734d30e535f16eb1f4313adDan Stozaconst char* BufferItem::scalingModeName(uint32_t scalingMode) { 210289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza switch (scalingMode) { 211289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza case NATIVE_WINDOW_SCALING_MODE_FREEZE: return "FREEZE"; 212289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza case NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW: return "SCALE_TO_WINDOW"; 213289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza case NATIVE_WINDOW_SCALING_MODE_SCALE_CROP: return "SCALE_CROP"; 214289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza default: return "Unknown"; 215289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza } 216289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza} 217289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 218289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza} // namespace android 219