diff options
author | Miguel Costa <miguel.costa@qt.io> | 2018-06-26 16:56:45 +0200 |
---|---|---|
committer | Andre de la Rocha <andre.rocha@qt.io> | 2018-10-13 21:36:35 +0000 |
commit | 0a7aebadfbb3534284546aa3ca8612314c08f136 (patch) | |
tree | e94ee33ae3bb9b96fc3047c6455d47ac4920bfbf /src/3rdparty/angle/src/libANGLE/Buffer.cpp | |
parent | 656e89f875ad2008ca16cc673b687a22daa294c9 (diff) |
Update ANGLE to chromium/3280
Change-Id: I0802c0d7486f772d361f87a544d6c5af937f4ca1
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
Diffstat (limited to 'src/3rdparty/angle/src/libANGLE/Buffer.cpp')
-rw-r--r-- | src/3rdparty/angle/src/libANGLE/Buffer.cpp | 187 |
1 files changed, 103 insertions, 84 deletions
diff --git a/src/3rdparty/angle/src/libANGLE/Buffer.cpp b/src/3rdparty/angle/src/libANGLE/Buffer.cpp index 589735c5a8..a1ebfc1acb 100644 --- a/src/3rdparty/angle/src/libANGLE/Buffer.cpp +++ b/src/3rdparty/angle/src/libANGLE/Buffer.cpp @@ -9,123 +9,148 @@ // [OpenGL ES 2.0.24] section 2.9 page 21. #include "libANGLE/Buffer.h" + +#include "libANGLE/Context.h" #include "libANGLE/renderer/BufferImpl.h" -#include "libANGLE/renderer/Renderer.h" +#include "libANGLE/renderer/GLImplFactory.h" namespace gl { -Buffer::Buffer(rx::BufferImpl *impl, GLuint id) - : RefCountObject(id), - mBuffer(impl), - mLabel(), - mUsage(GL_STATIC_DRAW), +BufferState::BufferState() + : mLabel(), + mUsage(BufferUsage::StaticDraw), mSize(0), mAccessFlags(0), mAccess(GL_WRITE_ONLY_OES), mMapped(GL_FALSE), - mMapPointer(NULL), + mMapPointer(nullptr), mMapOffset(0), mMapLength(0) { } +BufferState::~BufferState() +{ +} + +Buffer::Buffer(rx::GLImplFactory *factory, GLuint id) + : RefCountObject(id), mImpl(factory->createBuffer(mState)) +{ +} + Buffer::~Buffer() { - SafeDelete(mBuffer); + SafeDelete(mImpl); +} + +Error Buffer::onDestroy(const Context *context) +{ + // In tests, mImpl might be null. + if (mImpl) + mImpl->destroy(context); + return NoError(); } void Buffer::setLabel(const std::string &label) { - mLabel = label; + mState.mLabel = label; } const std::string &Buffer::getLabel() const { - return mLabel; + return mState.mLabel; } -Error Buffer::bufferData(const void *data, GLsizeiptr size, GLenum usage) +Error Buffer::bufferData(const Context *context, + BufferBinding target, + const void *data, + GLsizeiptr size, + BufferUsage usage) { - gl::Error error = mBuffer->setData(data, size, usage); - if (error.isError()) + const void *dataForImpl = data; + + // If we are using robust resource init, make sure the buffer starts cleared. + // Note: the Context is checked for nullptr because of some testing code. + // TODO(jmadill): Investigate lazier clearing. + if (context && context->getGLState().isRobustResourceInitEnabled() && !data && size > 0) { - return error; + angle::MemoryBuffer *scratchBuffer = nullptr; + ANGLE_TRY(context->getZeroFilledBuffer(static_cast<size_t>(size), &scratchBuffer)); + dataForImpl = scratchBuffer->data(); } + ANGLE_TRY(mImpl->setData(context, target, dataForImpl, size, usage)); + mIndexRangeCache.clear(); - mUsage = usage; - mSize = size; + mState.mUsage = usage; + mState.mSize = size; - return error; + return NoError(); } -Error Buffer::bufferSubData(const void *data, GLsizeiptr size, GLintptr offset) +Error Buffer::bufferSubData(const Context *context, + BufferBinding target, + const void *data, + GLsizeiptr size, + GLintptr offset) { - gl::Error error = mBuffer->setSubData(data, size, offset); - if (error.isError()) - { - return error; - } + ANGLE_TRY(mImpl->setSubData(context, target, data, size, offset)); mIndexRangeCache.invalidateRange(static_cast<unsigned int>(offset), static_cast<unsigned int>(size)); - return error; + return NoError(); } -Error Buffer::copyBufferSubData(Buffer* source, GLintptr sourceOffset, GLintptr destOffset, GLsizeiptr size) +Error Buffer::copyBufferSubData(const Context *context, + Buffer *source, + GLintptr sourceOffset, + GLintptr destOffset, + GLsizeiptr size) { - gl::Error error = mBuffer->copySubData(source->getImplementation(), sourceOffset, destOffset, size); - if (error.isError()) - { - return error; - } + ANGLE_TRY( + mImpl->copySubData(context, source->getImplementation(), sourceOffset, destOffset, size)); mIndexRangeCache.invalidateRange(static_cast<unsigned int>(destOffset), static_cast<unsigned int>(size)); - return error; + return NoError(); } -Error Buffer::map(GLenum access) +Error Buffer::map(const Context *context, GLenum access) { - ASSERT(!mMapped); + ASSERT(!mState.mMapped); - Error error = mBuffer->map(access, &mMapPointer); - if (error.isError()) - { - mMapPointer = NULL; - return error; - } + mState.mMapPointer = nullptr; + ANGLE_TRY(mImpl->map(context, access, &mState.mMapPointer)); ASSERT(access == GL_WRITE_ONLY_OES); - mMapped = GL_TRUE; - mMapOffset = 0; - mMapLength = mSize; - mAccess = access; - mAccessFlags = GL_MAP_WRITE_BIT; + mState.mMapped = GL_TRUE; + mState.mMapOffset = 0; + mState.mMapLength = mState.mSize; + mState.mAccess = access; + mState.mAccessFlags = GL_MAP_WRITE_BIT; mIndexRangeCache.clear(); - return error; + return NoError(); } -Error Buffer::mapRange(GLintptr offset, GLsizeiptr length, GLbitfield access) +Error Buffer::mapRange(const Context *context, + GLintptr offset, + GLsizeiptr length, + GLbitfield access) { - ASSERT(!mMapped); - ASSERT(offset + length <= mSize); + ASSERT(!mState.mMapped); + ASSERT(offset + length <= mState.mSize); - Error error = mBuffer->mapRange(offset, length, access, &mMapPointer); - if (error.isError()) - { - mMapPointer = NULL; - return error; - } + mState.mMapPointer = nullptr; + ANGLE_TRY(mImpl->mapRange(context, offset, length, access, &mState.mMapPointer)); - mMapped = GL_TRUE; - mMapOffset = static_cast<GLint64>(offset); - mMapLength = static_cast<GLint64>(length); - mAccess = GL_WRITE_ONLY_OES; - mAccessFlags = access; + mState.mMapped = GL_TRUE; + mState.mMapOffset = static_cast<GLint64>(offset); + mState.mMapLength = static_cast<GLint64>(length); + mState.mAccess = GL_WRITE_ONLY_OES; + mState.mAccessFlags = access; // The OES_mapbuffer extension states that GL_WRITE_ONLY_OES is the only valid // value for GL_BUFFER_ACCESS_OES because it was written against ES2. Since there is @@ -137,28 +162,24 @@ Error Buffer::mapRange(GLintptr offset, GLsizeiptr length, GLbitfield access) mIndexRangeCache.invalidateRange(static_cast<unsigned int>(offset), static_cast<unsigned int>(length)); } - return error; + return NoError(); } -Error Buffer::unmap(GLboolean *result) +Error Buffer::unmap(const Context *context, GLboolean *result) { - ASSERT(mMapped); + ASSERT(mState.mMapped); - Error error = mBuffer->unmap(result); - if (error.isError()) - { - *result = GL_FALSE; - return error; - } + *result = GL_FALSE; + ANGLE_TRY(mImpl->unmap(context, result)); - mMapped = GL_FALSE; - mMapPointer = NULL; - mMapOffset = 0; - mMapLength = 0; - mAccess = GL_WRITE_ONLY_OES; - mAccessFlags = 0; + mState.mMapped = GL_FALSE; + mState.mMapPointer = nullptr; + mState.mMapOffset = 0; + mState.mMapLength = 0; + mState.mAccess = GL_WRITE_ONLY_OES; + mState.mAccessFlags = 0; - return error; + return NoError(); } void Buffer::onTransformFeedback() @@ -171,7 +192,8 @@ void Buffer::onPixelUnpack() mIndexRangeCache.clear(); } -Error Buffer::getIndexRange(GLenum type, +Error Buffer::getIndexRange(const gl::Context *context, + GLenum type, size_t offset, size_t count, bool primitiveRestartEnabled, @@ -179,18 +201,15 @@ Error Buffer::getIndexRange(GLenum type, { if (mIndexRangeCache.findRange(type, offset, count, primitiveRestartEnabled, outRange)) { - return gl::Error(GL_NO_ERROR); + return NoError(); } - Error error = mBuffer->getIndexRange(type, offset, count, primitiveRestartEnabled, outRange); - if (error.isError()) - { - return error; - } + ANGLE_TRY( + mImpl->getIndexRange(context, type, offset, count, primitiveRestartEnabled, outRange)); mIndexRangeCache.addRange(type, offset, count, primitiveRestartEnabled, *outRange); - return Error(GL_NO_ERROR); + return NoError(); } -} +} // namespace gl |