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