Hash :
b3af2e86
Author :
Date :
2024-12-31T08:51:37
Enhance MemoryBuffer API
Add support for -
1. reserve - users can reserve sufficient capacity upfront to
minimize subsequent reallocations due to resize
2. append - to append data from a source so user doesn't need to
track offsets explicitly
Bug: angleproject:386749841
Tests: MemoryBufferTest*
Change-Id: Ibf2a3228d5a00ed34a7e0c5e3eb185e42677d676
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6135238
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Commit-Queue: mohan maiya <m.maiya@samsung.com>
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
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 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
//
// Copyright 2025 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.
//
// Unit tests for ANGLE's MemoryBuffer class.
//
#include "common/MemoryBuffer.h"
#include <gtest/gtest.h>
using namespace angle;
namespace
{
// Test usage of MemoryBuffer with multiple resizes
TEST(MemoryBufferTest, MultipleResizes)
{
MemoryBuffer buffer;
ASSERT_TRUE(buffer.resize(100));
ASSERT_EQ(buffer.size(), 100u);
buffer.assertTotalAllocatedBytes(100u);
buffer.assertTotalCopiedBytes(0u);
ASSERT_TRUE(buffer.resize(300));
ASSERT_EQ(buffer.size(), 300u);
buffer.assertTotalAllocatedBytes(400u);
buffer.assertTotalCopiedBytes(100u);
ASSERT_TRUE(buffer.resize(100));
ASSERT_EQ(buffer.size(), 100u);
buffer.assertTotalAllocatedBytes(400u);
buffer.assertTotalCopiedBytes(100u);
ASSERT_TRUE(buffer.resize(400));
ASSERT_EQ(buffer.size(), 400u);
buffer.assertTotalAllocatedBytes(800u);
buffer.assertTotalCopiedBytes(200u);
}
// Test usage of MemoryBuffer with reserve and then multiple resizes
TEST(MemoryBufferTest, ReserveThenResize)
{
MemoryBuffer buffer;
ASSERT_TRUE(buffer.reserve(300));
ASSERT_EQ(buffer.size(), 0u);
ASSERT_TRUE(buffer.resize(100));
ASSERT_EQ(buffer.size(), 100u);
buffer.assertTotalAllocatedBytes(300u);
buffer.assertTotalCopiedBytes(0u);
ASSERT_TRUE(buffer.resize(300));
ASSERT_EQ(buffer.size(), 300u);
buffer.assertTotalAllocatedBytes(300u);
buffer.assertTotalCopiedBytes(0u);
ASSERT_TRUE(buffer.resize(100));
ASSERT_EQ(buffer.size(), 100u);
buffer.assertTotalAllocatedBytes(300u);
buffer.assertTotalCopiedBytes(0u);
ASSERT_TRUE(buffer.resize(400));
ASSERT_EQ(buffer.size(), 400u);
buffer.assertTotalAllocatedBytes(700u);
buffer.assertTotalCopiedBytes(100u);
}
// Test usage of MemoryBuffer with clearAndReserve and then multiple resizes
TEST(MemoryBufferTest, ClearAndReserveThenResize)
{
MemoryBuffer buffer;
ASSERT_TRUE(buffer.clearAndReserve(300));
ASSERT_EQ(buffer.size(), 0u);
ASSERT_TRUE(buffer.resize(100));
ASSERT_EQ(buffer.size(), 100u);
buffer.assertTotalAllocatedBytes(300u);
buffer.assertTotalCopiedBytes(0u);
ASSERT_TRUE(buffer.resize(300));
ASSERT_EQ(buffer.size(), 300u);
buffer.assertTotalAllocatedBytes(300u);
buffer.assertTotalCopiedBytes(0u);
ASSERT_TRUE(buffer.resize(100));
ASSERT_EQ(buffer.size(), 100u);
buffer.assertTotalAllocatedBytes(300u);
buffer.assertTotalCopiedBytes(0u);
ASSERT_TRUE(buffer.clearAndReserve(400));
ASSERT_EQ(buffer.size(), 0u);
ASSERT_TRUE(buffer.resize(400));
ASSERT_EQ(buffer.size(), 400u);
buffer.assertTotalAllocatedBytes(700u);
buffer.assertTotalCopiedBytes(0u);
}
// Test appending and destroying MemoryBuffer
TEST(MemoryBufferTest, AppendAndDestroy)
{
MemoryBuffer bufferSrc;
MemoryBuffer bufferDst;
ASSERT_TRUE(bufferSrc.clearAndReserve(100));
ASSERT_EQ(bufferSrc.size(), 0u);
ASSERT_TRUE(bufferSrc.resize(100));
ASSERT_EQ(bufferSrc.size(), 100u);
bufferSrc.assertTotalAllocatedBytes(100u);
bufferSrc.assertTotalCopiedBytes(0u);
ASSERT_TRUE(bufferDst.clearAndReserve(200));
ASSERT_EQ(bufferDst.size(), 0u);
ASSERT_TRUE(bufferDst.resize(100));
ASSERT_EQ(bufferDst.size(), 100u);
ASSERT_TRUE(bufferDst.append(bufferSrc));
ASSERT_EQ(bufferDst.size(), 200u);
bufferDst.assertTotalAllocatedBytes(200u);
bufferDst.assertTotalCopiedBytes(0u);
ASSERT_TRUE(bufferDst.append(bufferSrc));
ASSERT_EQ(bufferDst.size(), 300u);
bufferDst.assertTotalAllocatedBytes(500u);
bufferDst.assertTotalCopiedBytes(200u);
ASSERT_TRUE(bufferDst.append(bufferDst));
ASSERT_EQ(bufferDst.size(), 600u);
bufferDst.assertTotalAllocatedBytes(1100u);
bufferDst.assertTotalCopiedBytes(500u);
bufferDst.destroy();
ASSERT_EQ(bufferDst.size(), 0u);
bufferDst.assertTotalAllocatedBytes(0u);
bufferDst.assertTotalCopiedBytes(0u);
}
} // namespace