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