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