Hash :
9aa6d3da
        
        Author :
  
        
        Date :
2024-04-26T11:34:10
        
      
Add trim support to MemoryBuffer There are usecases where we need a MemoryBuffer to be trimmed to a smaller size. In such cases there is no need to perform a resize, which would trigger a reallocation. Instead just update MemoryBuffer's size. Bug: angleproject:4722 Change-Id: I5b6cca121977903ffa7663591eaec62f6ffda97a Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5513269 Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: mohan maiya <m.maiya@samsung.com>
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
//
// Copyright 2014 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.
//
#ifndef COMMON_MEMORYBUFFER_H_
#define COMMON_MEMORYBUFFER_H_
#include "common/Optional.h"
#include "common/angleutils.h"
#include "common/debug.h"
#include <stdint.h>
#include <cstddef>
namespace angle
{
class MemoryBuffer final : NonCopyable
{
  public:
    MemoryBuffer() = default;
    ~MemoryBuffer();
    MemoryBuffer(MemoryBuffer &&other);
    MemoryBuffer &operator=(MemoryBuffer &&other);
    [[nodiscard]] bool resize(size_t size);
    void trim(size_t size);
    void clear() { (void)resize(0); }
    size_t size() const { return mSize; }
    bool empty() const { return mSize == 0; }
    const uint8_t *data() const { return mData; }
    uint8_t *data()
    {
        ASSERT(mData);
        return mData;
    }
    uint8_t &operator[](size_t pos)
    {
        ASSERT(pos < mSize);
        return mData[pos];
    }
    const uint8_t &operator[](size_t pos) const
    {
        ASSERT(pos < mSize);
        return mData[pos];
    }
    void fill(uint8_t datum);
  private:
    size_t mSize   = 0;
    uint8_t *mData = nullptr;
};
class ScratchBuffer final : NonCopyable
{
  public:
    ScratchBuffer();
    // If we request a scratch buffer requesting a smaller size this many times, release and
    // recreate the scratch buffer. This ensures we don't have a degenerate case where we are stuck
    // hogging memory.
    ScratchBuffer(uint32_t lifetime);
    ~ScratchBuffer();
    ScratchBuffer(ScratchBuffer &&other);
    ScratchBuffer &operator=(ScratchBuffer &&other);
    // Returns true with a memory buffer of the requested size, or false on failure.
    bool get(size_t requestedSize, MemoryBuffer **memoryBufferOut);
    // Same as get, but ensures new values are initialized to a fixed constant.
    bool getInitialized(size_t requestedSize, MemoryBuffer **memoryBufferOut, uint8_t initValue);
    // Ticks the release counter for the scratch buffer. Also done implicitly in get().
    void tick();
    void clear();
  private:
    bool getImpl(size_t requestedSize, MemoryBuffer **memoryBufferOut, Optional<uint8_t> initValue);
    uint32_t mLifetime;
    uint32_t mResetCounter;
    MemoryBuffer mScratchMemory;
};
}  // namespace angle
#endif  // COMMON_MEMORYBUFFER_H_