xref: /aosp_15_r20/external/angle/src/common/MemoryBuffer.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2014 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker 
7*8975f5c5SAndroid Build Coastguard Worker #ifndef COMMON_MEMORYBUFFER_H_
8*8975f5c5SAndroid Build Coastguard Worker #define COMMON_MEMORYBUFFER_H_
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #include "common/Optional.h"
11*8975f5c5SAndroid Build Coastguard Worker #include "common/angleutils.h"
12*8975f5c5SAndroid Build Coastguard Worker #include "common/debug.h"
13*8975f5c5SAndroid Build Coastguard Worker 
14*8975f5c5SAndroid Build Coastguard Worker #include <stdint.h>
15*8975f5c5SAndroid Build Coastguard Worker #include <cstddef>
16*8975f5c5SAndroid Build Coastguard Worker 
17*8975f5c5SAndroid Build Coastguard Worker namespace angle
18*8975f5c5SAndroid Build Coastguard Worker {
19*8975f5c5SAndroid Build Coastguard Worker 
20*8975f5c5SAndroid Build Coastguard Worker class MemoryBuffer final : NonCopyable
21*8975f5c5SAndroid Build Coastguard Worker {
22*8975f5c5SAndroid Build Coastguard Worker   public:
23*8975f5c5SAndroid Build Coastguard Worker     MemoryBuffer() = default;
24*8975f5c5SAndroid Build Coastguard Worker     ~MemoryBuffer();
25*8975f5c5SAndroid Build Coastguard Worker 
26*8975f5c5SAndroid Build Coastguard Worker     MemoryBuffer(MemoryBuffer &&other);
27*8975f5c5SAndroid Build Coastguard Worker     MemoryBuffer &operator=(MemoryBuffer &&other);
28*8975f5c5SAndroid Build Coastguard Worker 
29*8975f5c5SAndroid Build Coastguard Worker     // On success, size will be equal to capacity.
30*8975f5c5SAndroid Build Coastguard Worker     [[nodiscard]] bool resize(size_t size);
31*8975f5c5SAndroid Build Coastguard Worker     // Sets size bound by capacity.
setSize(size_t size)32*8975f5c5SAndroid Build Coastguard Worker     void setSize(size_t size)
33*8975f5c5SAndroid Build Coastguard Worker     {
34*8975f5c5SAndroid Build Coastguard Worker         ASSERT(size <= mCapacity);
35*8975f5c5SAndroid Build Coastguard Worker         mSize = size;
36*8975f5c5SAndroid Build Coastguard Worker     }
setSizeToCapacity()37*8975f5c5SAndroid Build Coastguard Worker     void setSizeToCapacity() { mSize = mCapacity; }
clear()38*8975f5c5SAndroid Build Coastguard Worker     void clear() { (void)resize(0); }
size()39*8975f5c5SAndroid Build Coastguard Worker     size_t size() const { return mSize; }
capacity()40*8975f5c5SAndroid Build Coastguard Worker     size_t capacity() const { return mCapacity; }
empty()41*8975f5c5SAndroid Build Coastguard Worker     bool empty() const { return mSize == 0; }
42*8975f5c5SAndroid Build Coastguard Worker 
data()43*8975f5c5SAndroid Build Coastguard Worker     const uint8_t *data() const { return mData; }
data()44*8975f5c5SAndroid Build Coastguard Worker     uint8_t *data()
45*8975f5c5SAndroid Build Coastguard Worker     {
46*8975f5c5SAndroid Build Coastguard Worker         ASSERT(mData);
47*8975f5c5SAndroid Build Coastguard Worker         return mData;
48*8975f5c5SAndroid Build Coastguard Worker     }
49*8975f5c5SAndroid Build Coastguard Worker 
50*8975f5c5SAndroid Build Coastguard Worker     uint8_t &operator[](size_t pos)
51*8975f5c5SAndroid Build Coastguard Worker     {
52*8975f5c5SAndroid Build Coastguard Worker         ASSERT(pos < mSize);
53*8975f5c5SAndroid Build Coastguard Worker         return mData[pos];
54*8975f5c5SAndroid Build Coastguard Worker     }
55*8975f5c5SAndroid Build Coastguard Worker     const uint8_t &operator[](size_t pos) const
56*8975f5c5SAndroid Build Coastguard Worker     {
57*8975f5c5SAndroid Build Coastguard Worker         ASSERT(pos < mSize);
58*8975f5c5SAndroid Build Coastguard Worker         return mData[pos];
59*8975f5c5SAndroid Build Coastguard Worker     }
60*8975f5c5SAndroid Build Coastguard Worker 
61*8975f5c5SAndroid Build Coastguard Worker     void fill(uint8_t datum);
62*8975f5c5SAndroid Build Coastguard Worker 
63*8975f5c5SAndroid Build Coastguard Worker   private:
64*8975f5c5SAndroid Build Coastguard Worker     size_t mSize     = 0;
65*8975f5c5SAndroid Build Coastguard Worker     size_t mCapacity = 0;
66*8975f5c5SAndroid Build Coastguard Worker     uint8_t *mData   = nullptr;
67*8975f5c5SAndroid Build Coastguard Worker };
68*8975f5c5SAndroid Build Coastguard Worker 
69*8975f5c5SAndroid Build Coastguard Worker class ScratchBuffer final : NonCopyable
70*8975f5c5SAndroid Build Coastguard Worker {
71*8975f5c5SAndroid Build Coastguard Worker   public:
72*8975f5c5SAndroid Build Coastguard Worker     ScratchBuffer();
73*8975f5c5SAndroid Build Coastguard Worker     // If we request a scratch buffer requesting a smaller size this many times, release and
74*8975f5c5SAndroid Build Coastguard Worker     // recreate the scratch buffer. This ensures we don't have a degenerate case where we are stuck
75*8975f5c5SAndroid Build Coastguard Worker     // hogging memory.
76*8975f5c5SAndroid Build Coastguard Worker     ScratchBuffer(uint32_t lifetime);
77*8975f5c5SAndroid Build Coastguard Worker     ~ScratchBuffer();
78*8975f5c5SAndroid Build Coastguard Worker 
79*8975f5c5SAndroid Build Coastguard Worker     ScratchBuffer(ScratchBuffer &&other);
80*8975f5c5SAndroid Build Coastguard Worker     ScratchBuffer &operator=(ScratchBuffer &&other);
81*8975f5c5SAndroid Build Coastguard Worker 
82*8975f5c5SAndroid Build Coastguard Worker     // Returns true with a memory buffer of the requested size, or false on failure.
83*8975f5c5SAndroid Build Coastguard Worker     bool get(size_t requestedSize, MemoryBuffer **memoryBufferOut);
84*8975f5c5SAndroid Build Coastguard Worker 
85*8975f5c5SAndroid Build Coastguard Worker     // Same as get, but ensures new values are initialized to a fixed constant.
86*8975f5c5SAndroid Build Coastguard Worker     bool getInitialized(size_t requestedSize, MemoryBuffer **memoryBufferOut, uint8_t initValue);
87*8975f5c5SAndroid Build Coastguard Worker 
88*8975f5c5SAndroid Build Coastguard Worker     // Ticks the release counter for the scratch buffer. Also done implicitly in get().
89*8975f5c5SAndroid Build Coastguard Worker     void tick();
90*8975f5c5SAndroid Build Coastguard Worker 
91*8975f5c5SAndroid Build Coastguard Worker     void clear();
92*8975f5c5SAndroid Build Coastguard Worker 
93*8975f5c5SAndroid Build Coastguard Worker   private:
94*8975f5c5SAndroid Build Coastguard Worker     bool getImpl(size_t requestedSize, MemoryBuffer **memoryBufferOut, Optional<uint8_t> initValue);
95*8975f5c5SAndroid Build Coastguard Worker 
96*8975f5c5SAndroid Build Coastguard Worker     uint32_t mLifetime;
97*8975f5c5SAndroid Build Coastguard Worker     uint32_t mResetCounter;
98*8975f5c5SAndroid Build Coastguard Worker     MemoryBuffer mScratchMemory;
99*8975f5c5SAndroid Build Coastguard Worker };
100*8975f5c5SAndroid Build Coastguard Worker 
101*8975f5c5SAndroid Build Coastguard Worker }  // namespace angle
102*8975f5c5SAndroid Build Coastguard Worker 
103*8975f5c5SAndroid Build Coastguard Worker #endif  // COMMON_MEMORYBUFFER_H_
104