1e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <private/dvr/buffer_hub_queue_producer.h> 2e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 3e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <base/logging.h> 41601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai#include <gui/IProducerListener.h> 5e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <gui/Surface.h> 61601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 7e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <gtest/gtest.h> 8e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 9e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkonamespace android { 10e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkonamespace dvr { 11e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 12e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkonamespace { 13e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 141601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai// Default dimensions before setDefaultBufferSize is called by the consumer. 151601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Caiconstexpr uint32_t kDefaultWidth = 1; 161601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Caiconstexpr uint32_t kDefaultHeight = 1; 171601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 181601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai// Default format before setDefaultBufferFormat is called by the consumer. 191601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Caiconstexpr PixelFormat kDefaultFormat = HAL_PIXEL_FORMAT_RGBA_8888; 201601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Caiconstexpr int kDefaultConsumerUsageBits = 0; 211601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 221601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai// Default transform hint before setTransformHint is called by the consumer. 231601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Caiconstexpr uint32_t kDefaultTransformHint = 0; 241601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 251601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Caiconstexpr int kTestApi = NATIVE_WINDOW_API_CPU; 261601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Caiconstexpr int kTestApiOther = NATIVE_WINDOW_API_EGL; 271601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Caiconstexpr int kTestApiInvalid = 0xDEADBEEF; 281601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Caiconstexpr int kTestProducerUsageBits = 0; 291601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Caiconstexpr bool kTestControlledByApp = true; 301601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 311601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai// Builder pattern to slightly vary *almost* correct input 321601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai// -- avoids copying and pasting 331601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Caistruct QueueBufferInputBuilder { 341601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai IGraphicBufferProducer::QueueBufferInput build() { 351601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai return IGraphicBufferProducer::QueueBufferInput( 361601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai mTimestamp, mIsAutoTimestamp, mDataSpace, mCrop, mScalingMode, 371601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai mTransform, mFence); 381601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai } 391601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 401601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai QueueBufferInputBuilder& setTimestamp(int64_t timestamp) { 411601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai this->mTimestamp = timestamp; 421601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai return *this; 431601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai } 441601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 451601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai QueueBufferInputBuilder& setIsAutoTimestamp(bool isAutoTimestamp) { 461601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai this->mIsAutoTimestamp = isAutoTimestamp; 471601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai return *this; 481601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai } 491601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 501601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai QueueBufferInputBuilder& setDataSpace(android_dataspace dataSpace) { 511601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai this->mDataSpace = dataSpace; 521601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai return *this; 531601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai } 541601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 551601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai QueueBufferInputBuilder& setCrop(Rect crop) { 561601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai this->mCrop = crop; 571601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai return *this; 581601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai } 591601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 601601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai QueueBufferInputBuilder& setScalingMode(int scalingMode) { 611601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai this->mScalingMode = scalingMode; 621601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai return *this; 631601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai } 641601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 651601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai QueueBufferInputBuilder& setTransform(uint32_t transform) { 661601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai this->mTransform = transform; 671601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai return *this; 681601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai } 691601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 701601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai QueueBufferInputBuilder& setFence(sp<Fence> fence) { 711601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai this->mFence = fence; 721601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai return *this; 731601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai } 741601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 751601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai private: 761601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai int64_t mTimestamp{1384888611}; 771601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai bool mIsAutoTimestamp{false}; 781601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai android_dataspace mDataSpace{HAL_DATASPACE_UNKNOWN}; 791601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai Rect mCrop{Rect(kDefaultWidth, kDefaultHeight)}; 801601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai int mScalingMode{0}; 811601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai uint32_t mTransform{0}; 821601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai sp<Fence> mFence{Fence::NO_FENCE}; 831601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai}; 841601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 851601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai// This is a test that covers our implementation of bufferhubqueue-based 861601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai// IGraphicBufferProducer. 871601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Caiclass BufferHubQueueProducerTest : public ::testing::Test { 881601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai protected: 891601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai virtual void SetUp() { 901601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai const ::testing::TestInfo* const testInfo = 911601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ::testing::UnitTest::GetInstance()->current_test_info(); 921601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ALOGD_IF(TRACE, "Begin test: %s.%s", testInfo->test_case_name(), 931601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai testInfo->name()); 941601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 95e08ab3f70982e055d8374db7ece59f90cfe3db3cJiwen 'Steve' Cai mProducer = BufferHubQueueProducer::Create(); 961601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_TRUE(mProducer != nullptr); 971601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai mSurface = new Surface(mProducer, true); 981601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_TRUE(mSurface != nullptr); 991601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai } 1001601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 1011601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai // Connect to a producer in a 'correct' fashion. 1021601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai void ConnectProducer() { 1031601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai IGraphicBufferProducer::QueueBufferOutput output; 1041601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai // Can connect the first time. 1051601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_EQ(NO_ERROR, mProducer->connect(kDummyListener, kTestApi, 1061601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai kTestControlledByApp, &output)); 1071601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai } 1081601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 1091601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai // Dequeue a buffer in a 'correct' fashion. 1101601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai // Precondition: Producer is connected. 1111601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai void DequeueBuffer(int* outSlot) { 1121601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai sp<Fence> fence; 1131601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_NO_FATAL_FAILURE(DequeueBuffer(outSlot, &fence)); 1141601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai } 1151601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 1161601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai void DequeueBuffer(int* outSlot, sp<Fence>* outFence) { 1171601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_NE(nullptr, outSlot); 1181601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_NE(nullptr, outFence); 1191601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 1201601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai int ret = mProducer->dequeueBuffer(outSlot, outFence, kDefaultWidth, 1211601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai kDefaultHeight, kDefaultFormat, 1221601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai kTestProducerUsageBits, nullptr); 1231601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai // BUFFER_NEEDS_REALLOCATION can be either on or off. 1241601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_EQ(0, ~IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION & ret); 1251601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 1261601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai // Slot number should be in boundary. 1271601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_LE(0, *outSlot); 1281601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_GT(BufferQueueDefs::NUM_BUFFER_SLOTS, *outSlot); 1291601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai } 1301601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 1311601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai // Create a generic "valid" input for queueBuffer 1321601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai // -- uses the default buffer format, width, etc. 1331601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai static IGraphicBufferProducer::QueueBufferInput CreateBufferInput() { 1341601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai return QueueBufferInputBuilder().build(); 1351601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai } 1361601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 1371601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai const sp<IProducerListener> kDummyListener{new DummyProducerListener}; 1381601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 1391601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai sp<BufferHubQueueProducer> mProducer; 1401601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai sp<Surface> mSurface; 1411601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai}; 1421601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 1431601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' CaiTEST_F(BufferHubQueueProducerTest, ConnectFirst_ReturnsError) { 1441601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai IGraphicBufferProducer::QueueBufferOutput output; 1451601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 1461601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai // NULL output returns BAD_VALUE 1471601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai EXPECT_EQ(BAD_VALUE, mProducer->connect(kDummyListener, kTestApi, 1481601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai kTestControlledByApp, nullptr)); 1491601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 1501601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai // Invalid API returns bad value 1511601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai EXPECT_EQ(BAD_VALUE, mProducer->connect(kDummyListener, kTestApiInvalid, 1521601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai kTestControlledByApp, &output)); 1531601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai} 1541601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 1551601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' CaiTEST_F(BufferHubQueueProducerTest, ConnectAgain_ReturnsError) { 1561601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_NO_FATAL_FAILURE(ConnectProducer()); 1571601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 1581601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai // Can't connect when there is already a producer connected. 1591601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai IGraphicBufferProducer::QueueBufferOutput output; 1601601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai EXPECT_EQ(BAD_VALUE, mProducer->connect(kDummyListener, kTestApi, 1611601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai kTestControlledByApp, &output)); 1621601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai} 1631601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 1641601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' CaiTEST_F(BufferHubQueueProducerTest, Disconnect_Succeeds) { 1651601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_NO_FATAL_FAILURE(ConnectProducer()); 1661601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 1671601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_EQ(NO_ERROR, mProducer->disconnect(kTestApi)); 1681601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai} 1691601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 1701601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' CaiTEST_F(BufferHubQueueProducerTest, Disconnect_ReturnsError) { 1711601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_NO_FATAL_FAILURE(ConnectProducer()); 1721601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 1731601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai // Must disconnect with same API number 1741601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai EXPECT_EQ(BAD_VALUE, mProducer->disconnect(kTestApiOther)); 1751601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai // API must not be out of range 1761601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai EXPECT_EQ(BAD_VALUE, mProducer->disconnect(kTestApiInvalid)); 1771601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai} 1781601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 1791601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' CaiTEST_F(BufferHubQueueProducerTest, Query_Succeeds) { 1801601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_NO_FATAL_FAILURE(ConnectProducer()); 1811601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 1821601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai int32_t value = -1; 1831601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai EXPECT_EQ(NO_ERROR, mProducer->query(NATIVE_WINDOW_WIDTH, &value)); 1841601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai EXPECT_EQ(kDefaultWidth, static_cast<uint32_t>(value)); 1851601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 1861601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai EXPECT_EQ(NO_ERROR, mProducer->query(NATIVE_WINDOW_HEIGHT, &value)); 1871601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai EXPECT_EQ(kDefaultHeight, static_cast<uint32_t>(value)); 1881601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 1891601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai EXPECT_EQ(NO_ERROR, mProducer->query(NATIVE_WINDOW_FORMAT, &value)); 1901601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai EXPECT_EQ(kDefaultFormat, value); 1911601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 1921601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai EXPECT_EQ(NO_ERROR, 1931601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai mProducer->query(NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, &value)); 1941601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai EXPECT_LE(0, value); 1951601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai EXPECT_GE(BufferQueueDefs::NUM_BUFFER_SLOTS, static_cast<size_t>(value)); 1961601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 1971601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai EXPECT_EQ(NO_ERROR, 1981601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai mProducer->query(NATIVE_WINDOW_CONSUMER_RUNNING_BEHIND, &value)); 1991601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai EXPECT_FALSE(value); // Can't run behind when we haven't touched the queue 2001601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 2011601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai EXPECT_EQ(NO_ERROR, 2021601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai mProducer->query(NATIVE_WINDOW_CONSUMER_USAGE_BITS, &value)); 2031601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai EXPECT_EQ(kDefaultConsumerUsageBits, value); 2041601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai} 2051601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 2061601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' CaiTEST_F(BufferHubQueueProducerTest, Query_ReturnsError) { 2071601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_NO_FATAL_FAILURE(ConnectProducer()); 2081601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 2091601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai // One past the end of the last 'query' enum value. Update this if we add more 2101601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai // enums. 2111601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai const int NATIVE_WINDOW_QUERY_LAST_OFF_BY_ONE = NATIVE_WINDOW_BUFFER_AGE + 1; 2121601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 2131601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai int value; 2141601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai // What was out of range 2151601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai EXPECT_EQ(BAD_VALUE, mProducer->query(/*what*/ -1, &value)); 2161601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai EXPECT_EQ(BAD_VALUE, mProducer->query(/*what*/ 0xDEADBEEF, &value)); 2171601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai EXPECT_EQ(BAD_VALUE, 2181601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai mProducer->query(NATIVE_WINDOW_QUERY_LAST_OFF_BY_ONE, &value)); 2191601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 2201601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai // Some enums from window.h are 'invalid' 2211601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai EXPECT_EQ(BAD_VALUE, 2221601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai mProducer->query(NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER, &value)); 2231601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai EXPECT_EQ(BAD_VALUE, mProducer->query(NATIVE_WINDOW_CONCRETE_TYPE, &value)); 2241601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai EXPECT_EQ(BAD_VALUE, mProducer->query(NATIVE_WINDOW_DEFAULT_WIDTH, &value)); 2251601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai EXPECT_EQ(BAD_VALUE, mProducer->query(NATIVE_WINDOW_DEFAULT_HEIGHT, &value)); 2261601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai EXPECT_EQ(BAD_VALUE, mProducer->query(NATIVE_WINDOW_TRANSFORM_HINT, &value)); 2271601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 2281601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai // Value was NULL 2291601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai EXPECT_EQ(BAD_VALUE, mProducer->query(NATIVE_WINDOW_FORMAT, /*value*/ NULL)); 2301601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai} 2311601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 2321601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' CaiTEST_F(BufferHubQueueProducerTest, Queue_Succeeds) { 2331601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai int slot = -1; 2341601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 2351601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_NO_FATAL_FAILURE(ConnectProducer()); 2361601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_NO_FATAL_FAILURE(DequeueBuffer(&slot)); 2371601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 2381601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai // Request the buffer (pre-requisite for queueing) 2391601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai sp<GraphicBuffer> buffer; 2401601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_EQ(NO_ERROR, mProducer->requestBuffer(slot, &buffer)); 2411601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 2421601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai // A generic "valid" input 2431601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai IGraphicBufferProducer::QueueBufferInput input = CreateBufferInput(); 2441601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai IGraphicBufferProducer::QueueBufferOutput output; 2451601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 2461601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai // Queue the buffer back into the BQ 2471601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_EQ(NO_ERROR, mProducer->queueBuffer(slot, input, &output)); 2481601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 2491601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai EXPECT_EQ(kDefaultWidth, output.width); 2501601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai EXPECT_EQ(kDefaultHeight, output.height); 2511601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai EXPECT_EQ(kDefaultTransformHint, output.transformHint); 2521601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 2531601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai // BufferHubQueue delivers buffers to consumer immediately. 2541601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai EXPECT_EQ(0u, output.numPendingBuffers); 2551601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 2561601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai // Note that BufferHubQueue doesn't support nextFrameNumber as it seems to 2571601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai // be a SurfaceFlinger specific optimization. 2581601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai EXPECT_EQ(0u, output.nextFrameNumber); 2591601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 2601601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai // Buffer was not in the dequeued state 2611601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai EXPECT_EQ(BAD_VALUE, mProducer->queueBuffer(slot, input, &output)); 2621601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai} 2631601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 2641601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai// Test invalid slot number 2651601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' CaiTEST_F(BufferHubQueueProducerTest, QueueInvalidSlot_ReturnsError) { 2661601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_NO_FATAL_FAILURE(ConnectProducer()); 2671601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 2681601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai // A generic "valid" input 2691601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai IGraphicBufferProducer::QueueBufferInput input = CreateBufferInput(); 2701601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai IGraphicBufferProducer::QueueBufferOutput output; 2711601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 2721601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai EXPECT_EQ(BAD_VALUE, mProducer->queueBuffer(/*slot*/ -1, input, &output)); 2731601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai EXPECT_EQ(BAD_VALUE, 2741601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai mProducer->queueBuffer(/*slot*/ 0xDEADBEEF, input, &output)); 2751601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai EXPECT_EQ(BAD_VALUE, mProducer->queueBuffer(BufferQueueDefs::NUM_BUFFER_SLOTS, 2761601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai input, &output)); 2771601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai} 2781601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 2791601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai// Slot was not in the dequeued state (all slots start out in Free state) 2801601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' CaiTEST_F(BufferHubQueueProducerTest, QueueNotDequeued_ReturnsError) { 2811601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_NO_FATAL_FAILURE(ConnectProducer()); 2821601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 2831601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai IGraphicBufferProducer::QueueBufferInput input = CreateBufferInput(); 2841601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai IGraphicBufferProducer::QueueBufferOutput output; 2851601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 2861601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai EXPECT_EQ(BAD_VALUE, mProducer->queueBuffer(/*slot*/ 0, input, &output)); 2871601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai} 2881601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 2891601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai// Slot was enqueued without requesting a buffer 2901601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' CaiTEST_F(BufferHubQueueProducerTest, QueueNotRequested_ReturnsError) { 2911601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai int slot = -1; 2921601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 2931601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_NO_FATAL_FAILURE(ConnectProducer()); 2941601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_NO_FATAL_FAILURE(DequeueBuffer(&slot)); 2951601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 2961601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai IGraphicBufferProducer::QueueBufferInput input = CreateBufferInput(); 2971601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai IGraphicBufferProducer::QueueBufferOutput output; 2981601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 2991601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai EXPECT_EQ(BAD_VALUE, mProducer->queueBuffer(slot, input, &output)); 3001601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai} 3011601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 3021601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai// Test when fence was NULL 3031601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' CaiTEST_F(BufferHubQueueProducerTest, QueueNoFence_ReturnsError) { 3041601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai int slot = -1; 3051601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 3061601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_NO_FATAL_FAILURE(ConnectProducer()); 3071601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_NO_FATAL_FAILURE(DequeueBuffer(&slot)); 3081601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 3091601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai sp<GraphicBuffer> buffer; 3101601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_EQ(NO_ERROR, mProducer->requestBuffer(slot, &buffer)); 3111601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 3121601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai sp<Fence> nullFence = NULL; 3131601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 3141601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai IGraphicBufferProducer::QueueBufferInput input = 3151601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai QueueBufferInputBuilder().setFence(nullFence).build(); 3161601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai IGraphicBufferProducer::QueueBufferOutput output; 3171601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 3181601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai EXPECT_EQ(BAD_VALUE, mProducer->queueBuffer(slot, input, &output)); 3191601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai} 3201601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 3211601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai// Test scaling mode was invalid 3221601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' CaiTEST_F(BufferHubQueueProducerTest, QueueTestInvalidScalingMode_ReturnsError) { 3231601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai int slot = -1; 3241601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 3251601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_NO_FATAL_FAILURE(ConnectProducer()); 3261601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_NO_FATAL_FAILURE(DequeueBuffer(&slot)); 3271601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 3281601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai sp<GraphicBuffer> buffer; 3291601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_EQ(NO_ERROR, mProducer->requestBuffer(slot, &buffer)); 3301601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 3311601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai IGraphicBufferProducer::QueueBufferInput input = 3321601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai QueueBufferInputBuilder().setScalingMode(-1).build(); 3331601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai IGraphicBufferProducer::QueueBufferOutput output; 3341601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 3351601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai EXPECT_EQ(BAD_VALUE, mProducer->queueBuffer(slot, input, &output)); 3361601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 3371601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai input = QueueBufferInputBuilder().setScalingMode(0xDEADBEEF).build(); 3381601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 3391601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai EXPECT_EQ(BAD_VALUE, mProducer->queueBuffer(slot, input, &output)); 3401601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai} 3411601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 3421601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai// Test crop rect is out of bounds of the buffer dimensions 3431601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' CaiTEST_F(BufferHubQueueProducerTest, QueueCropOutOfBounds_ReturnsError) { 3441601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai int slot = -1; 3451601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 3461601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_NO_FATAL_FAILURE(ConnectProducer()); 3471601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_NO_FATAL_FAILURE(DequeueBuffer(&slot)); 3481601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 3491601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai sp<GraphicBuffer> buffer; 3501601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_EQ(NO_ERROR, mProducer->requestBuffer(slot, &buffer)); 3511601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 3521601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai IGraphicBufferProducer::QueueBufferInput input = 3531601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai QueueBufferInputBuilder() 3541601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai .setCrop(Rect(kDefaultWidth + 1, kDefaultHeight + 1)) 3551601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai .build(); 3561601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai IGraphicBufferProducer::QueueBufferOutput output; 3571601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 3581601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai EXPECT_EQ(BAD_VALUE, mProducer->queueBuffer(slot, input, &output)); 3591601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai} 3601601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 3611601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' CaiTEST_F(BufferHubQueueProducerTest, CancelBuffer_Succeeds) { 3621601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai int slot = -1; 3631601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai sp<Fence> fence; 3641601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 3651601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_NO_FATAL_FAILURE(ConnectProducer()); 3661601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_NO_FATAL_FAILURE(DequeueBuffer(&slot, &fence)); 3671601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 3681601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai // Should be able to cancel buffer after a dequeue. 3691601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai EXPECT_EQ(NO_ERROR, mProducer->cancelBuffer(slot, fence)); 3701601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai} 3711601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 3721601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' CaiTEST_F(BufferHubQueueProducerTest, SetMaxDequeuedBufferCount_Succeeds) { 3731601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai return; 3741601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_NO_FATAL_FAILURE(ConnectProducer()); 3751601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 3761601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai int minUndequeuedBuffers; 3771601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_EQ(NO_ERROR, mProducer->query(NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, 3781601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai &minUndequeuedBuffers)); 3791601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 3801601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai const int minBuffers = 1; 3811601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai const int maxBuffers = 3821601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai BufferQueueDefs::NUM_BUFFER_SLOTS - minUndequeuedBuffers; 3831601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 3841601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_EQ(NO_ERROR, mProducer->setAsyncMode(false)) 3851601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai << "async mode: " << false; 3861601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_EQ(NO_ERROR, mProducer->setMaxDequeuedBufferCount(minBuffers)) 3871601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai << "bufferCount: " << minBuffers; 3881601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 3891601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai // Should now be able to dequeue up to minBuffers times 3901601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai // Should now be able to dequeue up to maxBuffers times 3911601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai int slot = -1; 3921601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai for (int i = 0; i < minBuffers; ++i) { 3931601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_NO_FATAL_FAILURE(DequeueBuffer(&slot)); 3941601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai } 3951601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 3961601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_EQ(NO_ERROR, mProducer->setMaxDequeuedBufferCount(maxBuffers)); 3971601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 3981601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai // queue the first buffer to enable max dequeued buffer count checking 3991601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai IGraphicBufferProducer::QueueBufferInput input = CreateBufferInput(); 4001601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai IGraphicBufferProducer::QueueBufferOutput output; 4011601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai sp<GraphicBuffer> buffer; 4021601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_EQ(NO_ERROR, mProducer->requestBuffer(slot, &buffer)); 4031601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_EQ(NO_ERROR, mProducer->queueBuffer(slot, input, &output)); 4041601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 4051601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai sp<Fence> fence; 4061601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai for (int i = 0; i < maxBuffers; ++i) { 4071601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_NO_FATAL_FAILURE(DequeueBuffer(&slot, &fence)); 4081601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai } 4091601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 4101601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai // Cancel a buffer, so we can decrease the buffer count 4111601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_EQ(NO_ERROR, mProducer->cancelBuffer(slot, fence)); 4121601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 4131601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai // Should now be able to decrease the max dequeued count by 1 4141601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_EQ(NO_ERROR, mProducer->setMaxDequeuedBufferCount(maxBuffers - 1)); 4151601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai} 4161601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 4171601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' CaiTEST_F(BufferHubQueueProducerTest, SetMaxDequeuedBufferCount_Fails) { 4181601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_NO_FATAL_FAILURE(ConnectProducer()); 4191601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 4201601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai int minUndequeuedBuffers; 4211601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_EQ(NO_ERROR, mProducer->query(NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, 4221601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai &minUndequeuedBuffers)); 4231601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 4241601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai const int minBuffers = 1; 4251601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai const int maxBuffers = 4261601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai BufferQueueDefs::NUM_BUFFER_SLOTS - minUndequeuedBuffers; 4271601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 4281601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_EQ(NO_ERROR, mProducer->setAsyncMode(false)) 4291601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai << "async mode: " << false; 4301601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai // Buffer count was out of range 4311601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai EXPECT_EQ(BAD_VALUE, mProducer->setMaxDequeuedBufferCount(0)) 4321601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai << "bufferCount: " << 0; 4331601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai EXPECT_EQ(BAD_VALUE, mProducer->setMaxDequeuedBufferCount(maxBuffers + 1)) 4341601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai << "bufferCount: " << maxBuffers + 1; 4351601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 4361601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai // Set max dequeue count to 2 4371601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_EQ(NO_ERROR, mProducer->setMaxDequeuedBufferCount(2)); 4381601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai // Dequeue 2 buffers 4391601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai int slot = -1; 4401601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai sp<Fence> fence; 4411601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai for (int i = 0; i < 2; i++) { 4421601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_EQ(OK, ~IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION & 4431601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai (mProducer->dequeueBuffer( 4441601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai &slot, &fence, kDefaultWidth, kDefaultHeight, 4451601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai kDefaultFormat, kTestProducerUsageBits, nullptr))) 4461601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai << "slot: " << slot; 4471601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai } 4481601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 4491601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai // Client has too many buffers dequeued 4501601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai EXPECT_EQ(BAD_VALUE, mProducer->setMaxDequeuedBufferCount(1)) 4511601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai << "bufferCount: " << minBuffers; 4521601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai} 4531601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 4541601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' CaiTEST_F(BufferHubQueueProducerTest, 4551601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai DisconnectedProducerReturnsError_dequeueBuffer) { 4561601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai int slot = -1; 4571601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai sp<Fence> fence; 4581601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 4591601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_EQ(NO_INIT, mProducer->dequeueBuffer(&slot, &fence, kDefaultWidth, 4601601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai kDefaultHeight, kDefaultFormat, 4611601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai kTestProducerUsageBits, nullptr)); 4621601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai} 4631601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 4641601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' CaiTEST_F(BufferHubQueueProducerTest, 4651601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai DisconnectedProducerReturnsError_requestBuffer) { 4661601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai int slot = -1; 4671601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai sp<GraphicBuffer> buffer; 4681601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 4691601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_NO_FATAL_FAILURE(ConnectProducer()); 4701601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_NO_FATAL_FAILURE(DequeueBuffer(&slot)); 4711601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 4721601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai // Shouldn't be able to request buffer after disconnect. 4731601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_EQ(NO_ERROR, mProducer->disconnect(kTestApi)); 4741601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_EQ(NO_INIT, mProducer->requestBuffer(slot, &buffer)); 4751601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai} 4761601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 4771601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' CaiTEST_F(BufferHubQueueProducerTest, 4781601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai DisconnectedProducerReturnsError_queueBuffer) { 4791601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai int slot = -1; 4801601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai sp<GraphicBuffer> buffer; 4811601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 4821601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_NO_FATAL_FAILURE(ConnectProducer()); 4831601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_NO_FATAL_FAILURE(DequeueBuffer(&slot)); 4841601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_EQ(NO_ERROR, mProducer->requestBuffer(slot, &buffer)); 4851601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 4861601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai // A generic "valid" input 4871601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai IGraphicBufferProducer::QueueBufferInput input = CreateBufferInput(); 4881601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai IGraphicBufferProducer::QueueBufferOutput output; 4891601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 4901601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai // Shouldn't be able to queue buffer after disconnect. 4911601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_EQ(NO_ERROR, mProducer->disconnect(kTestApi)); 4921601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_EQ(NO_INIT, mProducer->queueBuffer(slot, input, &output)); 4931601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai} 4941601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 4951601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' CaiTEST_F(BufferHubQueueProducerTest, 4961601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai DisconnectedProducerReturnsError_cancelBuffer) { 4971601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai int slot = -1; 4981601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai sp<GraphicBuffer> buffer; 4991601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai 5001601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_NO_FATAL_FAILURE(ConnectProducer()); 5011601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_NO_FATAL_FAILURE(DequeueBuffer(&slot)); 5021601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_EQ(NO_ERROR, mProducer->requestBuffer(slot, &buffer)); 503e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 5041601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai // Shouldn't be able to cancel buffer after disconnect. 5051601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_EQ(NO_ERROR, mProducer->disconnect(kTestApi)); 5061601bcfa9cdc07cea8f5980349608e1526690db5Jiwen 'Steve' Cai ASSERT_EQ(NO_INIT, mProducer->cancelBuffer(slot, Fence::NO_FENCE)); 507e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 508e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 509e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} // namespace 510e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 511e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} // namespace dvr 512e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} // namespace android 513