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