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