1e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala/*
2e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala * Copyright (C) 2012 The Android Open Source Project
3e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala *
4e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License");
5e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala * you may not use this file except in compliance with the License.
6e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala * You may obtain a copy of the License at
7e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala *
8e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala *      http://www.apache.org/licenses/LICENSE-2.0
9e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala *
10e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala * Unless required by applicable law or agreed to in writing, software
11e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS,
12e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala * See the License for the specific language governing permissions and
14e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala * limitations under the License.
15e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala */
16e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala
17e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala//#define LOG_NDEBUG 0
18e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala#define LOG_TAG "BufferItemConsumer"
19d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza//#define ATRACE_TAG ATRACE_TAG_GRAPHICS
20e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala#include <utils/Log.h>
21e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala
22dd26416fe135f93ef2c8570738f8e1ca5e2ca3a3Dan Stoza#include <gui/BufferItem.h>
23e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala#include <gui/BufferItemConsumer.h>
24e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala
25021d92e6b92a877b9c8a2d17761be8c2251ad7f6Jiwen 'Steve' Cai#define BI_LOGV(x, ...) ALOGV("[%s] " x, mName.string(), ##__VA_ARGS__)
26d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza//#define BI_LOGD(x, ...) ALOGD("[%s] " x, mName.string(), ##__VA_ARGS__)
27d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza//#define BI_LOGI(x, ...) ALOGI("[%s] " x, mName.string(), ##__VA_ARGS__)
28d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza//#define BI_LOGW(x, ...) ALOGW("[%s] " x, mName.string(), ##__VA_ARGS__)
298b49125f10e3fd991c631e12856ce1ebf5a56d7eDan Albert#define BI_LOGE(x, ...) ALOGE("[%s] " x, mName.string(), ##__VA_ARGS__)
30e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala
31e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvalanamespace android {
32e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala
33fe50d2a0a13116238d5321e16c06e6ed533618dcDan StozaBufferItemConsumer::BufferItemConsumer(
34fe50d2a0a13116238d5321e16c06e6ed533618dcDan Stoza        const sp<IGraphicBufferConsumer>& consumer, uint32_t consumerUsage,
35fe50d2a0a13116238d5321e16c06e6ed533618dcDan Stoza        int bufferCount, bool controlledByApp) :
36fe50d2a0a13116238d5321e16c06e6ed533618dcDan Stoza    ConsumerBase(consumer, controlledByApp)
37e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala{
38fe50d2a0a13116238d5321e16c06e6ed533618dcDan Stoza    status_t err = mConsumer->setConsumerUsageBits(consumerUsage);
39fe50d2a0a13116238d5321e16c06e6ed533618dcDan Stoza    LOG_ALWAYS_FATAL_IF(err != OK,
40fe50d2a0a13116238d5321e16c06e6ed533618dcDan Stoza            "Failed to set consumer usage bits to %#x", consumerUsage);
41fe50d2a0a13116238d5321e16c06e6ed533618dcDan Stoza    if (bufferCount != DEFAULT_MAX_BUFFERS) {
42fe50d2a0a13116238d5321e16c06e6ed533618dcDan Stoza        err = mConsumer->setMaxAcquiredBufferCount(bufferCount);
43fe50d2a0a13116238d5321e16c06e6ed533618dcDan Stoza        LOG_ALWAYS_FATAL_IF(err != OK,
44fe50d2a0a13116238d5321e16c06e6ed533618dcDan Stoza                "Failed to set max acquired buffer count to %d", bufferCount);
454be18a3566c5d902b7fe94db4cf14b174ed7beb5Igor Murashkin    }
46e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala}
47e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala
48d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan StozaBufferItemConsumer::~BufferItemConsumer() {}
49e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala
50e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvalavoid BufferItemConsumer::setName(const String8& name) {
51e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala    Mutex::Autolock _l(mMutex);
5265d9f6d63ab3bad1d835df14c662028a748eb3c5Pablo Ceballos    if (mAbandoned) {
5365d9f6d63ab3bad1d835df14c662028a748eb3c5Pablo Ceballos        BI_LOGE("setName: BufferItemConsumer is abandoned!");
5465d9f6d63ab3bad1d835df14c662028a748eb3c5Pablo Ceballos        return;
5565d9f6d63ab3bad1d835df14c662028a748eb3c5Pablo Ceballos    }
56e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala    mName = name;
57db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian    mConsumer->setConsumerName(name);
58e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala}
59e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala
60021d92e6b92a877b9c8a2d17761be8c2251ad7f6Jiwen 'Steve' Caivoid BufferItemConsumer::setBufferFreedListener(
61021d92e6b92a877b9c8a2d17761be8c2251ad7f6Jiwen 'Steve' Cai        const wp<BufferFreedListener>& listener) {
62021d92e6b92a877b9c8a2d17761be8c2251ad7f6Jiwen 'Steve' Cai    Mutex::Autolock _l(mMutex);
63021d92e6b92a877b9c8a2d17761be8c2251ad7f6Jiwen 'Steve' Cai    mBufferFreedListener = listener;
64021d92e6b92a877b9c8a2d17761be8c2251ad7f6Jiwen 'Steve' Cai}
65021d92e6b92a877b9c8a2d17761be8c2251ad7f6Jiwen 'Steve' Cai
6654716317b5752010134edc64421a3f492bd608abDan Stozastatus_t BufferItemConsumer::acquireBuffer(BufferItem *item,
671585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden        nsecs_t presentWhen, bool waitForFence) {
68e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala    status_t err;
69e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala
70e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala    if (!item) return BAD_VALUE;
71e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala
72e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala    Mutex::Autolock _l(mMutex);
73e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala
741585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden    err = acquireBufferLocked(item, presentWhen);
75e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala    if (err != OK) {
76e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala        if (err != NO_BUFFER_AVAILABLE) {
77e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala            BI_LOGE("Error acquiring buffer: %s (%d)", strerror(err), err);
78e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala        }
79e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala        return err;
80e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala    }
81e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala
821df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis    if (waitForFence) {
83ea74d3b78d607cde17790a7bb83e6f68ffd34cfdMathias Agopian        err = item->mFence->waitForever("BufferItemConsumer::acquireBuffer");
84e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala        if (err != OK) {
85e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala            BI_LOGE("Failed to wait for fence of acquired buffer: %s (%d)",
86e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala                    strerror(-err), err);
87e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala            return err;
88e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala        }
89e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala    }
90e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala
9147650f4f66a49e1815ad08ca4fb12a661d133abcPablo Ceballos    item->mGraphicBuffer = mSlots[item->mSlot].mGraphicBuffer;
92e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala
93e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala    return OK;
94e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala}
95e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala
96e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvalastatus_t BufferItemConsumer::releaseBuffer(const BufferItem &item,
97e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala        const sp<Fence>& releaseFence) {
98e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala    status_t err;
99e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala
100e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala    Mutex::Autolock _l(mMutex);
101e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala
10247650f4f66a49e1815ad08ca4fb12a661d133abcPablo Ceballos    err = addReleaseFenceLocked(item.mSlot, item.mGraphicBuffer, releaseFence);
103b27254154642575dfb4bbfa79fbedde7d7ee23ddJamie Gennis
10447650f4f66a49e1815ad08ca4fb12a661d133abcPablo Ceballos    err = releaseBufferLocked(item.mSlot, item.mGraphicBuffer, EGL_NO_DISPLAY,
105b27254154642575dfb4bbfa79fbedde7d7ee23ddJamie Gennis            EGL_NO_SYNC_KHR);
106e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala    if (err != OK) {
107e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala        BI_LOGE("Failed to release buffer: %s (%d)",
108e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala                strerror(-err), err);
109e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala    }
110e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala    return err;
111e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala}
112e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala
113021d92e6b92a877b9c8a2d17761be8c2251ad7f6Jiwen 'Steve' Caivoid BufferItemConsumer::freeBufferLocked(int slotIndex) {
114021d92e6b92a877b9c8a2d17761be8c2251ad7f6Jiwen 'Steve' Cai    sp<BufferFreedListener> listener = mBufferFreedListener.promote();
115021d92e6b92a877b9c8a2d17761be8c2251ad7f6Jiwen 'Steve' Cai    if (listener != NULL && mSlots[slotIndex].mGraphicBuffer != NULL) {
116021d92e6b92a877b9c8a2d17761be8c2251ad7f6Jiwen 'Steve' Cai        // Fire callback if we have a listener registered and the buffer being freed is valid.
117021d92e6b92a877b9c8a2d17761be8c2251ad7f6Jiwen 'Steve' Cai        BI_LOGV("actually calling onBufferFreed");
118021d92e6b92a877b9c8a2d17761be8c2251ad7f6Jiwen 'Steve' Cai        listener->onBufferFreed(mSlots[slotIndex].mGraphicBuffer);
119021d92e6b92a877b9c8a2d17761be8c2251ad7f6Jiwen 'Steve' Cai    }
120021d92e6b92a877b9c8a2d17761be8c2251ad7f6Jiwen 'Steve' Cai    ConsumerBase::freeBufferLocked(slotIndex);
121021d92e6b92a877b9c8a2d17761be8c2251ad7f6Jiwen 'Steve' Cai}
122021d92e6b92a877b9c8a2d17761be8c2251ad7f6Jiwen 'Steve' Cai
123e232fdca2a62dc5e81b550f5be8710e36174e7a6Eino-Ville Talvala} // namespace android
124