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