Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cd333fe7 authored by Yin-Chia Yeh's avatar Yin-Chia Yeh
Browse files

Camera: bug fixes for HAL buffer manager

Test: GCA smoke test + Camera CTS
Bug: 120986771
Change-Id: I946fb95d8e685995ebb8cf3d36b0373958bfad09
parent ffb2516c
Loading
Loading
Loading
Loading
+24 −14
Original line number Diff line number Diff line
@@ -1027,11 +1027,22 @@ hardware::Return<void> Camera3Device::requestStreamBuffers(
            return hardware::Void();
        }

        if (outputStream->isAbandoned()) {
            bufRet.val.error(StreamBufferRequestError::STREAM_DISCONNECTED);
            allReqsSucceeds = false;
            continue;
        }

        bufRet.streamId = streamId;
        size_t handOutBufferCount = outputStream->getOutstandingBuffersCount();
        uint32_t numBuffersRequested = bufReq.numBuffersRequested;
        size_t totalHandout = outputStream->getOutstandingBuffersCount() + numBuffersRequested;
        if (totalHandout > outputStream->asHalStream()->max_buffers) {
        size_t totalHandout = handOutBufferCount + numBuffersRequested;
        uint32_t maxBuffers = outputStream->asHalStream()->max_buffers;
        if (totalHandout > maxBuffers) {
            // Not able to allocate enough buffer. Exit early for this stream
            ALOGE("%s: request too much buffers for stream %d: at HAL: %zu + requesting: %d"
                    " > max: %d", __FUNCTION__, streamId, handOutBufferCount,
                    numBuffersRequested, maxBuffers);
            bufRet.val.error(StreamBufferRequestError::MAX_BUFFER_EXCEEDED);
            allReqsSucceeds = false;
            continue;
@@ -2186,12 +2197,11 @@ status_t Camera3Device::waitUntilStateThenRelock(bool active, nsecs_t timeout) {

    mStatusWaiters++;

    // Notify HAL to start draining. We need to notify the HalInterface layer
    // even when the device is already IDLE, so HalInterface can reject incoming
    // requestStreamBuffers call.
    if (!active && mUseHalBufManager) {
        auto streamIds = mOutputStreams.getStreamIds();
        if (mStatus == STATUS_ACTIVE) {
            mRequestThread->signalPipelineDrain(streamIds);
        }
        mRequestBufferSM.onWaitUntilIdle();
    }

@@ -5251,6 +5261,11 @@ bool Camera3Device::RequestThread::threadLoop() {
    ALOGVV("%s: %d: submitting %zu requests in a batch.", __FUNCTION__, __LINE__,
            mNextRequests.size());

    sp<Camera3Device> parent = mParent.promote();
    if (parent != nullptr) {
        parent->mRequestBufferSM.onSubmittingRequest();
    }

    bool submitRequestSuccess = false;
    nsecs_t tRequestStart = systemTime(SYSTEM_TIME_MONOTONIC);
    if (mInterface->supportBatchRequest()) {
@@ -5261,13 +5276,6 @@ bool Camera3Device::RequestThread::threadLoop() {
    nsecs_t tRequestEnd = systemTime(SYSTEM_TIME_MONOTONIC);
    mRequestLatency.add(tRequestStart, tRequestEnd);

    if (submitRequestSuccess) {
        sp<Camera3Device> parent = mParent.promote();
        if (parent != nullptr) {
            parent->mRequestBufferSM.onRequestSubmitted();
        }
    }

    if (useFlushLock) {
        mFlushLock.unlock();
    }
@@ -6429,9 +6437,11 @@ void Camera3Device::RequestBufferStateMachine::onStreamsConfigured() {
    return;
}

void Camera3Device::RequestBufferStateMachine::onRequestSubmitted() {
void Camera3Device::RequestBufferStateMachine::onSubmittingRequest() {
    std::lock_guard<std::mutex> lock(mLock);
    mRequestThreadPaused = false;
    // inflight map register actually happens in prepareHalRequest now, but it is close enough
    // approximation.
    mInflightMapEmpty = false;
    if (mStatus == RB_STATUS_STOPPED) {
        mStatus = RB_STATUS_READY;
+1 −1
Original line number Diff line number Diff line
@@ -1317,7 +1317,7 @@ class Camera3Device :
        void onInflightMapEmpty();

        // Events triggered by RequestThread
        void onRequestSubmitted();
        void onSubmittingRequest();
        void onRequestThreadPaused();

      private:
+5 −1
Original line number Diff line number Diff line
@@ -588,8 +588,12 @@ status_t Camera3Stream::getBuffer(camera3_stream_buffer *buffer,
    if (mState != STATE_CONFIGURED) {
        ALOGE("%s: Stream %d: Can't get buffers if stream is not in CONFIGURED state %d",
                __FUNCTION__, mId, mState);
        if (mState == STATE_ABANDONED) {
            return DEAD_OBJECT;
        } else {
            return INVALID_OPERATION;
        }
    }

    // Wait for new buffer returned back if we are running into the limit.
    if (getHandoutOutputBufferCountLocked() == camera3_stream::max_buffers) {