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

Commit c8bcb68f authored by Chavi Weingarten's avatar Chavi Weingarten
Browse files

Use external texture for buffer release.

When the buffer needs to be released due to the producer id changing,
use the external texture and not the buffer in the transaction. This is
because the buffer might be null if the buffer was already cached.

Test: Not reproducible crash
Fixes: 271771720
Change-Id: I6453fd44811b076c0c5670c047fe108383f4f426
parent b304b2f1
Loading
Loading
Loading
Loading
+8 −2
Original line number Diff line number Diff line
@@ -4105,7 +4105,12 @@ TransactionHandler::TransactionReadiness SurfaceFlinger::transactionReadyBufferC
        const TransactionHandler::TransactionFlushState& flushState) {
    using TransactionReadiness = TransactionHandler::TransactionReadiness;
    auto ready = TransactionReadiness::Ready;
    flushState.transaction->traverseStatesWithBuffersWhileTrue([&](const layer_state_t& s) -> bool {
    flushState.transaction->traverseStatesWithBuffersWhileTrue([&](const layer_state_t& s,
                                                                   const std::shared_ptr<
                                                                           renderengine::
                                                                                   ExternalTexture>&
                                                                           externalTexture)
                                                                       -> bool {
        sp<Layer> layer = LayerHandle::getLayer(s.surface);
        const auto& transaction = *flushState.transaction;
        // check for barrier frames
@@ -4115,7 +4120,8 @@ TransactionHandler::TransactionReadiness SurfaceFlinger::transactionReadyBufferC
            // don't wait on the barrier since we know that's stale information.
            if (layer->getDrawingState().producerId > s.bufferData->producerId) {
                layer->callReleaseBufferCallback(s.bufferData->releaseBufferListener,
                                                 s.bufferData->buffer, s.bufferData->frameNumber,
                                                 externalTexture->getBuffer(),
                                                 s.bufferData->frameNumber,
                                                 s.bufferData->acquireFence);
                // Delete the entire state at this point and not just release the buffer because
                // everything associated with the Layer in this Transaction is now out of date.
+1 −1
Original line number Diff line number Diff line
@@ -85,7 +85,7 @@ struct TransactionState {
        for (auto state = states.begin(); state != states.end();) {
            if (state->state.hasBufferChanges() && state->state.hasValidBuffer() &&
                state->state.surface) {
                int result = visitor(state->state);
                int result = visitor(state->state, state->externalTexture);
                if (result == STOP_TRAVERSAL) return;
                if (result == DELETE_AND_CONTINUE_TRAVERSAL) {
                    state = states.erase(state);