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

Commit c2c8dfd7 authored by Jamie Gennis's avatar Jamie Gennis
Browse files

SurfaceTexture: fix an error check in dequeueBuffer.

This change fixes the MIN_UNDEQUEUED_BUFFERS error check in
dequeueBuffer.  The check should only be performed if a buffer has been
queued since the last time the buffer count was changed by the client.
The check must be applied conditionally because video decoders require
all the bufferes to be dequeued and registered before beginning the
decode.

Change-Id: I08d96b380544e395c2fcf0f3983a199bfd695b09
parent 8cd5ba4b
Loading
Loading
Loading
Loading
+13 −9
Original line number Diff line number Diff line
@@ -285,6 +285,10 @@ status_t SurfaceTexture::dequeueBuffer(int *outBuf, uint32_t w, uint32_t h,
            return -EINVAL;
        }

        // See whether a buffer has been queued since the last setBufferCount so
        // we know whether to perform the MIN_UNDEQUEUED_BUFFERS check below.
        bool bufferHasBeenQueued = mCurrentTexture != INVALID_BUFFER_SLOT;
        if (bufferHasBeenQueued) {
            // make sure the client is not trying to dequeue more buffers
            // than allowed.
            const int avail = mBufferCount - (dequeuedCount+1);
@@ -292,8 +296,8 @@ status_t SurfaceTexture::dequeueBuffer(int *outBuf, uint32_t w, uint32_t h,
                LOGE("dequeueBuffer: MIN_UNDEQUEUED_BUFFERS=%d exceeded (dequeued=%d)",
                        MIN_UNDEQUEUED_BUFFERS-int(mSynchronousMode),
                        dequeuedCount);
            // TODO: Enable this error report after we fix issue 4435022
            // return -EBUSY;
                return -EBUSY;
            }
        }

        // we're in synchronous mode and didn't find a buffer, we need to wait
+8 −1
Original line number Diff line number Diff line
@@ -431,10 +431,13 @@ TEST_F(SurfaceTextureClientTest, SurfaceTextureSyncModeMinUndequeued) {
    android_native_buffer_t* buf[3];
    ASSERT_EQ(OK, st->setSynchronousMode(true));
    ASSERT_EQ(OK, native_window_set_buffer_count(anw.get(), 3));

    // We should be able to dequeue all the buffers before we've queued any.
    EXPECT_EQ(OK, anw->dequeueBuffer(anw.get(), &buf[0]));
    EXPECT_EQ(OK, anw->dequeueBuffer(anw.get(), &buf[1]));
    EXPECT_EQ(-EBUSY, anw->dequeueBuffer(anw.get(), &buf[2]));
    EXPECT_EQ(OK, anw->dequeueBuffer(anw.get(), &buf[2]));

    ASSERT_EQ(OK, anw->cancelBuffer(anw.get(), buf[2]));
    ASSERT_EQ(OK, anw->queueBuffer(anw.get(), buf[1]));

    EXPECT_EQ(OK, st->updateTexImage());
@@ -442,6 +445,10 @@ TEST_F(SurfaceTextureClientTest, SurfaceTextureSyncModeMinUndequeued) {

    EXPECT_EQ(OK, anw->dequeueBuffer(anw.get(), &buf[2]));

    // Once we've queued a buffer, however we should not be able to dequeue more
    // than (buffer-count - MIN_UNDEQUEUED_BUFFERS), which is 2 in this case.
    EXPECT_EQ(-EBUSY, anw->dequeueBuffer(anw.get(), &buf[1]));

    ASSERT_EQ(OK, anw->cancelBuffer(anw.get(), buf[0]));
    ASSERT_EQ(OK, anw->cancelBuffer(anw.get(), buf[2]));
}