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


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

            VALIDATE_CONSISTENCY();
            VALIDATE_CONSISTENCY();
        } // Autolock scope
        } // 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",
                BQ_LOGV("allocateBuffers: allocated a new buffer in slot %d",
                        *slot);
                        *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
                // Make sure the erase is done after all uses of the slot
                // iterator since it will be invalid after this point.
                // iterator since it will be invalid after this point.
                mCore->mFreeSlots.erase(slot);
                mCore->mFreeSlots.erase(slot);
+2 −0
Original line number Original line Diff line number Diff line
@@ -131,6 +131,8 @@ void ConsumerBase::onFrameReplaced(const BufferItem &item) {
    }
    }
}
}


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

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


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


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


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

    void onBuffersReleased() override {
    void onBuffersReleased() override {
        callRemoteAsync<decltype(&IConsumerListener::onBuffersReleased)>(Tag::ON_BUFFERS_RELEASED);
        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);
            return callLocalAsync(data, reply, &IConsumerListener::onFrameAvailable);
        case Tag::ON_FRAME_REPLACED:
        case Tag::ON_FRAME_REPLACED:
            return callLocalAsync(data, reply, &IConsumerListener::onFrameReplaced);
            return callLocalAsync(data, reply, &IConsumerListener::onFrameReplaced);
        case Tag::ON_BUFFER_ALLOCATED:
            return callLocalAsync(data, reply, &IConsumerListener::onBufferAllocated);
        case Tag::ON_BUFFERS_RELEASED:
        case Tag::ON_BUFFERS_RELEASED:
            return callLocalAsync(data, reply, &IConsumerListener::onBuffersReleased);
            return callLocalAsync(data, reply, &IConsumerListener::onBuffersReleased);
        case Tag::ON_SIDEBAND_STREAM_CHANGED:
        case Tag::ON_SIDEBAND_STREAM_CHANGED:
+1 −0
Original line number Original line Diff line number Diff line
@@ -61,6 +61,7 @@ public:
        void onDisconnect() override;
        void onDisconnect() override;
        void onFrameAvailable(const BufferItem& item) override;
        void onFrameAvailable(const BufferItem& item) override;
        void onFrameReplaced(const BufferItem& item) override;
        void onFrameReplaced(const BufferItem& item) override;
        void onBufferAllocated(const BufferItem& item) override;
        void onBuffersReleased() override;
        void onBuffersReleased() override;
        void onSidebandStreamChanged() override;
        void onSidebandStreamChanged() override;
        void addAndGetFrameTimestamps(
        void addAndGetFrameTimestamps(
Loading