diff options
author | Eino-Ville Talvala <etalvala@google.com> | 2012-08-21 13:37:35 -0700 |
---|---|---|
committer | Eino-Ville Talvala <etalvala@google.com> | 2012-08-21 15:46:35 -0700 |
commit | e232fdca2a62dc5e81b550f5be8710e36174e7a6 (patch) | |
tree | 567431349bc9770cb9282a2633015cc5237407fa /libs/gui | |
parent | f57e7540d4cf799f18fe87d3536c55f1e0064931 (diff) | |
download | frameworks_native-e232fdca2a62dc5e81b550f5be8710e36174e7a6.zip frameworks_native-e232fdca2a62dc5e81b550f5be8710e36174e7a6.tar.gz frameworks_native-e232fdca2a62dc5e81b550f5be8710e36174e7a6.tar.bz2 |
Add BufferItemConsumer, a simple BufferQueue consumer.
BufferItemConsumer allows for acquiring BufferQueue's BufferItems,
which contain all the data and metadata the BufferQueue has for a
given graphics buffer.
This consumer is useful when direct access to the native buffer_handles
is needed by the client.
Also includes a minor cleanup of CpuConsumer's use of 'virtual'.
Bug: 6243944
Change-Id: If7dc4192b15ac499555f1eda42a85140f2434795
Diffstat (limited to 'libs/gui')
-rw-r--r-- | libs/gui/Android.mk | 3 | ||||
-rw-r--r-- | libs/gui/BufferItemConsumer.cpp | 93 | ||||
-rw-r--r-- | libs/gui/CpuConsumer.cpp | 3 |
3 files changed, 98 insertions, 1 deletions
diff --git a/libs/gui/Android.mk b/libs/gui/Android.mk index 3aa3a50..2bf363f 100644 --- a/libs/gui/Android.mk +++ b/libs/gui/Android.mk @@ -23,7 +23,8 @@ LOCAL_SRC_FILES:= \ Surface.cpp \ SurfaceComposerClient.cpp \ DummyConsumer.cpp \ - CpuConsumer.cpp + CpuConsumer.cpp \ + BufferItemConsumer.cpp LOCAL_SHARED_LIBRARIES := \ libbinder \ diff --git a/libs/gui/BufferItemConsumer.cpp b/libs/gui/BufferItemConsumer.cpp new file mode 100644 index 0000000..218d929 --- /dev/null +++ b/libs/gui/BufferItemConsumer.cpp @@ -0,0 +1,93 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +//#define LOG_NDEBUG 0 +#define LOG_TAG "BufferItemConsumer" +#define ATRACE_TAG ATRACE_TAG_GRAPHICS +#include <utils/Log.h> + +#include <gui/BufferItemConsumer.h> + +#define BI_LOGV(x, ...) ALOGV("[%s] "x, mName.string(), ##__VA_ARGS__) +#define BI_LOGD(x, ...) ALOGD("[%s] "x, mName.string(), ##__VA_ARGS__) +#define BI_LOGI(x, ...) ALOGI("[%s] "x, mName.string(), ##__VA_ARGS__) +#define BI_LOGW(x, ...) ALOGW("[%s] "x, mName.string(), ##__VA_ARGS__) +#define BI_LOGE(x, ...) ALOGE("[%s] "x, mName.string(), ##__VA_ARGS__) + +namespace android { + +BufferItemConsumer::BufferItemConsumer(uint32_t consumerUsage, + int bufferCount, bool synchronousMode) : + ConsumerBase(new BufferQueue(true, bufferCount) ) +{ + mBufferQueue->setConsumerUsageBits(consumerUsage); + mBufferQueue->setSynchronousMode(synchronousMode); +} + +BufferItemConsumer::~BufferItemConsumer() { +} + +void BufferItemConsumer::setName(const String8& name) { + Mutex::Autolock _l(mMutex); + mName = name; + mBufferQueue->setConsumerName(name); +} + +status_t BufferItemConsumer::acquireBuffer(BufferItem *item, bool waitForFence) { + status_t err; + + if (!item) return BAD_VALUE; + + Mutex::Autolock _l(mMutex); + + err = acquireBufferLocked(item); + if (err != OK) { + if (err != NO_BUFFER_AVAILABLE) { + BI_LOGE("Error acquiring buffer: %s (%d)", strerror(err), err); + } + return err; + } + + if (waitForFence && item->mFence.get()) { + err = item->mFence->wait(Fence::TIMEOUT_NEVER); + if (err != OK) { + BI_LOGE("Failed to wait for fence of acquired buffer: %s (%d)", + strerror(-err), err); + return err; + } + } + + item->mGraphicBuffer = mSlots[item->mBuf].mGraphicBuffer; + + return OK; +} + +status_t BufferItemConsumer::releaseBuffer(const BufferItem &item, + const sp<Fence>& releaseFence) { + status_t err; + + Mutex::Autolock _l(mMutex); + + err = releaseBufferLocked(item.mBuf, EGL_NO_DISPLAY, + EGL_NO_SYNC_KHR, releaseFence); + if (err != OK) { + BI_LOGE("Failed to release buffer: %s (%d)", + strerror(-err), err); + } + return err; +} + +} // namespace android diff --git a/libs/gui/CpuConsumer.cpp b/libs/gui/CpuConsumer.cpp index 90c8ea6..242ac45 100644 --- a/libs/gui/CpuConsumer.cpp +++ b/libs/gui/CpuConsumer.cpp @@ -43,6 +43,9 @@ CpuConsumer::CpuConsumer(uint32_t maxLockedBuffers) : mBufferQueue->setConsumerUsageBits(GRALLOC_USAGE_SW_READ_OFTEN); } +CpuConsumer::~CpuConsumer() { +} + void CpuConsumer::setName(const String8& name) { Mutex::Autolock _l(mMutex); mName = name; |