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
20c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza#include "DummyConsumer.h"
21c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza
22cf3834db104e0b052056e3a06d46e3f222f0d372Dan Stoza#include <gui/BufferItem.h>
23f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza#include <gui/BufferQueue.h>
24f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza#include <gui/IProducerListener.h>
259e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis
269e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis#include <ui/GraphicBuffer.h>
279e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis
281a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza#include <binder/IPCThreadState.h>
299f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza#include <binder/IServiceManager.h>
301a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza#include <binder/ProcessState.h>
31f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza
32f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza#include <utils/String8.h>
33f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza#include <utils/threads.h>
34f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza
35f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza#include <gtest/gtest.h>
369e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis
37e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza#include <thread>
38e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza
39e77c7669bee30b7c0099172cf0c38cef92412040Dan Stozausing namespace std::chrono_literals;
40e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza
419e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennisnamespace android {
429e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis
439e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennisclass BufferQueueTest : public ::testing::Test {
449e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis
459f3053de78630815d60cf48a2cf2348cc5867c45Dan Stozapublic:
469f3053de78630815d60cf48a2cf2348cc5867c45Dan Stozaprotected:
479f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    BufferQueueTest() {
489e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis        const ::testing::TestInfo* const testInfo =
499e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis            ::testing::UnitTest::GetInstance()->current_test_info();
509e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis        ALOGV("Begin test: %s.%s", testInfo->test_case_name(),
519e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis                testInfo->name());
529e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis    }
539e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis
549f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ~BufferQueueTest() {
559e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis        const ::testing::TestInfo* const testInfo =
569e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis            ::testing::UnitTest::GetInstance()->current_test_info();
579e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis        ALOGV("End test:   %s.%s", testInfo->test_case_name(),
589e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis                testInfo->name());
599e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis    }
609e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis
617ea777f097784492f880623067becac1b276f884Igor Murashkin    void GetMinUndequeuedBufferCount(int* bufferCount) {
629f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza        ASSERT_TRUE(bufferCount != NULL);
639f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza        ASSERT_EQ(OK, mProducer->query(NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS,
649f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza                    bufferCount));
659f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza        ASSERT_GE(*bufferCount, 0);
667ea777f097784492f880623067becac1b276f884Igor Murashkin    }
677ea777f097784492f880623067becac1b276f884Igor Murashkin
681a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    void createBufferQueue() {
691a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza        BufferQueue::createBufferQueue(&mProducer, &mConsumer);
701a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    }
719e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis
72ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    void testBufferItem(const IGraphicBufferProducer::QueueBufferInput& input,
73ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos            const BufferItem& item) {
74ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos        int64_t timestamp;
75ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos        bool isAutoTimestamp;
76ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos        android_dataspace dataSpace;
77ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos        Rect crop;
78ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos        int scalingMode;
79ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos        uint32_t transform;
80ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos        sp<Fence> fence;
81ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos
82ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos        input.deflate(&timestamp, &isAutoTimestamp, &dataSpace, &crop,
83ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos                &scalingMode, &transform, &fence, NULL);
84ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos        ASSERT_EQ(timestamp, item.mTimestamp);
85ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos        ASSERT_EQ(isAutoTimestamp, item.mIsAutoTimestamp);
86ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos        ASSERT_EQ(dataSpace, item.mDataSpace);
87ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos        ASSERT_EQ(crop, item.mCrop);
88ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos        ASSERT_EQ(static_cast<uint32_t>(scalingMode), item.mScalingMode);
89ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos        ASSERT_EQ(transform, item.mTransform);
90ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos        ASSERT_EQ(fence, item.mFence);
91ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    }
92ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos
931a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    sp<IGraphicBufferProducer> mProducer;
941a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    sp<IGraphicBufferConsumer> mConsumer;
951a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza};
969f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
97f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stozastatic const uint32_t TEST_DATA = 0x12345678u;
98f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza
991a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza// XXX: Tests that fork a process to hold the BufferQueue must run before tests
1001a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza// that use a local BufferQueue, or else Binder will get unhappy
10188752d7f1a13a425c59c429f0986f6f899b7826bKalle Raita//
10288752d7f1a13a425c59c429f0986f6f899b7826bKalle Raita// In one instance this was a crash in the createBufferQueue where the
10388752d7f1a13a425c59c429f0986f6f899b7826bKalle Raita// binder call to create a buffer allocator apparently got garbage back.
10488752d7f1a13a425c59c429f0986f6f899b7826bKalle Raita// See b/36592665.
10588752d7f1a13a425c59c429f0986f6f899b7826bKalle RaitaTEST_F(BufferQueueTest, DISABLED_BufferQueueInAnotherProcess) {
1061a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    const String16 PRODUCER_NAME = String16("BQTestProducer");
1071a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    const String16 CONSUMER_NAME = String16("BQTestConsumer");
1081a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza
1091a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    pid_t forkPid = fork();
1101a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    ASSERT_NE(forkPid, -1);
1111a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza
1121a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    if (forkPid == 0) {
1131a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza        // Child process
114b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza        sp<IGraphicBufferProducer> producer;
115b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza        sp<IGraphicBufferConsumer> consumer;
1161a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza        BufferQueue::createBufferQueue(&producer, &consumer);
1171a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza        sp<IServiceManager> serviceManager = defaultServiceManager();
118097ca275f4717a2c47a5d49f302ed2b72c8a1370Marco Nelissen        serviceManager->addService(PRODUCER_NAME, IInterface::asBinder(producer));
119097ca275f4717a2c47a5d49f302ed2b72c8a1370Marco Nelissen        serviceManager->addService(CONSUMER_NAME, IInterface::asBinder(consumer));
1201a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza        ProcessState::self()->startThreadPool();
1211a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza        IPCThreadState::self()->joinThreadPool();
1221a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza        LOG_ALWAYS_FATAL("Shouldn't be here");
1231a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    }
1241a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza
1251a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    sp<IServiceManager> serviceManager = defaultServiceManager();
1261a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    sp<IBinder> binderProducer =
1271a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza        serviceManager->getService(PRODUCER_NAME);
1281a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    mProducer = interface_cast<IGraphicBufferProducer>(binderProducer);
1291a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    EXPECT_TRUE(mProducer != NULL);
1301a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    sp<IBinder> binderConsumer =
1311a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza        serviceManager->getService(CONSUMER_NAME);
1321a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    mConsumer = interface_cast<IGraphicBufferConsumer>(binderConsumer);
1331a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    EXPECT_TRUE(mConsumer != NULL);
1341a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza
1351a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    sp<DummyConsumer> dc(new DummyConsumer);
1361a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    ASSERT_EQ(OK, mConsumer->consumerConnect(dc, false));
1371a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    IGraphicBufferProducer::QueueBufferOutput output;
1381a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    ASSERT_EQ(OK,
1391a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza            mProducer->connect(NULL, NATIVE_WINDOW_API_CPU, false, &output));
1401a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza
1411a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    int slot;
1421a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    sp<Fence> fence;
1431a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    sp<GraphicBuffer> buffer;
1441a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
145567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos            mProducer->dequeueBuffer(&slot, &fence, 0, 0, 0,
1467c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson                    GRALLOC_USAGE_SW_WRITE_OFTEN, nullptr));
1471a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    ASSERT_EQ(OK, mProducer->requestBuffer(slot, &buffer));
1481a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza
1491a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    uint32_t* dataIn;
1501a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    ASSERT_EQ(OK, buffer->lock(GraphicBuffer::USAGE_SW_WRITE_OFTEN,
1511a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza            reinterpret_cast<void**>(&dataIn)));
152f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza    *dataIn = TEST_DATA;
1531a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    ASSERT_EQ(OK, buffer->unlock());
1541a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza
15582c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala    IGraphicBufferProducer::QueueBufferInput input(0, false,
15682c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala            HAL_DATASPACE_UNKNOWN, Rect(0, 0, 1, 1),
157567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos            NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, Fence::NO_FENCE);
1581a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    ASSERT_EQ(OK, mProducer->queueBuffer(slot, input, &output));
1591a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza
160cf3834db104e0b052056e3a06d46e3f222f0d372Dan Stoza    BufferItem item;
1611a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, 0));
1621a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza
1631a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    uint32_t* dataOut;
1641a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    ASSERT_EQ(OK, item.mGraphicBuffer->lock(GraphicBuffer::USAGE_SW_READ_OFTEN,
1651a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza            reinterpret_cast<void**>(&dataOut)));
166f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza    ASSERT_EQ(*dataOut, TEST_DATA);
1671a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    ASSERT_EQ(OK, item.mGraphicBuffer->unlock());
1681a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza}
1691a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza
1709e75ddda93888755d0b14144b62e896cd9f78f3aJamie GennisTEST_F(BufferQueueTest, AcquireBuffer_ExceedsMaxAcquireCount_Fails) {
1711a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    createBufferQueue();
1729e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis    sp<DummyConsumer> dc(new DummyConsumer);
1739f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    mConsumer->consumerConnect(dc, false);
1742adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden    IGraphicBufferProducer::QueueBufferOutput qbo;
175f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza    mProducer->connect(new DummyProducerListener, NATIVE_WINDOW_API_CPU, false,
176f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza            &qbo);
177fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos    mProducer->setMaxDequeuedBufferCount(3);
1789e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis
1799e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis    int slot;
1809e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis    sp<Fence> fence;
1819e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis    sp<GraphicBuffer> buf;
18282c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala    IGraphicBufferProducer::QueueBufferInput qbi(0, false,
18382c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala            HAL_DATASPACE_UNKNOWN, Rect(0, 0, 1, 1),
184567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos            NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, Fence::NO_FENCE);
185cf3834db104e0b052056e3a06d46e3f222f0d372Dan Stoza    BufferItem item;
1869e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis
1879e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis    for (int i = 0; i < 2; i++) {
1882adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden        ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
189567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos                mProducer->dequeueBuffer(&slot, &fence, 1, 1, 0,
1907c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson                    GRALLOC_USAGE_SW_READ_OFTEN, nullptr));
1919f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza        ASSERT_EQ(OK, mProducer->requestBuffer(slot, &buf));
1929f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza        ASSERT_EQ(OK, mProducer->queueBuffer(slot, qbi, &qbo));
1939f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza        ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, 0));
1949e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis    }
1959e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis
1962adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden    ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
197567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos            mProducer->dequeueBuffer(&slot, &fence, 1, 1, 0,
1987c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson                GRALLOC_USAGE_SW_READ_OFTEN, nullptr));
1999f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mProducer->requestBuffer(slot, &buf));
2009f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mProducer->queueBuffer(slot, qbi, &qbo));
2019e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis
2029e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis    // Acquire the third buffer, which should fail.
2039f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(INVALID_OPERATION, mConsumer->acquireBuffer(&item, 0));
2049e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis}
2059e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis
206c68f2ecfa02037144d1a3856f637a77f523cf416Jamie GennisTEST_F(BufferQueueTest, SetMaxAcquiredBufferCountWithIllegalValues_ReturnsError) {
2071a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    createBufferQueue();
208c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis    sp<DummyConsumer> dc(new DummyConsumer);
2099f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    mConsumer->consumerConnect(dc, false);
210c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis
21172daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    EXPECT_EQ(OK, mConsumer->setMaxBufferCount(10));
21272daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    EXPECT_EQ(BAD_VALUE, mConsumer->setMaxAcquiredBufferCount(10));
21372daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos
21472daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    IGraphicBufferProducer::QueueBufferOutput qbo;
21572daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    mProducer->connect(new DummyProducerListener, NATIVE_WINDOW_API_CPU, false,
21672daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos            &qbo);
21772daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    mProducer->setMaxDequeuedBufferCount(3);
21872daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos
2197ea777f097784492f880623067becac1b276f884Igor Murashkin    int minBufferCount;
2207ea777f097784492f880623067becac1b276f884Igor Murashkin    ASSERT_NO_FATAL_FAILURE(GetMinUndequeuedBufferCount(&minBufferCount));
2219f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    EXPECT_EQ(BAD_VALUE, mConsumer->setMaxAcquiredBufferCount(
2229f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza                minBufferCount - 1));
2237ea777f097784492f880623067becac1b276f884Igor Murashkin
2249f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    EXPECT_EQ(BAD_VALUE, mConsumer->setMaxAcquiredBufferCount(0));
2259f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    EXPECT_EQ(BAD_VALUE, mConsumer->setMaxAcquiredBufferCount(-3));
2269f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    EXPECT_EQ(BAD_VALUE, mConsumer->setMaxAcquiredBufferCount(
227c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis            BufferQueue::MAX_MAX_ACQUIRED_BUFFERS+1));
2289f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    EXPECT_EQ(BAD_VALUE, mConsumer->setMaxAcquiredBufferCount(100));
22919e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos
23072daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    int slot;
23172daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    sp<Fence> fence;
23272daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    sp<GraphicBuffer> buf;
23372daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    IGraphicBufferProducer::QueueBufferInput qbi(0, false,
23472daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos            HAL_DATASPACE_UNKNOWN, Rect(0, 0, 1, 1),
23572daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos            NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, Fence::NO_FENCE);
23672daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    BufferItem item;
23772daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    EXPECT_EQ(OK, mConsumer->setMaxAcquiredBufferCount(3));
23872daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    for (int i = 0; i < 3; i++) {
23972daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos        ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
24072daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos                mProducer->dequeueBuffer(&slot, &fence, 1, 1, 0,
2417c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson                    GRALLOC_USAGE_SW_READ_OFTEN, nullptr));
24272daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos        ASSERT_EQ(OK, mProducer->requestBuffer(slot, &buf));
24372daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos        ASSERT_EQ(OK, mProducer->queueBuffer(slot, qbi, &qbo));
24472daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos        ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, 0));
24572daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    }
24672daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos
24772daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    EXPECT_EQ(BAD_VALUE, mConsumer->setMaxAcquiredBufferCount(2));
248c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis}
249c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis
250c68f2ecfa02037144d1a3856f637a77f523cf416Jamie GennisTEST_F(BufferQueueTest, SetMaxAcquiredBufferCountWithLegalValues_Succeeds) {
2511a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    createBufferQueue();
252c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis    sp<DummyConsumer> dc(new DummyConsumer);
2539f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    mConsumer->consumerConnect(dc, false);
254c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis
25572daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    IGraphicBufferProducer::QueueBufferOutput qbo;
25672daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    mProducer->connect(new DummyProducerListener, NATIVE_WINDOW_API_CPU, false,
25772daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos            &qbo);
25872daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    mProducer->setMaxDequeuedBufferCount(2);
25972daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos
2607ea777f097784492f880623067becac1b276f884Igor Murashkin    int minBufferCount;
2617ea777f097784492f880623067becac1b276f884Igor Murashkin    ASSERT_NO_FATAL_FAILURE(GetMinUndequeuedBufferCount(&minBufferCount));
2627ea777f097784492f880623067becac1b276f884Igor Murashkin
2639f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    EXPECT_EQ(OK, mConsumer->setMaxAcquiredBufferCount(1));
2649f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    EXPECT_EQ(OK, mConsumer->setMaxAcquiredBufferCount(2));
2659f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    EXPECT_EQ(OK, mConsumer->setMaxAcquiredBufferCount(minBufferCount));
26672daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos
26772daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    int slot;
26872daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    sp<Fence> fence;
26972daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    sp<GraphicBuffer> buf;
27072daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    IGraphicBufferProducer::QueueBufferInput qbi(0, false,
27172daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos            HAL_DATASPACE_UNKNOWN, Rect(0, 0, 1, 1),
27272daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos            NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, Fence::NO_FENCE);
27372daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    BufferItem item;
27472daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos
27572daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
27672daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos            mProducer->dequeueBuffer(&slot, &fence, 1, 1, 0,
2777c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson            GRALLOC_USAGE_SW_READ_OFTEN, nullptr));
27872daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    ASSERT_EQ(OK, mProducer->requestBuffer(slot, &buf));
27972daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    ASSERT_EQ(OK, mProducer->queueBuffer(slot, qbi, &qbo));
28072daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, 0));
28172daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos
28272daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    EXPECT_EQ(OK, mConsumer->setMaxAcquiredBufferCount(3));
28372daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos
28472daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    for (int i = 0; i < 2; i++) {
28572daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos        ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
28672daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos                mProducer->dequeueBuffer(&slot, &fence, 1, 1, 0,
2877c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson                GRALLOC_USAGE_SW_READ_OFTEN, nullptr));
28872daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos        ASSERT_EQ(OK, mProducer->requestBuffer(slot, &buf));
28972daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos        ASSERT_EQ(OK, mProducer->queueBuffer(slot, qbi, &qbo));
29072daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos        ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, 0));
29172daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    }
29272daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos
2939f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    EXPECT_EQ(OK, mConsumer->setMaxAcquiredBufferCount(
294c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis            BufferQueue::MAX_MAX_ACQUIRED_BUFFERS));
295c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis}
296c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis
29719e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo CeballosTEST_F(BufferQueueTest, SetMaxBufferCountWithLegalValues_Succeeds) {
29819e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos    createBufferQueue();
29919e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos    sp<DummyConsumer> dc(new DummyConsumer);
30019e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos    mConsumer->consumerConnect(dc, false);
30119e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos
3023559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos    // Test shared buffer mode
30319e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos    EXPECT_EQ(OK, mConsumer->setMaxAcquiredBufferCount(1));
30419e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos}
30519e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos
30619e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo CeballosTEST_F(BufferQueueTest, SetMaxBufferCountWithIllegalValues_ReturnsError) {
30719e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos    createBufferQueue();
30819e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos    sp<DummyConsumer> dc(new DummyConsumer);
30919e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos    mConsumer->consumerConnect(dc, false);
31019e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos
31119e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos    EXPECT_EQ(BAD_VALUE, mConsumer->setMaxBufferCount(0));
31219e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos    EXPECT_EQ(BAD_VALUE, mConsumer->setMaxBufferCount(
31319e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos            BufferQueue::NUM_BUFFER_SLOTS + 1));
31419e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos
31519e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos    EXPECT_EQ(OK, mConsumer->setMaxAcquiredBufferCount(5));
31619e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos    EXPECT_EQ(BAD_VALUE, mConsumer->setMaxBufferCount(3));
31719e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos}
31819e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos
3199f3053de78630815d60cf48a2cf2348cc5867c45Dan StozaTEST_F(BufferQueueTest, DetachAndReattachOnProducerSide) {
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    ASSERT_EQ(BAD_VALUE, mProducer->detachBuffer(-1)); // Index too low
3289f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(BAD_VALUE, mProducer->detachBuffer(
3299f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza                BufferQueueDefs::NUM_BUFFER_SLOTS)); // Index too high
3309f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(BAD_VALUE, mProducer->detachBuffer(0)); // Not dequeued
3319f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
3329f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    int slot;
3339f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    sp<Fence> fence;
3349f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    sp<GraphicBuffer> buffer;
3359f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
336567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos            mProducer->dequeueBuffer(&slot, &fence, 0, 0, 0,
3377c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson                    GRALLOC_USAGE_SW_WRITE_OFTEN, nullptr));
3389f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(BAD_VALUE, mProducer->detachBuffer(slot)); // Not requested
3399f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mProducer->requestBuffer(slot, &buffer));
3409f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mProducer->detachBuffer(slot));
3419f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(BAD_VALUE, mProducer->detachBuffer(slot)); // Not dequeued
3429f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
3439f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    sp<GraphicBuffer> safeToClobberBuffer;
3449f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    // Can no longer request buffer from this slot
3459f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(BAD_VALUE, mProducer->requestBuffer(slot, &safeToClobberBuffer));
3469f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
3479f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    uint32_t* dataIn;
3489f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, buffer->lock(GraphicBuffer::USAGE_SW_WRITE_OFTEN,
3499f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza            reinterpret_cast<void**>(&dataIn)));
350f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza    *dataIn = TEST_DATA;
3519f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, buffer->unlock());
3529f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
3539f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    int newSlot;
3549f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(BAD_VALUE, mProducer->attachBuffer(NULL, safeToClobberBuffer));
3559f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(BAD_VALUE, mProducer->attachBuffer(&newSlot, NULL));
3569f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
3579f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mProducer->attachBuffer(&newSlot, buffer));
35882c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala    IGraphicBufferProducer::QueueBufferInput input(0, false,
35982c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala            HAL_DATASPACE_UNKNOWN, Rect(0, 0, 1, 1),
360567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos            NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, Fence::NO_FENCE);
3619f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mProducer->queueBuffer(newSlot, input, &output));
3629f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
363cf3834db104e0b052056e3a06d46e3f222f0d372Dan Stoza    BufferItem item;
3649f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, static_cast<nsecs_t>(0)));
3659f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
3669f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    uint32_t* dataOut;
3679f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, item.mGraphicBuffer->lock(GraphicBuffer::USAGE_SW_READ_OFTEN,
3689f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza            reinterpret_cast<void**>(&dataOut)));
369f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza    ASSERT_EQ(*dataOut, TEST_DATA);
3701a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    ASSERT_EQ(OK, item.mGraphicBuffer->unlock());
3719f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza}
3729f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
3739f3053de78630815d60cf48a2cf2348cc5867c45Dan StozaTEST_F(BufferQueueTest, DetachAndReattachOnConsumerSide) {
3741a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    createBufferQueue();
3759f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    sp<DummyConsumer> dc(new DummyConsumer);
3769f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mConsumer->consumerConnect(dc, false));
3779f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    IGraphicBufferProducer::QueueBufferOutput output;
378f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza    ASSERT_EQ(OK, mProducer->connect(new DummyProducerListener,
379f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza            NATIVE_WINDOW_API_CPU, false, &output));
3809f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
3819f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    int slot;
3829f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    sp<Fence> fence;
3839f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    sp<GraphicBuffer> buffer;
3849f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
385567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos            mProducer->dequeueBuffer(&slot, &fence, 0, 0, 0,
3867c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson                    GRALLOC_USAGE_SW_WRITE_OFTEN, nullptr));
3879f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mProducer->requestBuffer(slot, &buffer));
38882c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala    IGraphicBufferProducer::QueueBufferInput input(0, false,
38982c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala            HAL_DATASPACE_UNKNOWN, Rect(0, 0, 1, 1),
390567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos            NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, Fence::NO_FENCE);
3919f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mProducer->queueBuffer(slot, input, &output));
3929f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
3939f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(BAD_VALUE, mConsumer->detachBuffer(-1)); // Index too low
3949f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(BAD_VALUE, mConsumer->detachBuffer(
3959f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza            BufferQueueDefs::NUM_BUFFER_SLOTS)); // Index too high
3969f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(BAD_VALUE, mConsumer->detachBuffer(0)); // Not acquired
3979f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
398cf3834db104e0b052056e3a06d46e3f222f0d372Dan Stoza    BufferItem item;
3999f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, static_cast<nsecs_t>(0)));
4009f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
40147650f4f66a49e1815ad08ca4fb12a661d133abcPablo Ceballos    ASSERT_EQ(OK, mConsumer->detachBuffer(item.mSlot));
40247650f4f66a49e1815ad08ca4fb12a661d133abcPablo Ceballos    ASSERT_EQ(BAD_VALUE, mConsumer->detachBuffer(item.mSlot)); // Not acquired
4039f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
4049f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    uint32_t* dataIn;
4059f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, item.mGraphicBuffer->lock(
4069f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza            GraphicBuffer::USAGE_SW_WRITE_OFTEN,
4079f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza            reinterpret_cast<void**>(&dataIn)));
408f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza    *dataIn = TEST_DATA;
4099f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, item.mGraphicBuffer->unlock());
4109f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
4119f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    int newSlot;
4129f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    sp<GraphicBuffer> safeToClobberBuffer;
4139f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(BAD_VALUE, mConsumer->attachBuffer(NULL, safeToClobberBuffer));
4149f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(BAD_VALUE, mConsumer->attachBuffer(&newSlot, NULL));
4159f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mConsumer->attachBuffer(&newSlot, item.mGraphicBuffer));
4169f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
41799b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    ASSERT_EQ(OK, mConsumer->releaseBuffer(newSlot, 0, EGL_NO_DISPLAY,
4189f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza            EGL_NO_SYNC_KHR, Fence::NO_FENCE));
4199f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
4209f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
421567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos            mProducer->dequeueBuffer(&slot, &fence, 0, 0, 0,
4227c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson                    GRALLOC_USAGE_SW_WRITE_OFTEN, nullptr));
4239f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mProducer->requestBuffer(slot, &buffer));
4249f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
4259f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    uint32_t* dataOut;
4269f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, buffer->lock(GraphicBuffer::USAGE_SW_READ_OFTEN,
4279f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza            reinterpret_cast<void**>(&dataOut)));
428f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza    ASSERT_EQ(*dataOut, TEST_DATA);
4291a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    ASSERT_EQ(OK, buffer->unlock());
4309f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza}
4319f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
4329f3053de78630815d60cf48a2cf2348cc5867c45Dan StozaTEST_F(BufferQueueTest, MoveFromConsumerToProducer) {
4331a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    createBufferQueue();
4349f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    sp<DummyConsumer> dc(new DummyConsumer);
4359f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mConsumer->consumerConnect(dc, false));
4369f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    IGraphicBufferProducer::QueueBufferOutput output;
437f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza    ASSERT_EQ(OK, mProducer->connect(new DummyProducerListener,
438f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza            NATIVE_WINDOW_API_CPU, false, &output));
4399f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
4409f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    int slot;
4419f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    sp<Fence> fence;
4429f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    sp<GraphicBuffer> buffer;
4439f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
444567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos            mProducer->dequeueBuffer(&slot, &fence, 0, 0, 0,
4457c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson                    GRALLOC_USAGE_SW_WRITE_OFTEN, nullptr));
4469f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mProducer->requestBuffer(slot, &buffer));
4479f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
4489f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    uint32_t* dataIn;
4499f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, buffer->lock(GraphicBuffer::USAGE_SW_WRITE_OFTEN,
4509f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza            reinterpret_cast<void**>(&dataIn)));
451f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza    *dataIn = TEST_DATA;
4529f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, buffer->unlock());
4539f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
45482c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala    IGraphicBufferProducer::QueueBufferInput input(0, false,
45582c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala            HAL_DATASPACE_UNKNOWN, Rect(0, 0, 1, 1),
456567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos            NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, Fence::NO_FENCE);
4579f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mProducer->queueBuffer(slot, input, &output));
4589f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
459cf3834db104e0b052056e3a06d46e3f222f0d372Dan Stoza    BufferItem item;
4609f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, static_cast<nsecs_t>(0)));
46147650f4f66a49e1815ad08ca4fb12a661d133abcPablo Ceballos    ASSERT_EQ(OK, mConsumer->detachBuffer(item.mSlot));
4629f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
4639f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    int newSlot;
4649f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mProducer->attachBuffer(&newSlot, item.mGraphicBuffer));
4659f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mProducer->queueBuffer(newSlot, input, &output));
4669f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, static_cast<nsecs_t>(0)));
4679f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
4689f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    uint32_t* dataOut;
4699f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, item.mGraphicBuffer->lock(GraphicBuffer::USAGE_SW_READ_OFTEN,
4709f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza            reinterpret_cast<void**>(&dataOut)));
471f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza    ASSERT_EQ(*dataOut, TEST_DATA);
4721a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    ASSERT_EQ(OK, item.mGraphicBuffer->unlock());
4739f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza}
4749f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
4759de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan StozaTEST_F(BufferQueueTest, TestDisallowingAllocation) {
4769de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza    createBufferQueue();
4779de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza    sp<DummyConsumer> dc(new DummyConsumer);
4789de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza    ASSERT_EQ(OK, mConsumer->consumerConnect(dc, true));
4799de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza    IGraphicBufferProducer::QueueBufferOutput output;
4809de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza    ASSERT_EQ(OK, mProducer->connect(new DummyProducerListener,
4819de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza            NATIVE_WINDOW_API_CPU, true, &output));
4829de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza
4839de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza    static const uint32_t WIDTH = 320;
4849de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza    static const uint32_t HEIGHT = 240;
4859de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza
4869de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza    ASSERT_EQ(OK, mConsumer->setDefaultBufferSize(WIDTH, HEIGHT));
4879de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza
4889de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza    int slot;
4899de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza    sp<Fence> fence;
4909de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza    sp<GraphicBuffer> buffer;
4919de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza    // This should return an error since it would require an allocation
4929de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza    ASSERT_EQ(OK, mProducer->allowAllocation(false));
493567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos    ASSERT_EQ(WOULD_BLOCK, mProducer->dequeueBuffer(&slot, &fence, 0, 0,
4947c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson            0, GRALLOC_USAGE_SW_WRITE_OFTEN, nullptr));
4959de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza
4969de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza    // This should succeed, now that we've lifted the prohibition
4979de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza    ASSERT_EQ(OK, mProducer->allowAllocation(true));
4989de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza    ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
499567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos            mProducer->dequeueBuffer(&slot, &fence, 0, 0, 0,
5007c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson            GRALLOC_USAGE_SW_WRITE_OFTEN, nullptr));
5019de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza
5029de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza    // Release the previous buffer back to the BufferQueue
5039de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza    mProducer->cancelBuffer(slot, fence);
5049de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza
5059de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza    // This should fail since we're requesting a different size
5069de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza    ASSERT_EQ(OK, mProducer->allowAllocation(false));
507567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos    ASSERT_EQ(WOULD_BLOCK, mProducer->dequeueBuffer(&slot, &fence,
5087c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson            WIDTH * 2, HEIGHT * 2, 0, GRALLOC_USAGE_SW_WRITE_OFTEN, nullptr));
5099de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza}
5109de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza
511812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan StozaTEST_F(BufferQueueTest, TestGenerationNumbers) {
512812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    createBufferQueue();
513812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    sp<DummyConsumer> dc(new DummyConsumer);
514812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    ASSERT_EQ(OK, mConsumer->consumerConnect(dc, true));
515812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    IGraphicBufferProducer::QueueBufferOutput output;
516812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    ASSERT_EQ(OK, mProducer->connect(new DummyProducerListener,
517812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza            NATIVE_WINDOW_API_CPU, true, &output));
518812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza
519812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    ASSERT_EQ(OK, mProducer->setGenerationNumber(1));
520812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza
521812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    // Get one buffer to play with
522812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    int slot;
523812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    sp<Fence> fence;
524812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
5257c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson            mProducer->dequeueBuffer(&slot, &fence, 0, 0, 0, 0, nullptr));
526812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza
527812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    sp<GraphicBuffer> buffer;
528812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    ASSERT_EQ(OK, mProducer->requestBuffer(slot, &buffer));
529812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza
530812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    // Ensure that the generation number we set propagates to allocated buffers
531812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    ASSERT_EQ(1U, buffer->getGenerationNumber());
532812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza
533812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    ASSERT_EQ(OK, mProducer->detachBuffer(slot));
534812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza
535812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    ASSERT_EQ(OK, mProducer->setGenerationNumber(2));
536812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza
537812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    // These should fail, since we've changed the generation number on the queue
538812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    int outSlot;
539812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    ASSERT_EQ(BAD_VALUE, mProducer->attachBuffer(&outSlot, buffer));
540812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    ASSERT_EQ(BAD_VALUE, mConsumer->attachBuffer(&outSlot, buffer));
541812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza
542812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    buffer->setGenerationNumber(2);
543812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza
544812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    // This should succeed now that we've changed the buffer's generation number
545812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    ASSERT_EQ(OK, mProducer->attachBuffer(&outSlot, buffer));
546812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza
547812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    ASSERT_EQ(OK, mProducer->detachBuffer(outSlot));
548812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza
549812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    // This should also succeed with the new generation number
550812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    ASSERT_EQ(OK, mConsumer->attachBuffer(&outSlot, buffer));
551812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza}
552812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza
5533559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo CeballosTEST_F(BufferQueueTest, TestSharedBufferModeWithoutAutoRefresh) {
554ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    createBufferQueue();
555ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    sp<DummyConsumer> dc(new DummyConsumer);
556ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    ASSERT_EQ(OK, mConsumer->consumerConnect(dc, true));
557ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    IGraphicBufferProducer::QueueBufferOutput output;
558ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    ASSERT_EQ(OK, mProducer->connect(new DummyProducerListener,
559ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos            NATIVE_WINDOW_API_CPU, true, &output));
560ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos
5613559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos    ASSERT_EQ(OK, mProducer->setSharedBufferMode(true));
562ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos
563ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    // Get a buffer
5643559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos    int sharedSlot;
565ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    sp<Fence> fence;
566ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    sp<GraphicBuffer> buffer;
567ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
5687c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson            mProducer->dequeueBuffer(&sharedSlot, &fence, 0, 0, 0, 0, nullptr));
5693559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos    ASSERT_EQ(OK, mProducer->requestBuffer(sharedSlot, &buffer));
570ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos
571ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    // Queue the buffer
572ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    IGraphicBufferProducer::QueueBufferInput input(0, false,
573ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos            HAL_DATASPACE_UNKNOWN, Rect(0, 0, 1, 1),
574ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos            NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, Fence::NO_FENCE);
5753559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos    ASSERT_EQ(OK, mProducer->queueBuffer(sharedSlot, input, &output));
576ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos
577ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    // Repeatedly queue and dequeue a buffer from the producer side, it should
578ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    // always return the same one. And we won't run out of buffers because it's
579ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    // always the same one and because async mode gets enabled.
580ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    int slot;
581ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    for (int i = 0; i < 5; i++) {
5827c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson        ASSERT_EQ(OK, mProducer->dequeueBuffer(
5837c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson                &slot, &fence, 0, 0, 0, 0, nullptr));
5843559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos        ASSERT_EQ(sharedSlot, slot);
5853559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos        ASSERT_EQ(OK, mProducer->queueBuffer(sharedSlot, input, &output));
586ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    }
587ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos
588ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    // acquire the buffer
589ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    BufferItem item;
590ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, 0));
5913559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos    ASSERT_EQ(sharedSlot, item.mSlot);
592ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    testBufferItem(input, item);
593ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    ASSERT_EQ(true, item.mQueuedBuffer);
594ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    ASSERT_EQ(false, item.mAutoRefresh);
595ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos
596ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    ASSERT_EQ(OK, mConsumer->releaseBuffer(item.mSlot, item.mFrameNumber,
597ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos            EGL_NO_DISPLAY, EGL_NO_SYNC_KHR, Fence::NO_FENCE));
598ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos
599ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    // attempt to acquire a second time should return no buffer available
600ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    ASSERT_EQ(IGraphicBufferConsumer::NO_BUFFER_AVAILABLE,
601ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos            mConsumer->acquireBuffer(&item, 0));
602ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos}
603ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos
6043559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo CeballosTEST_F(BufferQueueTest, TestSharedBufferModeWithAutoRefresh) {
605ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos    createBufferQueue();
606ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos    sp<DummyConsumer> dc(new DummyConsumer);
607ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos    ASSERT_EQ(OK, mConsumer->consumerConnect(dc, true));
608ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos    IGraphicBufferProducer::QueueBufferOutput output;
609ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos    ASSERT_EQ(OK, mProducer->connect(new DummyProducerListener,
610ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos            NATIVE_WINDOW_API_CPU, true, &output));
611ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos
6123559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos    ASSERT_EQ(OK, mProducer->setSharedBufferMode(true));
613ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    ASSERT_EQ(OK, mProducer->setAutoRefresh(true));
614ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos
615ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos    // Get a buffer
6163559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos    int sharedSlot;
617ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos    sp<Fence> fence;
618ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos    sp<GraphicBuffer> buffer;
619ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos    ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
6207c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson            mProducer->dequeueBuffer(&sharedSlot, &fence, 0, 0, 0, 0, nullptr));
6213559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos    ASSERT_EQ(OK, mProducer->requestBuffer(sharedSlot, &buffer));
622ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos
623ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos    // Queue the buffer
624ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos    IGraphicBufferProducer::QueueBufferInput input(0, false,
625ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos            HAL_DATASPACE_UNKNOWN, Rect(0, 0, 1, 1),
626ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos            NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, Fence::NO_FENCE);
6273559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos    ASSERT_EQ(OK, mProducer->queueBuffer(sharedSlot, input, &output));
628ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos
629ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos    // Repeatedly acquire and release a buffer from the consumer side, it should
630ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos    // always return the same one.
631ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos    BufferItem item;
632ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos    for (int i = 0; i < 5; i++) {
633ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos        ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, 0));
6343559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos        ASSERT_EQ(sharedSlot, item.mSlot);
635ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos        testBufferItem(input, item);
636ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos        ASSERT_EQ(i == 0, item.mQueuedBuffer);
637ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos        ASSERT_EQ(true, item.mAutoRefresh);
638ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos
639ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos        ASSERT_EQ(OK, mConsumer->releaseBuffer(item.mSlot, item.mFrameNumber,
640ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos                EGL_NO_DISPLAY, EGL_NO_SYNC_KHR, Fence::NO_FENCE));
641ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos    }
642ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos
643ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos    // Repeatedly queue and dequeue a buffer from the producer side, it should
644ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos    // always return the same one.
645ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos    int slot;
646ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos    for (int i = 0; i < 5; i++) {
6477c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson        ASSERT_EQ(OK, mProducer->dequeueBuffer(
6487c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson                &slot, &fence, 0, 0, 0, 0, nullptr));
6493559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos        ASSERT_EQ(sharedSlot, slot);
6503559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos        ASSERT_EQ(OK, mProducer->queueBuffer(sharedSlot, input, &output));
651ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos    }
652ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos
653ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos    // Repeatedly acquire and release a buffer from the consumer side, it should
654ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos    // always return the same one. First grabbing them from the queue and then
6553559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos    // when the queue is empty, returning the shared buffer.
656ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos    for (int i = 0; i < 10; i++) {
657ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos        ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, 0));
6583559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos        ASSERT_EQ(sharedSlot, item.mSlot);
659ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos        ASSERT_EQ(0, item.mTimestamp);
660ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos        ASSERT_EQ(false, item.mIsAutoTimestamp);
661ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos        ASSERT_EQ(HAL_DATASPACE_UNKNOWN, item.mDataSpace);
662ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos        ASSERT_EQ(Rect(0, 0, 1, 1), item.mCrop);
663ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos        ASSERT_EQ(NATIVE_WINDOW_SCALING_MODE_FREEZE, item.mScalingMode);
6645ecfb68ffd63d352df0392dca6e95ef67a66c679Dan Stoza        ASSERT_EQ(0u, item.mTransform);
665ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos        ASSERT_EQ(Fence::NO_FENCE, item.mFence);
666ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos        ASSERT_EQ(i == 0, item.mQueuedBuffer);
667ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos        ASSERT_EQ(true, item.mAutoRefresh);
668ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos
669ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos        ASSERT_EQ(OK, mConsumer->releaseBuffer(item.mSlot, item.mFrameNumber,
670ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos                EGL_NO_DISPLAY, EGL_NO_SYNC_KHR, Fence::NO_FENCE));
671ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos    }
672ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos}
673ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos
6743559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo CeballosTEST_F(BufferQueueTest, TestSharedBufferModeUsingAlreadyDequeuedBuffer) {
675295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos    createBufferQueue();
676295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos    sp<DummyConsumer> dc(new DummyConsumer);
677295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos    ASSERT_EQ(OK, mConsumer->consumerConnect(dc, true));
678295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos    IGraphicBufferProducer::QueueBufferOutput output;
679295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos    ASSERT_EQ(OK, mProducer->connect(new DummyProducerListener,
680295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos            NATIVE_WINDOW_API_CPU, true, &output));
681295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos
682295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos    // Dequeue a buffer
6833559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos    int sharedSlot;
684295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos    sp<Fence> fence;
685295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos    sp<GraphicBuffer> buffer;
686295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos    ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
6877c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson            mProducer->dequeueBuffer(&sharedSlot, &fence, 0, 0, 0, 0, nullptr));
6883559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos    ASSERT_EQ(OK, mProducer->requestBuffer(sharedSlot, &buffer));
689295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos
6903559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos    // Enable shared buffer mode
6913559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos    ASSERT_EQ(OK, mProducer->setSharedBufferMode(true));
692295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos
693295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos    // Queue the buffer
694295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos    IGraphicBufferProducer::QueueBufferInput input(0, false,
695295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos            HAL_DATASPACE_UNKNOWN, Rect(0, 0, 1, 1),
696295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos            NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, Fence::NO_FENCE);
6973559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos    ASSERT_EQ(OK, mProducer->queueBuffer(sharedSlot, input, &output));
698295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos
699295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos    // Repeatedly queue and dequeue a buffer from the producer side, it should
700295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos    // always return the same one. And we won't run out of buffers because it's
701295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos    // always the same one and because async mode gets enabled.
702295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos    int slot;
703295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos    for (int i = 0; i < 5; i++) {
7047c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson        ASSERT_EQ(OK, mProducer->dequeueBuffer(
7057c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson                &slot, &fence, 0, 0, 0, 0, nullptr));
7063559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos        ASSERT_EQ(sharedSlot, slot);
7073559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos        ASSERT_EQ(OK, mProducer->queueBuffer(sharedSlot, input, &output));
708295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos    }
709295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos
710295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos    // acquire the buffer
711295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos    BufferItem item;
712295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos    ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, 0));
7133559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos    ASSERT_EQ(sharedSlot, item.mSlot);
714295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos    testBufferItem(input, item);
715295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos    ASSERT_EQ(true, item.mQueuedBuffer);
716295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos    ASSERT_EQ(false, item.mAutoRefresh);
717295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos
718295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos    ASSERT_EQ(OK, mConsumer->releaseBuffer(item.mSlot, item.mFrameNumber,
719295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos            EGL_NO_DISPLAY, EGL_NO_SYNC_KHR, Fence::NO_FENCE));
720295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos
721295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos    // attempt to acquire a second time should return no buffer available
722295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos    ASSERT_EQ(IGraphicBufferConsumer::NO_BUFFER_AVAILABLE,
723295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos            mConsumer->acquireBuffer(&item, 0));
724295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos}
725295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos
726127fc63e8a15366b4395f1363e8e18eb058d1709Dan StozaTEST_F(BufferQueueTest, TestTimeouts) {
727127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    createBufferQueue();
728127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    sp<DummyConsumer> dc(new DummyConsumer);
729127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    ASSERT_EQ(OK, mConsumer->consumerConnect(dc, true));
730127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    IGraphicBufferProducer::QueueBufferOutput output;
731127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    ASSERT_EQ(OK, mProducer->connect(new DummyProducerListener,
732127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza            NATIVE_WINDOW_API_CPU, true, &output));
733127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza
734127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    // Fill up the queue. Since the controlledByApp flags are set to true, this
735127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    // queue should be in non-blocking mode, and we should be recycling the same
736127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    // two buffers
737127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    for (int i = 0; i < 5; ++i) {
738127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza        int slot = BufferQueue::INVALID_BUFFER_SLOT;
739127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza        sp<Fence> fence = Fence::NO_FENCE;
7407c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson        auto result = mProducer->dequeueBuffer(
7417c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson                &slot, &fence, 0, 0, 0, 0, nullptr);
742127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza        if (i < 2) {
743127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza            ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
744127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza                    result);
745127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza        } else {
746127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza            ASSERT_EQ(OK, result);
747127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza        }
748127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza        sp<GraphicBuffer> buffer;
749127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza        ASSERT_EQ(OK, mProducer->requestBuffer(slot, &buffer));
750127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza        IGraphicBufferProducer::QueueBufferInput input(0ull, true,
751127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza                HAL_DATASPACE_UNKNOWN, Rect::INVALID_RECT,
752127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza                NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, Fence::NO_FENCE);
753127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza        IGraphicBufferProducer::QueueBufferOutput output{};
754127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza        ASSERT_EQ(OK, mProducer->queueBuffer(slot, input, &output));
755127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    }
756127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza
757127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    const auto TIMEOUT = ms2ns(250);
758127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    mProducer->setDequeueTimeout(TIMEOUT);
759127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza
760127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    // Setting a timeout will change the BufferQueue into blocking mode (with
761127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    // one droppable buffer in the queue and one free from the previous
762127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    // dequeue/queues), so dequeue and queue two more buffers: one to replace
763127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    // the current droppable buffer, and a second to max out the buffer count
764127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    sp<GraphicBuffer> buffer; // Save a buffer to attach later
765127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    for (int i = 0; i < 2; ++i) {
766127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza        int slot = BufferQueue::INVALID_BUFFER_SLOT;
767127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza        sp<Fence> fence = Fence::NO_FENCE;
7687c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson        ASSERT_EQ(OK, mProducer->dequeueBuffer(
7697c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson                &slot, &fence, 0, 0, 0, 0, nullptr));
770127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza        ASSERT_EQ(OK, mProducer->requestBuffer(slot, &buffer));
771127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza        IGraphicBufferProducer::QueueBufferInput input(0ull, true,
772127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza                HAL_DATASPACE_UNKNOWN, Rect::INVALID_RECT,
773127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza                NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, Fence::NO_FENCE);
774127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza        ASSERT_EQ(OK, mProducer->queueBuffer(slot, input, &output));
775127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    }
776127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza
777127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    int slot = BufferQueue::INVALID_BUFFER_SLOT;
778127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    sp<Fence> fence = Fence::NO_FENCE;
779127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    auto startTime = systemTime();
7807c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson    ASSERT_EQ(TIMED_OUT, mProducer->dequeueBuffer(
7817c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson            &slot, &fence, 0, 0, 0, 0, nullptr));
782127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    ASSERT_GE(systemTime() - startTime, TIMEOUT);
783127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza
784127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    // We're technically attaching the same buffer multiple times (since we
785127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    // queued it previously), but that doesn't matter for this test
786127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    startTime = systemTime();
787127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    ASSERT_EQ(TIMED_OUT, mProducer->attachBuffer(&slot, buffer));
788127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    ASSERT_GE(systemTime() - startTime, TIMEOUT);
789127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza}
790127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza
7915ecfb68ffd63d352df0392dca6e95ef67a66c679Dan StozaTEST_F(BufferQueueTest, CanAttachWhileDisallowingAllocation) {
7925ecfb68ffd63d352df0392dca6e95ef67a66c679Dan Stoza    createBufferQueue();
7935ecfb68ffd63d352df0392dca6e95ef67a66c679Dan Stoza    sp<DummyConsumer> dc(new DummyConsumer);
7945ecfb68ffd63d352df0392dca6e95ef67a66c679Dan Stoza    ASSERT_EQ(OK, mConsumer->consumerConnect(dc, true));
7955ecfb68ffd63d352df0392dca6e95ef67a66c679Dan Stoza    IGraphicBufferProducer::QueueBufferOutput output;
7965ecfb68ffd63d352df0392dca6e95ef67a66c679Dan Stoza    ASSERT_EQ(OK, mProducer->connect(new DummyProducerListener,
7975ecfb68ffd63d352df0392dca6e95ef67a66c679Dan Stoza            NATIVE_WINDOW_API_CPU, true, &output));
7985ecfb68ffd63d352df0392dca6e95ef67a66c679Dan Stoza
7995ecfb68ffd63d352df0392dca6e95ef67a66c679Dan Stoza    int slot = BufferQueue::INVALID_BUFFER_SLOT;
8005ecfb68ffd63d352df0392dca6e95ef67a66c679Dan Stoza    sp<Fence> sourceFence;
8015ecfb68ffd63d352df0392dca6e95ef67a66c679Dan Stoza    ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
8027c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson            mProducer->dequeueBuffer(&slot, &sourceFence, 0, 0, 0, 0, nullptr));
8035ecfb68ffd63d352df0392dca6e95ef67a66c679Dan Stoza    sp<GraphicBuffer> buffer;
8045ecfb68ffd63d352df0392dca6e95ef67a66c679Dan Stoza    ASSERT_EQ(OK, mProducer->requestBuffer(slot, &buffer));
8055ecfb68ffd63d352df0392dca6e95ef67a66c679Dan Stoza    ASSERT_EQ(OK, mProducer->detachBuffer(slot));
8065ecfb68ffd63d352df0392dca6e95ef67a66c679Dan Stoza
8075ecfb68ffd63d352df0392dca6e95ef67a66c679Dan Stoza    ASSERT_EQ(OK, mProducer->allowAllocation(false));
8085ecfb68ffd63d352df0392dca6e95ef67a66c679Dan Stoza
8095ecfb68ffd63d352df0392dca6e95ef67a66c679Dan Stoza    slot = BufferQueue::INVALID_BUFFER_SLOT;
8105ecfb68ffd63d352df0392dca6e95ef67a66c679Dan Stoza    ASSERT_EQ(OK, mProducer->attachBuffer(&slot, buffer));
8115ecfb68ffd63d352df0392dca6e95ef67a66c679Dan Stoza}
8125ecfb68ffd63d352df0392dca6e95ef67a66c679Dan Stoza
81350101d02a8eae555887282a5f761fdec57bdaf30Dan StozaTEST_F(BufferQueueTest, CanRetrieveLastQueuedBuffer) {
81450101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    createBufferQueue();
81550101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    sp<DummyConsumer> dc(new DummyConsumer);
81650101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    ASSERT_EQ(OK, mConsumer->consumerConnect(dc, false));
81750101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    IGraphicBufferProducer::QueueBufferOutput output;
81850101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    ASSERT_EQ(OK, mProducer->connect(new DummyProducerListener,
81950101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza            NATIVE_WINDOW_API_CPU, false, &output));
82050101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza
82150101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    // Dequeue and queue the first buffer, storing the handle
82250101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    int slot = BufferQueue::INVALID_BUFFER_SLOT;
82350101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    sp<Fence> fence;
82450101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
8257c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson            mProducer->dequeueBuffer(&slot, &fence, 0, 0, 0, 0, nullptr));
82650101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    sp<GraphicBuffer> firstBuffer;
82750101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    ASSERT_EQ(OK, mProducer->requestBuffer(slot, &firstBuffer));
82850101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza
82950101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    IGraphicBufferProducer::QueueBufferInput input(0ull, true,
83050101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza        HAL_DATASPACE_UNKNOWN, Rect::INVALID_RECT,
83150101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza        NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, Fence::NO_FENCE);
83250101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    ASSERT_EQ(OK, mProducer->queueBuffer(slot, input, &output));
83350101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza
83450101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    // Dequeue a second buffer
83550101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    slot = BufferQueue::INVALID_BUFFER_SLOT;
83650101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
8377c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson            mProducer->dequeueBuffer(&slot, &fence, 0, 0, 0, 0, nullptr));
83850101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    sp<GraphicBuffer> secondBuffer;
83950101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    ASSERT_EQ(OK, mProducer->requestBuffer(slot, &secondBuffer));
84050101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza
84150101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    // Ensure it's a new buffer
84250101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    ASSERT_NE(firstBuffer->getNativeBuffer()->handle,
84350101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza            secondBuffer->getNativeBuffer()->handle);
84450101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza
84550101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    // Queue the second buffer
84650101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    ASSERT_EQ(OK, mProducer->queueBuffer(slot, input, &output));
84750101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza
84850101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    // Acquire and release both buffers
84950101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    for (size_t i = 0; i < 2; ++i) {
85050101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza        BufferItem item;
85150101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza        ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, 0));
85250101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza        ASSERT_EQ(OK, mConsumer->releaseBuffer(item.mSlot, item.mFrameNumber,
85350101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza                    EGL_NO_DISPLAY, EGL_NO_SYNC_KHR, Fence::NO_FENCE));
85450101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    }
85550101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza
85650101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    // Make sure we got the second buffer back
85750101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    sp<GraphicBuffer> returnedBuffer;
85850101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    sp<Fence> returnedFence;
8591a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck    float transform[16];
86050101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    ASSERT_EQ(OK,
8611a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck            mProducer->getLastQueuedBuffer(&returnedBuffer, &returnedFence,
8621a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck            transform));
86350101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    ASSERT_EQ(secondBuffer->getNativeBuffer()->handle,
86450101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza            returnedBuffer->getNativeBuffer()->handle);
86550101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza}
86650101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza
867e77c7669bee30b7c0099172cf0c38cef92412040Dan StozaTEST_F(BufferQueueTest, TestOccupancyHistory) {
868e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    createBufferQueue();
869e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    sp<DummyConsumer> dc(new DummyConsumer);
870e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    ASSERT_EQ(OK, mConsumer->consumerConnect(dc, false));
871e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    IGraphicBufferProducer::QueueBufferOutput output;
872e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    ASSERT_EQ(OK, mProducer->connect(new DummyProducerListener,
873e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza            NATIVE_WINDOW_API_CPU, false, &output));
874e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza
875e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    int slot = BufferQueue::INVALID_BUFFER_SLOT;
876e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    sp<Fence> fence = Fence::NO_FENCE;
877e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    sp<GraphicBuffer> buffer = nullptr;
878e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    IGraphicBufferProducer::QueueBufferInput input(0ull, true,
879e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza        HAL_DATASPACE_UNKNOWN, Rect::INVALID_RECT,
880e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza        NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, Fence::NO_FENCE);
881e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    BufferItem item{};
882e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza
883e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    // Preallocate, dequeue, request, and cancel 3 buffers so we don't get
884e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    // BUFFER_NEEDS_REALLOCATION below
885e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    int slots[3] = {};
886e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    mProducer->setMaxDequeuedBufferCount(3);
887e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    for (size_t i = 0; i < 3; ++i) {
888e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza        status_t result = mProducer->dequeueBuffer(&slots[i], &fence,
8897c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson                0, 0, 0, 0, nullptr);
890e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza        ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION, result);
891e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza        ASSERT_EQ(OK, mProducer->requestBuffer(slots[i], &buffer));
892e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    }
893e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    for (size_t i = 0; i < 3; ++i) {
894e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza        ASSERT_EQ(OK, mProducer->cancelBuffer(slots[i], Fence::NO_FENCE));
895e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    }
896e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza
897e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    // Create 3 segments
898e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza
899e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    // The first segment is a two-buffer segment, so we only put one buffer into
900e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    // the queue at a time
901e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    for (size_t i = 0; i < 5; ++i) {
9027c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson        ASSERT_EQ(OK, mProducer->dequeueBuffer(
9037c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson                &slot, &fence, 0, 0, 0, 0, nullptr));
904e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza        ASSERT_EQ(OK, mProducer->queueBuffer(slot, input, &output));
905e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza        ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, 0));
906e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza        ASSERT_EQ(OK, mConsumer->releaseBuffer(item.mSlot, item.mFrameNumber,
907e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza                EGL_NO_DISPLAY, EGL_NO_SYNC_KHR, Fence::NO_FENCE));
908e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza        std::this_thread::sleep_for(16ms);
909e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    }
910e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza
911e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    // Sleep between segments
912e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    std::this_thread::sleep_for(500ms);
913e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza
914e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    // The second segment is a double-buffer segment. It starts the same as the
915e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    // two-buffer segment, but then at the end, we put two buffers in the queue
916e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    // at the same time before draining it.
917e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    for (size_t i = 0; i < 5; ++i) {
9187c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson        ASSERT_EQ(OK, mProducer->dequeueBuffer(
9197c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson                &slot, &fence, 0, 0, 0, 0, nullptr));
920e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza        ASSERT_EQ(OK, mProducer->queueBuffer(slot, input, &output));
921e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza        ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, 0));
922e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza        ASSERT_EQ(OK, mConsumer->releaseBuffer(item.mSlot, item.mFrameNumber,
923e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza                EGL_NO_DISPLAY, EGL_NO_SYNC_KHR, Fence::NO_FENCE));
924e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza        std::this_thread::sleep_for(16ms);
925e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    }
9267c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson    ASSERT_EQ(OK, mProducer->dequeueBuffer(&slot, &fence, 0, 0, 0, 0, nullptr));
927e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    ASSERT_EQ(OK, mProducer->queueBuffer(slot, input, &output));
9287c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson    ASSERT_EQ(OK, mProducer->dequeueBuffer(&slot, &fence, 0, 0, 0, 0, nullptr));
929e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    ASSERT_EQ(OK, mProducer->queueBuffer(slot, input, &output));
930e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, 0));
931e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    ASSERT_EQ(OK, mConsumer->releaseBuffer(item.mSlot, item.mFrameNumber,
932e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza            EGL_NO_DISPLAY, EGL_NO_SYNC_KHR, Fence::NO_FENCE));
933e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    std::this_thread::sleep_for(16ms);
934e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, 0));
935e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    ASSERT_EQ(OK, mConsumer->releaseBuffer(item.mSlot, item.mFrameNumber,
936e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza            EGL_NO_DISPLAY, EGL_NO_SYNC_KHR, Fence::NO_FENCE));
937e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza
938e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    // Sleep between segments
939e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    std::this_thread::sleep_for(500ms);
940e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza
941e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    // The third segment is a triple-buffer segment, so the queue is switching
942e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    // between one buffer and two buffers deep.
9437c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson    ASSERT_EQ(OK, mProducer->dequeueBuffer(&slot, &fence, 0, 0, 0, 0, nullptr));
944e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    ASSERT_EQ(OK, mProducer->queueBuffer(slot, input, &output));
945e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    for (size_t i = 0; i < 5; ++i) {
9467c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson        ASSERT_EQ(OK, mProducer->dequeueBuffer(
9477c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson                &slot, &fence, 0, 0, 0, 0, nullptr));
948e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza        ASSERT_EQ(OK, mProducer->queueBuffer(slot, input, &output));
949e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza        ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, 0));
950e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza        ASSERT_EQ(OK, mConsumer->releaseBuffer(item.mSlot, item.mFrameNumber,
951e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza                    EGL_NO_DISPLAY, EGL_NO_SYNC_KHR, Fence::NO_FENCE));
952e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza        std::this_thread::sleep_for(16ms);
953e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    }
954e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, 0));
955e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    ASSERT_EQ(OK, mConsumer->releaseBuffer(item.mSlot, item.mFrameNumber,
956e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza            EGL_NO_DISPLAY, EGL_NO_SYNC_KHR, Fence::NO_FENCE));
957e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza
958e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    // Now we read the segments
959e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    std::vector<OccupancyTracker::Segment> history;
960e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    ASSERT_EQ(OK, mConsumer->getOccupancyHistory(false, &history));
961e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza
962e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    // Since we didn't force a flush, we should only get the first two segments
963e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    // (since the third segment hasn't been closed out by the appearance of a
964e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    // new segment yet)
965e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    ASSERT_EQ(2u, history.size());
966e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza
967e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    // The first segment (which will be history[1], since the newest segment
968e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    // should be at the front of the vector) should be a two-buffer segment,
969e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    // which implies that the occupancy average should be between 0 and 1, and
970e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    // usedThirdBuffer should be false
971e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    const auto& firstSegment = history[1];
972e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    ASSERT_EQ(5u, firstSegment.numFrames);
973e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    ASSERT_LT(0, firstSegment.occupancyAverage);
974e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    ASSERT_GT(1, firstSegment.occupancyAverage);
975e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    ASSERT_EQ(false, firstSegment.usedThirdBuffer);
976e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza
977e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    // The second segment should be a double-buffered segment, which implies that
978e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    // the occupancy average should be between 0 and 1, but usedThirdBuffer
979e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    // should be true
980e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    const auto& secondSegment = history[0];
981e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    ASSERT_EQ(7u, secondSegment.numFrames);
982e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    ASSERT_LT(0, secondSegment.occupancyAverage);
983e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    ASSERT_GT(1, secondSegment.occupancyAverage);
984e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    ASSERT_EQ(true, secondSegment.usedThirdBuffer);
985e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza
986e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    // If we read the segments again without flushing, we shouldn't get any new
987e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    // segments
988e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    ASSERT_EQ(OK, mConsumer->getOccupancyHistory(false, &history));
989e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    ASSERT_EQ(0u, history.size());
990e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza
991e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    // Read the segments again, this time forcing a flush so we get the third
992e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    // segment
993e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    ASSERT_EQ(OK, mConsumer->getOccupancyHistory(true, &history));
994e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    ASSERT_EQ(1u, history.size());
995e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza
996e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    // This segment should be a triple-buffered segment, which implies that the
997e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    // occupancy average should be between 1 and 2, and usedThirdBuffer should
998e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    // be true
999e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    const auto& thirdSegment = history[0];
1000e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    ASSERT_EQ(6u, thirdSegment.numFrames);
1001e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    ASSERT_LT(1, thirdSegment.occupancyAverage);
1002e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    ASSERT_GT(2, thirdSegment.occupancyAverage);
1003e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza    ASSERT_EQ(true, thirdSegment.usedThirdBuffer);
1004e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza}
1005e77c7669bee30b7c0099172cf0c38cef92412040Dan Stoza
1006bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville TalvalaTEST_F(BufferQueueTest, TestDiscardFreeBuffers) {
1007bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala    createBufferQueue();
1008bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala    sp<DummyConsumer> dc(new DummyConsumer);
1009bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala    ASSERT_EQ(OK, mConsumer->consumerConnect(dc, false));
1010bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala    IGraphicBufferProducer::QueueBufferOutput output;
1011bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala    ASSERT_EQ(OK, mProducer->connect(new DummyProducerListener,
1012bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala            NATIVE_WINDOW_API_CPU, false, &output));
1013bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala
1014bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala    int slot = BufferQueue::INVALID_BUFFER_SLOT;
1015bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala    sp<Fence> fence = Fence::NO_FENCE;
1016bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala    sp<GraphicBuffer> buffer = nullptr;
1017bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala    IGraphicBufferProducer::QueueBufferInput input(0ull, true,
1018bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala        HAL_DATASPACE_UNKNOWN, Rect::INVALID_RECT,
1019bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala        NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, Fence::NO_FENCE);
1020bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala    BufferItem item{};
1021bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala
1022bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala    // Preallocate, dequeue, request, and cancel 4 buffers so we don't get
1023bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala    // BUFFER_NEEDS_REALLOCATION below
1024bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala    int slots[4] = {};
1025bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala    mProducer->setMaxDequeuedBufferCount(4);
1026bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala    for (size_t i = 0; i < 4; ++i) {
1027bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala        status_t result = mProducer->dequeueBuffer(&slots[i], &fence,
10287c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson                0, 0, 0, 0, nullptr);
1029bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala        ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION, result);
1030bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala        ASSERT_EQ(OK, mProducer->requestBuffer(slots[i], &buffer));
1031bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala    }
1032bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala    for (size_t i = 0; i < 4; ++i) {
1033bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala        ASSERT_EQ(OK, mProducer->cancelBuffer(slots[i], Fence::NO_FENCE));
1034bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala    }
1035bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala
1036bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala    // Get buffers in all states: dequeued, filled, acquired, free
1037bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala
1038bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala    // Fill 3 buffers
10397c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson    ASSERT_EQ(OK, mProducer->dequeueBuffer(&slot, &fence, 0, 0, 0, 0, nullptr));
1040bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala    ASSERT_EQ(OK, mProducer->queueBuffer(slot, input, &output));
10417c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson    ASSERT_EQ(OK, mProducer->dequeueBuffer(&slot, &fence, 0, 0, 0, 0, nullptr));
1042bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala    ASSERT_EQ(OK, mProducer->queueBuffer(slot, input, &output));
10437c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson    ASSERT_EQ(OK, mProducer->dequeueBuffer(&slot, &fence, 0, 0, 0, 0, nullptr));
1044bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala    ASSERT_EQ(OK, mProducer->queueBuffer(slot, input, &output));
1045bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala    // Dequeue 1 buffer
10467c3ba8aa288755fad78ddbabcee0ad5a0610ac1cBrian Anderson    ASSERT_EQ(OK, mProducer->dequeueBuffer(&slot, &fence, 0, 0, 0, 0, nullptr));
1047bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala
1048bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala    // Acquire and free 1 buffer
1049bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala    ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, 0));
1050bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala    ASSERT_EQ(OK, mConsumer->releaseBuffer(item.mSlot, item.mFrameNumber,
1051bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala                    EGL_NO_DISPLAY, EGL_NO_SYNC_KHR, Fence::NO_FENCE));
1052bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala    // Acquire 1 buffer, leaving 1 filled buffer in queue
1053bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala    ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, 0));
1054bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala
1055bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala    // Now discard the free buffers
1056bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala    ASSERT_EQ(OK, mConsumer->discardFreeBuffers());
1057bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala
1058bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala    // Check no free buffers in dump
1059bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala    String8 dumpString;
10600c9a1ed91f8e19887ac43eff5af16e59878c8226Dan Stoza    mConsumer->dumpState(String8{}, &dumpString);
1061bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala
1062bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala    // Parse the dump to ensure that all buffer slots that are FREE also
1063bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala    // have a null GraphicBuffer
1064bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala    // Fragile - assumes the following format for the dump for a buffer entry:
1065bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala    // ":%p\][^:]*state=FREE" where %p is the buffer pointer in hex.
1066bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala    ssize_t idx = dumpString.find("state=FREE");
1067bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala    while (idx != -1) {
1068bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala        ssize_t bufferPtrIdx = idx - 1;
1069bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala        while (bufferPtrIdx > 0) {
1070bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala            if (dumpString[bufferPtrIdx] == ':') {
1071bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala                bufferPtrIdx++;
1072bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala                break;
1073bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala            }
1074bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala            bufferPtrIdx--;
1075bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala        }
1076bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala        ASSERT_GT(bufferPtrIdx, 0) << "Can't parse queue dump to validate";
1077bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala        ssize_t nullPtrIdx = dumpString.find("0x0]", bufferPtrIdx);
1078bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala        ASSERT_EQ(bufferPtrIdx, nullPtrIdx) << "Free buffer not discarded";
1079bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala        idx = dumpString.find("FREE", idx + 1);
1080bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala    }
1081bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala}
1082bc2df65a3f3f4b8abaaaa2a4e576a3a42c2d30f3Eino-Ville Talvala
108322f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen WangTEST_F(BufferQueueTest, TestBufferReplacedInQueueBuffer) {
108422f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang    createBufferQueue();
108522f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang    sp<DummyConsumer> dc(new DummyConsumer);
108622f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang    ASSERT_EQ(OK, mConsumer->consumerConnect(dc, true));
108722f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang    IGraphicBufferProducer::QueueBufferOutput output;
108822f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang    ASSERT_EQ(OK, mProducer->connect(new DummyProducerListener,
108922f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang            NATIVE_WINDOW_API_CPU, true, &output));
109022f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang    ASSERT_EQ(OK, mConsumer->setMaxAcquiredBufferCount(1));
109122f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang
109222f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang    int slot = BufferQueue::INVALID_BUFFER_SLOT;
109322f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang    sp<Fence> fence = Fence::NO_FENCE;
109422f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang    sp<GraphicBuffer> buffer = nullptr;
109522f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang    IGraphicBufferProducer::QueueBufferInput input(0ull, true,
109622f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang        HAL_DATASPACE_UNKNOWN, Rect::INVALID_RECT,
109722f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang        NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, Fence::NO_FENCE);
109822f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang    BufferItem item{};
109922f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang
110022f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang    // Preallocate, dequeue, request, and cancel 2 buffers so we don't get
110122f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang    // BUFFER_NEEDS_REALLOCATION below
110222f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang    int slots[2] = {};
110322f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang    ASSERT_EQ(OK, mProducer->setMaxDequeuedBufferCount(2));
110422f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang    for (size_t i = 0; i < 2; ++i) {
110522f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang        status_t result = mProducer->dequeueBuffer(&slots[i], &fence,
110622f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang                0, 0, 0, 0, nullptr);
110722f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang        ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION, result);
110822f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang        ASSERT_EQ(OK, mProducer->requestBuffer(slots[i], &buffer));
110922f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang    }
111022f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang    for (size_t i = 0; i < 2; ++i) {
111122f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang        ASSERT_EQ(OK, mProducer->cancelBuffer(slots[i], Fence::NO_FENCE));
111222f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang    }
111322f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang
111422f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang    // Fill 2 buffers without consumer consuming them. Verify that all
111522f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang    // queued buffer returns proper bufferReplaced flag
111622f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang    ASSERT_EQ(OK, mProducer->dequeueBuffer(&slot, &fence, 0, 0, 0, 0, nullptr));
111722f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang    ASSERT_EQ(OK, mProducer->queueBuffer(slot, input, &output));
111822f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang    ASSERT_EQ(false, output.bufferReplaced);
111922f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang    ASSERT_EQ(OK, mProducer->dequeueBuffer(&slot, &fence, 0, 0, 0, 0, nullptr));
112022f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang    ASSERT_EQ(OK, mProducer->queueBuffer(slot, input, &output));
112122f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang    ASSERT_EQ(true, output.bufferReplaced);
112222f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang}
112322f842ba04c32cef2faf855dc304eb0ab131b9ecShuzhen Wang
1124d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan StozaTEST_F(BufferQueueTest, TestStaleBufferHandleSentAfterDisconnect) {
1125d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza    createBufferQueue();
1126d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza    sp<DummyConsumer> dc(new DummyConsumer);
1127d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza    ASSERT_EQ(OK, mConsumer->consumerConnect(dc, true));
1128d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza    IGraphicBufferProducer::QueueBufferOutput output;
1129d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza    sp<IProducerListener> dummyListener(new DummyProducerListener);
1130d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza    ASSERT_EQ(OK, mProducer->connect(dummyListener, NATIVE_WINDOW_API_CPU,
1131d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza            true, &output));
1132d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza
1133d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza    int slot = BufferQueue::INVALID_BUFFER_SLOT;
1134d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza    sp<Fence> fence = Fence::NO_FENCE;
1135d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza    sp<GraphicBuffer> buffer = nullptr;
1136d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza    IGraphicBufferProducer::QueueBufferInput input(0ull, true,
1137d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza            HAL_DATASPACE_UNKNOWN, Rect::INVALID_RECT,
1138d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza            NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, Fence::NO_FENCE);
1139d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza
1140d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza    // Dequeue, request, and queue one buffer
1141d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza    status_t result = mProducer->dequeueBuffer(&slot, &fence, 0, 0, 0, 0,
1142d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza            nullptr);
1143d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza    ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION, result);
1144d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza    ASSERT_EQ(OK, mProducer->requestBuffer(slot, &buffer));
1145d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza    ASSERT_EQ(OK, mProducer->queueBuffer(slot, input, &output));
1146d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza
1147d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza    // Acquire and release the buffer. Upon acquiring, the buffer handle should
1148d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza    // be non-null since this is the first time we've acquired this slot.
1149d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza    BufferItem item;
1150d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza    ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, 0));
1151d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza    ASSERT_EQ(slot, item.mSlot);
1152d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza    ASSERT_NE(nullptr, item.mGraphicBuffer.get());
1153d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza    ASSERT_EQ(OK, mConsumer->releaseBuffer(item.mSlot, item.mFrameNumber,
1154d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza            EGL_NO_DISPLAY, EGL_NO_SYNC_KHR, Fence::NO_FENCE));
1155d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza
1156d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza    // Dequeue and queue the buffer again
1157d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza    ASSERT_EQ(OK, mProducer->dequeueBuffer(&slot, &fence, 0, 0, 0, 0, nullptr));
1158d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza    ASSERT_EQ(OK, mProducer->queueBuffer(slot, input, &output));
1159d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza
1160d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza    // Acquire and release the buffer again. Upon acquiring, the buffer handle
1161d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza    // should be null since this is not the first time we've acquired this slot.
1162d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza    ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, 0));
1163d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza    ASSERT_EQ(slot, item.mSlot);
1164d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza    ASSERT_EQ(nullptr, item.mGraphicBuffer.get());
1165d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza    ASSERT_EQ(OK, mConsumer->releaseBuffer(item.mSlot, item.mFrameNumber,
1166d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza            EGL_NO_DISPLAY, EGL_NO_SYNC_KHR, Fence::NO_FENCE));
1167d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza
1168d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza    // Dequeue and queue the buffer again
1169d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza    ASSERT_EQ(OK, mProducer->dequeueBuffer(&slot, &fence, 0, 0, 0, 0, nullptr));
1170d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza    ASSERT_EQ(OK, mProducer->queueBuffer(slot, input, &output));
1171d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza
1172d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza    // Disconnect the producer end. This should clear all of the slots and mark
1173d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza    // the buffer in the queue as stale.
1174d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza    ASSERT_EQ(OK, mProducer->disconnect(NATIVE_WINDOW_API_CPU));
1175d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza
1176d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza    // Acquire the buffer again. Upon acquiring, the buffer handle should not be
1177d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza    // null since the queued buffer should have been marked as stale, which
1178d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza    // should trigger the BufferQueue to resend the buffer handle.
1179d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza    ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, 0));
1180d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza    ASSERT_EQ(slot, item.mSlot);
1181d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza    ASSERT_NE(nullptr, item.mGraphicBuffer.get());
1182d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza}
1183d4c6f9912fa4f9d6a5a2e51672adf27c7a1c8624Dan Stoza
11843e198b2b331c09e8d078b5cd4cb770bcf049c0d1Wonsik KimTEST_F(BufferQueueTest, TestProducerConnectDisconnect) {
11853e198b2b331c09e8d078b5cd4cb770bcf049c0d1Wonsik Kim    createBufferQueue();
11863e198b2b331c09e8d078b5cd4cb770bcf049c0d1Wonsik Kim    sp<DummyConsumer> dc(new DummyConsumer);
11873e198b2b331c09e8d078b5cd4cb770bcf049c0d1Wonsik Kim    ASSERT_EQ(OK, mConsumer->consumerConnect(dc, true));
11883e198b2b331c09e8d078b5cd4cb770bcf049c0d1Wonsik Kim    IGraphicBufferProducer::QueueBufferOutput output;
11893e198b2b331c09e8d078b5cd4cb770bcf049c0d1Wonsik Kim    sp<IProducerListener> dummyListener(new DummyProducerListener);
11903e198b2b331c09e8d078b5cd4cb770bcf049c0d1Wonsik Kim    ASSERT_EQ(NO_INIT, mProducer->disconnect(NATIVE_WINDOW_API_CPU));
11913e198b2b331c09e8d078b5cd4cb770bcf049c0d1Wonsik Kim    ASSERT_EQ(OK, mProducer->connect(
11923e198b2b331c09e8d078b5cd4cb770bcf049c0d1Wonsik Kim            dummyListener, NATIVE_WINDOW_API_CPU, true, &output));
11933e198b2b331c09e8d078b5cd4cb770bcf049c0d1Wonsik Kim    ASSERT_EQ(BAD_VALUE, mProducer->connect(
11943e198b2b331c09e8d078b5cd4cb770bcf049c0d1Wonsik Kim            dummyListener, NATIVE_WINDOW_API_MEDIA, true, &output));
11953e198b2b331c09e8d078b5cd4cb770bcf049c0d1Wonsik Kim
11963e198b2b331c09e8d078b5cd4cb770bcf049c0d1Wonsik Kim    ASSERT_EQ(BAD_VALUE, mProducer->disconnect(NATIVE_WINDOW_API_MEDIA));
11973e198b2b331c09e8d078b5cd4cb770bcf049c0d1Wonsik Kim    ASSERT_EQ(OK, mProducer->disconnect(NATIVE_WINDOW_API_CPU));
11983e198b2b331c09e8d078b5cd4cb770bcf049c0d1Wonsik Kim    ASSERT_EQ(NO_INIT, mProducer->disconnect(NATIVE_WINDOW_API_CPU));
11993e198b2b331c09e8d078b5cd4cb770bcf049c0d1Wonsik Kim}
12003e198b2b331c09e8d078b5cd4cb770bcf049c0d1Wonsik Kim
12019e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis} // namespace android
1202