summaryrefslogtreecommitdiffstats
path: root/src/3rdparty/angle/src/common/MemoryBuffer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/3rdparty/angle/src/common/MemoryBuffer.cpp')
-rw-r--r--src/3rdparty/angle/src/common/MemoryBuffer.cpp105
1 files changed, 90 insertions, 15 deletions
diff --git a/src/3rdparty/angle/src/common/MemoryBuffer.cpp b/src/3rdparty/angle/src/common/MemoryBuffer.cpp
index e7a3fb4a2b..6f5188c69c 100644
--- a/src/3rdparty/angle/src/common/MemoryBuffer.cpp
+++ b/src/3rdparty/angle/src/common/MemoryBuffer.cpp
@@ -11,19 +11,18 @@
#include "common/debug.h"
-namespace rx
+namespace angle
{
-MemoryBuffer::MemoryBuffer()
- : mSize(0),
- mData(NULL)
+// MemoryBuffer implementation.
+MemoryBuffer::MemoryBuffer() : mSize(0), mData(nullptr)
{
}
MemoryBuffer::~MemoryBuffer()
{
free(mData);
- mData = NULL;
+ mData = nullptr;
}
bool MemoryBuffer::resize(size_t size)
@@ -31,7 +30,7 @@ bool MemoryBuffer::resize(size_t size)
if (size == 0)
{
free(mData);
- mData = NULL;
+ mData = nullptr;
mSize = 0;
return true;
}
@@ -42,8 +41,8 @@ bool MemoryBuffer::resize(size_t size)
}
// Only reallocate if the size has changed.
- uint8_t *newMemory = reinterpret_cast<uint8_t*>(malloc(sizeof(uint8_t) * size));
- if (newMemory == NULL)
+ uint8_t *newMemory = reinterpret_cast<uint8_t *>(malloc(sizeof(uint8_t) * size));
+ if (newMemory == nullptr)
{
return false;
}
@@ -61,20 +60,96 @@ bool MemoryBuffer::resize(size_t size)
return true;
}
-size_t MemoryBuffer::size() const
+void MemoryBuffer::fill(uint8_t datum)
{
- return mSize;
+ if (!empty())
+ {
+ std::fill(mData, mData + mSize, datum);
+ }
+}
+
+MemoryBuffer::MemoryBuffer(MemoryBuffer &&other) : MemoryBuffer()
+{
+ *this = std::move(other);
}
-const uint8_t *MemoryBuffer::data() const
+MemoryBuffer &MemoryBuffer::operator=(MemoryBuffer &&other)
{
- return mData;
+ std::swap(mSize, other.mSize);
+ std::swap(mData, other.mData);
+ return *this;
}
-uint8_t *MemoryBuffer::data()
+// ScratchBuffer implementation.
+
+ScratchBuffer::ScratchBuffer(uint32_t lifetime) : mLifetime(lifetime), mResetCounter(lifetime)
{
- ASSERT(mData);
- return mData;
}
+ScratchBuffer::~ScratchBuffer()
+{
+}
+
+bool ScratchBuffer::get(size_t requestedSize, MemoryBuffer **memoryBufferOut)
+{
+ return getImpl(requestedSize, memoryBufferOut, Optional<uint8_t>::Invalid());
}
+
+bool ScratchBuffer::getInitialized(size_t requestedSize,
+ MemoryBuffer **memoryBufferOut,
+ uint8_t initValue)
+{
+ return getImpl(requestedSize, memoryBufferOut, Optional<uint8_t>(initValue));
+}
+
+bool ScratchBuffer::getImpl(size_t requestedSize,
+ MemoryBuffer **memoryBufferOut,
+ Optional<uint8_t> initValue)
+{
+ if (mScratchMemory.size() == requestedSize)
+ {
+ mResetCounter = mLifetime;
+ *memoryBufferOut = &mScratchMemory;
+ return true;
+ }
+
+ if (mScratchMemory.size() > requestedSize)
+ {
+ tick();
+ }
+
+ if (mResetCounter == 0 || mScratchMemory.size() < requestedSize)
+ {
+ mScratchMemory.resize(0);
+ if (!mScratchMemory.resize(requestedSize))
+ {
+ return false;
+ }
+ mResetCounter = mLifetime;
+ if (initValue.valid())
+ {
+ mScratchMemory.fill(initValue.value());
+ }
+ }
+
+ ASSERT(mScratchMemory.size() >= requestedSize);
+
+ *memoryBufferOut = &mScratchMemory;
+ return true;
+}
+
+void ScratchBuffer::tick()
+{
+ if (mResetCounter > 0)
+ {
+ --mResetCounter;
+ }
+}
+
+void ScratchBuffer::clear()
+{
+ mResetCounter = mLifetime;
+ mScratchMemory.resize(0);
+}
+
+} // namespace angle