19e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis/*
29e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis * Copyright (C) 2012 The Android Open Source Project
39e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis *
49e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis * Licensed under the Apache License, Version 2.0 (the "License");
59e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis * you may not use this file except in compliance with the License.
69e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis * You may obtain a copy of the License at
79e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis *
89e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis *      http://www.apache.org/licenses/LICENSE-2.0
99e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis *
109e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis * Unless required by applicable law or agreed to in writing, software
119e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis * distributed under the License is distributed on an "AS IS" BASIS,
129e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis * See the License for the specific language governing permissions and
149e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis * limitations under the License.
159e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis */
169e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis
179e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis#define LOG_TAG "BufferQueue_test"
189e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis//#define LOG_NDEBUG 0
199e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis
20f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza#include <gui/BufferQueue.h>
21f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza#include <gui/IProducerListener.h>
229e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis
239e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis#include <ui/GraphicBuffer.h>
249e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis
251a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza#include <binder/IPCThreadState.h>
269f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza#include <binder/IServiceManager.h>
271a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza#include <binder/ProcessState.h>
28f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza
29f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza#include <utils/String8.h>
30f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza#include <utils/threads.h>
31f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza
32f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza#include <gtest/gtest.h>
339e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis
349e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennisnamespace android {
359e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis
369e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennisclass BufferQueueTest : public ::testing::Test {
379e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis
389f3053de78630815d60cf48a2cf2348cc5867c45Dan Stozapublic:
399f3053de78630815d60cf48a2cf2348cc5867c45Dan Stozaprotected:
409f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    BufferQueueTest() {
419e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis        const ::testing::TestInfo* const testInfo =
429e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis            ::testing::UnitTest::GetInstance()->current_test_info();
439e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis        ALOGV("Begin test: %s.%s", testInfo->test_case_name(),
449e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis                testInfo->name());
459e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis    }
469e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis
479f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ~BufferQueueTest() {
489e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis        const ::testing::TestInfo* const testInfo =
499e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis            ::testing::UnitTest::GetInstance()->current_test_info();
509e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis        ALOGV("End test:   %s.%s", testInfo->test_case_name(),
519e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis                testInfo->name());
529e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis    }
539e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis
547ea777f097784492f880623067becac1b276f884Igor Murashkin    void GetMinUndequeuedBufferCount(int* bufferCount) {
559f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza        ASSERT_TRUE(bufferCount != NULL);
569f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza        ASSERT_EQ(OK, mProducer->query(NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS,
579f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza                    bufferCount));
589f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza        ASSERT_GE(*bufferCount, 0);
597ea777f097784492f880623067becac1b276f884Igor Murashkin    }
607ea777f097784492f880623067becac1b276f884Igor Murashkin
611a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    void createBufferQueue() {
621a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza        BufferQueue::createBufferQueue(&mProducer, &mConsumer);
631a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    }
649e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis
651a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    sp<IGraphicBufferProducer> mProducer;
661a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    sp<IGraphicBufferConsumer> mConsumer;
671a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza};
689f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
69a4e19521ac4563f2ff6517bcfd63d9b8d33a6d0bMathias Agopianstruct DummyConsumer : public BnConsumerListener {
709e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis    virtual void onFrameAvailable() {}
719e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis    virtual void onBuffersReleased() {}
7249bfda1fbdf828a8ea63ae2c2fa25739f6e48527Jesse Hall    virtual void onSidebandStreamChanged() {}
739e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis};
749e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis
751a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza// XXX: Tests that fork a process to hold the BufferQueue must run before tests
761a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza// that use a local BufferQueue, or else Binder will get unhappy
771a0b8617909c94f6c7301b651cb7b07463529c8cDan StozaTEST_F(BufferQueueTest, BufferQueueInAnotherProcess) {
781a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    const String16 PRODUCER_NAME = String16("BQTestProducer");
791a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    const String16 CONSUMER_NAME = String16("BQTestConsumer");
801a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza
811a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    pid_t forkPid = fork();
821a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    ASSERT_NE(forkPid, -1);
831a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza
841a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    if (forkPid == 0) {
851a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza        // Child process
86b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza        sp<IGraphicBufferProducer> producer;
87b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza        sp<IGraphicBufferConsumer> consumer;
881a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza        BufferQueue::createBufferQueue(&producer, &consumer);
891a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza        sp<IServiceManager> serviceManager = defaultServiceManager();
90b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza        serviceManager->addService(PRODUCER_NAME, producer->asBinder());
91b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza        serviceManager->addService(CONSUMER_NAME, consumer->asBinder());
921a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza        ProcessState::self()->startThreadPool();
931a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza        IPCThreadState::self()->joinThreadPool();
941a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza        LOG_ALWAYS_FATAL("Shouldn't be here");
951a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    }
961a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza
971a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    sp<IServiceManager> serviceManager = defaultServiceManager();
981a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    sp<IBinder> binderProducer =
991a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza        serviceManager->getService(PRODUCER_NAME);
1001a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    mProducer = interface_cast<IGraphicBufferProducer>(binderProducer);
1011a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    EXPECT_TRUE(mProducer != NULL);
1021a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    sp<IBinder> binderConsumer =
1031a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza        serviceManager->getService(CONSUMER_NAME);
1041a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    mConsumer = interface_cast<IGraphicBufferConsumer>(binderConsumer);
1051a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    EXPECT_TRUE(mConsumer != NULL);
1061a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza
1071a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    sp<DummyConsumer> dc(new DummyConsumer);
1081a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    ASSERT_EQ(OK, mConsumer->consumerConnect(dc, false));
1091a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    IGraphicBufferProducer::QueueBufferOutput output;
1101a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    ASSERT_EQ(OK,
1111a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza            mProducer->connect(NULL, NATIVE_WINDOW_API_CPU, false, &output));
1121a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza
1131a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    int slot;
1141a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    sp<Fence> fence;
1151a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    sp<GraphicBuffer> buffer;
1161a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
1171a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza            mProducer->dequeueBuffer(&slot, &fence, false, 0, 0, 0,
1181a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza                    GRALLOC_USAGE_SW_WRITE_OFTEN));
1191a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    ASSERT_EQ(OK, mProducer->requestBuffer(slot, &buffer));
1201a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza
1211a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    uint32_t* dataIn;
1221a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    ASSERT_EQ(OK, buffer->lock(GraphicBuffer::USAGE_SW_WRITE_OFTEN,
1231a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza            reinterpret_cast<void**>(&dataIn)));
1241a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    *dataIn = 0x12345678;
1251a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    ASSERT_EQ(OK, buffer->unlock());
1261a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza
1271a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    IGraphicBufferProducer::QueueBufferInput input(0, false, Rect(0, 0, 1, 1),
1281a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza            NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, false, Fence::NO_FENCE);
1291a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    ASSERT_EQ(OK, mProducer->queueBuffer(slot, input, &output));
1301a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza
1311a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    IGraphicBufferConsumer::BufferItem item;
1321a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, 0));
1331a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza
1341a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    uint32_t* dataOut;
1351a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    ASSERT_EQ(OK, item.mGraphicBuffer->lock(GraphicBuffer::USAGE_SW_READ_OFTEN,
1361a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza            reinterpret_cast<void**>(&dataOut)));
1371a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    ASSERT_EQ(*dataOut, 0x12345678);
1381a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    ASSERT_EQ(OK, item.mGraphicBuffer->unlock());
1391a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza}
1401a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza
1419e75ddda93888755d0b14144b62e896cd9f78f3aJamie GennisTEST_F(BufferQueueTest, AcquireBuffer_ExceedsMaxAcquireCount_Fails) {
1421a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    createBufferQueue();
1439e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis    sp<DummyConsumer> dc(new DummyConsumer);
1449f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    mConsumer->consumerConnect(dc, false);
1452adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden    IGraphicBufferProducer::QueueBufferOutput qbo;
146f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza    mProducer->connect(new DummyProducerListener, NATIVE_WINDOW_API_CPU, false,
147f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza            &qbo);
1489f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    mProducer->setBufferCount(4);
1499e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis
1509e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis    int slot;
1519e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis    sp<Fence> fence;
1529e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis    sp<GraphicBuffer> buf;
1538b308ed70ed782f68c8075aac2a6b66bbfcdb9afAndy McFadden    IGraphicBufferProducer::QueueBufferInput qbi(0, false, Rect(0, 0, 1, 1),
1547cdd786fa80cf03551291ae8feca7b77583be1c5Mathias Agopian            NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, false, Fence::NO_FENCE);
1559e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis    BufferQueue::BufferItem item;
1569e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis
1579e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis    for (int i = 0; i < 2; i++) {
1582adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden        ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
1599f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza                mProducer->dequeueBuffer(&slot, &fence, false, 1, 1, 0,
1609e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis                    GRALLOC_USAGE_SW_READ_OFTEN));
1619f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza        ASSERT_EQ(OK, mProducer->requestBuffer(slot, &buf));
1629f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza        ASSERT_EQ(OK, mProducer->queueBuffer(slot, qbi, &qbo));
1639f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza        ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, 0));
1649e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis    }
1659e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis
1662adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden    ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
1679f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza            mProducer->dequeueBuffer(&slot, &fence, false, 1, 1, 0,
1689e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis                GRALLOC_USAGE_SW_READ_OFTEN));
1699f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mProducer->requestBuffer(slot, &buf));
1709f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mProducer->queueBuffer(slot, qbi, &qbo));
1719e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis
1729e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis    // Acquire the third buffer, which should fail.
1739f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(INVALID_OPERATION, mConsumer->acquireBuffer(&item, 0));
1749e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis}
1759e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis
176c68f2ecfa02037144d1a3856f637a77f523cf416Jamie GennisTEST_F(BufferQueueTest, SetMaxAcquiredBufferCountWithIllegalValues_ReturnsError) {
1771a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    createBufferQueue();
178c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis    sp<DummyConsumer> dc(new DummyConsumer);
1799f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    mConsumer->consumerConnect(dc, false);
180c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis
1817ea777f097784492f880623067becac1b276f884Igor Murashkin    int minBufferCount;
1827ea777f097784492f880623067becac1b276f884Igor Murashkin    ASSERT_NO_FATAL_FAILURE(GetMinUndequeuedBufferCount(&minBufferCount));
1839f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    EXPECT_EQ(BAD_VALUE, mConsumer->setMaxAcquiredBufferCount(
1849f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza                minBufferCount - 1));
1857ea777f097784492f880623067becac1b276f884Igor Murashkin
1869f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    EXPECT_EQ(BAD_VALUE, mConsumer->setMaxAcquiredBufferCount(0));
1879f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    EXPECT_EQ(BAD_VALUE, mConsumer->setMaxAcquiredBufferCount(-3));
1889f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    EXPECT_EQ(BAD_VALUE, mConsumer->setMaxAcquiredBufferCount(
189c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis            BufferQueue::MAX_MAX_ACQUIRED_BUFFERS+1));
1909f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    EXPECT_EQ(BAD_VALUE, mConsumer->setMaxAcquiredBufferCount(100));
191c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis}
192c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis
193c68f2ecfa02037144d1a3856f637a77f523cf416Jamie GennisTEST_F(BufferQueueTest, SetMaxAcquiredBufferCountWithLegalValues_Succeeds) {
1941a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    createBufferQueue();
195c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis    sp<DummyConsumer> dc(new DummyConsumer);
1969f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    mConsumer->consumerConnect(dc, false);
197c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis
1987ea777f097784492f880623067becac1b276f884Igor Murashkin    int minBufferCount;
1997ea777f097784492f880623067becac1b276f884Igor Murashkin    ASSERT_NO_FATAL_FAILURE(GetMinUndequeuedBufferCount(&minBufferCount));
2007ea777f097784492f880623067becac1b276f884Igor Murashkin
2019f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    EXPECT_EQ(OK, mConsumer->setMaxAcquiredBufferCount(1));
2029f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    EXPECT_EQ(OK, mConsumer->setMaxAcquiredBufferCount(2));
2039f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    EXPECT_EQ(OK, mConsumer->setMaxAcquiredBufferCount(minBufferCount));
2049f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    EXPECT_EQ(OK, mConsumer->setMaxAcquiredBufferCount(
205c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis            BufferQueue::MAX_MAX_ACQUIRED_BUFFERS));
206c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis}
207c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis
2089f3053de78630815d60cf48a2cf2348cc5867c45Dan StozaTEST_F(BufferQueueTest, DetachAndReattachOnProducerSide) {
2091a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    createBufferQueue();
2109f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    sp<DummyConsumer> dc(new DummyConsumer);
2119f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mConsumer->consumerConnect(dc, false));
2129f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    IGraphicBufferProducer::QueueBufferOutput output;
213f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza    ASSERT_EQ(OK, mProducer->connect(new DummyProducerListener,
214f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza            NATIVE_WINDOW_API_CPU, false, &output));
2159f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
2169f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(BAD_VALUE, mProducer->detachBuffer(-1)); // Index too low
2179f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(BAD_VALUE, mProducer->detachBuffer(
2189f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza                BufferQueueDefs::NUM_BUFFER_SLOTS)); // Index too high
2199f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(BAD_VALUE, mProducer->detachBuffer(0)); // Not dequeued
2209f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
2219f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    int slot;
2229f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    sp<Fence> fence;
2239f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    sp<GraphicBuffer> buffer;
2249f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
2259f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza            mProducer->dequeueBuffer(&slot, &fence, false, 0, 0, 0,
2269f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza                    GRALLOC_USAGE_SW_WRITE_OFTEN));
2279f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(BAD_VALUE, mProducer->detachBuffer(slot)); // Not requested
2289f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mProducer->requestBuffer(slot, &buffer));
2299f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mProducer->detachBuffer(slot));
2309f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(BAD_VALUE, mProducer->detachBuffer(slot)); // Not dequeued
2319f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
2329f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    sp<GraphicBuffer> safeToClobberBuffer;
2339f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    // Can no longer request buffer from this slot
2349f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(BAD_VALUE, mProducer->requestBuffer(slot, &safeToClobberBuffer));
2359f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
2369f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    uint32_t* dataIn;
2379f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, buffer->lock(GraphicBuffer::USAGE_SW_WRITE_OFTEN,
2389f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza            reinterpret_cast<void**>(&dataIn)));
2399f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    *dataIn = 0x12345678;
2409f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, buffer->unlock());
2419f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
2429f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    int newSlot;
2439f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(BAD_VALUE, mProducer->attachBuffer(NULL, safeToClobberBuffer));
2449f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(BAD_VALUE, mProducer->attachBuffer(&newSlot, NULL));
2459f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
2469f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mProducer->attachBuffer(&newSlot, buffer));
2479f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    IGraphicBufferProducer::QueueBufferInput input(0, false, Rect(0, 0, 1, 1),
2489f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza            NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, false, Fence::NO_FENCE);
2499f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mProducer->queueBuffer(newSlot, input, &output));
2509f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
2519f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    IGraphicBufferConsumer::BufferItem item;
2529f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, static_cast<nsecs_t>(0)));
2539f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
2549f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    uint32_t* dataOut;
2559f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, item.mGraphicBuffer->lock(GraphicBuffer::USAGE_SW_READ_OFTEN,
2569f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza            reinterpret_cast<void**>(&dataOut)));
2579f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(*dataOut, 0x12345678);
2581a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    ASSERT_EQ(OK, item.mGraphicBuffer->unlock());
2599f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza}
2609f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
2619f3053de78630815d60cf48a2cf2348cc5867c45Dan StozaTEST_F(BufferQueueTest, DetachAndReattachOnConsumerSide) {
2621a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    createBufferQueue();
2639f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    sp<DummyConsumer> dc(new DummyConsumer);
2649f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mConsumer->consumerConnect(dc, false));
2659f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    IGraphicBufferProducer::QueueBufferOutput output;
266f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza    ASSERT_EQ(OK, mProducer->connect(new DummyProducerListener,
267f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza            NATIVE_WINDOW_API_CPU, false, &output));
2689f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
2699f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    int slot;
2709f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    sp<Fence> fence;
2719f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    sp<GraphicBuffer> buffer;
2729f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
2739f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza            mProducer->dequeueBuffer(&slot, &fence, false, 0, 0, 0,
2749f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza                    GRALLOC_USAGE_SW_WRITE_OFTEN));
2759f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mProducer->requestBuffer(slot, &buffer));
2769f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    IGraphicBufferProducer::QueueBufferInput input(0, false, Rect(0, 0, 1, 1),
2779f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza            NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, false, Fence::NO_FENCE);
2789f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mProducer->queueBuffer(slot, input, &output));
2799f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
2809f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(BAD_VALUE, mConsumer->detachBuffer(-1)); // Index too low
2819f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(BAD_VALUE, mConsumer->detachBuffer(
2829f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza            BufferQueueDefs::NUM_BUFFER_SLOTS)); // Index too high
2839f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(BAD_VALUE, mConsumer->detachBuffer(0)); // Not acquired
2849f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
2859f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    IGraphicBufferConsumer::BufferItem item;
2869f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, static_cast<nsecs_t>(0)));
2879f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
2889f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mConsumer->detachBuffer(item.mBuf));
2899f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(BAD_VALUE, mConsumer->detachBuffer(item.mBuf)); // Not acquired
2909f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
2919f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    uint32_t* dataIn;
2929f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, item.mGraphicBuffer->lock(
2939f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza            GraphicBuffer::USAGE_SW_WRITE_OFTEN,
2949f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza            reinterpret_cast<void**>(&dataIn)));
2959f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    *dataIn = 0x12345678;
2969f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, item.mGraphicBuffer->unlock());
2979f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
2989f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    int newSlot;
2999f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    sp<GraphicBuffer> safeToClobberBuffer;
3009f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(BAD_VALUE, mConsumer->attachBuffer(NULL, safeToClobberBuffer));
3019f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(BAD_VALUE, mConsumer->attachBuffer(&newSlot, NULL));
3029f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mConsumer->attachBuffer(&newSlot, item.mGraphicBuffer));
3039f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
30499b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    ASSERT_EQ(OK, mConsumer->releaseBuffer(newSlot, 0, EGL_NO_DISPLAY,
3059f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza            EGL_NO_SYNC_KHR, Fence::NO_FENCE));
3069f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
3079f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
3089f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza            mProducer->dequeueBuffer(&slot, &fence, false, 0, 0, 0,
3099f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza                    GRALLOC_USAGE_SW_WRITE_OFTEN));
3109f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mProducer->requestBuffer(slot, &buffer));
3119f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
3129f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    uint32_t* dataOut;
3139f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, buffer->lock(GraphicBuffer::USAGE_SW_READ_OFTEN,
3149f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza            reinterpret_cast<void**>(&dataOut)));
3159f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(*dataOut, 0x12345678);
3161a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    ASSERT_EQ(OK, buffer->unlock());
3179f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza}
3189f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
3199f3053de78630815d60cf48a2cf2348cc5867c45Dan StozaTEST_F(BufferQueueTest, MoveFromConsumerToProducer) {
3201a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    createBufferQueue();
3219f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    sp<DummyConsumer> dc(new DummyConsumer);
3229f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mConsumer->consumerConnect(dc, false));
3239f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    IGraphicBufferProducer::QueueBufferOutput output;
324f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza    ASSERT_EQ(OK, mProducer->connect(new DummyProducerListener,
325f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza            NATIVE_WINDOW_API_CPU, false, &output));
3269f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
3279f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    int slot;
3289f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    sp<Fence> fence;
3299f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    sp<GraphicBuffer> buffer;
3309f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
3319f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza            mProducer->dequeueBuffer(&slot, &fence, false, 0, 0, 0,
3329f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza                    GRALLOC_USAGE_SW_WRITE_OFTEN));
3339f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mProducer->requestBuffer(slot, &buffer));
3349f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
3359f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    uint32_t* dataIn;
3369f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, buffer->lock(GraphicBuffer::USAGE_SW_WRITE_OFTEN,
3379f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza            reinterpret_cast<void**>(&dataIn)));
3389f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    *dataIn = 0x12345678;
3399f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, buffer->unlock());
3409f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
3419f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    IGraphicBufferProducer::QueueBufferInput input(0, false, Rect(0, 0, 1, 1),
3429f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza            NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, false, Fence::NO_FENCE);
3439f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mProducer->queueBuffer(slot, input, &output));
3449f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
3459f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    IGraphicBufferConsumer::BufferItem item;
3469f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, static_cast<nsecs_t>(0)));
3479f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mConsumer->detachBuffer(item.mBuf));
3489f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
3499f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    int newSlot;
3509f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mProducer->attachBuffer(&newSlot, item.mGraphicBuffer));
3519f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mProducer->queueBuffer(newSlot, input, &output));
3529f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, static_cast<nsecs_t>(0)));
3539f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
3549f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    uint32_t* dataOut;
3559f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, item.mGraphicBuffer->lock(GraphicBuffer::USAGE_SW_READ_OFTEN,
3569f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza            reinterpret_cast<void**>(&dataOut)));
3579f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(*dataOut, 0x12345678);
3581a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    ASSERT_EQ(OK, item.mGraphicBuffer->unlock());
3599f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza}
3609f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
3619e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis} // namespace android
362