OffscreenBufferPoolTests.cpp revision 64db2bf1118db88c937e2b8c61b299bb2a80e3cb
1/* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#include <gtest/gtest.h> 18#include <Rect.h> 19#include <renderstate/OffscreenBufferPool.h> 20 21#include <tests/common/TestUtils.h> 22 23using namespace android::uirenderer; 24 25TEST(OffscreenBuffer, computeIdealDimension) { 26 EXPECT_EQ(64u, OffscreenBuffer::computeIdealDimension(1)); 27 EXPECT_EQ(64u, OffscreenBuffer::computeIdealDimension(31)); 28 EXPECT_EQ(64u, OffscreenBuffer::computeIdealDimension(33)); 29 EXPECT_EQ(64u, OffscreenBuffer::computeIdealDimension(64)); 30 EXPECT_EQ(1024u, OffscreenBuffer::computeIdealDimension(1000)); 31} 32 33TEST(OffscreenBuffer, construct) { 34 TestUtils::runOnRenderThread([] (renderthread::RenderThread& thread) { 35 OffscreenBuffer layer(thread.renderState(), Caches::getInstance(), 49u, 149u); 36 EXPECT_EQ(49u, layer.viewportWidth); 37 EXPECT_EQ(149u, layer.viewportHeight); 38 39 EXPECT_EQ(64u, layer.texture.width()); 40 EXPECT_EQ(192u, layer.texture.height()); 41 42 EXPECT_EQ(64u * 192u * 4u, layer.getSizeInBytes()); 43 }); 44} 45 46TEST(OffscreenBuffer, getTextureCoordinates) { 47 TestUtils::runOnRenderThread([] (renderthread::RenderThread& thread) { 48 OffscreenBuffer layerAligned(thread.renderState(), Caches::getInstance(), 256u, 256u); 49 EXPECT_EQ(Rect(0, 1, 1, 0), 50 layerAligned.getTextureCoordinates()); 51 52 OffscreenBuffer layerUnaligned(thread.renderState(), Caches::getInstance(), 200u, 225u); 53 EXPECT_EQ(Rect(0, 225.0f / 256.0f, 200.0f / 256.0f, 0), 54 layerUnaligned.getTextureCoordinates()); 55 }); 56} 57 58TEST(OffscreenBuffer, dirty) { 59 TestUtils::runOnRenderThread([] (renderthread::RenderThread& thread) { 60 OffscreenBuffer buffer(thread.renderState(), Caches::getInstance(), 256u, 256u); 61 buffer.dirty(Rect(-100, -100, 100, 100)); 62 EXPECT_EQ(android::Rect(100, 100), buffer.region.getBounds()); 63 }); 64} 65 66TEST(OffscreenBufferPool, construct) { 67 TestUtils::runOnRenderThread([] (renderthread::RenderThread& thread) { 68 OffscreenBufferPool pool; 69 EXPECT_EQ(0u, pool.getCount()) << "pool must be created empty"; 70 EXPECT_EQ(0u, pool.getSize()) << "pool must be created empty"; 71 EXPECT_EQ((uint32_t) Properties::layerPoolSize, pool.getMaxSize()) 72 << "pool must read size from Properties"; 73 }); 74} 75 76TEST(OffscreenBufferPool, getPutClear) { 77 TestUtils::runOnRenderThread([] (renderthread::RenderThread& thread) { 78 OffscreenBufferPool pool; 79 80 auto layer = pool.get(thread.renderState(), 100u, 200u); 81 EXPECT_EQ(100u, layer->viewportWidth); 82 EXPECT_EQ(200u, layer->viewportHeight); 83 84 ASSERT_LT(layer->getSizeInBytes(), pool.getMaxSize()); 85 86 pool.putOrDelete(layer); 87 ASSERT_EQ(layer->getSizeInBytes(), pool.getSize()); 88 89 auto layer2 = pool.get(thread.renderState(), 102u, 202u); 90 EXPECT_EQ(layer, layer2) << "layer should be recycled"; 91 ASSERT_EQ(0u, pool.getSize()) << "pool should have been emptied by removing only layer"; 92 93 pool.putOrDelete(layer); 94 EXPECT_EQ(1u, pool.getCount()); 95 pool.clear(); 96 EXPECT_EQ(0u, pool.getSize()); 97 EXPECT_EQ(0u, pool.getCount()); 98 }); 99} 100 101TEST(OffscreenBufferPool, resize) { 102 TestUtils::runOnRenderThread([] (renderthread::RenderThread& thread) { 103 OffscreenBufferPool pool; 104 105 auto layer = pool.get(thread.renderState(), 64u, 64u); 106 107 // resize in place 108 ASSERT_EQ(layer, pool.resize(layer, 60u, 55u)); 109 EXPECT_EQ(60u, layer->viewportWidth); 110 EXPECT_EQ(55u, layer->viewportHeight); 111 EXPECT_EQ(64u, layer->texture.width()); 112 EXPECT_EQ(64u, layer->texture.height()); 113 114 // resized to use different object in pool 115 auto layer2 = pool.get(thread.renderState(), 128u, 128u); 116 pool.putOrDelete(layer2); 117 ASSERT_EQ(1u, pool.getCount()); 118 ASSERT_EQ(layer2, pool.resize(layer, 120u, 125u)); 119 EXPECT_EQ(120u, layer2->viewportWidth); 120 EXPECT_EQ(125u, layer2->viewportHeight); 121 EXPECT_EQ(128u, layer2->texture.width()); 122 EXPECT_EQ(128u, layer2->texture.height()); 123 124 // original allocation now only thing in pool 125 EXPECT_EQ(1u, pool.getCount()); 126 EXPECT_EQ(layer->getSizeInBytes(), pool.getSize()); 127 128 pool.putOrDelete(layer2); 129 }); 130} 131 132TEST(OffscreenBufferPool, putAndDestroy) { 133 TestUtils::runOnRenderThread([] (renderthread::RenderThread& thread) { 134 OffscreenBufferPool pool; 135 // layer too big to return to the pool 136 // Note: this relies on the fact that the pool won't reject based on max texture size 137 auto hugeLayer = pool.get(thread.renderState(), pool.getMaxSize() / 64, 64); 138 EXPECT_GT(hugeLayer->getSizeInBytes(), pool.getMaxSize()); 139 pool.putOrDelete(hugeLayer); 140 EXPECT_EQ(0u, pool.getCount()); // failed to put (so was destroyed instead) 141 }); 142} 143