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()
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;
......@@ -128,6 +142,10 @@ bool ScratchBuffer::get(size_t requestedSize, MemoryBuffer **memoryBufferOut)
return false;
}
mResetCounter = mLifetime;
if (initValue.valid())
{
mScratchMemory.fill(initValue.value());
}
}
ASSERT(mScratchMemory.size() >= requestedSize);
......
......@@ -7,6 +7,7 @@
#ifndef COMMON_MEMORYBUFFER_H_
#define COMMON_MEMORYBUFFER_H_
#include "common/Optional.h"
#include "common/angleutils.h"
#include <stdint.h>
......@@ -50,12 +51,17 @@ class ScratchBuffer final : NonCopyable
// Returns true with a memory buffer of the requested size, or false on failure.
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().
void tick();
void clear();
private:
bool getImpl(size_t requestedSize, MemoryBuffer **memoryBufferOut, Optional<uint8_t> initValue);
const uint32_t mLifetime;
uint32_t mResetCounter;
MemoryBuffer mScratchMemory;
......
......@@ -75,8 +75,7 @@ Error Buffer::bufferData(const Context *context,
if (context && context->getGLState().isRobustResourceInitEnabled() && !data && size > 0)
{
angle::MemoryBuffer *scratchBuffer = nullptr;
ANGLE_TRY(context->getScratchBuffer(static_cast<size_t>(size), &scratchBuffer));
std::fill(scratchBuffer->data(), scratchBuffer->data() + size, static_cast<uint8_t>(0));
ANGLE_TRY(context->getZeroFilledBuffer(static_cast<size_t>(size), &scratchBuffer));
dataForImpl = scratchBuffer->data();
}
......
......@@ -272,7 +272,8 @@ Context::Context(rx::EGLImplFactory *implFactory,
mSurfacelessFramebuffer(nullptr),
mWebGLContext(GetWebGLContext(attribs)),
mMemoryProgramCache(memoryProgramCache),
mScratchBuffer(1000u)
mScratchBuffer(1000u),
mZeroFilledBuffer(1000u)
{
if (mRobustAccess)
{
......@@ -4171,9 +4172,20 @@ void Context::setFramebufferParameteri(GLenum target, GLenum pname, GLint 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.";
}
......
......@@ -793,7 +793,8 @@ class Context final : public ValidationContext
void getFramebufferParameteriv(GLenum target, GLenum pname, GLint *params);
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);
......@@ -915,6 +916,7 @@ class Context final : public ValidationContext
// Not really a property of context state. The size and contexts change per-api-call.
mutable angle::ScratchBuffer mScratchBuffer;
mutable angle::ScratchBuffer mZeroFilledBuffer;
};
template <EntryPoint EP, typename... ArgsT>
......
......@@ -888,9 +888,8 @@ gl::Error TextureD3D_2D::copyImage(const gl::Context *context,
!mRenderer->isRobustResourceInitEnabled())
{
angle::MemoryBuffer *zero;
ANGLE_TRY(context->getScratchBuffer(
ANGLE_TRY(context->getZeroFilledBuffer(
origSourceArea.width * origSourceArea.height * internalFormatInfo.pixelBytes, &zero));
zero->fill(0);
setImage(context, target, imageLevel, internalFormat, sourceExtents,
internalFormatInfo.format, internalFormatInfo.type, gl::PixelUnpackState(1, 0),
zero->data());
......
......@@ -575,9 +575,8 @@ gl::Error TextureGL::copyImage(const gl::Context *context,
GLuint pixelBytes =
gl::GetInternalFormatInfo(copyTexImageFormat.internalFormat, type).pixelBytes;
angle::MemoryBuffer *zero;
ANGLE_TRY(context->getScratchBuffer(
ANGLE_TRY(context->getZeroFilledBuffer(
origSourceArea.width * origSourceArea.height * pixelBytes, &zero));
zero->fill(0);
mStateManager->setPixelUnpackState(gl::PixelUnpackState(1, 0));
mFunctions->texImage2D(target, static_cast<GLint>(level), copyTexImageFormat.internalFormat,
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