ConsumerBase.cpp revision db89edc94bd2a78226b407f9f7261e202e7fa325
11a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis/* 21a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis * Copyright (C) 2010 The Android Open Source Project 31a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis * 41a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis * Licensed under the Apache License, Version 2.0 (the "License"); 51a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis * you may not use this file except in compliance with the License. 61a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis * You may obtain a copy of the License at 71a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis * 81a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis * http://www.apache.org/licenses/LICENSE-2.0 91a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis * 101a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis * Unless required by applicable law or agreed to in writing, software 111a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis * distributed under the License is distributed on an "AS IS" BASIS, 121a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis * See the License for the specific language governing permissions and 141a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis * limitations under the License. 151a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis */ 161a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis 171a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis#define LOG_TAG "ConsumerBase" 181a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis#define ATRACE_TAG ATRACE_TAG_GRAPHICS 191a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis//#define LOG_NDEBUG 0 201a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis 211a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis#define EGL_EGLEXT_PROTOTYPES 221a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis 231a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis#include <EGL/egl.h> 241a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis#include <EGL/eglext.h> 251a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis 261a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis#include <hardware/hardware.h> 271a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis 281a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis#include <gui/IGraphicBufferAlloc.h> 291a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis#include <gui/ISurfaceComposer.h> 301a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis#include <gui/SurfaceComposerClient.h> 311a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis#include <gui/ConsumerBase.h> 321a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis 331a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis#include <private/gui/ComposerService.h> 341a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis 351a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis#include <utils/Log.h> 361a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis#include <utils/String8.h> 371a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis#include <utils/Trace.h> 381a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis 391a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis// Macros for including the ConsumerBase name in log messages 401a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis#define CB_LOGV(x, ...) ALOGV("[%s] "x, mName.string(), ##__VA_ARGS__) 411a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis#define CB_LOGD(x, ...) ALOGD("[%s] "x, mName.string(), ##__VA_ARGS__) 421a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis#define CB_LOGI(x, ...) ALOGI("[%s] "x, mName.string(), ##__VA_ARGS__) 431a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis#define CB_LOGW(x, ...) ALOGW("[%s] "x, mName.string(), ##__VA_ARGS__) 441a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis#define CB_LOGE(x, ...) ALOGE("[%s] "x, mName.string(), ##__VA_ARGS__) 451a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis 461a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennisnamespace android { 471a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis 481a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis// Get an ID that's unique within this process. 491a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennisstatic int32_t createProcessUniqueId() { 501a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis static volatile int32_t globalCounter = 0; 511a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis return android_atomic_inc(&globalCounter); 521a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis} 531a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis 54db89edc94bd2a78226b407f9f7261e202e7fa325Mathias AgopianConsumerBase::ConsumerBase(const sp<IGraphicBufferConsumer>& bufferQueue, bool controlledByApp) : 559fea3421ffddf6480f57f55a25936a886043d909Jamie Gennis mAbandoned(false), 56db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian mConsumer(bufferQueue) { 571a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis // Choose a name using the PID and a process-unique ID. 581a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis mName = String8::format("unnamed-%d-%d", getpid(), createProcessUniqueId()); 591a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis 601a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis // Note that we can't create an sp<...>(this) in a ctor that will not keep a 611a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis // reference once the ctor ends, as that would cause the refcount of 'this' 621a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis // dropping to 0 at the end of the ctor. Since all we need is a wp<...> 631a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis // that's what we create. 64a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian wp<ConsumerListener> listener = static_cast<ConsumerListener*>(this); 65a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopian sp<IConsumerListener> proxy = new BufferQueue::ProxyConsumerListener(listener); 661a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis 67db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian status_t err = mConsumer->consumerConnect(proxy, controlledByApp); 681a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis if (err != NO_ERROR) { 692adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden CB_LOGE("ConsumerBase: error connecting to BufferQueue: %s (%d)", 701a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis strerror(-err), err); 711a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis } else { 72db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian mConsumer->setConsumerName(mName); 731a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis } 741a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis} 751a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis 761a4d883dcc1725892bfb5c28dec255a233186524Jamie GennisConsumerBase::~ConsumerBase() { 77ad669b04f4633957eea55b8ad2d8253adcefe39bJamie Gennis CB_LOGV("~ConsumerBase"); 78ad669b04f4633957eea55b8ad2d8253adcefe39bJamie Gennis Mutex::Autolock lock(mMutex); 79ad669b04f4633957eea55b8ad2d8253adcefe39bJamie Gennis 80ad669b04f4633957eea55b8ad2d8253adcefe39bJamie Gennis // Verify that abandon() has been called before we get here. This should 81ad669b04f4633957eea55b8ad2d8253adcefe39bJamie Gennis // be done by ConsumerBase::onLastStrongRef(), but it's possible for a 82ad669b04f4633957eea55b8ad2d8253adcefe39bJamie Gennis // derived class to override that method and not call 83ad669b04f4633957eea55b8ad2d8253adcefe39bJamie Gennis // ConsumerBase::onLastStrongRef(). 84ad669b04f4633957eea55b8ad2d8253adcefe39bJamie Gennis LOG_ALWAYS_FATAL_IF(!mAbandoned, "[%s] ~ConsumerBase was called, but the " 85ad669b04f4633957eea55b8ad2d8253adcefe39bJamie Gennis "consumer is not abandoned!", mName.string()); 86ad669b04f4633957eea55b8ad2d8253adcefe39bJamie Gennis} 87ad669b04f4633957eea55b8ad2d8253adcefe39bJamie Gennis 88ad669b04f4633957eea55b8ad2d8253adcefe39bJamie Gennisvoid ConsumerBase::onLastStrongRef(const void* id) { 891a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis abandon(); 901a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis} 911a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis 921a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennisvoid ConsumerBase::freeBufferLocked(int slotIndex) { 931a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis CB_LOGV("freeBufferLocked: slotIndex=%d", slotIndex); 941a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis mSlots[slotIndex].mGraphicBuffer = 0; 951df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis mSlots[slotIndex].mFence = Fence::NO_FENCE; 96c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar mSlots[slotIndex].mFrameNumber = 0; 971a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis} 981a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis 991a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennisvoid ConsumerBase::onFrameAvailable() { 1001a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis CB_LOGV("onFrameAvailable"); 1011a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis 1021a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis sp<FrameAvailableListener> listener; 1031a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis { // scope for the lock 1041a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis Mutex::Autolock lock(mMutex); 105a4a3149a36bc69a06e4824aeae909ab910661070Igor Murashkin listener = mFrameAvailableListener.promote(); 1061a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis } 1071a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis 1081a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis if (listener != NULL) { 1091a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis CB_LOGV("actually calling onFrameAvailable"); 1101a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis listener->onFrameAvailable(); 1111a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis } 1121a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis} 1131a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis 1141a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennisvoid ConsumerBase::onBuffersReleased() { 11572c3f7d88160b7c279f90f0efe3c1cb12cd140aeJamie Gennis Mutex::Autolock lock(mMutex); 116b21a4e3b5f7f07ed160ca6e1809313e2a8e2a6a4Jamie Gennis 11772c3f7d88160b7c279f90f0efe3c1cb12cd140aeJamie Gennis CB_LOGV("onBuffersReleased"); 1181a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis 11972c3f7d88160b7c279f90f0efe3c1cb12cd140aeJamie Gennis if (mAbandoned) { 12072c3f7d88160b7c279f90f0efe3c1cb12cd140aeJamie Gennis // Nothing to do if we're already abandoned. 12172c3f7d88160b7c279f90f0efe3c1cb12cd140aeJamie Gennis return; 1221a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis } 1231a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis 12472c3f7d88160b7c279f90f0efe3c1cb12cd140aeJamie Gennis uint32_t mask = 0; 125db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian mConsumer->getReleasedBuffers(&mask); 1261a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis for (int i = 0; i < BufferQueue::NUM_BUFFER_SLOTS; i++) { 12772c3f7d88160b7c279f90f0efe3c1cb12cd140aeJamie Gennis if (mask & (1 << i)) { 12872c3f7d88160b7c279f90f0efe3c1cb12cd140aeJamie Gennis freeBufferLocked(i); 12972c3f7d88160b7c279f90f0efe3c1cb12cd140aeJamie Gennis } 1301a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis } 1311a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis} 1321a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis 1331a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennisvoid ConsumerBase::abandon() { 1341a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis CB_LOGV("abandon"); 1351a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis Mutex::Autolock lock(mMutex); 1361a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis 1371a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis if (!mAbandoned) { 1381a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis abandonLocked(); 1391a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis mAbandoned = true; 1401a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis } 1411a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis} 1421a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis 1431a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennisvoid ConsumerBase::abandonLocked() { 1441a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis CB_LOGV("abandonLocked"); 1451a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis for (int i =0; i < BufferQueue::NUM_BUFFER_SLOTS; i++) { 1461a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis freeBufferLocked(i); 1471a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis } 1481a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis // disconnect from the BufferQueue 149db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian mConsumer->consumerDisconnect(); 150db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian mConsumer.clear(); 1511a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis} 1521a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis 1531a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennisvoid ConsumerBase::setFrameAvailableListener( 154a4a3149a36bc69a06e4824aeae909ab910661070Igor Murashkin const wp<FrameAvailableListener>& listener) { 1551a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis CB_LOGV("setFrameAvailableListener"); 1561a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis Mutex::Autolock lock(mMutex); 1571a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis mFrameAvailableListener = listener; 1581a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis} 1591a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis 1601a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennisvoid ConsumerBase::dump(String8& result) const { 16174d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian dump(result, ""); 1621a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis} 1631a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis 16474d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopianvoid ConsumerBase::dump(String8& result, const char* prefix) const { 1651a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis Mutex::Autolock _l(mMutex); 16674d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian dumpLocked(result, prefix); 1671a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis} 1681a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis 16974d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopianvoid ConsumerBase::dumpLocked(String8& result, const char* prefix) const { 17074d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian result.appendFormat("%smAbandoned=%d\n", prefix, int(mAbandoned)); 1711a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis 1721a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis if (!mAbandoned) { 173db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian mConsumer->dump(result, prefix); 1741a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis } 1751a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis} 1761a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis 1771585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFaddenstatus_t ConsumerBase::acquireBufferLocked(BufferQueue::BufferItem *item, 1781585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden nsecs_t presentWhen) { 179db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian status_t err = mConsumer->acquireBuffer(item, presentWhen); 1801a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis if (err != NO_ERROR) { 1811a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis return err; 1821a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis } 1831a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis 1841a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis if (item->mGraphicBuffer != NULL) { 1851a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis mSlots[item->mBuf].mGraphicBuffer = item->mGraphicBuffer; 1861a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis } 1871a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis 188c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar mSlots[item->mBuf].mFrameNumber = item->mFrameNumber; 189b27254154642575dfb4bbfa79fbedde7d7ee23ddJamie Gennis mSlots[item->mBuf].mFence = item->mFence; 190b27254154642575dfb4bbfa79fbedde7d7ee23ddJamie Gennis 191c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar CB_LOGV("acquireBufferLocked: -> slot=%d/%llu", 192c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar item->mBuf, item->mFrameNumber); 1931a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis 1941a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis return OK; 1951a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis} 1961a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis 197c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnarstatus_t ConsumerBase::addReleaseFence(int slot, 198c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar const sp<GraphicBuffer> graphicBuffer, const sp<Fence>& fence) { 1999504eb915c9628e130f45019bdefda0168089886Jesse Hall Mutex::Autolock lock(mMutex); 200c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar return addReleaseFenceLocked(slot, graphicBuffer, fence); 2019504eb915c9628e130f45019bdefda0168089886Jesse Hall} 2029504eb915c9628e130f45019bdefda0168089886Jesse Hall 203c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnarstatus_t ConsumerBase::addReleaseFenceLocked(int slot, 204c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar const sp<GraphicBuffer> graphicBuffer, const sp<Fence>& fence) { 2059504eb915c9628e130f45019bdefda0168089886Jesse Hall CB_LOGV("addReleaseFenceLocked: slot=%d", slot); 206b27254154642575dfb4bbfa79fbedde7d7ee23ddJamie Gennis 207c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar // If consumer no longer tracks this graphicBuffer, we can safely 208c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar // drop this fence, as it will never be received by the producer. 209c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar if (!stillTracking(slot, graphicBuffer)) { 210c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar return OK; 211c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar } 212c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar 213b27254154642575dfb4bbfa79fbedde7d7ee23ddJamie Gennis if (!mSlots[slot].mFence.get()) { 214b27254154642575dfb4bbfa79fbedde7d7ee23ddJamie Gennis mSlots[slot].mFence = fence; 215b27254154642575dfb4bbfa79fbedde7d7ee23ddJamie Gennis } else { 216b27254154642575dfb4bbfa79fbedde7d7ee23ddJamie Gennis sp<Fence> mergedFence = Fence::merge( 2177aff4a5de47bf32b0934f5744cd1df4ce666d2d2Jamie Gennis String8::format("%.28s:%d", mName.string(), slot), 218b27254154642575dfb4bbfa79fbedde7d7ee23ddJamie Gennis mSlots[slot].mFence, fence); 219b27254154642575dfb4bbfa79fbedde7d7ee23ddJamie Gennis if (!mergedFence.get()) { 220b27254154642575dfb4bbfa79fbedde7d7ee23ddJamie Gennis CB_LOGE("failed to merge release fences"); 221b27254154642575dfb4bbfa79fbedde7d7ee23ddJamie Gennis // synchronization is broken, the best we can do is hope fences 222b27254154642575dfb4bbfa79fbedde7d7ee23ddJamie Gennis // signal in order so the new fence will act like a union 223b27254154642575dfb4bbfa79fbedde7d7ee23ddJamie Gennis mSlots[slot].mFence = fence; 224b27254154642575dfb4bbfa79fbedde7d7ee23ddJamie Gennis return BAD_VALUE; 225b27254154642575dfb4bbfa79fbedde7d7ee23ddJamie Gennis } 226b27254154642575dfb4bbfa79fbedde7d7ee23ddJamie Gennis mSlots[slot].mFence = mergedFence; 227b27254154642575dfb4bbfa79fbedde7d7ee23ddJamie Gennis } 228b27254154642575dfb4bbfa79fbedde7d7ee23ddJamie Gennis 229b27254154642575dfb4bbfa79fbedde7d7ee23ddJamie Gennis return OK; 230b27254154642575dfb4bbfa79fbedde7d7ee23ddJamie Gennis} 231b27254154642575dfb4bbfa79fbedde7d7ee23ddJamie Gennis 232c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnarstatus_t ConsumerBase::releaseBufferLocked( 233c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar int slot, const sp<GraphicBuffer> graphicBuffer, 234c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar EGLDisplay display, EGLSyncKHR eglFence) { 235c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar // If consumer no longer tracks this graphicBuffer (we received a new 236c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar // buffer on the same slot), the buffer producer is definitely no longer 237c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar // tracking it. 238c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar if (!stillTracking(slot, graphicBuffer)) { 239c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar return OK; 240c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar } 241c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar 242c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar CB_LOGV("releaseBufferLocked: slot=%d/%llu", 243c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar slot, mSlots[slot].mFrameNumber); 244db89edc94bd2a78226b407f9f7261e202e7fa325Mathias Agopian status_t err = mConsumer->releaseBuffer(slot, mSlots[slot].mFrameNumber, 245c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar display, eglFence, mSlots[slot].mFence); 2461a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis if (err == BufferQueue::STALE_BUFFER_SLOT) { 2471a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis freeBufferLocked(slot); 2481a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis } 2491a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis 2501df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis mSlots[slot].mFence = Fence::NO_FENCE; 2511a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis 2521a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis return err; 2531a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis} 2541a4d883dcc1725892bfb5c28dec255a233186524Jamie Gennis 255c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnarbool ConsumerBase::stillTracking(int slot, 256c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar const sp<GraphicBuffer> graphicBuffer) { 257c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar if (slot < 0 || slot >= BufferQueue::NUM_BUFFER_SLOTS) { 258c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar return false; 259c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar } 260c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar return (mSlots[slot].mGraphicBuffer != NULL && 261c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar mSlots[slot].mGraphicBuffer->handle == graphicBuffer->handle); 262c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar} 263c5d7b7d323bba8772a9005f7d300ad983a04733aLajos Molnar 2642adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden} // namespace android 265