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(×tamp, &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