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
379e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennisnamespace android {
389e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis
399e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennisclass BufferQueueTest : public ::testing::Test {
409e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis
419f3053de78630815d60cf48a2cf2348cc5867c45Dan Stozapublic:
429f3053de78630815d60cf48a2cf2348cc5867c45Dan Stozaprotected:
439f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    BufferQueueTest() {
449e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis        const ::testing::TestInfo* const testInfo =
459e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis            ::testing::UnitTest::GetInstance()->current_test_info();
469e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis        ALOGV("Begin test: %s.%s", testInfo->test_case_name(),
479e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis                testInfo->name());
489e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis    }
499e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis
509f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ~BufferQueueTest() {
519e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis        const ::testing::TestInfo* const testInfo =
529e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis            ::testing::UnitTest::GetInstance()->current_test_info();
539e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis        ALOGV("End test:   %s.%s", testInfo->test_case_name(),
549e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis                testInfo->name());
559e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis    }
569e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis
577ea777f097784492f880623067becac1b276f884Igor Murashkin    void GetMinUndequeuedBufferCount(int* bufferCount) {
589f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza        ASSERT_TRUE(bufferCount != NULL);
599f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza        ASSERT_EQ(OK, mProducer->query(NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS,
609f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza                    bufferCount));
619f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza        ASSERT_GE(*bufferCount, 0);
627ea777f097784492f880623067becac1b276f884Igor Murashkin    }
637ea777f097784492f880623067becac1b276f884Igor Murashkin
641a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    void createBufferQueue() {
651a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza        BufferQueue::createBufferQueue(&mProducer, &mConsumer);
661a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    }
679e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis
68ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    void testBufferItem(const IGraphicBufferProducer::QueueBufferInput& input,
69ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos            const BufferItem& item) {
70ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos        int64_t timestamp;
71ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos        bool isAutoTimestamp;
72ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos        android_dataspace dataSpace;
73ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos        Rect crop;
74ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos        int scalingMode;
75ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos        uint32_t transform;
76ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos        sp<Fence> fence;
77ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos
78ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos        input.deflate(&timestamp, &isAutoTimestamp, &dataSpace, &crop,
79ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos                &scalingMode, &transform, &fence, NULL);
80ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos        ASSERT_EQ(timestamp, item.mTimestamp);
81ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos        ASSERT_EQ(isAutoTimestamp, item.mIsAutoTimestamp);
82ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos        ASSERT_EQ(dataSpace, item.mDataSpace);
83ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos        ASSERT_EQ(crop, item.mCrop);
84ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos        ASSERT_EQ(static_cast<uint32_t>(scalingMode), item.mScalingMode);
85ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos        ASSERT_EQ(transform, item.mTransform);
86ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos        ASSERT_EQ(fence, item.mFence);
87ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    }
88ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos
891a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    sp<IGraphicBufferProducer> mProducer;
901a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    sp<IGraphicBufferConsumer> mConsumer;
911a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza};
929f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
93f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stozastatic const uint32_t TEST_DATA = 0x12345678u;
94f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza
951a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza// XXX: Tests that fork a process to hold the BufferQueue must run before tests
961a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza// that use a local BufferQueue, or else Binder will get unhappy
971a0b8617909c94f6c7301b651cb7b07463529c8cDan StozaTEST_F(BufferQueueTest, BufferQueueInAnotherProcess) {
981a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    const String16 PRODUCER_NAME = String16("BQTestProducer");
991a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    const String16 CONSUMER_NAME = String16("BQTestConsumer");
1001a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza
1011a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    pid_t forkPid = fork();
1021a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    ASSERT_NE(forkPid, -1);
1031a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza
1041a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    if (forkPid == 0) {
1051a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza        // Child process
106b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza        sp<IGraphicBufferProducer> producer;
107b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza        sp<IGraphicBufferConsumer> consumer;
1081a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza        BufferQueue::createBufferQueue(&producer, &consumer);
1091a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza        sp<IServiceManager> serviceManager = defaultServiceManager();
110097ca275f4717a2c47a5d49f302ed2b72c8a1370Marco Nelissen        serviceManager->addService(PRODUCER_NAME, IInterface::asBinder(producer));
111097ca275f4717a2c47a5d49f302ed2b72c8a1370Marco Nelissen        serviceManager->addService(CONSUMER_NAME, IInterface::asBinder(consumer));
1121a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza        ProcessState::self()->startThreadPool();
1131a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza        IPCThreadState::self()->joinThreadPool();
1141a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza        LOG_ALWAYS_FATAL("Shouldn't be here");
1151a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    }
1161a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza
1171a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    sp<IServiceManager> serviceManager = defaultServiceManager();
1181a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    sp<IBinder> binderProducer =
1191a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza        serviceManager->getService(PRODUCER_NAME);
1201a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    mProducer = interface_cast<IGraphicBufferProducer>(binderProducer);
1211a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    EXPECT_TRUE(mProducer != NULL);
1221a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    sp<IBinder> binderConsumer =
1231a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza        serviceManager->getService(CONSUMER_NAME);
1241a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    mConsumer = interface_cast<IGraphicBufferConsumer>(binderConsumer);
1251a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    EXPECT_TRUE(mConsumer != NULL);
1261a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza
1271a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    sp<DummyConsumer> dc(new DummyConsumer);
1281a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    ASSERT_EQ(OK, mConsumer->consumerConnect(dc, false));
1291a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    IGraphicBufferProducer::QueueBufferOutput output;
1301a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    ASSERT_EQ(OK,
1311a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza            mProducer->connect(NULL, NATIVE_WINDOW_API_CPU, false, &output));
1321a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza
1331a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    int slot;
1341a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    sp<Fence> fence;
1351a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    sp<GraphicBuffer> buffer;
1361a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
137567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos            mProducer->dequeueBuffer(&slot, &fence, 0, 0, 0,
1381a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza                    GRALLOC_USAGE_SW_WRITE_OFTEN));
1391a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    ASSERT_EQ(OK, mProducer->requestBuffer(slot, &buffer));
1401a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza
1411a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    uint32_t* dataIn;
1421a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    ASSERT_EQ(OK, buffer->lock(GraphicBuffer::USAGE_SW_WRITE_OFTEN,
1431a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza            reinterpret_cast<void**>(&dataIn)));
144f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza    *dataIn = TEST_DATA;
1451a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    ASSERT_EQ(OK, buffer->unlock());
1461a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza
14782c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala    IGraphicBufferProducer::QueueBufferInput input(0, false,
14882c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala            HAL_DATASPACE_UNKNOWN, Rect(0, 0, 1, 1),
149567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos            NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, Fence::NO_FENCE);
1501a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    ASSERT_EQ(OK, mProducer->queueBuffer(slot, input, &output));
1511a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza
152cf3834db104e0b052056e3a06d46e3f222f0d372Dan Stoza    BufferItem item;
1531a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, 0));
1541a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza
1551a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    uint32_t* dataOut;
1561a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    ASSERT_EQ(OK, item.mGraphicBuffer->lock(GraphicBuffer::USAGE_SW_READ_OFTEN,
1571a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza            reinterpret_cast<void**>(&dataOut)));
158f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza    ASSERT_EQ(*dataOut, TEST_DATA);
1591a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    ASSERT_EQ(OK, item.mGraphicBuffer->unlock());
1601a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza}
1611a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza
1629e75ddda93888755d0b14144b62e896cd9f78f3aJamie GennisTEST_F(BufferQueueTest, AcquireBuffer_ExceedsMaxAcquireCount_Fails) {
1631a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    createBufferQueue();
1649e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis    sp<DummyConsumer> dc(new DummyConsumer);
1659f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    mConsumer->consumerConnect(dc, false);
1662adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden    IGraphicBufferProducer::QueueBufferOutput qbo;
167f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza    mProducer->connect(new DummyProducerListener, NATIVE_WINDOW_API_CPU, false,
168f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza            &qbo);
169fa455354557f6283ff3a7d76979e52fd251c155fPablo Ceballos    mProducer->setMaxDequeuedBufferCount(3);
1709e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis
1719e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis    int slot;
1729e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis    sp<Fence> fence;
1739e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis    sp<GraphicBuffer> buf;
17482c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala    IGraphicBufferProducer::QueueBufferInput qbi(0, false,
17582c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala            HAL_DATASPACE_UNKNOWN, Rect(0, 0, 1, 1),
176567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos            NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, Fence::NO_FENCE);
177cf3834db104e0b052056e3a06d46e3f222f0d372Dan Stoza    BufferItem item;
1789e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis
1799e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis    for (int i = 0; i < 2; i++) {
1802adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden        ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
181567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos                mProducer->dequeueBuffer(&slot, &fence, 1, 1, 0,
1829e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis                    GRALLOC_USAGE_SW_READ_OFTEN));
1839f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza        ASSERT_EQ(OK, mProducer->requestBuffer(slot, &buf));
1849f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza        ASSERT_EQ(OK, mProducer->queueBuffer(slot, qbi, &qbo));
1859f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza        ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, 0));
1869e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis    }
1879e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis
1882adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden    ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
189567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos            mProducer->dequeueBuffer(&slot, &fence, 1, 1, 0,
1909e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis                GRALLOC_USAGE_SW_READ_OFTEN));
1919f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mProducer->requestBuffer(slot, &buf));
1929f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mProducer->queueBuffer(slot, qbi, &qbo));
1939e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis
1949e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis    // Acquire the third buffer, which should fail.
1959f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(INVALID_OPERATION, mConsumer->acquireBuffer(&item, 0));
1969e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis}
1979e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis
198c68f2ecfa02037144d1a3856f637a77f523cf416Jamie GennisTEST_F(BufferQueueTest, SetMaxAcquiredBufferCountWithIllegalValues_ReturnsError) {
1991a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    createBufferQueue();
200c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis    sp<DummyConsumer> dc(new DummyConsumer);
2019f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    mConsumer->consumerConnect(dc, false);
202c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis
20372daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    EXPECT_EQ(OK, mConsumer->setMaxBufferCount(10));
20472daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    EXPECT_EQ(BAD_VALUE, mConsumer->setMaxAcquiredBufferCount(10));
20572daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos
20672daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    IGraphicBufferProducer::QueueBufferOutput qbo;
20772daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    mProducer->connect(new DummyProducerListener, NATIVE_WINDOW_API_CPU, false,
20872daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos            &qbo);
20972daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    mProducer->setMaxDequeuedBufferCount(3);
21072daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos
2117ea777f097784492f880623067becac1b276f884Igor Murashkin    int minBufferCount;
2127ea777f097784492f880623067becac1b276f884Igor Murashkin    ASSERT_NO_FATAL_FAILURE(GetMinUndequeuedBufferCount(&minBufferCount));
2139f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    EXPECT_EQ(BAD_VALUE, mConsumer->setMaxAcquiredBufferCount(
2149f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza                minBufferCount - 1));
2157ea777f097784492f880623067becac1b276f884Igor Murashkin
2169f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    EXPECT_EQ(BAD_VALUE, mConsumer->setMaxAcquiredBufferCount(0));
2179f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    EXPECT_EQ(BAD_VALUE, mConsumer->setMaxAcquiredBufferCount(-3));
2189f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    EXPECT_EQ(BAD_VALUE, mConsumer->setMaxAcquiredBufferCount(
219c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis            BufferQueue::MAX_MAX_ACQUIRED_BUFFERS+1));
2209f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    EXPECT_EQ(BAD_VALUE, mConsumer->setMaxAcquiredBufferCount(100));
22119e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos
22272daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    int slot;
22372daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    sp<Fence> fence;
22472daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    sp<GraphicBuffer> buf;
22572daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    IGraphicBufferProducer::QueueBufferInput qbi(0, false,
22672daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos            HAL_DATASPACE_UNKNOWN, Rect(0, 0, 1, 1),
22772daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos            NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, Fence::NO_FENCE);
22872daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    BufferItem item;
22972daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    EXPECT_EQ(OK, mConsumer->setMaxAcquiredBufferCount(3));
23072daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    for (int i = 0; i < 3; i++) {
23172daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos        ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
23272daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos                mProducer->dequeueBuffer(&slot, &fence, 1, 1, 0,
23372daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos                    GRALLOC_USAGE_SW_READ_OFTEN));
23472daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos        ASSERT_EQ(OK, mProducer->requestBuffer(slot, &buf));
23572daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos        ASSERT_EQ(OK, mProducer->queueBuffer(slot, qbi, &qbo));
23672daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos        ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, 0));
23772daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    }
23872daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos
23972daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    EXPECT_EQ(BAD_VALUE, mConsumer->setMaxAcquiredBufferCount(2));
240c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis}
241c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis
242c68f2ecfa02037144d1a3856f637a77f523cf416Jamie GennisTEST_F(BufferQueueTest, SetMaxAcquiredBufferCountWithLegalValues_Succeeds) {
2431a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    createBufferQueue();
244c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis    sp<DummyConsumer> dc(new DummyConsumer);
2459f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    mConsumer->consumerConnect(dc, false);
246c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis
24772daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    IGraphicBufferProducer::QueueBufferOutput qbo;
24872daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    mProducer->connect(new DummyProducerListener, NATIVE_WINDOW_API_CPU, false,
24972daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos            &qbo);
25072daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    mProducer->setMaxDequeuedBufferCount(2);
25172daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos
2527ea777f097784492f880623067becac1b276f884Igor Murashkin    int minBufferCount;
2537ea777f097784492f880623067becac1b276f884Igor Murashkin    ASSERT_NO_FATAL_FAILURE(GetMinUndequeuedBufferCount(&minBufferCount));
2547ea777f097784492f880623067becac1b276f884Igor Murashkin
2559f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    EXPECT_EQ(OK, mConsumer->setMaxAcquiredBufferCount(1));
2569f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    EXPECT_EQ(OK, mConsumer->setMaxAcquiredBufferCount(2));
2579f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    EXPECT_EQ(OK, mConsumer->setMaxAcquiredBufferCount(minBufferCount));
25872daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos
25972daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    int slot;
26072daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    sp<Fence> fence;
26172daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    sp<GraphicBuffer> buf;
26272daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    IGraphicBufferProducer::QueueBufferInput qbi(0, false,
26372daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos            HAL_DATASPACE_UNKNOWN, Rect(0, 0, 1, 1),
26472daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos            NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, Fence::NO_FENCE);
26572daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    BufferItem item;
26672daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos
26772daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
26872daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos            mProducer->dequeueBuffer(&slot, &fence, 1, 1, 0,
26972daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos            GRALLOC_USAGE_SW_READ_OFTEN));
27072daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    ASSERT_EQ(OK, mProducer->requestBuffer(slot, &buf));
27172daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    ASSERT_EQ(OK, mProducer->queueBuffer(slot, qbi, &qbo));
27272daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, 0));
27372daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos
27472daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    EXPECT_EQ(OK, mConsumer->setMaxAcquiredBufferCount(3));
27572daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos
27672daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    for (int i = 0; i < 2; i++) {
27772daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos        ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
27872daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos                mProducer->dequeueBuffer(&slot, &fence, 1, 1, 0,
27972daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos                GRALLOC_USAGE_SW_READ_OFTEN));
28072daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos        ASSERT_EQ(OK, mProducer->requestBuffer(slot, &buf));
28172daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos        ASSERT_EQ(OK, mProducer->queueBuffer(slot, qbi, &qbo));
28272daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos        ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, 0));
28372daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos    }
28472daab652e3481566c01ce45c6afdb9fcec6f140Pablo Ceballos
2859f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    EXPECT_EQ(OK, mConsumer->setMaxAcquiredBufferCount(
286c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis            BufferQueue::MAX_MAX_ACQUIRED_BUFFERS));
287c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis}
288c68f2ecfa02037144d1a3856f637a77f523cf416Jamie Gennis
28919e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo CeballosTEST_F(BufferQueueTest, SetMaxBufferCountWithLegalValues_Succeeds) {
29019e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos    createBufferQueue();
29119e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos    sp<DummyConsumer> dc(new DummyConsumer);
29219e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos    mConsumer->consumerConnect(dc, false);
29319e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos
2943559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos    // Test shared buffer mode
29519e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos    EXPECT_EQ(OK, mConsumer->setMaxAcquiredBufferCount(1));
29619e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos}
29719e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos
29819e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo CeballosTEST_F(BufferQueueTest, SetMaxBufferCountWithIllegalValues_ReturnsError) {
29919e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos    createBufferQueue();
30019e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos    sp<DummyConsumer> dc(new DummyConsumer);
30119e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos    mConsumer->consumerConnect(dc, false);
30219e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos
30319e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos    EXPECT_EQ(BAD_VALUE, mConsumer->setMaxBufferCount(0));
30419e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos    EXPECT_EQ(BAD_VALUE, mConsumer->setMaxBufferCount(
30519e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos            BufferQueue::NUM_BUFFER_SLOTS + 1));
30619e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos
30719e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos    EXPECT_EQ(OK, mConsumer->setMaxAcquiredBufferCount(5));
30819e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos    EXPECT_EQ(BAD_VALUE, mConsumer->setMaxBufferCount(3));
30919e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos}
31019e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos
3119f3053de78630815d60cf48a2cf2348cc5867c45Dan StozaTEST_F(BufferQueueTest, DetachAndReattachOnProducerSide) {
3121a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    createBufferQueue();
3139f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    sp<DummyConsumer> dc(new DummyConsumer);
3149f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mConsumer->consumerConnect(dc, false));
3159f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    IGraphicBufferProducer::QueueBufferOutput output;
316f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza    ASSERT_EQ(OK, mProducer->connect(new DummyProducerListener,
317f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza            NATIVE_WINDOW_API_CPU, false, &output));
3189f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
3199f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(BAD_VALUE, mProducer->detachBuffer(-1)); // Index too low
3209f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(BAD_VALUE, mProducer->detachBuffer(
3219f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza                BufferQueueDefs::NUM_BUFFER_SLOTS)); // Index too high
3229f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(BAD_VALUE, mProducer->detachBuffer(0)); // Not dequeued
3239f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
3249f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    int slot;
3259f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    sp<Fence> fence;
3269f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    sp<GraphicBuffer> buffer;
3279f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
328567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos            mProducer->dequeueBuffer(&slot, &fence, 0, 0, 0,
3299f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza                    GRALLOC_USAGE_SW_WRITE_OFTEN));
3309f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(BAD_VALUE, mProducer->detachBuffer(slot)); // Not requested
3319f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mProducer->requestBuffer(slot, &buffer));
3329f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mProducer->detachBuffer(slot));
3339f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(BAD_VALUE, mProducer->detachBuffer(slot)); // Not dequeued
3349f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
3359f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    sp<GraphicBuffer> safeToClobberBuffer;
3369f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    // Can no longer request buffer from this slot
3379f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(BAD_VALUE, mProducer->requestBuffer(slot, &safeToClobberBuffer));
3389f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
3399f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    uint32_t* dataIn;
3409f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, buffer->lock(GraphicBuffer::USAGE_SW_WRITE_OFTEN,
3419f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza            reinterpret_cast<void**>(&dataIn)));
342f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza    *dataIn = TEST_DATA;
3439f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, buffer->unlock());
3449f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
3459f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    int newSlot;
3469f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(BAD_VALUE, mProducer->attachBuffer(NULL, safeToClobberBuffer));
3479f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(BAD_VALUE, mProducer->attachBuffer(&newSlot, NULL));
3489f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
3499f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mProducer->attachBuffer(&newSlot, buffer));
35082c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala    IGraphicBufferProducer::QueueBufferInput input(0, false,
35182c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala            HAL_DATASPACE_UNKNOWN, Rect(0, 0, 1, 1),
352567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos            NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, Fence::NO_FENCE);
3539f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mProducer->queueBuffer(newSlot, input, &output));
3549f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
355cf3834db104e0b052056e3a06d46e3f222f0d372Dan Stoza    BufferItem item;
3569f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, static_cast<nsecs_t>(0)));
3579f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
3589f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    uint32_t* dataOut;
3599f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, item.mGraphicBuffer->lock(GraphicBuffer::USAGE_SW_READ_OFTEN,
3609f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza            reinterpret_cast<void**>(&dataOut)));
361f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza    ASSERT_EQ(*dataOut, TEST_DATA);
3621a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    ASSERT_EQ(OK, item.mGraphicBuffer->unlock());
3639f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza}
3649f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
3659f3053de78630815d60cf48a2cf2348cc5867c45Dan StozaTEST_F(BufferQueueTest, DetachAndReattachOnConsumerSide) {
3661a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    createBufferQueue();
3679f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    sp<DummyConsumer> dc(new DummyConsumer);
3689f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mConsumer->consumerConnect(dc, false));
3699f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    IGraphicBufferProducer::QueueBufferOutput output;
370f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza    ASSERT_EQ(OK, mProducer->connect(new DummyProducerListener,
371f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza            NATIVE_WINDOW_API_CPU, false, &output));
3729f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
3739f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    int slot;
3749f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    sp<Fence> fence;
3759f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    sp<GraphicBuffer> buffer;
3769f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
377567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos            mProducer->dequeueBuffer(&slot, &fence, 0, 0, 0,
3789f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza                    GRALLOC_USAGE_SW_WRITE_OFTEN));
3799f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mProducer->requestBuffer(slot, &buffer));
38082c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala    IGraphicBufferProducer::QueueBufferInput input(0, false,
38182c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala            HAL_DATASPACE_UNKNOWN, Rect(0, 0, 1, 1),
382567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos            NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, Fence::NO_FENCE);
3839f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mProducer->queueBuffer(slot, input, &output));
3849f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
3859f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(BAD_VALUE, mConsumer->detachBuffer(-1)); // Index too low
3869f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(BAD_VALUE, mConsumer->detachBuffer(
3879f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza            BufferQueueDefs::NUM_BUFFER_SLOTS)); // Index too high
3889f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(BAD_VALUE, mConsumer->detachBuffer(0)); // Not acquired
3899f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
390cf3834db104e0b052056e3a06d46e3f222f0d372Dan Stoza    BufferItem item;
3919f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, static_cast<nsecs_t>(0)));
3929f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
39347650f4f66a49e1815ad08ca4fb12a661d133abcPablo Ceballos    ASSERT_EQ(OK, mConsumer->detachBuffer(item.mSlot));
39447650f4f66a49e1815ad08ca4fb12a661d133abcPablo Ceballos    ASSERT_EQ(BAD_VALUE, mConsumer->detachBuffer(item.mSlot)); // Not acquired
3959f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
3969f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    uint32_t* dataIn;
3979f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, item.mGraphicBuffer->lock(
3989f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza            GraphicBuffer::USAGE_SW_WRITE_OFTEN,
3999f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza            reinterpret_cast<void**>(&dataIn)));
400f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza    *dataIn = TEST_DATA;
4019f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, item.mGraphicBuffer->unlock());
4029f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
4039f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    int newSlot;
4049f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    sp<GraphicBuffer> safeToClobberBuffer;
4059f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(BAD_VALUE, mConsumer->attachBuffer(NULL, safeToClobberBuffer));
4069f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(BAD_VALUE, mConsumer->attachBuffer(&newSlot, NULL));
4079f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mConsumer->attachBuffer(&newSlot, item.mGraphicBuffer));
4089f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
40999b18b447dec188bcec37b415603b9dd400fc7e1Dan Stoza    ASSERT_EQ(OK, mConsumer->releaseBuffer(newSlot, 0, EGL_NO_DISPLAY,
4109f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza            EGL_NO_SYNC_KHR, Fence::NO_FENCE));
4119f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
4129f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
413567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos            mProducer->dequeueBuffer(&slot, &fence, 0, 0, 0,
4149f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza                    GRALLOC_USAGE_SW_WRITE_OFTEN));
4159f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mProducer->requestBuffer(slot, &buffer));
4169f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
4179f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    uint32_t* dataOut;
4189f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, buffer->lock(GraphicBuffer::USAGE_SW_READ_OFTEN,
4199f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza            reinterpret_cast<void**>(&dataOut)));
420f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza    ASSERT_EQ(*dataOut, TEST_DATA);
4211a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    ASSERT_EQ(OK, buffer->unlock());
4229f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza}
4239f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
4249f3053de78630815d60cf48a2cf2348cc5867c45Dan StozaTEST_F(BufferQueueTest, MoveFromConsumerToProducer) {
4251a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    createBufferQueue();
4269f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    sp<DummyConsumer> dc(new DummyConsumer);
4279f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mConsumer->consumerConnect(dc, false));
4289f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    IGraphicBufferProducer::QueueBufferOutput output;
429f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza    ASSERT_EQ(OK, mProducer->connect(new DummyProducerListener,
430f0eaf25e9247edf4d124bedaeb863f7abdf35a3eDan Stoza            NATIVE_WINDOW_API_CPU, false, &output));
4319f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
4329f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    int slot;
4339f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    sp<Fence> fence;
4349f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    sp<GraphicBuffer> buffer;
4359f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
436567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos            mProducer->dequeueBuffer(&slot, &fence, 0, 0, 0,
4379f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza                    GRALLOC_USAGE_SW_WRITE_OFTEN));
4389f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mProducer->requestBuffer(slot, &buffer));
4399f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
4409f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    uint32_t* dataIn;
4419f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, buffer->lock(GraphicBuffer::USAGE_SW_WRITE_OFTEN,
4429f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza            reinterpret_cast<void**>(&dataIn)));
443f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza    *dataIn = TEST_DATA;
4449f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, buffer->unlock());
4459f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
44682c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala    IGraphicBufferProducer::QueueBufferInput input(0, false,
44782c6bcc9705eabcaf5b9e45bc81867b0e2d61a02Eino-Ville Talvala            HAL_DATASPACE_UNKNOWN, Rect(0, 0, 1, 1),
448567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos            NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, Fence::NO_FENCE);
4499f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mProducer->queueBuffer(slot, input, &output));
4509f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
451cf3834db104e0b052056e3a06d46e3f222f0d372Dan Stoza    BufferItem item;
4529f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, static_cast<nsecs_t>(0)));
45347650f4f66a49e1815ad08ca4fb12a661d133abcPablo Ceballos    ASSERT_EQ(OK, mConsumer->detachBuffer(item.mSlot));
4549f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
4559f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    int newSlot;
4569f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mProducer->attachBuffer(&newSlot, item.mGraphicBuffer));
4579f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mProducer->queueBuffer(newSlot, input, &output));
4589f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, static_cast<nsecs_t>(0)));
4599f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
4609f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    uint32_t* dataOut;
4619f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza    ASSERT_EQ(OK, item.mGraphicBuffer->lock(GraphicBuffer::USAGE_SW_READ_OFTEN,
4629f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza            reinterpret_cast<void**>(&dataOut)));
463f8cebe54576c8100769e2515d4f67bdd013a6927Dan Stoza    ASSERT_EQ(*dataOut, TEST_DATA);
4641a0b8617909c94f6c7301b651cb7b07463529c8cDan Stoza    ASSERT_EQ(OK, item.mGraphicBuffer->unlock());
4659f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza}
4669f3053de78630815d60cf48a2cf2348cc5867c45Dan Stoza
4679de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan StozaTEST_F(BufferQueueTest, TestDisallowingAllocation) {
4689de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza    createBufferQueue();
4699de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza    sp<DummyConsumer> dc(new DummyConsumer);
4709de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza    ASSERT_EQ(OK, mConsumer->consumerConnect(dc, true));
4719de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza    IGraphicBufferProducer::QueueBufferOutput output;
4729de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza    ASSERT_EQ(OK, mProducer->connect(new DummyProducerListener,
4739de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza            NATIVE_WINDOW_API_CPU, true, &output));
4749de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza
4759de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza    static const uint32_t WIDTH = 320;
4769de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza    static const uint32_t HEIGHT = 240;
4779de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza
4789de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza    ASSERT_EQ(OK, mConsumer->setDefaultBufferSize(WIDTH, HEIGHT));
4799de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza
4809de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza    int slot;
4819de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza    sp<Fence> fence;
4829de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza    sp<GraphicBuffer> buffer;
4839de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza    // This should return an error since it would require an allocation
4849de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza    ASSERT_EQ(OK, mProducer->allowAllocation(false));
485567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos    ASSERT_EQ(WOULD_BLOCK, mProducer->dequeueBuffer(&slot, &fence, 0, 0,
4869de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza            0, GRALLOC_USAGE_SW_WRITE_OFTEN));
4879de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza
4889de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza    // This should succeed, now that we've lifted the prohibition
4899de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza    ASSERT_EQ(OK, mProducer->allowAllocation(true));
4909de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza    ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
491567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos            mProducer->dequeueBuffer(&slot, &fence, 0, 0, 0,
4929de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza            GRALLOC_USAGE_SW_WRITE_OFTEN));
4939de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza
4949de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza    // Release the previous buffer back to the BufferQueue
4959de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza    mProducer->cancelBuffer(slot, fence);
4969de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza
4979de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza    // This should fail since we're requesting a different size
4989de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza    ASSERT_EQ(OK, mProducer->allowAllocation(false));
499567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos    ASSERT_EQ(WOULD_BLOCK, mProducer->dequeueBuffer(&slot, &fence,
5009de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza            WIDTH * 2, HEIGHT * 2, 0, GRALLOC_USAGE_SW_WRITE_OFTEN));
5019de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza}
5029de7293b0a1b01ebe6fb1ab4a498f144adc8029fDan Stoza
503812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan StozaTEST_F(BufferQueueTest, TestGenerationNumbers) {
504812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    createBufferQueue();
505812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    sp<DummyConsumer> dc(new DummyConsumer);
506812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    ASSERT_EQ(OK, mConsumer->consumerConnect(dc, true));
507812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    IGraphicBufferProducer::QueueBufferOutput output;
508812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    ASSERT_EQ(OK, mProducer->connect(new DummyProducerListener,
509812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza            NATIVE_WINDOW_API_CPU, true, &output));
510812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza
511812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    ASSERT_EQ(OK, mProducer->setGenerationNumber(1));
512812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza
513812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    // Get one buffer to play with
514812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    int slot;
515812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    sp<Fence> fence;
516812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
517567dbbb6dd42be5013fcde0dadb3316d85f2fa0dPablo Ceballos            mProducer->dequeueBuffer(&slot, &fence, 0, 0, 0, 0));
518812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza
519812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    sp<GraphicBuffer> buffer;
520812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    ASSERT_EQ(OK, mProducer->requestBuffer(slot, &buffer));
521812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza
522812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    // Ensure that the generation number we set propagates to allocated buffers
523812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    ASSERT_EQ(1U, buffer->getGenerationNumber());
524812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza
525812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    ASSERT_EQ(OK, mProducer->detachBuffer(slot));
526812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza
527812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    ASSERT_EQ(OK, mProducer->setGenerationNumber(2));
528812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza
529812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    // These should fail, since we've changed the generation number on the queue
530812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    int outSlot;
531812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    ASSERT_EQ(BAD_VALUE, mProducer->attachBuffer(&outSlot, buffer));
532812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    ASSERT_EQ(BAD_VALUE, mConsumer->attachBuffer(&outSlot, buffer));
533812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza
534812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    buffer->setGenerationNumber(2);
535812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza
536812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    // This should succeed now that we've changed the buffer's generation number
537812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    ASSERT_EQ(OK, mProducer->attachBuffer(&outSlot, buffer));
538812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza
539812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    ASSERT_EQ(OK, mProducer->detachBuffer(outSlot));
540812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza
541812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    // This should also succeed with the new generation number
542812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza    ASSERT_EQ(OK, mConsumer->attachBuffer(&outSlot, buffer));
543812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza}
544812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza
5453559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo CeballosTEST_F(BufferQueueTest, TestSharedBufferModeWithoutAutoRefresh) {
546ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    createBufferQueue();
547ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    sp<DummyConsumer> dc(new DummyConsumer);
548ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    ASSERT_EQ(OK, mConsumer->consumerConnect(dc, true));
549ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    IGraphicBufferProducer::QueueBufferOutput output;
550ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    ASSERT_EQ(OK, mProducer->connect(new DummyProducerListener,
551ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos            NATIVE_WINDOW_API_CPU, true, &output));
552ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos
5533559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos    ASSERT_EQ(OK, mProducer->setSharedBufferMode(true));
554ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos
555ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    // Get a buffer
5563559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos    int sharedSlot;
557ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    sp<Fence> fence;
558ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    sp<GraphicBuffer> buffer;
559ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
5603559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos            mProducer->dequeueBuffer(&sharedSlot, &fence, 0, 0, 0, 0));
5613559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos    ASSERT_EQ(OK, mProducer->requestBuffer(sharedSlot, &buffer));
562ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos
563ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    // Queue the buffer
564ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    IGraphicBufferProducer::QueueBufferInput input(0, false,
565ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos            HAL_DATASPACE_UNKNOWN, Rect(0, 0, 1, 1),
566ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos            NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, Fence::NO_FENCE);
5673559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos    ASSERT_EQ(OK, mProducer->queueBuffer(sharedSlot, input, &output));
568ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos
569ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    // Repeatedly queue and dequeue a buffer from the producer side, it should
570ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    // always return the same one. And we won't run out of buffers because it's
571ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    // always the same one and because async mode gets enabled.
572ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    int slot;
573ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    for (int i = 0; i < 5; i++) {
574ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos        ASSERT_EQ(OK, mProducer->dequeueBuffer(&slot, &fence, 0, 0, 0, 0));
5753559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos        ASSERT_EQ(sharedSlot, slot);
5763559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos        ASSERT_EQ(OK, mProducer->queueBuffer(sharedSlot, input, &output));
577ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    }
578ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos
579ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    // acquire the buffer
580ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    BufferItem item;
581ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, 0));
5823559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos    ASSERT_EQ(sharedSlot, item.mSlot);
583ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    testBufferItem(input, item);
584ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    ASSERT_EQ(true, item.mQueuedBuffer);
585ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    ASSERT_EQ(false, item.mAutoRefresh);
586ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos
587ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    ASSERT_EQ(OK, mConsumer->releaseBuffer(item.mSlot, item.mFrameNumber,
588ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos            EGL_NO_DISPLAY, EGL_NO_SYNC_KHR, Fence::NO_FENCE));
589ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos
590ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    // attempt to acquire a second time should return no buffer available
591ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    ASSERT_EQ(IGraphicBufferConsumer::NO_BUFFER_AVAILABLE,
592ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos            mConsumer->acquireBuffer(&item, 0));
593ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos}
594ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos
5953559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo CeballosTEST_F(BufferQueueTest, TestSharedBufferModeWithAutoRefresh) {
596ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos    createBufferQueue();
597ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos    sp<DummyConsumer> dc(new DummyConsumer);
598ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos    ASSERT_EQ(OK, mConsumer->consumerConnect(dc, true));
599ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos    IGraphicBufferProducer::QueueBufferOutput output;
600ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos    ASSERT_EQ(OK, mProducer->connect(new DummyProducerListener,
601ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos            NATIVE_WINDOW_API_CPU, true, &output));
602ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos
6033559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos    ASSERT_EQ(OK, mProducer->setSharedBufferMode(true));
604ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos    ASSERT_EQ(OK, mProducer->setAutoRefresh(true));
605ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos
606ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos    // Get a buffer
6073559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos    int sharedSlot;
608ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos    sp<Fence> fence;
609ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos    sp<GraphicBuffer> buffer;
610ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos    ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
6113559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos            mProducer->dequeueBuffer(&sharedSlot, &fence, 0, 0, 0, 0));
6123559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos    ASSERT_EQ(OK, mProducer->requestBuffer(sharedSlot, &buffer));
613ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos
614ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos    // Queue the buffer
615ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos    IGraphicBufferProducer::QueueBufferInput input(0, false,
616ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos            HAL_DATASPACE_UNKNOWN, Rect(0, 0, 1, 1),
617ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos            NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, Fence::NO_FENCE);
6183559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos    ASSERT_EQ(OK, mProducer->queueBuffer(sharedSlot, input, &output));
619ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos
620ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos    // Repeatedly acquire and release a buffer from the consumer side, it should
621ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos    // always return the same one.
622ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos    BufferItem item;
623ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos    for (int i = 0; i < 5; i++) {
624ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos        ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, 0));
6253559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos        ASSERT_EQ(sharedSlot, item.mSlot);
626ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos        testBufferItem(input, item);
627ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos        ASSERT_EQ(i == 0, item.mQueuedBuffer);
628ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos        ASSERT_EQ(true, item.mAutoRefresh);
629ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos
630ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos        ASSERT_EQ(OK, mConsumer->releaseBuffer(item.mSlot, item.mFrameNumber,
631ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos                EGL_NO_DISPLAY, EGL_NO_SYNC_KHR, Fence::NO_FENCE));
632ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos    }
633ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos
634ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos    // Repeatedly queue and dequeue a buffer from the producer side, it should
635ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos    // always return the same one.
636ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos    int slot;
637ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos    for (int i = 0; i < 5; i++) {
638ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos        ASSERT_EQ(OK, mProducer->dequeueBuffer(&slot, &fence, 0, 0, 0, 0));
6393559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos        ASSERT_EQ(sharedSlot, slot);
6403559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos        ASSERT_EQ(OK, mProducer->queueBuffer(sharedSlot, input, &output));
641ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos    }
642ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos
643ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos    // Repeatedly acquire and release a buffer from the consumer side, it should
644ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos    // always return the same one. First grabbing them from the queue and then
6453559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos    // when the queue is empty, returning the shared buffer.
646ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos    for (int i = 0; i < 10; i++) {
647ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos        ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, 0));
6483559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos        ASSERT_EQ(sharedSlot, item.mSlot);
649ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos        ASSERT_EQ(0, item.mTimestamp);
650ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos        ASSERT_EQ(false, item.mIsAutoTimestamp);
651ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos        ASSERT_EQ(HAL_DATASPACE_UNKNOWN, item.mDataSpace);
652ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos        ASSERT_EQ(Rect(0, 0, 1, 1), item.mCrop);
653ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos        ASSERT_EQ(NATIVE_WINDOW_SCALING_MODE_FREEZE, item.mScalingMode);
6545ecfb68ffd63d352df0392dca6e95ef67a66c679Dan Stoza        ASSERT_EQ(0u, item.mTransform);
655ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos        ASSERT_EQ(Fence::NO_FENCE, item.mFence);
656ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos        ASSERT_EQ(i == 0, item.mQueuedBuffer);
657ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos        ASSERT_EQ(true, item.mAutoRefresh);
658ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos
659ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos        ASSERT_EQ(OK, mConsumer->releaseBuffer(item.mSlot, item.mFrameNumber,
660ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos                EGL_NO_DISPLAY, EGL_NO_SYNC_KHR, Fence::NO_FENCE));
661ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos    }
662ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos}
663ccdfd60d79a8b7f1ed6401d0f2e8e29166a10584Pablo Ceballos
6643559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo CeballosTEST_F(BufferQueueTest, TestSharedBufferModeUsingAlreadyDequeuedBuffer) {
665295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos    createBufferQueue();
666295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos    sp<DummyConsumer> dc(new DummyConsumer);
667295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos    ASSERT_EQ(OK, mConsumer->consumerConnect(dc, true));
668295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos    IGraphicBufferProducer::QueueBufferOutput output;
669295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos    ASSERT_EQ(OK, mProducer->connect(new DummyProducerListener,
670295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos            NATIVE_WINDOW_API_CPU, true, &output));
671295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos
672295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos    // Dequeue a buffer
6733559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos    int sharedSlot;
674295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos    sp<Fence> fence;
675295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos    sp<GraphicBuffer> buffer;
676295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos    ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
6773559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos            mProducer->dequeueBuffer(&sharedSlot, &fence, 0, 0, 0, 0));
6783559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos    ASSERT_EQ(OK, mProducer->requestBuffer(sharedSlot, &buffer));
679295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos
6803559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos    // Enable shared buffer mode
6813559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos    ASSERT_EQ(OK, mProducer->setSharedBufferMode(true));
682295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos
683295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos    // Queue the buffer
684295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos    IGraphicBufferProducer::QueueBufferInput input(0, false,
685295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos            HAL_DATASPACE_UNKNOWN, Rect(0, 0, 1, 1),
686295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos            NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, Fence::NO_FENCE);
6873559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos    ASSERT_EQ(OK, mProducer->queueBuffer(sharedSlot, input, &output));
688295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos
689295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos    // Repeatedly queue and dequeue a buffer from the producer side, it should
690295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos    // always return the same one. And we won't run out of buffers because it's
691295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos    // always the same one and because async mode gets enabled.
692295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos    int slot;
693295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos    for (int i = 0; i < 5; i++) {
694295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos        ASSERT_EQ(OK, mProducer->dequeueBuffer(&slot, &fence, 0, 0, 0, 0));
6953559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos        ASSERT_EQ(sharedSlot, slot);
6963559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos        ASSERT_EQ(OK, mProducer->queueBuffer(sharedSlot, input, &output));
697295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos    }
698295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos
699295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos    // acquire the buffer
700295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos    BufferItem item;
701295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos    ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, 0));
7023559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos    ASSERT_EQ(sharedSlot, item.mSlot);
703295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos    testBufferItem(input, item);
704295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos    ASSERT_EQ(true, item.mQueuedBuffer);
705295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos    ASSERT_EQ(false, item.mAutoRefresh);
706295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos
707295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos    ASSERT_EQ(OK, mConsumer->releaseBuffer(item.mSlot, item.mFrameNumber,
708295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos            EGL_NO_DISPLAY, EGL_NO_SYNC_KHR, Fence::NO_FENCE));
709295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos
710295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos    // attempt to acquire a second time should return no buffer available
711295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos    ASSERT_EQ(IGraphicBufferConsumer::NO_BUFFER_AVAILABLE,
712295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos            mConsumer->acquireBuffer(&item, 0));
713295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos}
714295a9fc8aa87daa2cded5c1a279b8cd24e9a9a9fPablo Ceballos
715127fc63e8a15366b4395f1363e8e18eb058d1709Dan StozaTEST_F(BufferQueueTest, TestTimeouts) {
716127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    createBufferQueue();
717127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    sp<DummyConsumer> dc(new DummyConsumer);
718127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    ASSERT_EQ(OK, mConsumer->consumerConnect(dc, true));
719127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    IGraphicBufferProducer::QueueBufferOutput output;
720127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    ASSERT_EQ(OK, mProducer->connect(new DummyProducerListener,
721127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza            NATIVE_WINDOW_API_CPU, true, &output));
722127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza
723127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    // Fill up the queue. Since the controlledByApp flags are set to true, this
724127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    // queue should be in non-blocking mode, and we should be recycling the same
725127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    // two buffers
726127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    for (int i = 0; i < 5; ++i) {
727127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza        int slot = BufferQueue::INVALID_BUFFER_SLOT;
728127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza        sp<Fence> fence = Fence::NO_FENCE;
729127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza        auto result = mProducer->dequeueBuffer(&slot, &fence, 0, 0, 0, 0);
730127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza        if (i < 2) {
731127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza            ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
732127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza                    result);
733127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza        } else {
734127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza            ASSERT_EQ(OK, result);
735127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza        }
736127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza        sp<GraphicBuffer> buffer;
737127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza        ASSERT_EQ(OK, mProducer->requestBuffer(slot, &buffer));
738127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza        IGraphicBufferProducer::QueueBufferInput input(0ull, true,
739127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza                HAL_DATASPACE_UNKNOWN, Rect::INVALID_RECT,
740127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza                NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, Fence::NO_FENCE);
741127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza        IGraphicBufferProducer::QueueBufferOutput output{};
742127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza        ASSERT_EQ(OK, mProducer->queueBuffer(slot, input, &output));
743127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    }
744127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza
745127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    const auto TIMEOUT = ms2ns(250);
746127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    mProducer->setDequeueTimeout(TIMEOUT);
747127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza
748127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    // Setting a timeout will change the BufferQueue into blocking mode (with
749127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    // one droppable buffer in the queue and one free from the previous
750127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    // dequeue/queues), so dequeue and queue two more buffers: one to replace
751127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    // the current droppable buffer, and a second to max out the buffer count
752127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    sp<GraphicBuffer> buffer; // Save a buffer to attach later
753127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    for (int i = 0; i < 2; ++i) {
754127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza        int slot = BufferQueue::INVALID_BUFFER_SLOT;
755127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza        sp<Fence> fence = Fence::NO_FENCE;
756127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza        ASSERT_EQ(OK, mProducer->dequeueBuffer(&slot, &fence, 0, 0, 0, 0));
757127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza        ASSERT_EQ(OK, mProducer->requestBuffer(slot, &buffer));
758127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza        IGraphicBufferProducer::QueueBufferInput input(0ull, true,
759127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza                HAL_DATASPACE_UNKNOWN, Rect::INVALID_RECT,
760127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza                NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, Fence::NO_FENCE);
761127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza        ASSERT_EQ(OK, mProducer->queueBuffer(slot, input, &output));
762127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    }
763127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza
764127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    int slot = BufferQueue::INVALID_BUFFER_SLOT;
765127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    sp<Fence> fence = Fence::NO_FENCE;
766127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    auto startTime = systemTime();
767127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    ASSERT_EQ(TIMED_OUT, mProducer->dequeueBuffer(&slot, &fence, 0, 0, 0, 0));
768127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    ASSERT_GE(systemTime() - startTime, TIMEOUT);
769127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza
770127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    // We're technically attaching the same buffer multiple times (since we
771127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    // queued it previously), but that doesn't matter for this test
772127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    startTime = systemTime();
773127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    ASSERT_EQ(TIMED_OUT, mProducer->attachBuffer(&slot, buffer));
774127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza    ASSERT_GE(systemTime() - startTime, TIMEOUT);
775127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza}
776127fc63e8a15366b4395f1363e8e18eb058d1709Dan Stoza
7775ecfb68ffd63d352df0392dca6e95ef67a66c679Dan StozaTEST_F(BufferQueueTest, CanAttachWhileDisallowingAllocation) {
7785ecfb68ffd63d352df0392dca6e95ef67a66c679Dan Stoza    createBufferQueue();
7795ecfb68ffd63d352df0392dca6e95ef67a66c679Dan Stoza    sp<DummyConsumer> dc(new DummyConsumer);
7805ecfb68ffd63d352df0392dca6e95ef67a66c679Dan Stoza    ASSERT_EQ(OK, mConsumer->consumerConnect(dc, true));
7815ecfb68ffd63d352df0392dca6e95ef67a66c679Dan Stoza    IGraphicBufferProducer::QueueBufferOutput output;
7825ecfb68ffd63d352df0392dca6e95ef67a66c679Dan Stoza    ASSERT_EQ(OK, mProducer->connect(new DummyProducerListener,
7835ecfb68ffd63d352df0392dca6e95ef67a66c679Dan Stoza            NATIVE_WINDOW_API_CPU, true, &output));
7845ecfb68ffd63d352df0392dca6e95ef67a66c679Dan Stoza
7855ecfb68ffd63d352df0392dca6e95ef67a66c679Dan Stoza    int slot = BufferQueue::INVALID_BUFFER_SLOT;
7865ecfb68ffd63d352df0392dca6e95ef67a66c679Dan Stoza    sp<Fence> sourceFence;
7875ecfb68ffd63d352df0392dca6e95ef67a66c679Dan Stoza    ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
7885ecfb68ffd63d352df0392dca6e95ef67a66c679Dan Stoza            mProducer->dequeueBuffer(&slot, &sourceFence, 0, 0, 0, 0));
7895ecfb68ffd63d352df0392dca6e95ef67a66c679Dan Stoza    sp<GraphicBuffer> buffer;
7905ecfb68ffd63d352df0392dca6e95ef67a66c679Dan Stoza    ASSERT_EQ(OK, mProducer->requestBuffer(slot, &buffer));
7915ecfb68ffd63d352df0392dca6e95ef67a66c679Dan Stoza    ASSERT_EQ(OK, mProducer->detachBuffer(slot));
7925ecfb68ffd63d352df0392dca6e95ef67a66c679Dan Stoza
7935ecfb68ffd63d352df0392dca6e95ef67a66c679Dan Stoza    ASSERT_EQ(OK, mProducer->allowAllocation(false));
7945ecfb68ffd63d352df0392dca6e95ef67a66c679Dan Stoza
7955ecfb68ffd63d352df0392dca6e95ef67a66c679Dan Stoza    slot = BufferQueue::INVALID_BUFFER_SLOT;
7965ecfb68ffd63d352df0392dca6e95ef67a66c679Dan Stoza    ASSERT_EQ(OK, mProducer->attachBuffer(&slot, buffer));
7975ecfb68ffd63d352df0392dca6e95ef67a66c679Dan Stoza}
7985ecfb68ffd63d352df0392dca6e95ef67a66c679Dan Stoza
79950101d02a8eae555887282a5f761fdec57bdaf30Dan StozaTEST_F(BufferQueueTest, CanRetrieveLastQueuedBuffer) {
80050101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    createBufferQueue();
80150101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    sp<DummyConsumer> dc(new DummyConsumer);
80250101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    ASSERT_EQ(OK, mConsumer->consumerConnect(dc, false));
80350101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    IGraphicBufferProducer::QueueBufferOutput output;
80450101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    ASSERT_EQ(OK, mProducer->connect(new DummyProducerListener,
80550101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza            NATIVE_WINDOW_API_CPU, false, &output));
80650101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza
80750101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    // Dequeue and queue the first buffer, storing the handle
80850101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    int slot = BufferQueue::INVALID_BUFFER_SLOT;
80950101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    sp<Fence> fence;
81050101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
81150101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza            mProducer->dequeueBuffer(&slot, &fence, 0, 0, 0, 0));
81250101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    sp<GraphicBuffer> firstBuffer;
81350101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    ASSERT_EQ(OK, mProducer->requestBuffer(slot, &firstBuffer));
81450101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza
81550101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    IGraphicBufferProducer::QueueBufferInput input(0ull, true,
81650101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza        HAL_DATASPACE_UNKNOWN, Rect::INVALID_RECT,
81750101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza        NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, Fence::NO_FENCE);
81850101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    ASSERT_EQ(OK, mProducer->queueBuffer(slot, input, &output));
81950101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza
82050101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    // Dequeue a second buffer
82150101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    slot = BufferQueue::INVALID_BUFFER_SLOT;
82250101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION,
82350101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza            mProducer->dequeueBuffer(&slot, &fence, 0, 0, 0, 0));
82450101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    sp<GraphicBuffer> secondBuffer;
82550101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    ASSERT_EQ(OK, mProducer->requestBuffer(slot, &secondBuffer));
82650101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza
82750101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    // Ensure it's a new buffer
82850101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    ASSERT_NE(firstBuffer->getNativeBuffer()->handle,
82950101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza            secondBuffer->getNativeBuffer()->handle);
83050101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza
83150101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    // Queue the second buffer
83250101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    ASSERT_EQ(OK, mProducer->queueBuffer(slot, input, &output));
83350101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza
83450101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    // Acquire and release both buffers
83550101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    for (size_t i = 0; i < 2; ++i) {
83650101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza        BufferItem item;
83750101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza        ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, 0));
83850101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza        ASSERT_EQ(OK, mConsumer->releaseBuffer(item.mSlot, item.mFrameNumber,
83950101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza                    EGL_NO_DISPLAY, EGL_NO_SYNC_KHR, Fence::NO_FENCE));
84050101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    }
84150101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza
84250101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    // Make sure we got the second buffer back
84350101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    sp<GraphicBuffer> returnedBuffer;
84450101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    sp<Fence> returnedFence;
8451a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck    float transform[16];
84650101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    ASSERT_EQ(OK,
8471a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck            mProducer->getLastQueuedBuffer(&returnedBuffer, &returnedFence,
8481a61da5e28fa16ad556a58193c8bbeb32a5f636dJohn Reck            transform));
84950101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza    ASSERT_EQ(secondBuffer->getNativeBuffer()->handle,
85050101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza            returnedBuffer->getNativeBuffer()->handle);
85150101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza}
85250101d02a8eae555887282a5f761fdec57bdaf30Dan Stoza
8539e75ddda93888755d0b14144b62e896cd9f78f3aJamie Gennis} // namespace android
854