Commit 9f9b1d2d by Jamie Madill Committed by Commit Bot

Make ScratchBuffer its own type.

This helper tool in Renderer11 can be useful in other back-ends, or even in the front end. BUG=angleproject:1635 Change-Id: I18ec19a891a9bdfa7b80dea1b8e308abf206906b Reviewed-on: https://chromium-review.googlesource.com/450919 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent ef964d48
...@@ -11,19 +11,18 @@ ...@@ -11,19 +11,18 @@
#include "common/debug.h" #include "common/debug.h"
namespace rx namespace angle
{ {
MemoryBuffer::MemoryBuffer() // MemoryBuffer implementation.
: mSize(0), MemoryBuffer::MemoryBuffer() : mSize(0), mData(nullptr)
mData(NULL)
{ {
} }
MemoryBuffer::~MemoryBuffer() MemoryBuffer::~MemoryBuffer()
{ {
free(mData); free(mData);
mData = NULL; mData = nullptr;
} }
bool MemoryBuffer::resize(size_t size) bool MemoryBuffer::resize(size_t size)
...@@ -31,7 +30,7 @@ bool MemoryBuffer::resize(size_t size) ...@@ -31,7 +30,7 @@ bool MemoryBuffer::resize(size_t size)
if (size == 0) if (size == 0)
{ {
free(mData); free(mData);
mData = NULL; mData = nullptr;
mSize = 0; mSize = 0;
return true; return true;
} }
...@@ -43,7 +42,7 @@ bool MemoryBuffer::resize(size_t size) ...@@ -43,7 +42,7 @@ bool MemoryBuffer::resize(size_t size)
// Only reallocate if the size has changed. // Only reallocate if the size has changed.
uint8_t *newMemory = reinterpret_cast<uint8_t*>(malloc(sizeof(uint8_t) * size)); uint8_t *newMemory = reinterpret_cast<uint8_t*>(malloc(sizeof(uint8_t) * size));
if (newMemory == NULL) if (newMemory == nullptr)
{ {
return false; return false;
} }
...@@ -77,4 +76,58 @@ uint8_t *MemoryBuffer::data() ...@@ -77,4 +76,58 @@ uint8_t *MemoryBuffer::data()
return mData; return mData;
} }
// ScratchBuffer implementation.
ScratchBuffer::ScratchBuffer(uint32_t lifetime) : mLifetime(lifetime), mResetCounter(lifetime)
{
}
ScratchBuffer::~ScratchBuffer()
{
} }
bool ScratchBuffer::get(size_t requestedSize, MemoryBuffer **memoryBufferOut)
{
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;
}
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
...@@ -12,10 +12,10 @@ ...@@ -12,10 +12,10 @@
#include <cstddef> #include <cstddef>
#include <stdint.h> #include <stdint.h>
namespace rx namespace angle
{ {
class MemoryBuffer : angle::NonCopyable class MemoryBuffer final : NonCopyable
{ {
public: public:
MemoryBuffer(); MemoryBuffer();
...@@ -33,6 +33,29 @@ class MemoryBuffer : angle::NonCopyable ...@@ -33,6 +33,29 @@ class MemoryBuffer : angle::NonCopyable
uint8_t *mData; uint8_t *mData;
}; };
} class ScratchBuffer final : NonCopyable
{
public:
// 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();
// Returns true with a memory buffer of the requested size, or false on failure.
bool get(size_t requestedSize, MemoryBuffer **memoryBufferOut);
// Ticks the release counter for the scratch buffer. Also done implicitly in get().
void tick();
void clear();
private:
const uint32_t mLifetime;
uint32_t mResetCounter;
MemoryBuffer mScratchMemory;
};
} // namespace angle
#endif // COMMON_MEMORYBUFFER_H_ #endif // COMMON_MEMORYBUFFER_H_
...@@ -45,7 +45,7 @@ struct LinkedUniform : public sh::Uniform ...@@ -45,7 +45,7 @@ struct LinkedUniform : public sh::Uniform
sh::BlockMemberInfo blockInfo; sh::BlockMemberInfo blockInfo;
private: private:
mutable rx::MemoryBuffer mLazyData; mutable angle::MemoryBuffer mLazyData;
}; };
// Helper struct representing a single shader uniform block // Helper struct representing a single shader uniform block
......
...@@ -205,8 +205,8 @@ class Buffer11::EmulatedIndexedStorage : public Buffer11::BufferStorage ...@@ -205,8 +205,8 @@ class Buffer11::EmulatedIndexedStorage : public Buffer11::BufferStorage
private: private:
ID3D11Buffer *mNativeStorage; // contains expanded data for use by D3D ID3D11Buffer *mNativeStorage; // contains expanded data for use by D3D
MemoryBuffer mMemoryBuffer; // original data (not expanded) angle::MemoryBuffer mMemoryBuffer; // original data (not expanded)
MemoryBuffer mIndicesMemoryBuffer; // indices data angle::MemoryBuffer mIndicesMemoryBuffer; // indices data
}; };
// Pack storage represents internal storage for pack buffers. We implement pack buffers // Pack storage represents internal storage for pack buffers. We implement pack buffers
...@@ -237,7 +237,7 @@ class Buffer11::PackStorage : public Buffer11::BufferStorage ...@@ -237,7 +237,7 @@ class Buffer11::PackStorage : public Buffer11::BufferStorage
gl::Error flushQueuedPackCommand(); gl::Error flushQueuedPackCommand();
TextureHelper11 mStagingTexture; TextureHelper11 mStagingTexture;
MemoryBuffer mMemoryBuffer; angle::MemoryBuffer mMemoryBuffer;
std::unique_ptr<PackPixelsParams> mQueuedPackCommand; std::unique_ptr<PackPixelsParams> mQueuedPackCommand;
PackPixelsParams mPackParams; PackPixelsParams mPackParams;
bool mDataModified; bool mDataModified;
...@@ -265,10 +265,10 @@ class Buffer11::SystemMemoryStorage : public Buffer11::BufferStorage ...@@ -265,10 +265,10 @@ class Buffer11::SystemMemoryStorage : public Buffer11::BufferStorage
uint8_t **mapPointerOut) override; uint8_t **mapPointerOut) override;
void unmap() override; void unmap() override;
MemoryBuffer *getSystemCopy() { return &mSystemCopy; } angle::MemoryBuffer *getSystemCopy() { return &mSystemCopy; }
protected: protected:
MemoryBuffer mSystemCopy; angle::MemoryBuffer mSystemCopy;
}; };
Buffer11::Buffer11(const gl::BufferState &state, Renderer11 *renderer) Buffer11::Buffer11(const gl::BufferState &state, Renderer11 *renderer)
...@@ -1274,7 +1274,7 @@ gl::ErrorOrResult<ID3D11Buffer *> Buffer11::EmulatedIndexedStorage::getNativeSto ...@@ -1274,7 +1274,7 @@ gl::ErrorOrResult<ID3D11Buffer *> Buffer11::EmulatedIndexedStorage::getNativeSto
// Expand the memory storage upon request and cache the results. // Expand the memory storage upon request and cache the results.
unsigned int expandedDataSize = unsigned int expandedDataSize =
static_cast<unsigned int>((indexInfo->srcCount * attribute.stride) + offset); static_cast<unsigned int>((indexInfo->srcCount * attribute.stride) + offset);
MemoryBuffer expandedData; angle::MemoryBuffer expandedData;
if (!expandedData.resize(expandedDataSize)) if (!expandedData.resize(expandedDataSize))
{ {
return gl::Error( return gl::Error(
......
...@@ -370,7 +370,7 @@ gl::Error Image11::copyFromFramebuffer(const gl::Offset &destOffset, ...@@ -370,7 +370,7 @@ gl::Error Image11::copyFromFramebuffer(const gl::Offset &destOffset,
if (loadFunction.requiresConversion) if (loadFunction.requiresConversion)
{ {
size_t bufferSize = destFormatInfo.pixelBytes * sourceArea.width * sourceArea.height; size_t bufferSize = destFormatInfo.pixelBytes * sourceArea.width * sourceArea.height;
MemoryBuffer *memoryBuffer = nullptr; angle::MemoryBuffer *memoryBuffer = nullptr;
mRenderer->getScratchMemoryBuffer(bufferSize, &memoryBuffer); mRenderer->getScratchMemoryBuffer(bufferSize, &memoryBuffer);
GLuint memoryBufferRowPitch = destFormatInfo.pixelBytes * sourceArea.width; GLuint memoryBufferRowPitch = destFormatInfo.pixelBytes * sourceArea.width;
......
...@@ -376,10 +376,7 @@ int GetWrapBits(GLenum wrap) ...@@ -376,10 +376,7 @@ int GetWrapBits(GLenum wrap)
} }
} }
// If we request a scratch buffer requesting a smaller size this many times, const uint32_t ScratchMemoryBufferLifetime = 1000;
// release and recreate the scratch buffer. This ensures we don't have a
// degenerate case where we are stuck hogging memory.
const int ScratchMemoryBufferLifetime = 1000;
} // anonymous namespace } // anonymous namespace
...@@ -390,7 +387,7 @@ Renderer11::Renderer11(egl::Display *display) ...@@ -390,7 +387,7 @@ Renderer11::Renderer11(egl::Display *display)
mLastHistogramUpdateTime( mLastHistogramUpdateTime(
ANGLEPlatformCurrent()->monotonicallyIncreasingTime(ANGLEPlatformCurrent())), ANGLEPlatformCurrent()->monotonicallyIncreasingTime(ANGLEPlatformCurrent())),
mDebug(nullptr), mDebug(nullptr),
mScratchMemoryBufferResetCounter(0), mScratchMemoryBuffer(ScratchMemoryBufferLifetime),
mAnnotator(nullptr) mAnnotator(nullptr)
{ {
mVertexDataManager = NULL; mVertexDataManager = NULL;
...@@ -2717,7 +2714,7 @@ void Renderer11::release() ...@@ -2717,7 +2714,7 @@ void Renderer11::release()
{ {
RendererD3D::cleanup(); RendererD3D::cleanup();
mScratchMemoryBuffer.resize(0); mScratchMemoryBuffer.clear();
if (mAnnotator != nullptr) if (mAnnotator != nullptr)
{ {
...@@ -4589,33 +4586,12 @@ FramebufferImpl *Renderer11::createDefaultFramebuffer(const gl::FramebufferState ...@@ -4589,33 +4586,12 @@ FramebufferImpl *Renderer11::createDefaultFramebuffer(const gl::FramebufferState
return new Framebuffer11(state, this); return new Framebuffer11(state, this);
} }
gl::Error Renderer11::getScratchMemoryBuffer(size_t requestedSize, MemoryBuffer **bufferOut) gl::Error Renderer11::getScratchMemoryBuffer(size_t requestedSize, angle::MemoryBuffer **bufferOut)
{ {
if (mScratchMemoryBuffer.size() == requestedSize) if (!mScratchMemoryBuffer.get(requestedSize, bufferOut))
{ {
mScratchMemoryBufferResetCounter = ScratchMemoryBufferLifetime; return gl::OutOfMemory() << "Failed to allocate internal buffer.";
*bufferOut = &mScratchMemoryBuffer;
return gl::NoError();
}
if (mScratchMemoryBuffer.size() > requestedSize)
{
mScratchMemoryBufferResetCounter--;
} }
if (mScratchMemoryBufferResetCounter <= 0 || mScratchMemoryBuffer.size() < requestedSize)
{
mScratchMemoryBuffer.resize(0);
if (!mScratchMemoryBuffer.resize(requestedSize))
{
return gl::Error(GL_OUT_OF_MEMORY, "Failed to allocate internal buffer.");
}
mScratchMemoryBufferResetCounter = ScratchMemoryBufferLifetime;
}
ASSERT(mScratchMemoryBuffer.size() >= requestedSize);
*bufferOut = &mScratchMemoryBuffer;
return gl::NoError(); return gl::NoError();
} }
......
...@@ -377,7 +377,7 @@ class Renderer11 : public RendererD3D ...@@ -377,7 +377,7 @@ class Renderer11 : public RendererD3D
// Necessary hack for default framebuffers in D3D. // Necessary hack for default framebuffers in D3D.
FramebufferImpl *createDefaultFramebuffer(const gl::FramebufferState &state) override; FramebufferImpl *createDefaultFramebuffer(const gl::FramebufferState &state) override;
gl::Error getScratchMemoryBuffer(size_t requestedSize, MemoryBuffer **bufferOut); gl::Error getScratchMemoryBuffer(size_t requestedSize, angle::MemoryBuffer **bufferOut);
gl::Version getMaxSupportedESVersion() const override; gl::Version getMaxSupportedESVersion() const override;
...@@ -574,8 +574,7 @@ class Renderer11 : public RendererD3D ...@@ -574,8 +574,7 @@ class Renderer11 : public RendererD3D
std::vector<GLuint> mScratchIndexDataBuffer; std::vector<GLuint> mScratchIndexDataBuffer;
MemoryBuffer mScratchMemoryBuffer; angle::ScratchBuffer mScratchMemoryBuffer;
unsigned int mScratchMemoryBufferResetCounter;
gl::DebugAnnotator *mAnnotator; gl::DebugAnnotator *mAnnotator;
......
...@@ -654,7 +654,7 @@ gl::Error TextureStorage11::setData(const gl::ImageIndex &index, ...@@ -654,7 +654,7 @@ gl::Error TextureStorage11::setData(const gl::ImageIndex &index,
UINT bufferDepthPitch = bufferRowPitch * height; UINT bufferDepthPitch = bufferRowPitch * height;
const size_t neededSize = bufferDepthPitch * depth; const size_t neededSize = bufferDepthPitch * depth;
MemoryBuffer *conversionBuffer = nullptr; angle::MemoryBuffer *conversionBuffer = nullptr;
const uint8_t *data = nullptr; const uint8_t *data = nullptr;
LoadImageFunctionInfo loadFunctionInfo = d3d11Format.getLoadFunctions()(type); LoadImageFunctionInfo loadFunctionInfo = d3d11Format.getLoadFunctions()(type);
......
...@@ -54,7 +54,7 @@ class Buffer9 : public BufferD3D ...@@ -54,7 +54,7 @@ class Buffer9 : public BufferD3D
gl::Error markTransformFeedbackUsage() override; gl::Error markTransformFeedbackUsage() override;
private: private:
MemoryBuffer mMemory; angle::MemoryBuffer mMemory;
size_t mSize; size_t mSize;
}; };
......
...@@ -63,7 +63,7 @@ class BufferGL : public BufferImpl ...@@ -63,7 +63,7 @@ class BufferGL : public BufferImpl
size_t mMapSize; size_t mMapSize;
bool mShadowBufferData; bool mShadowBufferData;
MemoryBuffer mShadowCopy; angle::MemoryBuffer mShadowCopy;
size_t mBufferSize; size_t mBufferSize;
...@@ -73,6 +73,6 @@ class BufferGL : public BufferImpl ...@@ -73,6 +73,6 @@ class BufferGL : public BufferImpl
GLuint mBufferID; GLuint mBufferID;
}; };
} } // namespace rx
#endif // LIBANGLE_RENDERER_GL_BUFFERGL_H_ #endif // LIBANGLE_RENDERER_GL_BUFFERGL_H_
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment