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