BufferItem.cpp revision 82c6bcc9705eabcaf5b9e45bc81867b0e2d61a02
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 42289ade165e60b5f71734d30e535f16eb1f4313adDan StozaBufferItem::operator IGraphicBufferConsumer::BufferItem() const { 43289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza IGraphicBufferConsumer::BufferItem bufferItem; 443e96f1982fda358424b0b75f394cbf7c1794a072Dan Stoza bufferItem.mGraphicBuffer = mGraphicBuffer; 453e96f1982fda358424b0b75f394cbf7c1794a072Dan Stoza bufferItem.mFence = mFence; 463e96f1982fda358424b0b75f394cbf7c1794a072Dan Stoza bufferItem.mCrop = mCrop; 47289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza bufferItem.mTransform = mTransform; 48289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza bufferItem.mScalingMode = mScalingMode; 49289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza bufferItem.mTimestamp = mTimestamp; 50289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza bufferItem.mIsAutoTimestamp = mIsAutoTimestamp; 5182c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala bufferItem.mDataSpace = mDataSpace; 52289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza bufferItem.mFrameNumber = mFrameNumber; 53289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza bufferItem.mBuf = mSlot; 54289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza bufferItem.mIsDroppable = mIsDroppable; 55289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza bufferItem.mAcquireCalled = mAcquireCalled; 56289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza bufferItem.mTransformToDisplayInverse = mTransformToDisplayInverse; 57289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza return bufferItem; 58289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza} 59289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 60289ade165e60b5f71734d30e535f16eb1f4313adDan Stozasize_t BufferItem::getPodSize() const { 61289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza size_t c = sizeof(mCrop) + 62289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza sizeof(mTransform) + 63289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza sizeof(mScalingMode) + 64289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza sizeof(mTimestamp) + 65289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza sizeof(mIsAutoTimestamp) + 6682c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala sizeof(mDataSpace) + 67289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza sizeof(mFrameNumber) + 68289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza sizeof(mSlot) + 69289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza sizeof(mIsDroppable) + 70289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza sizeof(mAcquireCalled) + 71289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza sizeof(mTransformToDisplayInverse); 72289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza return c; 73289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza} 74289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 75289ade165e60b5f71734d30e535f16eb1f4313adDan Stozasize_t BufferItem::getFlattenedSize() const { 76289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza size_t c = 0; 77289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza if (mGraphicBuffer != 0) { 78289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza c += mGraphicBuffer->getFlattenedSize(); 79289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza FlattenableUtils::align<4>(c); 80289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza } 81289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza if (mFence != 0) { 82289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza c += mFence->getFlattenedSize(); 83289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza FlattenableUtils::align<4>(c); 84289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza } 85289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza return sizeof(int32_t) + c + getPodSize(); 86289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza} 87289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 88289ade165e60b5f71734d30e535f16eb1f4313adDan Stozasize_t BufferItem::getFdCount() const { 89289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza size_t c = 0; 90289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza if (mGraphicBuffer != 0) { 91289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza c += mGraphicBuffer->getFdCount(); 92289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza } 93289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza if (mFence != 0) { 94289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza c += mFence->getFdCount(); 95289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza } 96289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza return c; 97289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza} 98289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 99289ade165e60b5f71734d30e535f16eb1f4313adDan Stozastatus_t BufferItem::flatten( 100289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza void*& buffer, size_t& size, int*& fds, size_t& count) const { 101289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 102289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza // make sure we have enough space 103289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza if (count < BufferItem::getFlattenedSize()) { 104289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza return NO_MEMORY; 105289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza } 106289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 107289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza // content flags are stored first 108289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza uint32_t& flags = *static_cast<uint32_t*>(buffer); 109289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 110289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza // advance the pointer 111289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza FlattenableUtils::advance(buffer, size, sizeof(uint32_t)); 112289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 113289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza flags = 0; 114289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza if (mGraphicBuffer != 0) { 115289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza status_t err = mGraphicBuffer->flatten(buffer, size, fds, count); 116289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza if (err) return err; 117289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza size -= FlattenableUtils::align<4>(buffer); 118289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza flags |= 1; 119289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza } 120289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza if (mFence != 0) { 121289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza status_t err = mFence->flatten(buffer, size, fds, count); 122289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza if (err) return err; 123289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza size -= FlattenableUtils::align<4>(buffer); 124289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza flags |= 2; 125289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza } 126289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 127289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza // check we have enough space (in case flattening the fence/graphicbuffer lied to us) 128289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza if (size < getPodSize()) { 129289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza return NO_MEMORY; 130289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza } 131289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 132289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza FlattenableUtils::write(buffer, size, mCrop); 133289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza FlattenableUtils::write(buffer, size, mTransform); 134289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza FlattenableUtils::write(buffer, size, mScalingMode); 135289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza FlattenableUtils::write(buffer, size, mTimestamp); 136289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza FlattenableUtils::write(buffer, size, mIsAutoTimestamp); 13782c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala FlattenableUtils::write(buffer, size, mDataSpace); 138289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza FlattenableUtils::write(buffer, size, mFrameNumber); 139289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza FlattenableUtils::write(buffer, size, mSlot); 140289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza FlattenableUtils::write(buffer, size, mIsDroppable); 141289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza FlattenableUtils::write(buffer, size, mAcquireCalled); 142289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza FlattenableUtils::write(buffer, size, mTransformToDisplayInverse); 143289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 144289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza return NO_ERROR; 145289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza} 146289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 147289ade165e60b5f71734d30e535f16eb1f4313adDan Stozastatus_t BufferItem::unflatten( 148289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza void const*& buffer, size_t& size, int const*& fds, size_t& count) { 149289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 150289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza if (size < sizeof(uint32_t)) 151289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza return NO_MEMORY; 152289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 153289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza uint32_t flags = 0; 154289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza FlattenableUtils::read(buffer, size, flags); 155289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 156289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza if (flags & 1) { 157289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza mGraphicBuffer = new GraphicBuffer(); 158289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza status_t err = mGraphicBuffer->unflatten(buffer, size, fds, count); 159289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza if (err) return err; 160289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza size -= FlattenableUtils::align<4>(buffer); 161289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza } 162289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 163289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza if (flags & 2) { 164289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza mFence = new Fence(); 165289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza status_t err = mFence->unflatten(buffer, size, fds, count); 166289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza if (err) return err; 167289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza size -= FlattenableUtils::align<4>(buffer); 168289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza } 169289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 170289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza // check we have enough space 171289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza if (size < getPodSize()) { 172289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza return NO_MEMORY; 173289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza } 174289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 175289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza FlattenableUtils::read(buffer, size, mCrop); 176289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza FlattenableUtils::read(buffer, size, mTransform); 177289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza FlattenableUtils::read(buffer, size, mScalingMode); 178289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza FlattenableUtils::read(buffer, size, mTimestamp); 179289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza FlattenableUtils::read(buffer, size, mIsAutoTimestamp); 18082c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala FlattenableUtils::read(buffer, size, mDataSpace); 181289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza FlattenableUtils::read(buffer, size, mFrameNumber); 182289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza FlattenableUtils::read(buffer, size, mSlot); 183289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza FlattenableUtils::read(buffer, size, mIsDroppable); 184289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza FlattenableUtils::read(buffer, size, mAcquireCalled); 185289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza FlattenableUtils::read(buffer, size, mTransformToDisplayInverse); 186289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 187289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza return NO_ERROR; 188289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza} 189289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 190289ade165e60b5f71734d30e535f16eb1f4313adDan Stozaconst char* BufferItem::scalingModeName(uint32_t scalingMode) { 191289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza switch (scalingMode) { 192289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza case NATIVE_WINDOW_SCALING_MODE_FREEZE: return "FREEZE"; 193289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza case NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW: return "SCALE_TO_WINDOW"; 194289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza case NATIVE_WINDOW_SCALING_MODE_SCALE_CROP: return "SCALE_CROP"; 195289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza default: return "Unknown"; 196289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza } 197289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza} 198289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 199289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza} // namespace android 200