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 173e96f1982fda358424b0b75f394cbf7c1794a072Dan Stoza#define LOG_TAG "BufferQueueCore" 183e96f1982fda358424b0b75f394cbf7c1794a072Dan Stoza#define ATRACE_TAG ATRACE_TAG_GRAPHICS 193e96f1982fda358424b0b75f394cbf7c1794a072Dan Stoza//#define LOG_NDEBUG 0 203e96f1982fda358424b0b75f394cbf7c1794a072Dan Stoza 21289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza#define EGL_EGLEXT_PROTOTYPES 22289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 239e314337cdc65b1fbf52060e9a6a4ddf2215c352Pablo Ceballos#if DEBUG_ONLY_CODE 249e314337cdc65b1fbf52060e9a6a4ddf2215c352Pablo Ceballos#define VALIDATE_CONSISTENCY() do { validateConsistencyLocked(); } while (0) 259e314337cdc65b1fbf52060e9a6a4ddf2215c352Pablo Ceballos#else 269e314337cdc65b1fbf52060e9a6a4ddf2215c352Pablo Ceballos#define VALIDATE_CONSISTENCY() 279e314337cdc65b1fbf52060e9a6a4ddf2215c352Pablo Ceballos#endif 289e314337cdc65b1fbf52060e9a6a4ddf2215c352Pablo Ceballos 29cece164b23dbb368de1be2112827dd2df0ab2b5cMark Salyzyn#include <inttypes.h> 30cece164b23dbb368de1be2112827dd2df0ab2b5cMark Salyzyn 31289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza#include <gui/BufferItem.h> 32289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza#include <gui/BufferQueueCore.h> 33289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza#include <gui/IConsumerListener.h> 343e96f1982fda358424b0b75f394cbf7c1794a072Dan Stoza#include <gui/IGraphicBufferAlloc.h> 35f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza#include <gui/IProducerListener.h> 363e96f1982fda358424b0b75f394cbf7c1794a072Dan Stoza#include <gui/ISurfaceComposer.h> 373e96f1982fda358424b0b75f394cbf7c1794a072Dan Stoza#include <private/gui/ComposerService.h> 38289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 39289ade165e60b5f71734d30e535f16eb1f4313adDan Stozanamespace android { 40289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 41289ade165e60b5f71734d30e535f16eb1f4313adDan Stozastatic String8 getUniqueName() { 42289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza static volatile int32_t counter = 0; 43289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza return String8::format("unnamed-%d-%d", getpid(), 44289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza android_atomic_inc(&counter)); 45289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza} 46289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 478e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballosstatic uint64_t getUniqueId() { 488e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos static std::atomic<uint32_t> counter{0}; 498e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos static uint64_t id = static_cast<uint64_t>(getpid()) << 32; 508e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos return id | counter++; 518e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos} 528e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos 5370982a5f95f68295244e5f6cc037c193713a5259Dan StozaBufferQueueCore::BufferQueueCore(const sp<IGraphicBufferAlloc>& allocator) : 5470982a5f95f68295244e5f6cc037c193713a5259Dan Stoza mAllocator(allocator), 55289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza mMutex(), 56289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza mIsAbandoned(false), 57289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza mConsumerControlledByApp(false), 58289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza mConsumerName(getUniqueName()), 59289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza mConsumerListener(), 60289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza mConsumerUsageBits(0), 61289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza mConnectedApi(NO_CONNECTED_API), 62f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza mConnectedProducerListener(), 63289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza mSlots(), 64289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza mQueue(), 650de7ea752900b5da29ad19c2799040235477f3c5Dan Stoza mFreeSlots(), 660de7ea752900b5da29ad19c2799040235477f3c5Dan Stoza mFreeBuffers(), 6723b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos mUnusedSlots(), 6823b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos mActiveBuffers(), 69289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza mDequeueCondition(), 70289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza mDequeueBufferCannotBlock(false), 71289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza mDefaultBufferFormat(PIXEL_FORMAT_RGBA_8888), 72289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza mDefaultWidth(1), 73289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza mDefaultHeight(1), 7482c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala mDefaultBufferDataSpace(HAL_DATASPACE_UNKNOWN), 7519e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos mMaxBufferCount(BufferQueueDefs::NUM_BUFFER_SLOTS), 76289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza mMaxAcquiredBufferCount(1), 77fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos mMaxDequeuedBufferCount(1), 78289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza mBufferHasBeenQueued(false), 79289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza mFrameCounter(0), 8078014f32da6d0ebf52fb34ebb7663863000520a0Antoine Labour mTransformHint(0), 8178014f32da6d0ebf52fb34ebb7663863000520a0Antoine Labour mIsAllocating(false), 829de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza mIsAllocatingCondition(), 834afd8b67f9be307e6c6ed89deab2e85516bb3a0eDan Stoza mAllowAllocation(true), 84812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza mBufferAge(0), 85fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos mGenerationNumber(0), 86ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos mAsyncMode(false), 873559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos mSharedBufferMode(false), 88ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos mAutoRefresh(false), 893559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos mSharedBufferSlot(INVALID_BUFFER_SLOT), 903559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos mSharedBufferCache(Rect::INVALID_RECT, 0, NATIVE_WINDOW_SCALING_MODE_FREEZE, 918e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos HAL_DATASPACE_UNKNOWN), 928e3e92b906db431c4fa822f21242977d4ee99942Pablo Ceballos mUniqueId(getUniqueId()) 933e96f1982fda358424b0b75f394cbf7c1794a072Dan Stoza{ 9470982a5f95f68295244e5f6cc037c193713a5259Dan Stoza if (allocator == NULL) { 9570982a5f95f68295244e5f6cc037c193713a5259Dan Stoza sp<ISurfaceComposer> composer(ComposerService::getComposerService()); 9670982a5f95f68295244e5f6cc037c193713a5259Dan Stoza mAllocator = composer->createGraphicBufferAlloc(); 9770982a5f95f68295244e5f6cc037c193713a5259Dan Stoza if (mAllocator == NULL) { 9870982a5f95f68295244e5f6cc037c193713a5259Dan Stoza BQ_LOGE("createGraphicBufferAlloc failed"); 9970982a5f95f68295244e5f6cc037c193713a5259Dan Stoza } 1003e96f1982fda358424b0b75f394cbf7c1794a072Dan Stoza } 10123b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos 10223b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos int numStartingBuffers = getMaxBufferCountLocked(); 10323b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos for (int s = 0; s < numStartingBuffers; s++) { 10423b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos mFreeSlots.insert(s); 10523b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos } 10623b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos for (int s = numStartingBuffers; s < BufferQueueDefs::NUM_BUFFER_SLOTS; 10723b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos s++) { 10823b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos mUnusedSlots.push_front(s); 1090de7ea752900b5da29ad19c2799040235477f3c5Dan Stoza } 1103e96f1982fda358424b0b75f394cbf7c1794a072Dan Stoza} 111289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 112289ade165e60b5f71734d30e535f16eb1f4313adDan StozaBufferQueueCore::~BufferQueueCore() {} 113289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 114289ade165e60b5f71734d30e535f16eb1f4313adDan Stozavoid BufferQueueCore::dump(String8& result, const char* prefix) const { 115289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza Mutex::Autolock lock(mMutex); 116289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 117289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza String8 fifo; 118289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza Fifo::const_iterator current(mQueue.begin()); 119289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza while (current != mQueue.end()) { 120289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza fifo.appendFormat("%02d:%p crop=[%d,%d,%d,%d], " 121cece164b23dbb368de1be2112827dd2df0ab2b5cMark Salyzyn "xform=0x%02x, time=%#" PRIx64 ", scale=%s\n", 122289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza current->mSlot, current->mGraphicBuffer.get(), 123289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza current->mCrop.left, current->mCrop.top, current->mCrop.right, 124289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza current->mCrop.bottom, current->mTransform, current->mTimestamp, 125289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza BufferItem::scalingModeName(current->mScalingMode)); 126289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza ++current; 127289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza } 128289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 129289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza result.appendFormat("%s-BufferQueue mMaxAcquiredBufferCount=%d, " 130567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos "mMaxDequeuedBufferCount=%d, mDequeueBufferCannotBlock=%d " 131567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos "mAsyncMode=%d, default-size=[%dx%d], default-format=%d, " 132567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos "transform-hint=%02x, FIFO(%zu)={%s}\n", prefix, 133567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos mMaxAcquiredBufferCount, mMaxDequeuedBufferCount, 134567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos mDequeueBufferCannotBlock, mAsyncMode, mDefaultWidth, 135567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos mDefaultHeight, mDefaultBufferFormat, mTransformHint, mQueue.size(), 136567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos fifo.string()); 137289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 13823b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos for (int s : mActiveBuffers) { 13923b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos const sp<GraphicBuffer>& buffer(mSlots[s].mGraphicBuffer); 140adf51bac81fa28637d00227a44d7b20ea035980aPablo Ceballos // A dequeued buffer might be null if it's still being allocated 141adf51bac81fa28637d00227a44d7b20ea035980aPablo Ceballos if (buffer.get()) { 142adf51bac81fa28637d00227a44d7b20ea035980aPablo Ceballos result.appendFormat("%s%s[%02d:%p] state=%-8s, %p " 143adf51bac81fa28637d00227a44d7b20ea035980aPablo Ceballos "[%4ux%4u:%4u,%3X]\n", prefix, 144adf51bac81fa28637d00227a44d7b20ea035980aPablo Ceballos (mSlots[s].mBufferState.isAcquired()) ? ">" : " ", s, 145adf51bac81fa28637d00227a44d7b20ea035980aPablo Ceballos buffer.get(), mSlots[s].mBufferState.string(), 146adf51bac81fa28637d00227a44d7b20ea035980aPablo Ceballos buffer->handle, buffer->width, buffer->height, 147adf51bac81fa28637d00227a44d7b20ea035980aPablo Ceballos buffer->stride, buffer->format); 148adf51bac81fa28637d00227a44d7b20ea035980aPablo Ceballos } else { 149adf51bac81fa28637d00227a44d7b20ea035980aPablo Ceballos result.appendFormat("%s [%02d:%p] state=%-8s\n", prefix, s, 150adf51bac81fa28637d00227a44d7b20ea035980aPablo Ceballos buffer.get(), mSlots[s].mBufferState.string()); 151adf51bac81fa28637d00227a44d7b20ea035980aPablo Ceballos } 15223b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos } 15323b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos for (int s : mFreeBuffers) { 15423b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos const sp<GraphicBuffer>& buffer(mSlots[s].mGraphicBuffer); 15523b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos result.appendFormat("%s [%02d:%p] state=%-8s, %p [%4ux%4u:%4u,%3X]\n", 15623b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos prefix, s, buffer.get(), mSlots[s].mBufferState.string(), 15723b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos buffer->handle, buffer->width, buffer->height, buffer->stride, 15823b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos buffer->format); 15923b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos } 160289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 16123b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos for (int s : mFreeSlots) { 16223b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos const sp<GraphicBuffer>& buffer(mSlots[s].mGraphicBuffer); 16323b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos result.appendFormat("%s [%02d:%p] state=%-8s\n", prefix, s, 16423b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos buffer.get(), mSlots[s].mBufferState.string()); 165289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza } 166289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza} 167289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 168567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballosint BufferQueueCore::getMinUndequeuedBufferCountLocked() const { 169289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza // If dequeueBuffer is allowed to error out, we don't have to add an 170289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza // extra buffer. 171567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos if (mAsyncMode || mDequeueBufferCannotBlock) { 172289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza return mMaxAcquiredBufferCount + 1; 173289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza } 174289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 175289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza return mMaxAcquiredBufferCount; 176289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza} 177289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 178567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballosint BufferQueueCore::getMinMaxBufferCountLocked() const { 179567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos return getMinUndequeuedBufferCountLocked() + 1; 180289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza} 181289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 18223b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballosint BufferQueueCore::getMaxBufferCountLocked(bool asyncMode, 18323b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos bool dequeueBufferCannotBlock, int maxBufferCount) const { 18423b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos int maxCount = mMaxAcquiredBufferCount + mMaxDequeuedBufferCount + 18523b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos ((asyncMode || dequeueBufferCannotBlock) ? 1 : 0); 18623b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos maxCount = std::min(maxBufferCount, maxCount); 18723b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos return maxCount; 18823b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos} 18923b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos 190567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballosint BufferQueueCore::getMaxBufferCountLocked() const { 19119e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos int maxBufferCount = mMaxAcquiredBufferCount + mMaxDequeuedBufferCount + 19223b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos ((mAsyncMode || mDequeueBufferCannotBlock) ? 1 : 0); 19319e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos 19419e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos // limit maxBufferCount by mMaxBufferCount always 19519e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos maxBufferCount = std::min(mMaxBufferCount, maxBufferCount); 196289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 197289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza return maxBufferCount; 198289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza} 199289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 20023b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballosvoid BufferQueueCore::clearBufferSlotLocked(int slot) { 20123b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos BQ_LOGV("clearBufferSlotLocked: slot %d", slot); 20223b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos 203289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza mSlots[slot].mGraphicBuffer.clear(); 20423b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos mSlots[slot].mBufferState.reset(); 20523b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos mSlots[slot].mRequestBufferCalled = false; 20652937cd9a543fe66696c38ae50ec141aa70ec1e4Dan Stoza mSlots[slot].mFrameNumber = 0; 20723b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos mSlots[slot].mAcquireCalled = false; 20823b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos mSlots[slot].mNeedsReallocation = true; 209289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 210289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza // Destroy fence as BufferQueue now takes ownership 211289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza if (mSlots[slot].mEglFence != EGL_NO_SYNC_KHR) { 212289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza eglDestroySyncKHR(mSlots[slot].mEglDisplay, mSlots[slot].mEglFence); 213289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza mSlots[slot].mEglFence = EGL_NO_SYNC_KHR; 214289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza } 215289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza mSlots[slot].mFence = Fence::NO_FENCE; 21623b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos mSlots[slot].mEglDisplay = EGL_NO_DISPLAY; 21750101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza 21850101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza if (mLastQueuedSlot == slot) { 21950101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza mLastQueuedSlot = INVALID_BUFFER_SLOT; 22050101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza } 221289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza} 222289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 223289ade165e60b5f71734d30e535f16eb1f4313adDan Stozavoid BufferQueueCore::freeAllBuffersLocked() { 22423b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos for (int s : mFreeSlots) { 22523b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos clearBufferSlotLocked(s); 226289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza } 227289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 22823b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos for (int s : mFreeBuffers) { 22923b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos mFreeSlots.insert(s); 23023b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos clearBufferSlotLocked(s); 23123b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos } 23223b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos mFreeBuffers.clear(); 23323b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos 23423b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos for (int s : mActiveBuffers) { 23523b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos mFreeSlots.insert(s); 23623b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos clearBufferSlotLocked(s); 23723b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos } 23823b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos mActiveBuffers.clear(); 23923b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos 24023b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos for (auto& b : mQueue) { 24123b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos b.mIsStale = true; 24223b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos } 243289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 2449e314337cdc65b1fbf52060e9a6a4ddf2215c352Pablo Ceballos VALIDATE_CONSISTENCY(); 24523b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos} 246289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 247bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvalavoid BufferQueueCore::discardFreeBuffersLocked() { 248bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala for (int s : mFreeBuffers) { 249bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala mFreeSlots.insert(s); 250bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala clearBufferSlotLocked(s); 251bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala } 252bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala mFreeBuffers.clear(); 253bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala 254bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala VALIDATE_CONSISTENCY(); 255bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala} 256bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala 2573827379b2e414b4c96793dd3555302638db02562Pablo Ceballosbool BufferQueueCore::adjustAvailableSlotsLocked(int delta) { 25823b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos if (delta >= 0) { 25972daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos // If we're going to fail, do so before modifying anything 26072daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos if (delta > static_cast<int>(mUnusedSlots.size())) { 26172daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos return false; 26272daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos } 26323b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos while (delta > 0) { 26423b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos if (mUnusedSlots.empty()) { 26523b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos return false; 26623b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos } 26723b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos int slot = mUnusedSlots.back(); 26823b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos mUnusedSlots.pop_back(); 26923b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos mFreeSlots.insert(slot); 27023b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos delta--; 27123b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos } 27223b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos } else { 27372daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos // If we're going to fail, do so before modifying anything 27472daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos if (-delta > static_cast<int>(mFreeSlots.size() + 27572daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos mFreeBuffers.size())) { 27672daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos return false; 27772daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos } 27823b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos while (delta < 0) { 27923b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos if (!mFreeSlots.empty()) { 28023b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos auto slot = mFreeSlots.begin(); 28123b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos clearBufferSlotLocked(*slot); 28223b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos mUnusedSlots.push_back(*slot); 28323b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos mFreeSlots.erase(slot); 28423b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos } else if (!mFreeBuffers.empty()) { 28523b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos int slot = mFreeBuffers.back(); 28623b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos clearBufferSlotLocked(slot); 28723b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos mUnusedSlots.push_back(slot); 28823b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos mFreeBuffers.pop_back(); 28923b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos } else { 29023b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos return false; 29123b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos } 29223b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos delta++; 29323b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos } 29423b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos } 29523b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos return true; 296289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza} 297289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza 29878014f32da6d0ebf52fb34ebb7663863000520a0Antoine Labourvoid BufferQueueCore::waitWhileAllocatingLocked() const { 29978014f32da6d0ebf52fb34ebb7663863000520a0Antoine Labour ATRACE_CALL(); 30078014f32da6d0ebf52fb34ebb7663863000520a0Antoine Labour while (mIsAllocating) { 30178014f32da6d0ebf52fb34ebb7663863000520a0Antoine Labour mIsAllocatingCondition.wait(mMutex); 30278014f32da6d0ebf52fb34ebb7663863000520a0Antoine Labour } 30378014f32da6d0ebf52fb34ebb7663863000520a0Antoine Labour} 30478014f32da6d0ebf52fb34ebb7663863000520a0Antoine Labour 3059e314337cdc65b1fbf52060e9a6a4ddf2215c352Pablo Ceballos#if DEBUG_ONLY_CODE 3060de7ea752900b5da29ad19c2799040235477f3c5Dan Stozavoid BufferQueueCore::validateConsistencyLocked() const { 3070de7ea752900b5da29ad19c2799040235477f3c5Dan Stoza static const useconds_t PAUSE_TIME = 0; 30823b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos int allocatedSlots = 0; 3090de7ea752900b5da29ad19c2799040235477f3c5Dan Stoza for (int slot = 0; slot < BufferQueueDefs::NUM_BUFFER_SLOTS; ++slot) { 3100de7ea752900b5da29ad19c2799040235477f3c5Dan Stoza bool isInFreeSlots = mFreeSlots.count(slot) != 0; 3110de7ea752900b5da29ad19c2799040235477f3c5Dan Stoza bool isInFreeBuffers = 3120de7ea752900b5da29ad19c2799040235477f3c5Dan Stoza std::find(mFreeBuffers.cbegin(), mFreeBuffers.cend(), slot) != 3130de7ea752900b5da29ad19c2799040235477f3c5Dan Stoza mFreeBuffers.cend(); 31423b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos bool isInActiveBuffers = mActiveBuffers.count(slot) != 0; 31523b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos bool isInUnusedSlots = 31623b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos std::find(mUnusedSlots.cbegin(), mUnusedSlots.cend(), slot) != 31723b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos mUnusedSlots.cend(); 31823b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos 31923b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos if (isInFreeSlots || isInFreeBuffers || isInActiveBuffers) { 32023b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos allocatedSlots++; 32123b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos } 32223b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos 32323b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos if (isInUnusedSlots) { 32423b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos if (isInFreeSlots) { 32523b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos BQ_LOGE("Slot %d is in mUnusedSlots and in mFreeSlots", slot); 32623b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos usleep(PAUSE_TIME); 32723b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos } 32823b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos if (isInFreeBuffers) { 32923b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos BQ_LOGE("Slot %d is in mUnusedSlots and in mFreeBuffers", slot); 33023b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos usleep(PAUSE_TIME); 33123b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos } 33223b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos if (isInActiveBuffers) { 33323b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos BQ_LOGE("Slot %d is in mUnusedSlots and in mActiveBuffers", 33423b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos slot); 33523b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos usleep(PAUSE_TIME); 33623b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos } 33723b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos if (!mSlots[slot].mBufferState.isFree()) { 33823b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos BQ_LOGE("Slot %d is in mUnusedSlots but is not FREE", slot); 33923b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos usleep(PAUSE_TIME); 34023b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos } 34123b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos if (mSlots[slot].mGraphicBuffer != NULL) { 34223b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos BQ_LOGE("Slot %d is in mUnusedSluts but has an active buffer", 34323b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos slot); 34423b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos usleep(PAUSE_TIME); 34523b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos } 34623b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos } else if (isInFreeSlots) { 34723b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos if (isInUnusedSlots) { 34823b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos BQ_LOGE("Slot %d is in mFreeSlots and in mUnusedSlots", slot); 34923b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos usleep(PAUSE_TIME); 35023b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos } 35123b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos if (isInFreeBuffers) { 35223b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos BQ_LOGE("Slot %d is in mFreeSlots and in mFreeBuffers", slot); 35323b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos usleep(PAUSE_TIME); 35423b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos } 35523b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos if (isInActiveBuffers) { 35623b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos BQ_LOGE("Slot %d is in mFreeSlots and in mActiveBuffers", slot); 35723b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos usleep(PAUSE_TIME); 35823b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos } 35923b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos if (!mSlots[slot].mBufferState.isFree()) { 36023b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos BQ_LOGE("Slot %d is in mFreeSlots but is not FREE", slot); 36123b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos usleep(PAUSE_TIME); 36223b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos } 36323b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos if (mSlots[slot].mGraphicBuffer != NULL) { 36423b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos BQ_LOGE("Slot %d is in mFreeSlots but has a buffer", 36523b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos slot); 36623b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos usleep(PAUSE_TIME); 36723b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos } 36823b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos } else if (isInFreeBuffers) { 36923b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos if (isInUnusedSlots) { 37023b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos BQ_LOGE("Slot %d is in mFreeBuffers and in mUnusedSlots", slot); 37123b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos usleep(PAUSE_TIME); 37223b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos } 37323b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos if (isInFreeSlots) { 37423b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos BQ_LOGE("Slot %d is in mFreeBuffers and in mFreeSlots", slot); 37523b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos usleep(PAUSE_TIME); 37623b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos } 37723b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos if (isInActiveBuffers) { 37823b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos BQ_LOGE("Slot %d is in mFreeBuffers and in mActiveBuffers", 37923b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos slot); 38023b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos usleep(PAUSE_TIME); 38123b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos } 38223b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos if (!mSlots[slot].mBufferState.isFree()) { 38323b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos BQ_LOGE("Slot %d is in mFreeBuffers but is not FREE", slot); 38423b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos usleep(PAUSE_TIME); 38523b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos } 3860de7ea752900b5da29ad19c2799040235477f3c5Dan Stoza if (mSlots[slot].mGraphicBuffer == NULL) { 38723b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos BQ_LOGE("Slot %d is in mFreeBuffers but has no buffer", slot); 38823b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos usleep(PAUSE_TIME); 38923b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos } 39023b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos } else if (isInActiveBuffers) { 39123b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos if (isInUnusedSlots) { 39223b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos BQ_LOGE("Slot %d is in mActiveBuffers and in mUnusedSlots", 39323b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos slot); 39423b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos usleep(PAUSE_TIME); 3950de7ea752900b5da29ad19c2799040235477f3c5Dan Stoza } 3960de7ea752900b5da29ad19c2799040235477f3c5Dan Stoza if (isInFreeSlots) { 39723b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos BQ_LOGE("Slot %d is in mActiveBuffers and in mFreeSlots", slot); 3980de7ea752900b5da29ad19c2799040235477f3c5Dan Stoza usleep(PAUSE_TIME); 3990de7ea752900b5da29ad19c2799040235477f3c5Dan Stoza } 4000de7ea752900b5da29ad19c2799040235477f3c5Dan Stoza if (isInFreeBuffers) { 40123b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos BQ_LOGE("Slot %d is in mActiveBuffers and in mFreeBuffers", 40223b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos slot); 40323b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos usleep(PAUSE_TIME); 40423b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos } 40523b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos if (mSlots[slot].mBufferState.isFree() && 40623b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos !mSlots[slot].mBufferState.isShared()) { 40723b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos BQ_LOGE("Slot %d is in mActiveBuffers but is FREE", slot); 4080de7ea752900b5da29ad19c2799040235477f3c5Dan Stoza usleep(PAUSE_TIME); 4090de7ea752900b5da29ad19c2799040235477f3c5Dan Stoza } 41023b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos if (mSlots[slot].mGraphicBuffer == NULL && !mIsAllocating) { 41123b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos BQ_LOGE("Slot %d is in mActiveBuffers but has no buffer", slot); 41223b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos usleep(PAUSE_TIME); 41323b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos } 41423b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos } else { 41523b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos BQ_LOGE("Slot %d isn't in any of mUnusedSlots, mFreeSlots, " 41623b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos "mFreeBuffers, or mActiveBuffers", slot); 41723b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos usleep(PAUSE_TIME); 4180de7ea752900b5da29ad19c2799040235477f3c5Dan Stoza } 4190de7ea752900b5da29ad19c2799040235477f3c5Dan Stoza } 42023b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos 42123b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos if (allocatedSlots != getMaxBufferCountLocked()) { 42223b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos BQ_LOGE("Number of allocated slots is incorrect. Allocated = %d, " 42323b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos "Should be %d (%zu free slots, %zu free buffers, " 42423b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos "%zu activeBuffers, %zu unusedSlots)", allocatedSlots, 42523b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos getMaxBufferCountLocked(), mFreeSlots.size(), 42623b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos mFreeBuffers.size(), mActiveBuffers.size(), 42723b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos mUnusedSlots.size()); 42823b4abe024ea88c45e0b94c80e1fb537a573b143Pablo Ceballos } 4290de7ea752900b5da29ad19c2799040235477f3c5Dan Stoza} 4309e314337cdc65b1fbf52060e9a6a4ddf2215c352Pablo Ceballos#endif 4310de7ea752900b5da29ad19c2799040235477f3c5Dan Stoza 432289ade165e60b5f71734d30e535f16eb1f4313adDan Stoza} // namespace android 433