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

Commit d7b3a8bc authored by Alec Mouri's avatar Alec Mouri
Browse files

Create EGLImages during buffer allocation

EGLImage creation is now performed on an async binder thread, so now GPU
composition should rarely be stalled by expensive image creation.

Bug: 129008989
Test: systrace
Change-Id: I9732f866933a8950a4c69ff51d5ac1622bbb3470
parent dc705b9e
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -59,6 +59,13 @@ void BufferQueue::ProxyConsumerListener::onFrameReplaced(
    }
}

void BufferQueue::ProxyConsumerListener::onBufferAllocated(const BufferItem& item) {
    sp<ConsumerListener> listener(mConsumerListener.promote());
    if (listener != nullptr) {
        listener->onBufferAllocated(item);
    }
}

void BufferQueue::ProxyConsumerListener::onBuffersReleased() {
    sp<ConsumerListener> listener(mConsumerListener.promote());
    if (listener != nullptr) {
+14 −0
Original line number Diff line number Diff line
@@ -530,6 +530,13 @@ status_t BufferQueueProducer::dequeueBuffer(int* outSlot, sp<android::Fence>* ou
                return NO_INIT;
            }

            if (mCore->mConsumerListener != nullptr) {
                BufferItem item;
                item.mGraphicBuffer = graphicBuffer;
                item.mSlot = *outSlot;
                mCore->mConsumerListener->onBufferAllocated(item);
            }

            VALIDATE_CONSISTENCY();
        } // Autolock scope
    }
@@ -1414,6 +1421,13 @@ void BufferQueueProducer::allocateBuffers(uint32_t width, uint32_t height,
                BQ_LOGV("allocateBuffers: allocated a new buffer in slot %d",
                        *slot);

                if (mCore->mConsumerListener != nullptr) {
                    BufferItem item;
                    item.mGraphicBuffer = buffers[i];
                    item.mSlot = *slot;
                    mCore->mConsumerListener->onBufferAllocated(item);
                }

                // Make sure the erase is done after all uses of the slot
                // iterator since it will be invalid after this point.
                mCore->mFreeSlots.erase(slot);
+2 −0
Original line number Diff line number Diff line
@@ -131,6 +131,8 @@ void ConsumerBase::onFrameReplaced(const BufferItem &item) {
    }
}

void ConsumerBase::onBufferAllocated(const BufferItem& /*item*/) {}

void ConsumerBase::onBuffersReleased() {
    Mutex::Autolock lock(mMutex);

+9 −1
Original line number Diff line number Diff line
@@ -28,7 +28,8 @@ enum class Tag : uint32_t {
    ON_FRAME_REPLACED,
    ON_BUFFERS_RELEASED,
    ON_SIDEBAND_STREAM_CHANGED,
    LAST = ON_SIDEBAND_STREAM_CHANGED,
    ON_BUFFER_ALLOCATED,
    LAST = ON_BUFFER_ALLOCATED,
};

} // Anonymous namespace
@@ -54,6 +55,11 @@ public:
                                                                       item);
    }

    void onBufferAllocated(const BufferItem& item) override {
        callRemoteAsync<decltype(&IConsumerListener::onBufferAllocated)>(Tag::ON_BUFFER_ALLOCATED,
                                                                         item);
    }

    void onBuffersReleased() override {
        callRemoteAsync<decltype(&IConsumerListener::onBuffersReleased)>(Tag::ON_BUFFERS_RELEASED);
    }
@@ -89,6 +95,8 @@ status_t BnConsumerListener::onTransact(uint32_t code, const Parcel& data, Parce
            return callLocalAsync(data, reply, &IConsumerListener::onFrameAvailable);
        case Tag::ON_FRAME_REPLACED:
            return callLocalAsync(data, reply, &IConsumerListener::onFrameReplaced);
        case Tag::ON_BUFFER_ALLOCATED:
            return callLocalAsync(data, reply, &IConsumerListener::onBufferAllocated);
        case Tag::ON_BUFFERS_RELEASED:
            return callLocalAsync(data, reply, &IConsumerListener::onBuffersReleased);
        case Tag::ON_SIDEBAND_STREAM_CHANGED:
+1 −0
Original line number Diff line number Diff line
@@ -61,6 +61,7 @@ public:
        void onDisconnect() override;
        void onFrameAvailable(const BufferItem& item) override;
        void onFrameReplaced(const BufferItem& item) override;
        void onBufferAllocated(const BufferItem& item) override;
        void onBuffersReleased() override;
        void onSidebandStreamChanged() override;
        void addAndGetFrameTimestamps(
Loading