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

Commit 9de7293b authored by Dan Stoza's avatar Dan Stoza
Browse files

libgui: Allow an IGBProducer to disable allocation

Adds a new method IGBP::allowAllocation, which controls whether
dequeueBuffer is permitted to allocate a new buffer. If allocation is
disallowed, dequeueBuffer will block or return an error as it
normally would (as controlled by *ControlledByApp).

If there are free buffers, but they are not of the correct dimensions,
format, or usage, they may be freed if a more suitable buffer is not
found first.

Bug: 19801715
Change-Id: I0d604958b78b2fd775c2547690301423f9a52165
parent 0de7ea75
Loading
Loading
Loading
Loading
+4 −0
Original line number Original line Diff line number Diff line
@@ -266,6 +266,10 @@ private:
    // mIsAllocatingCondition is a condition variable used by producers to wait until mIsAllocating
    // mIsAllocatingCondition is a condition variable used by producers to wait until mIsAllocating
    // becomes false.
    // becomes false.
    mutable Condition mIsAllocatingCondition;
    mutable Condition mIsAllocatingCondition;

    // mAllowAllocation determines whether dequeueBuffer is allowed to allocate
    // new buffers
    bool mAllowAllocation;
}; // class BufferQueueCore
}; // class BufferQueueCore


} // namespace android
} // namespace android
+3 −0
Original line number Original line Diff line number Diff line
@@ -172,6 +172,9 @@ public:
    virtual void allocateBuffers(bool async, uint32_t width, uint32_t height,
    virtual void allocateBuffers(bool async, uint32_t width, uint32_t height,
            PixelFormat format, uint32_t usage);
            PixelFormat format, uint32_t usage);


    // See IGraphicBufferProducer::allowAllocation
    virtual status_t allowAllocation(bool allow);

private:
private:
    // This is required by the IBinder::DeathRecipient interface
    // This is required by the IBinder::DeathRecipient interface
    virtual void binderDied(const wp<IBinder>& who);
    virtual void binderDied(const wp<IBinder>& who);
+12 −0
Original line number Original line Diff line number Diff line
@@ -458,6 +458,18 @@ public:
    // allocated, this function has no effect.
    // allocated, this function has no effect.
    virtual void allocateBuffers(bool async, uint32_t width, uint32_t height,
    virtual void allocateBuffers(bool async, uint32_t width, uint32_t height,
            PixelFormat format, uint32_t usage) = 0;
            PixelFormat format, uint32_t usage) = 0;

    // Sets whether dequeueBuffer is allowed to allocate new buffers.
    //
    // Normally dequeueBuffer does not discriminate between free slots which
    // already have an allocated buffer and those which do not, and will
    // allocate a new buffer if the slot doesn't have a buffer or if the slot's
    // buffer doesn't match the requested size, format, or usage. This method
    // allows the producer to restrict the eligible slots to those which already
    // have an allocated buffer of the correct size, format, and usage. If no
    // eligible slot is available, dequeueBuffer will block or return an error
    // as usual.
    virtual status_t allowAllocation(bool allow) = 0;
};
};


// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
+3 −0
Original line number Original line Diff line number Diff line
@@ -97,6 +97,9 @@ public:
    status_t reallocate(uint32_t inWidth, uint32_t inHeight,
    status_t reallocate(uint32_t inWidth, uint32_t inHeight,
            PixelFormat inFormat, uint32_t inUsage);
            PixelFormat inFormat, uint32_t inUsage);


    bool needsReallocation(uint32_t inWidth, uint32_t inHeight,
            PixelFormat inFormat, uint32_t inUsage);

    status_t lock(uint32_t inUsage, void** vaddr);
    status_t lock(uint32_t inUsage, void** vaddr);
    status_t lock(uint32_t inUsage, const Rect& rect, void** vaddr);
    status_t lock(uint32_t inUsage, const Rect& rect, void** vaddr);
    // For HAL_PIXEL_FORMAT_YCbCr_420_888
    // For HAL_PIXEL_FORMAT_YCbCr_420_888
+2 −1
Original line number Original line Diff line number Diff line
@@ -69,7 +69,8 @@ BufferQueueCore::BufferQueueCore(const sp<IGraphicBufferAlloc>& allocator) :
    mFrameCounter(0),
    mFrameCounter(0),
    mTransformHint(0),
    mTransformHint(0),
    mIsAllocating(false),
    mIsAllocating(false),
    mIsAllocatingCondition()
    mIsAllocatingCondition(),
    mAllowAllocation(true)
{
{
    if (allocator == NULL) {
    if (allocator == NULL) {
        sp<ISurfaceComposer> composer(ComposerService::getComposerService());
        sp<ISurfaceComposer> composer(ComposerService::getComposerService());
Loading