Loading services/surfaceflinger/BufferStateLayer.h +4 −0 Original line number Diff line number Diff line Loading @@ -29,6 +29,8 @@ namespace android { class SlotGenerationTest; class BufferStateLayer : public BufferLayer { public: explicit BufferStateLayer(const LayerCreationArgs&); Loading Loading @@ -134,6 +136,7 @@ private: void setHwcLayerBuffer(const sp<const DisplayDevice>& display) override; private: friend class SlotGenerationTest; void onFirstRef() override; bool willPresentCurrentTransaction() const; Loading Loading @@ -170,6 +173,7 @@ private: uint32_t getHwcCacheSlot(const client_cache_t& clientCacheId); private: friend class SlotGenerationTest; uint32_t addCachedBuffer(const client_cache_t& clientCacheId) REQUIRES(mMutex); uint32_t getFreeHwcCacheSlot() REQUIRES(mMutex); void evictLeastRecentlyUsed() REQUIRES(mMutex); Loading services/surfaceflinger/tests/unittests/Android.bp +2 −1 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ cc_test { srcs: [ ":libsurfaceflinger_sources", "libsurfaceflinger_unittest_main.cpp", "CachingTest.cpp", "CompositionTest.cpp", "DispSyncSourceTest.cpp", "DisplayIdentificationTest.cpp", Loading services/surfaceflinger/tests/unittests/CachingTest.cpp 0 → 100644 +93 −0 Original line number Diff line number Diff line /* * Copyright 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #undef LOG_TAG #define LOG_TAG "CachingTest" #include <gmock/gmock.h> #include <gtest/gtest.h> #include <gui/BufferQueue.h> #include "BufferStateLayer.h" namespace android { class SlotGenerationTest : public testing::Test { protected: BufferStateLayer::HwcSlotGenerator mHwcSlotGenerator; 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)}; sp<GraphicBuffer> mBuffer3{new GraphicBuffer(10, 10, HAL_PIXEL_FORMAT_RGBA_8888, 1, 0)}; }; TEST_F(SlotGenerationTest, getHwcCacheSlot_Invalid) { sp<IBinder> binder = new BBinder(); // test getting invalid client_cache_id client_cache_t id; uint32_t slot = mHwcSlotGenerator.getHwcCacheSlot(id); EXPECT_EQ(BufferQueue::INVALID_BUFFER_SLOT, slot); } TEST_F(SlotGenerationTest, getHwcCacheSlot_Basic) { sp<IBinder> binder = new BBinder(); client_cache_t id; id.token = binder; id.id = 0; uint32_t slot = mHwcSlotGenerator.getHwcCacheSlot(id); EXPECT_EQ(BufferQueue::NUM_BUFFER_SLOTS - 1, slot); client_cache_t idB; idB.token = binder; idB.id = 1; slot = mHwcSlotGenerator.getHwcCacheSlot(idB); EXPECT_EQ(BufferQueue::NUM_BUFFER_SLOTS - 2, slot); slot = mHwcSlotGenerator.getHwcCacheSlot(idB); EXPECT_EQ(BufferQueue::NUM_BUFFER_SLOTS - 2, slot); slot = mHwcSlotGenerator.getHwcCacheSlot(id); EXPECT_EQ(BufferQueue::NUM_BUFFER_SLOTS - 1, slot); } TEST_F(SlotGenerationTest, getHwcCacheSlot_Reuse) { sp<IBinder> binder = new BBinder(); std::vector<client_cache_t> ids; uint32_t cacheId = 0; // fill up cache for (uint32_t i = 0; i < BufferQueue::NUM_BUFFER_SLOTS; i++) { client_cache_t id; id.token = binder; id.id = cacheId; ids.push_back(id); uint32_t slot = mHwcSlotGenerator.getHwcCacheSlot(id); EXPECT_EQ(BufferQueue::NUM_BUFFER_SLOTS - (i + 1), slot); cacheId++; } for (uint32_t i = 0; i < BufferQueue::NUM_BUFFER_SLOTS; i++) { uint32_t slot = mHwcSlotGenerator.getHwcCacheSlot(ids[i]); EXPECT_EQ(BufferQueue::NUM_BUFFER_SLOTS - (i + 1), slot); } for (uint32_t i = 0; i < BufferQueue::NUM_BUFFER_SLOTS; i++) { client_cache_t id; id.token = binder; id.id = cacheId; uint32_t slot = mHwcSlotGenerator.getHwcCacheSlot(id); EXPECT_EQ(BufferQueue::NUM_BUFFER_SLOTS - (i + 1), slot); cacheId++; } } } // namespace android Loading
services/surfaceflinger/BufferStateLayer.h +4 −0 Original line number Diff line number Diff line Loading @@ -29,6 +29,8 @@ namespace android { class SlotGenerationTest; class BufferStateLayer : public BufferLayer { public: explicit BufferStateLayer(const LayerCreationArgs&); Loading Loading @@ -134,6 +136,7 @@ private: void setHwcLayerBuffer(const sp<const DisplayDevice>& display) override; private: friend class SlotGenerationTest; void onFirstRef() override; bool willPresentCurrentTransaction() const; Loading Loading @@ -170,6 +173,7 @@ private: uint32_t getHwcCacheSlot(const client_cache_t& clientCacheId); private: friend class SlotGenerationTest; uint32_t addCachedBuffer(const client_cache_t& clientCacheId) REQUIRES(mMutex); uint32_t getFreeHwcCacheSlot() REQUIRES(mMutex); void evictLeastRecentlyUsed() REQUIRES(mMutex); Loading
services/surfaceflinger/tests/unittests/Android.bp +2 −1 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ cc_test { srcs: [ ":libsurfaceflinger_sources", "libsurfaceflinger_unittest_main.cpp", "CachingTest.cpp", "CompositionTest.cpp", "DispSyncSourceTest.cpp", "DisplayIdentificationTest.cpp", Loading
services/surfaceflinger/tests/unittests/CachingTest.cpp 0 → 100644 +93 −0 Original line number Diff line number Diff line /* * Copyright 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #undef LOG_TAG #define LOG_TAG "CachingTest" #include <gmock/gmock.h> #include <gtest/gtest.h> #include <gui/BufferQueue.h> #include "BufferStateLayer.h" namespace android { class SlotGenerationTest : public testing::Test { protected: BufferStateLayer::HwcSlotGenerator mHwcSlotGenerator; 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)}; sp<GraphicBuffer> mBuffer3{new GraphicBuffer(10, 10, HAL_PIXEL_FORMAT_RGBA_8888, 1, 0)}; }; TEST_F(SlotGenerationTest, getHwcCacheSlot_Invalid) { sp<IBinder> binder = new BBinder(); // test getting invalid client_cache_id client_cache_t id; uint32_t slot = mHwcSlotGenerator.getHwcCacheSlot(id); EXPECT_EQ(BufferQueue::INVALID_BUFFER_SLOT, slot); } TEST_F(SlotGenerationTest, getHwcCacheSlot_Basic) { sp<IBinder> binder = new BBinder(); client_cache_t id; id.token = binder; id.id = 0; uint32_t slot = mHwcSlotGenerator.getHwcCacheSlot(id); EXPECT_EQ(BufferQueue::NUM_BUFFER_SLOTS - 1, slot); client_cache_t idB; idB.token = binder; idB.id = 1; slot = mHwcSlotGenerator.getHwcCacheSlot(idB); EXPECT_EQ(BufferQueue::NUM_BUFFER_SLOTS - 2, slot); slot = mHwcSlotGenerator.getHwcCacheSlot(idB); EXPECT_EQ(BufferQueue::NUM_BUFFER_SLOTS - 2, slot); slot = mHwcSlotGenerator.getHwcCacheSlot(id); EXPECT_EQ(BufferQueue::NUM_BUFFER_SLOTS - 1, slot); } TEST_F(SlotGenerationTest, getHwcCacheSlot_Reuse) { sp<IBinder> binder = new BBinder(); std::vector<client_cache_t> ids; uint32_t cacheId = 0; // fill up cache for (uint32_t i = 0; i < BufferQueue::NUM_BUFFER_SLOTS; i++) { client_cache_t id; id.token = binder; id.id = cacheId; ids.push_back(id); uint32_t slot = mHwcSlotGenerator.getHwcCacheSlot(id); EXPECT_EQ(BufferQueue::NUM_BUFFER_SLOTS - (i + 1), slot); cacheId++; } for (uint32_t i = 0; i < BufferQueue::NUM_BUFFER_SLOTS; i++) { uint32_t slot = mHwcSlotGenerator.getHwcCacheSlot(ids[i]); EXPECT_EQ(BufferQueue::NUM_BUFFER_SLOTS - (i + 1), slot); } for (uint32_t i = 0; i < BufferQueue::NUM_BUFFER_SLOTS; i++) { client_cache_t id; id.token = binder; id.id = cacheId; uint32_t slot = mHwcSlotGenerator.getHwcCacheSlot(id); EXPECT_EQ(BufferQueue::NUM_BUFFER_SLOTS - (i + 1), slot); cacheId++; } } } // namespace android