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