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