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