Path: blob/main_old/src/common/MemoryBuffer.cpp
1693 views
//1// Copyright 2014 The ANGLE Project Authors. All rights reserved.2// Use of this source code is governed by a BSD-style license that can be3// found in the LICENSE file.4//56#include "common/MemoryBuffer.h"78#include <algorithm>9#include <cstdlib>1011#include "common/debug.h"1213namespace angle14{1516// MemoryBuffer implementation.17MemoryBuffer::~MemoryBuffer()18{19if (mData)20{21free(mData);22mData = nullptr;23}24}2526bool MemoryBuffer::resize(size_t size)27{28if (size == 0)29{30if (mData)31{32free(mData);33mData = nullptr;34}35mSize = 0;36return true;37}3839if (size == mSize)40{41return true;42}4344// Only reallocate if the size has changed.45uint8_t *newMemory = static_cast<uint8_t *>(malloc(sizeof(uint8_t) * size));46if (newMemory == nullptr)47{48return false;49}5051if (mData)52{53// Copy the intersection of the old data and the new data54std::copy(mData, mData + std::min(mSize, size), newMemory);55free(mData);56}5758mData = newMemory;59mSize = size;6061return true;62}6364void MemoryBuffer::fill(uint8_t datum)65{66if (!empty())67{68std::fill(mData, mData + mSize, datum);69}70}7172MemoryBuffer::MemoryBuffer(MemoryBuffer &&other) : MemoryBuffer()73{74*this = std::move(other);75}7677MemoryBuffer &MemoryBuffer::operator=(MemoryBuffer &&other)78{79std::swap(mSize, other.mSize);80std::swap(mData, other.mData);81return *this;82}8384namespace85{86static constexpr uint32_t kDefaultScratchBufferLifetime = 1000u;8788} // anonymous namespace8990// ScratchBuffer implementation.91ScratchBuffer::ScratchBuffer() : ScratchBuffer(kDefaultScratchBufferLifetime) {}9293ScratchBuffer::ScratchBuffer(uint32_t lifetime) : mLifetime(lifetime), mResetCounter(lifetime) {}9495ScratchBuffer::~ScratchBuffer() {}9697ScratchBuffer::ScratchBuffer(ScratchBuffer &&other)98{99*this = std::move(other);100}101102ScratchBuffer &ScratchBuffer::operator=(ScratchBuffer &&other)103{104std::swap(mLifetime, other.mLifetime);105std::swap(mResetCounter, other.mResetCounter);106std::swap(mScratchMemory, other.mScratchMemory);107return *this;108}109110bool ScratchBuffer::get(size_t requestedSize, MemoryBuffer **memoryBufferOut)111{112return getImpl(requestedSize, memoryBufferOut, Optional<uint8_t>::Invalid());113}114115bool ScratchBuffer::getInitialized(size_t requestedSize,116MemoryBuffer **memoryBufferOut,117uint8_t initValue)118{119return getImpl(requestedSize, memoryBufferOut, Optional<uint8_t>(initValue));120}121122bool ScratchBuffer::getImpl(size_t requestedSize,123MemoryBuffer **memoryBufferOut,124Optional<uint8_t> initValue)125{126if (mScratchMemory.size() == requestedSize)127{128mResetCounter = mLifetime;129*memoryBufferOut = &mScratchMemory;130return true;131}132133if (mScratchMemory.size() > requestedSize)134{135tick();136}137138if (mScratchMemory.size() < requestedSize)139{140if (!mScratchMemory.resize(requestedSize))141{142return false;143}144mResetCounter = mLifetime;145if (initValue.valid())146{147mScratchMemory.fill(initValue.value());148}149}150151ASSERT(mScratchMemory.size() >= requestedSize);152153*memoryBufferOut = &mScratchMemory;154return true;155}156157void ScratchBuffer::tick()158{159if (mResetCounter > 0)160{161--mResetCounter;162if (mResetCounter == 0)163{164clear();165}166}167}168169void ScratchBuffer::clear()170{171mResetCounter = mLifetime;172if (mScratchMemory.size() > 0)173{174mScratchMemory.clear();175}176}177178} // namespace angle179180181