Hash :
5546fb4f
Author :
Date :
2019-01-17T12:25:54
Vulkan:Adding custom pool allocator Migrated pool allocator used by compiler to common. Planning to use this for ANGLE custom command buffers so this some refactoring in preparation for that work. Added a unit test to check PoolAllocator functionality. Bug: angleproject:2951 Reviewed-on: https://chromium-review.googlesource.com/c/1476953 Reviewed-by: Jamie Madill <jmadill@google.com> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: Tobin Ehlis <tobine@google.com> Change-Id: I0b4f3d55ea1799e35c9799c221f7129233f30b24 Reviewed-on: https://chromium-review.googlesource.com/c/1492972
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
//
// Copyright 2019 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// PoolAlloc_unittest:
// Tests of the PoolAlloc class
//
#include <gtest/gtest.h>
#include "common/PoolAlloc.h"
namespace angle
{
// Verify the public interface of PoolAllocator class
TEST(PoolAllocatorTest, Interface)
{
size_t numBytes = 1024;
constexpr uint32_t kTestValue = 0xbaadbeef;
// Create a default pool allocator and allocate from it
PoolAllocator poolAllocator;
void *allocation = poolAllocator.allocate(numBytes);
// Verify non-zero ptr returned
EXPECT_NE(nullptr, allocation);
// Write to allocation to check later
uint32_t *writePtr = static_cast<uint32_t *>(allocation);
*writePtr = kTestValue;
// Test push and creating a new allocation
poolAllocator.push();
allocation = poolAllocator.allocate(numBytes);
EXPECT_NE(nullptr, allocation);
// Make an allocation that spans multiple pages
allocation = poolAllocator.allocate(10 * 1024);
// pop previous two allocations
poolAllocator.pop();
// Verify first allocation still has data
EXPECT_EQ(kTestValue, *writePtr);
// Make a bunch of allocations
for (uint32_t i = 0; i < 1000; ++i)
{
numBytes = (rand() % (1024 * 4)) + 1;
allocation = poolAllocator.allocate(numBytes);
EXPECT_NE(nullptr, allocation);
// Write data into full allocation. In debug case if we
// overwrite any other allocation we get error.
memset(allocation, 0xb8, numBytes);
}
// Free everything
poolAllocator.popAll();
}
#if !defined(ANGLE_POOL_ALLOC_GUARD_BLOCKS)
// Verify allocations are correctly aligned for different alignments
class PoolAllocatorAlignmentTest : public testing::TestWithParam<int>
{};
TEST_P(PoolAllocatorAlignmentTest, Alignment)
{
int alignment = GetParam();
// Create a pool allocator to allocate from
PoolAllocator poolAllocator(4096, alignment);
// Test a number of allocation sizes for each alignment
for (uint32_t i = 0; i < 100; ++i)
{
// Vary the allocation size around 4k to hit some multi-page allocations
void *allocation = poolAllocator.allocate((rand() % (1024 * 4)) + 1);
// Verify alignment of allocation matches expected default
EXPECT_EQ(0u, (reinterpret_cast<std::uintptr_t>(allocation) % alignment));
}
}
INSTANTIATE_TEST_SUITE_P(,
PoolAllocatorAlignmentTest,
testing::Values(2, 4, 8, 16, 32, 64, 128),
testing::PrintToStringParamName());
#endif
} // namespace angle