Commit b3f26b9e by Jamie Madill Committed by Commit Bot

Add a zero-filled scratch buffer to Context.

We need this in a few places for handling resource init. Centralize this in the context so we don't have to recreate and re-fill a large zero buffer. BUG=angleproject:2107 Change-Id: Icf9ce417e7ee3498f03e47741dfff89e81b49519 Reviewed-on: https://chromium-review.googlesource.com/576057Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>
parent ab918821
...@@ -108,6 +108,20 @@ ScratchBuffer::~ScratchBuffer() ...@@ -108,6 +108,20 @@ ScratchBuffer::~ScratchBuffer()
bool ScratchBuffer::get(size_t requestedSize, MemoryBuffer **memoryBufferOut) 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) if (mScratchMemory.size() == requestedSize)
{ {
mResetCounter = mLifetime; mResetCounter = mLifetime;
...@@ -128,6 +142,10 @@ bool ScratchBuffer::get(size_t requestedSize, MemoryBuffer **memoryBufferOut) ...@@ -128,6 +142,10 @@ bool ScratchBuffer::get(size_t requestedSize, MemoryBuffer **memoryBufferOut)
return false; return false;
} }
mResetCounter = mLifetime; mResetCounter = mLifetime;
if (initValue.valid())
{
mScratchMemory.fill(initValue.value());
}
} }
ASSERT(mScratchMemory.size() >= requestedSize); ASSERT(mScratchMemory.size() >= requestedSize);
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#ifndef COMMON_MEMORYBUFFER_H_ #ifndef COMMON_MEMORYBUFFER_H_
#define COMMON_MEMORYBUFFER_H_ #define COMMON_MEMORYBUFFER_H_
#include "common/Optional.h"
#include "common/angleutils.h" #include "common/angleutils.h"
#include <stdint.h> #include <stdint.h>
...@@ -50,12 +51,17 @@ class ScratchBuffer final : NonCopyable ...@@ -50,12 +51,17 @@ class ScratchBuffer final : NonCopyable
// Returns true with a memory buffer of the requested size, or false on failure. // Returns true with a memory buffer of the requested size, or false on failure.
bool get(size_t requestedSize, MemoryBuffer **memoryBufferOut); 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(). // Ticks the release counter for the scratch buffer. Also done implicitly in get().
void tick(); void tick();
void clear(); void clear();
private: private:
bool getImpl(size_t requestedSize, MemoryBuffer **memoryBufferOut, Optional<uint8_t> initValue);
const uint32_t mLifetime; const uint32_t mLifetime;
uint32_t mResetCounter; uint32_t mResetCounter;
MemoryBuffer mScratchMemory; MemoryBuffer mScratchMemory;
......
...@@ -75,8 +75,7 @@ Error Buffer::bufferData(const Context *context, ...@@ -75,8 +75,7 @@ Error Buffer::bufferData(const Context *context,
if (context && context->getGLState().isRobustResourceInitEnabled() && !data && size > 0) if (context && context->getGLState().isRobustResourceInitEnabled() && !data && size > 0)
{ {
angle::MemoryBuffer *scratchBuffer = nullptr; angle::MemoryBuffer *scratchBuffer = nullptr;
ANGLE_TRY(context->getScratchBuffer(static_cast<size_t>(size), &scratchBuffer)); ANGLE_TRY(context->getZeroFilledBuffer(static_cast<size_t>(size), &scratchBuffer));
std::fill(scratchBuffer->data(), scratchBuffer->data() + size, static_cast<uint8_t>(0));
dataForImpl = scratchBuffer->data(); dataForImpl = scratchBuffer->data();
} }
......
...@@ -272,7 +272,8 @@ Context::Context(rx::EGLImplFactory *implFactory, ...@@ -272,7 +272,8 @@ Context::Context(rx::EGLImplFactory *implFactory,
mSurfacelessFramebuffer(nullptr), mSurfacelessFramebuffer(nullptr),
mWebGLContext(GetWebGLContext(attribs)), mWebGLContext(GetWebGLContext(attribs)),
mMemoryProgramCache(memoryProgramCache), mMemoryProgramCache(memoryProgramCache),
mScratchBuffer(1000u) mScratchBuffer(1000u),
mZeroFilledBuffer(1000u)
{ {
if (mRobustAccess) if (mRobustAccess)
{ {
...@@ -4171,9 +4172,20 @@ void Context::setFramebufferParameteri(GLenum target, GLenum pname, GLint param) ...@@ -4171,9 +4172,20 @@ void Context::setFramebufferParameteri(GLenum target, GLenum pname, GLint param)
SetFramebufferParameteri(framebuffer, pname, param); SetFramebufferParameteri(framebuffer, pname, param);
} }
Error Context::getScratchBuffer(size_t requestedSize, angle::MemoryBuffer **scratchBufferOut) const Error Context::getScratchBuffer(size_t requstedSizeBytes,
angle::MemoryBuffer **scratchBufferOut) const
{ {
if (!mScratchBuffer.get(requestedSize, scratchBufferOut)) if (!mScratchBuffer.get(requstedSizeBytes, scratchBufferOut))
{
return OutOfMemory() << "Failed to allocate internal buffer.";
}
return NoError();
}
Error Context::getZeroFilledBuffer(size_t requstedSizeBytes,
angle::MemoryBuffer **zeroBufferOut) const
{
if (!mZeroFilledBuffer.getInitialized(requstedSizeBytes, zeroBufferOut, 0))
{ {
return OutOfMemory() << "Failed to allocate internal buffer."; return OutOfMemory() << "Failed to allocate internal buffer.";
} }
......
...@@ -793,7 +793,8 @@ class Context final : public ValidationContext ...@@ -793,7 +793,8 @@ class Context final : public ValidationContext
void getFramebufferParameteriv(GLenum target, GLenum pname, GLint *params); void getFramebufferParameteriv(GLenum target, GLenum pname, GLint *params);
void setFramebufferParameteri(GLenum target, GLenum pname, GLint param); void setFramebufferParameteri(GLenum target, GLenum pname, GLint param);
Error getScratchBuffer(size_t requestedSize, angle::MemoryBuffer **scratchBufferOut) const; Error getScratchBuffer(size_t requestedSizeBytes, angle::MemoryBuffer **scratchBufferOut) const;
Error getZeroFilledBuffer(size_t requstedSizeBytes, angle::MemoryBuffer **zeroBufferOut) const;
void dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ); void dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ);
...@@ -915,6 +916,7 @@ class Context final : public ValidationContext ...@@ -915,6 +916,7 @@ class Context final : public ValidationContext
// Not really a property of context state. The size and contexts change per-api-call. // Not really a property of context state. The size and contexts change per-api-call.
mutable angle::ScratchBuffer mScratchBuffer; mutable angle::ScratchBuffer mScratchBuffer;
mutable angle::ScratchBuffer mZeroFilledBuffer;
}; };
template <EntryPoint EP, typename... ArgsT> template <EntryPoint EP, typename... ArgsT>
......
...@@ -888,9 +888,8 @@ gl::Error TextureD3D_2D::copyImage(const gl::Context *context, ...@@ -888,9 +888,8 @@ gl::Error TextureD3D_2D::copyImage(const gl::Context *context,
!mRenderer->isRobustResourceInitEnabled()) !mRenderer->isRobustResourceInitEnabled())
{ {
angle::MemoryBuffer *zero; angle::MemoryBuffer *zero;
ANGLE_TRY(context->getScratchBuffer( ANGLE_TRY(context->getZeroFilledBuffer(
origSourceArea.width * origSourceArea.height * internalFormatInfo.pixelBytes, &zero)); origSourceArea.width * origSourceArea.height * internalFormatInfo.pixelBytes, &zero));
zero->fill(0);
setImage(context, target, imageLevel, internalFormat, sourceExtents, setImage(context, target, imageLevel, internalFormat, sourceExtents,
internalFormatInfo.format, internalFormatInfo.type, gl::PixelUnpackState(1, 0), internalFormatInfo.format, internalFormatInfo.type, gl::PixelUnpackState(1, 0),
zero->data()); zero->data());
......
...@@ -575,9 +575,8 @@ gl::Error TextureGL::copyImage(const gl::Context *context, ...@@ -575,9 +575,8 @@ gl::Error TextureGL::copyImage(const gl::Context *context,
GLuint pixelBytes = GLuint pixelBytes =
gl::GetInternalFormatInfo(copyTexImageFormat.internalFormat, type).pixelBytes; gl::GetInternalFormatInfo(copyTexImageFormat.internalFormat, type).pixelBytes;
angle::MemoryBuffer *zero; angle::MemoryBuffer *zero;
ANGLE_TRY(context->getScratchBuffer( ANGLE_TRY(context->getZeroFilledBuffer(
origSourceArea.width * origSourceArea.height * pixelBytes, &zero)); origSourceArea.width * origSourceArea.height * pixelBytes, &zero));
zero->fill(0);
mStateManager->setPixelUnpackState(gl::PixelUnpackState(1, 0)); mStateManager->setPixelUnpackState(gl::PixelUnpackState(1, 0));
mFunctions->texImage2D(target, static_cast<GLint>(level), copyTexImageFormat.internalFormat, mFunctions->texImage2D(target, static_cast<GLint>(level), copyTexImageFormat.internalFormat,
origSourceArea.width, origSourceArea.height, 0, origSourceArea.width, origSourceArea.height, 0,
......
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