diff options
| author | 2016-02-18 22:09:39 +0000 | |
|---|---|---|
| committer | 2016-02-18 22:09:39 +0000 | |
| commit | 8164ce1d59f505f7e6eb5bce66864879b021f2b6 (patch) | |
| tree | f54c7ff10582c916e36d12ec5d52165157133902 /libs/gui/BufferQueueConsumer.cpp | |
| parent | 0b1cf331d281d28eb67b3aa2be01026c2ceda4d9 (diff) | |
| parent | 981066c3a5be3e4775b6537ef32268f7e108c912 (diff) | |
Merge "Partial revert of "Fix Surface slot caching"" into nyc-dev
Diffstat (limited to 'libs/gui/BufferQueueConsumer.cpp')
| -rw-r--r-- | libs/gui/BufferQueueConsumer.cpp | 129 | 
1 files changed, 47 insertions, 82 deletions
diff --git a/libs/gui/BufferQueueConsumer.cpp b/libs/gui/BufferQueueConsumer.cpp index b025280382..92285e5811 100644 --- a/libs/gui/BufferQueueConsumer.cpp +++ b/libs/gui/BufferQueueConsumer.cpp @@ -274,51 +274,35 @@ status_t BufferQueueConsumer::detachBuffer(int slot) {      ATRACE_CALL();      ATRACE_BUFFER_INDEX(slot);      BQ_LOGV("detachBuffer: slot %d", slot); +    Mutex::Autolock lock(mCore->mMutex); -    sp<IConsumerListener> consumerListener; -    sp<IProducerListener> producerListener; -    { -        Mutex::Autolock lock(mCore->mMutex); - -        if (mCore->mIsAbandoned) { -            BQ_LOGE("detachBuffer: BufferQueue has been abandoned"); -            return NO_INIT; -        } - -        if (mCore->mSingleBufferMode || slot == mCore->mSingleBufferSlot) { -            BQ_LOGE("detachBuffer: detachBuffer not allowed in single buffer" -                    "mode"); -            return BAD_VALUE; -        } - -        if (slot < 0 || slot >= BufferQueueDefs::NUM_BUFFER_SLOTS) { -            BQ_LOGE("detachBuffer: slot index %d out of range [0, %d)", -                    slot, BufferQueueDefs::NUM_BUFFER_SLOTS); -            return BAD_VALUE; -        } else if (!mSlots[slot].mBufferState.isAcquired()) { -            BQ_LOGE("detachBuffer: slot %d is not owned by the consumer " -                    "(state = %s)", slot, mSlots[slot].mBufferState.string()); -            return BAD_VALUE; -        } - -        mSlots[slot].mBufferState.detachConsumer(); -        mCore->mActiveBuffers.erase(slot); -        mCore->mFreeSlots.insert(slot); -        mCore->clearBufferSlotLocked(slot); -        mCore->mDequeueCondition.broadcast(); -        VALIDATE_CONSISTENCY(); -        producerListener = mCore->mConnectedProducerListener; -        consumerListener = mCore->mConsumerListener; +    if (mCore->mIsAbandoned) { +        BQ_LOGE("detachBuffer: BufferQueue has been abandoned"); +        return NO_INIT;      } -    // Call back without lock held -    if (producerListener != NULL) { -        producerListener->onSlotFreed(slot); +    if (mCore->mSingleBufferMode || slot == mCore->mSingleBufferSlot) { +        BQ_LOGE("detachBuffer: detachBuffer not allowed in single buffer" +                "mode"); +        return BAD_VALUE;      } -    if (consumerListener != NULL) { -        consumerListener->onBuffersReleased(); + +    if (slot < 0 || slot >= BufferQueueDefs::NUM_BUFFER_SLOTS) { +        BQ_LOGE("detachBuffer: slot index %d out of range [0, %d)", +                slot, BufferQueueDefs::NUM_BUFFER_SLOTS); +        return BAD_VALUE; +    } else if (!mSlots[slot].mBufferState.isAcquired()) { +        BQ_LOGE("detachBuffer: slot %d is not owned by the consumer " +                "(state = %s)", slot, mSlots[slot].mBufferState.string()); +        return BAD_VALUE;      } +    mSlots[slot].mBufferState.detachConsumer(); +    mCore->mActiveBuffers.erase(slot); +    mCore->mFreeSlots.insert(slot); +    mCore->clearBufferSlotLocked(slot); +    mCore->mDequeueCondition.broadcast(); +    VALIDATE_CONSISTENCY();      return NO_ERROR;  } @@ -589,40 +573,30 @@ status_t BufferQueueConsumer::setMaxBufferCount(int bufferCount) {          return BAD_VALUE;      } -    sp<IConsumerListener> listener; -    { -        Mutex::Autolock lock(mCore->mMutex); -        if (mCore->mConnectedApi != BufferQueueCore::NO_CONNECTED_API) { -            BQ_LOGE("setMaxBufferCount: producer is already connected"); -            return INVALID_OPERATION; -        } - -        if (bufferCount < mCore->mMaxAcquiredBufferCount) { -            BQ_LOGE("setMaxBufferCount: invalid buffer count (%d) less than" -                    "mMaxAcquiredBufferCount (%d)", bufferCount, -                    mCore->mMaxAcquiredBufferCount); -            return BAD_VALUE; -        } +    Mutex::Autolock lock(mCore->mMutex); -        int delta = mCore->getMaxBufferCountLocked(mCore->mAsyncMode, -                mCore->mDequeueBufferCannotBlock, bufferCount) - -                mCore->getMaxBufferCountLocked(); -        if (!mCore->adjustAvailableSlotsLocked(delta, nullptr)) { -            BQ_LOGE("setMaxBufferCount: BufferQueue failed to adjust the number" -                    " of available slots. Delta = %d", delta); -            return BAD_VALUE; -        } +    if (mCore->mConnectedApi != BufferQueueCore::NO_CONNECTED_API) { +        BQ_LOGE("setMaxBufferCount: producer is already connected"); +        return INVALID_OPERATION; +    } -        mCore->mMaxBufferCount = bufferCount; -        if (delta < 0) { -            listener = mCore->mConsumerListener; -        } +    if (bufferCount < mCore->mMaxAcquiredBufferCount) { +        BQ_LOGE("setMaxBufferCount: invalid buffer count (%d) less than" +                "mMaxAcquiredBufferCount (%d)", bufferCount, +                mCore->mMaxAcquiredBufferCount); +        return BAD_VALUE;      } -    // Call back without lock held -    if (listener != NULL) { -        listener->onBuffersReleased(); +    int delta = mCore->getMaxBufferCountLocked(mCore->mAsyncMode, +            mCore->mDequeueBufferCannotBlock, bufferCount) - +            mCore->getMaxBufferCountLocked(); +    if (!mCore->adjustAvailableSlotsLocked(delta)) { +        BQ_LOGE("setMaxBufferCount: BufferQueue failed to adjust the number of " +                "available slots. Delta = %d", delta); +        return BAD_VALUE;      } + +    mCore->mMaxBufferCount = bufferCount;      return NO_ERROR;  } @@ -637,9 +611,7 @@ status_t BufferQueueConsumer::setMaxAcquiredBufferCount(          return BAD_VALUE;      } -    sp<IConsumerListener> consumerListener; -    sp<IProducerListener> producerListener; -    std::vector<int> freedSlots; +    sp<IConsumerListener> listener;      { // Autolock scope          Mutex::Autolock lock(mCore->mMutex);          mCore->waitWhileAllocatingLocked(); @@ -676,7 +648,7 @@ status_t BufferQueueConsumer::setMaxAcquiredBufferCount(          }          int delta = maxAcquiredBuffers - mCore->mMaxAcquiredBufferCount; -        if (!mCore->adjustAvailableSlotsLocked(delta, &freedSlots)) { +        if (!mCore->adjustAvailableSlotsLocked(delta)) {              return BAD_VALUE;          } @@ -684,19 +656,12 @@ status_t BufferQueueConsumer::setMaxAcquiredBufferCount(          mCore->mMaxAcquiredBufferCount = maxAcquiredBuffers;          VALIDATE_CONSISTENCY();          if (delta < 0) { -            consumerListener = mCore->mConsumerListener; -            producerListener = mCore->mConnectedProducerListener; +            listener = mCore->mConsumerListener;          }      } -      // Call back without lock held -    if (consumerListener != NULL) { -        consumerListener->onBuffersReleased(); -    } -    if (producerListener != NULL) { -        for (int i : freedSlots) { -            producerListener->onSlotFreed(i); -        } +    if (listener != NULL) { +        listener->onBuffersReleased();      }      return NO_ERROR;  |