BufferItem.cpp revision 5065a55291b67f584d7b0be3fa3cfc4e29a3cd1c
1/* 2 * Copyright 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#include <gui/BufferItem.h> 18 19#include <ui/Fence.h> 20#include <ui/GraphicBuffer.h> 21 22#include <system/window.h> 23 24namespace android { 25 26BufferItem::BufferItem() : 27 mTransform(0), 28 mScalingMode(NATIVE_WINDOW_SCALING_MODE_FREEZE), 29 mTimestamp(0), 30 mIsAutoTimestamp(false), 31 mDataSpace(HAL_DATASPACE_UNKNOWN), 32 mFrameNumber(0), 33 mSlot(INVALID_BUFFER_SLOT), 34 mIsDroppable(false), 35 mAcquireCalled(false), 36 mTransformToDisplayInverse(false) { 37 mCrop.makeInvalid(); 38} 39 40BufferItem::~BufferItem() {} 41 42size_t BufferItem::getPodSize() const { 43 size_t c = sizeof(mCrop) + 44 sizeof(mTransform) + 45 sizeof(mScalingMode) + 46 sizeof(mTimestamp) + 47 sizeof(mIsAutoTimestamp) + 48 sizeof(mDataSpace) + 49 sizeof(mFrameNumber) + 50 sizeof(mSlot) + 51 sizeof(mIsDroppable) + 52 sizeof(mAcquireCalled) + 53 sizeof(mTransformToDisplayInverse); 54 return c; 55} 56 57size_t BufferItem::getFlattenedSize() const { 58 size_t c = 0; 59 if (mGraphicBuffer != 0) { 60 c += mGraphicBuffer->getFlattenedSize(); 61 FlattenableUtils::align<4>(c); 62 } 63 if (mFence != 0) { 64 c += mFence->getFlattenedSize(); 65 FlattenableUtils::align<4>(c); 66 } 67 c += mSurfaceDamage.getFlattenedSize(); 68 FlattenableUtils::align<4>(c); 69 return sizeof(int32_t) + c + getPodSize(); 70} 71 72size_t BufferItem::getFdCount() const { 73 size_t c = 0; 74 if (mGraphicBuffer != 0) { 75 c += mGraphicBuffer->getFdCount(); 76 } 77 if (mFence != 0) { 78 c += mFence->getFdCount(); 79 } 80 return c; 81} 82 83status_t BufferItem::flatten( 84 void*& buffer, size_t& size, int*& fds, size_t& count) const { 85 86 // make sure we have enough space 87 if (count < BufferItem::getFlattenedSize()) { 88 return NO_MEMORY; 89 } 90 91 // content flags are stored first 92 uint32_t& flags = *static_cast<uint32_t*>(buffer); 93 94 // advance the pointer 95 FlattenableUtils::advance(buffer, size, sizeof(uint32_t)); 96 97 flags = 0; 98 if (mGraphicBuffer != 0) { 99 status_t err = mGraphicBuffer->flatten(buffer, size, fds, count); 100 if (err) return err; 101 size -= FlattenableUtils::align<4>(buffer); 102 flags |= 1; 103 } 104 if (mFence != 0) { 105 status_t err = mFence->flatten(buffer, size, fds, count); 106 if (err) return err; 107 size -= FlattenableUtils::align<4>(buffer); 108 flags |= 2; 109 } 110 status_t err = mSurfaceDamage.flatten(buffer, size); 111 if (err) return err; 112 size -= FlattenableUtils::align<4>(buffer); 113 114 // check we have enough space (in case flattening the fence/graphicbuffer lied to us) 115 if (size < getPodSize()) { 116 return NO_MEMORY; 117 } 118 119 FlattenableUtils::write(buffer, size, mCrop); 120 FlattenableUtils::write(buffer, size, mTransform); 121 FlattenableUtils::write(buffer, size, mScalingMode); 122 FlattenableUtils::write(buffer, size, mTimestamp); 123 FlattenableUtils::write(buffer, size, mIsAutoTimestamp); 124 FlattenableUtils::write(buffer, size, mDataSpace); 125 FlattenableUtils::write(buffer, size, mFrameNumber); 126 FlattenableUtils::write(buffer, size, mSlot); 127 FlattenableUtils::write(buffer, size, mIsDroppable); 128 FlattenableUtils::write(buffer, size, mAcquireCalled); 129 FlattenableUtils::write(buffer, size, mTransformToDisplayInverse); 130 131 return NO_ERROR; 132} 133 134status_t BufferItem::unflatten( 135 void const*& buffer, size_t& size, int const*& fds, size_t& count) { 136 137 if (size < sizeof(uint32_t)) 138 return NO_MEMORY; 139 140 uint32_t flags = 0; 141 FlattenableUtils::read(buffer, size, flags); 142 143 if (flags & 1) { 144 mGraphicBuffer = new GraphicBuffer(); 145 status_t err = mGraphicBuffer->unflatten(buffer, size, fds, count); 146 if (err) return err; 147 size -= FlattenableUtils::align<4>(buffer); 148 } 149 150 if (flags & 2) { 151 mFence = new Fence(); 152 status_t err = mFence->unflatten(buffer, size, fds, count); 153 if (err) return err; 154 size -= FlattenableUtils::align<4>(buffer); 155 } 156 status_t err = mSurfaceDamage.unflatten(buffer, size); 157 if (err) return err; 158 size -= FlattenableUtils::align<4>(buffer); 159 160 // check we have enough space 161 if (size < getPodSize()) { 162 return NO_MEMORY; 163 } 164 165 FlattenableUtils::read(buffer, size, mCrop); 166 FlattenableUtils::read(buffer, size, mTransform); 167 FlattenableUtils::read(buffer, size, mScalingMode); 168 FlattenableUtils::read(buffer, size, mTimestamp); 169 FlattenableUtils::read(buffer, size, mIsAutoTimestamp); 170 FlattenableUtils::read(buffer, size, mDataSpace); 171 FlattenableUtils::read(buffer, size, mFrameNumber); 172 FlattenableUtils::read(buffer, size, mSlot); 173 FlattenableUtils::read(buffer, size, mIsDroppable); 174 FlattenableUtils::read(buffer, size, mAcquireCalled); 175 FlattenableUtils::read(buffer, size, mTransformToDisplayInverse); 176 177 return NO_ERROR; 178} 179 180const char* BufferItem::scalingModeName(uint32_t scalingMode) { 181 switch (scalingMode) { 182 case NATIVE_WINDOW_SCALING_MODE_FREEZE: return "FREEZE"; 183 case NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW: return "SCALE_TO_WINDOW"; 184 case NATIVE_WINDOW_SCALING_MODE_SCALE_CROP: return "SCALE_CROP"; 185 default: return "Unknown"; 186 } 187} 188 189} // namespace android 190