diff options
author | Valerie Hau <vhau@google.com> | 2019-02-20 10:36:29 -0800 |
---|---|---|
committer | Valerie Hau <vhau@google.com> | 2019-02-27 07:45:04 -0800 |
commit | b28f007e51fb84ff78ce8b053d80efb0efdbce20 (patch) | |
tree | ce54e323ba3684e4cccdea733b2ca096f63106e6 /services/surfaceflinger/CompositionEngine/tests/HwcBufferCacheTest.cpp | |
parent | 613e49e99e456df7a2b34ec820319855516c47cc (diff) |
Caching between SF and HWC for BufferStateLayers
Bug: 120434937
Test: build, boot,libcompositionengine_test
Change-Id: I4a99faeb7aa88683aac19c7000db87bd75f9ebe9
Diffstat (limited to 'services/surfaceflinger/CompositionEngine/tests/HwcBufferCacheTest.cpp')
-rw-r--r-- | services/surfaceflinger/CompositionEngine/tests/HwcBufferCacheTest.cpp | 102 |
1 files changed, 60 insertions, 42 deletions
diff --git a/services/surfaceflinger/CompositionEngine/tests/HwcBufferCacheTest.cpp b/services/surfaceflinger/CompositionEngine/tests/HwcBufferCacheTest.cpp index f2a1aad2fc..d4bbf6ddaa 100644 --- a/services/surfaceflinger/CompositionEngine/tests/HwcBufferCacheTest.cpp +++ b/services/surfaceflinger/CompositionEngine/tests/HwcBufferCacheTest.cpp @@ -22,60 +22,78 @@ namespace android::compositionengine { namespace { +class TestableHwcBufferCache : public impl::HwcBufferCache { +public: + void getHwcBuffer(const sp<GraphicBuffer>& buffer, uint32_t* outSlot, + sp<GraphicBuffer>* outBuffer) { + HwcBufferCache::getHwcBuffer(buffer, outSlot, outBuffer); + } + int getSlot(const sp<GraphicBuffer>& buffer) { return HwcBufferCache::getSlot(buffer); } + int getLeastRecentlyUsedSlot() { return HwcBufferCache::getLeastRecentlyUsedSlot(); } +}; + class HwcBufferCacheTest : public testing::Test { public: ~HwcBufferCacheTest() override = default; - void testSlot(const int inSlot, const uint32_t expectedSlot) { - uint32_t outSlot; - sp<GraphicBuffer> outBuffer; - - // The first time, the output is the same as the input - mCache.getHwcBuffer(inSlot, mBuffer1, &outSlot, &outBuffer); - EXPECT_EQ(expectedSlot, outSlot); - EXPECT_EQ(mBuffer1, outBuffer); - - // The second time with the same buffer, the outBuffer is nullptr. - mCache.getHwcBuffer(inSlot, mBuffer1, &outSlot, &outBuffer); - EXPECT_EQ(expectedSlot, outSlot); - EXPECT_EQ(nullptr, outBuffer.get()); - - // With a new buffer, the outBuffer is the input. - mCache.getHwcBuffer(inSlot, mBuffer2, &outSlot, &outBuffer); - EXPECT_EQ(expectedSlot, outSlot); - EXPECT_EQ(mBuffer2, outBuffer); - - // Again, the second request with the same buffer sets outBuffer to nullptr. - mCache.getHwcBuffer(inSlot, mBuffer2, &outSlot, &outBuffer); - EXPECT_EQ(expectedSlot, outSlot); - EXPECT_EQ(nullptr, outBuffer.get()); - - // Setting a slot to use nullptr lookslike works, but note that - // the output values make it look like no new buffer is being set.... - mCache.getHwcBuffer(inSlot, sp<GraphicBuffer>(), &outSlot, &outBuffer); - EXPECT_EQ(expectedSlot, outSlot); - EXPECT_EQ(nullptr, outBuffer.get()); - } - - impl::HwcBufferCache mCache; + TestableHwcBufferCache mCache; sp<GraphicBuffer> mBuffer1{new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888, 1, 0)}; sp<GraphicBuffer> mBuffer2{new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888, 1, 0)}; }; -TEST_F(HwcBufferCacheTest, cacheWorksForSlotZero) { - testSlot(0, 0); -} +TEST_F(HwcBufferCacheTest, testSlot) { + uint32_t outSlot; + sp<GraphicBuffer> outBuffer; -TEST_F(HwcBufferCacheTest, cacheWorksForMaxSlot) { - testSlot(BufferQueue::NUM_BUFFER_SLOTS - 1, BufferQueue::NUM_BUFFER_SLOTS - 1); -} + // The first time, the output is the same as the input + mCache.getHwcBuffer(mBuffer1, &outSlot, &outBuffer); + EXPECT_EQ(0, outSlot); + EXPECT_EQ(mBuffer1, outBuffer); -TEST_F(HwcBufferCacheTest, cacheMapsNegativeSlotToZero) { - testSlot(-123, 0); + // The second time with the same buffer, the outBuffer is nullptr. + mCache.getHwcBuffer(mBuffer1, &outSlot, &outBuffer); + EXPECT_EQ(0, outSlot); + EXPECT_EQ(nullptr, outBuffer.get()); + + // With a new buffer, the outBuffer is the input. + mCache.getHwcBuffer(mBuffer2, &outSlot, &outBuffer); + EXPECT_EQ(1, outSlot); + EXPECT_EQ(mBuffer2, outBuffer); + + // Again, the second request with the same buffer sets outBuffer to nullptr. + mCache.getHwcBuffer(mBuffer2, &outSlot, &outBuffer); + EXPECT_EQ(1, outSlot); + EXPECT_EQ(nullptr, outBuffer.get()); + + // Setting a slot to use nullptr lookslike works, but note that + // the output values make it look like no new buffer is being set.... + mCache.getHwcBuffer(sp<GraphicBuffer>(), &outSlot, &outBuffer); + EXPECT_EQ(2, outSlot); + EXPECT_EQ(nullptr, outBuffer.get()); } -TEST_F(HwcBufferCacheTest, cacheMapsInvalidBufferSlotToZero) { - testSlot(BufferQueue::INVALID_BUFFER_SLOT, 0); +TEST_F(HwcBufferCacheTest, testGetLeastRecentlyUsedSlot) { + int slot; + uint32_t outSlot; + sp<GraphicBuffer> outBuffer; + + // fill up cache + for (int i = 0; i < BufferQueue::NUM_BUFFER_SLOTS; i++) { + sp<GraphicBuffer> buf{new GraphicBuffer(1, 1, HAL_PIXEL_FORMAT_RGBA_8888, 1, 0)}; + mCache.getHwcBuffer(buf, &outSlot, &outBuffer); + EXPECT_EQ(buf, outBuffer); + EXPECT_EQ(i, outSlot); + } + + slot = mCache.getLeastRecentlyUsedSlot(); + EXPECT_EQ(0, slot); + + mCache.getHwcBuffer(mBuffer1, &outSlot, &outBuffer); + EXPECT_EQ(0, outSlot); + EXPECT_EQ(mBuffer1, outBuffer); + + slot = mCache.getLeastRecentlyUsedSlot(); + EXPECT_EQ(1, slot); } } // namespace |