diff options
author | Oliver Wolff <oliver.wolff@theqtcompany.com> | 2016-03-24 12:38:18 +0100 |
---|---|---|
committer | Oliver Wolff <oliver.wolff@qt.io> | 2016-04-25 05:57:38 +0000 |
commit | e12ba07322cd61c5cf50c25ed8d1f08f6b1ff879 (patch) | |
tree | d31a44c9f123ed764a00eff7b4fff656a07d54ab /src/3rdparty/angle/src/libANGLE/Buffer.cpp | |
parent | d3dcc6f610b97be7cbfbb0a65988e5940568c825 (diff) |
Update ANGLE to chromium/2651
Change-Id: I1cd32b780b1a0b913fab870e155ae1f4f9ac40d7
Reviewed-by: Maurice Kalinowski <maurice.kalinowski@qt.io>
Diffstat (limited to 'src/3rdparty/angle/src/libANGLE/Buffer.cpp')
-rw-r--r-- | src/3rdparty/angle/src/libANGLE/Buffer.cpp | 91 |
1 files changed, 83 insertions, 8 deletions
diff --git a/src/3rdparty/angle/src/libANGLE/Buffer.cpp b/src/3rdparty/angle/src/libANGLE/Buffer.cpp index f394a6b1d1..589735c5a8 100644 --- a/src/3rdparty/angle/src/libANGLE/Buffer.cpp +++ b/src/3rdparty/angle/src/libANGLE/Buffer.cpp @@ -18,9 +18,11 @@ namespace gl Buffer::Buffer(rx::BufferImpl *impl, GLuint id) : RefCountObject(id), mBuffer(impl), - mUsage(GL_DYNAMIC_DRAW), + mLabel(), + mUsage(GL_STATIC_DRAW), mSize(0), mAccessFlags(0), + mAccess(GL_WRITE_ONLY_OES), mMapped(GL_FALSE), mMapPointer(NULL), mMapOffset(0), @@ -33,6 +35,16 @@ Buffer::~Buffer() SafeDelete(mBuffer); } +void Buffer::setLabel(const std::string &label) +{ + mLabel = label; +} + +const std::string &Buffer::getLabel() const +{ + return mLabel; +} + Error Buffer::bufferData(const void *data, GLsizeiptr size, GLenum usage) { gl::Error error = mBuffer->setData(data, size, usage); @@ -56,7 +68,7 @@ Error Buffer::bufferSubData(const void *data, GLsizeiptr size, GLintptr offset) return error; } - mIndexRangeCache.invalidateRange(offset, size); + mIndexRangeCache.invalidateRange(static_cast<unsigned int>(offset), static_cast<unsigned int>(size)); return error; } @@ -69,7 +81,30 @@ Error Buffer::copyBufferSubData(Buffer* source, GLintptr sourceOffset, GLintptr return error; } - mIndexRangeCache.invalidateRange(destOffset, size); + mIndexRangeCache.invalidateRange(static_cast<unsigned int>(destOffset), static_cast<unsigned int>(size)); + + return error; +} + +Error Buffer::map(GLenum access) +{ + ASSERT(!mMapped); + + Error error = mBuffer->map(access, &mMapPointer); + if (error.isError()) + { + mMapPointer = NULL; + return error; + } + + ASSERT(access == GL_WRITE_ONLY_OES); + + mMapped = GL_TRUE; + mMapOffset = 0; + mMapLength = mSize; + mAccess = access; + mAccessFlags = GL_MAP_WRITE_BIT; + mIndexRangeCache.clear(); return error; } @@ -79,7 +114,7 @@ Error Buffer::mapRange(GLintptr offset, GLsizeiptr length, GLbitfield access) ASSERT(!mMapped); ASSERT(offset + length <= mSize); - Error error = mBuffer->map(offset, length, access, &mMapPointer); + Error error = mBuffer->mapRange(offset, length, access, &mMapPointer); if (error.isError()) { mMapPointer = NULL; @@ -89,23 +124,30 @@ Error Buffer::mapRange(GLintptr offset, GLsizeiptr length, GLbitfield access) mMapped = GL_TRUE; mMapOffset = static_cast<GLint64>(offset); mMapLength = static_cast<GLint64>(length); - mAccessFlags = static_cast<GLint>(access); + mAccess = GL_WRITE_ONLY_OES; + 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 + // no update for ES3 and the GL_READ_ONLY and GL_READ_WRITE enums don't exist for ES, + // we cannot properly set GL_BUFFER_ACCESS_OES when glMapBufferRange is called. if ((access & GL_MAP_WRITE_BIT) > 0) { - mIndexRangeCache.invalidateRange(offset, length); + mIndexRangeCache.invalidateRange(static_cast<unsigned int>(offset), static_cast<unsigned int>(length)); } return error; } -Error Buffer::unmap() +Error Buffer::unmap(GLboolean *result) { ASSERT(mMapped); - Error error = mBuffer->unmap(); + Error error = mBuffer->unmap(result); if (error.isError()) { + *result = GL_FALSE; return error; } @@ -113,9 +155,42 @@ Error Buffer::unmap() mMapPointer = NULL; mMapOffset = 0; mMapLength = 0; + mAccess = GL_WRITE_ONLY_OES; mAccessFlags = 0; return error; } +void Buffer::onTransformFeedback() +{ + mIndexRangeCache.clear(); +} + +void Buffer::onPixelUnpack() +{ + mIndexRangeCache.clear(); +} + +Error Buffer::getIndexRange(GLenum type, + size_t offset, + size_t count, + bool primitiveRestartEnabled, + IndexRange *outRange) const +{ + if (mIndexRangeCache.findRange(type, offset, count, primitiveRestartEnabled, outRange)) + { + return gl::Error(GL_NO_ERROR); + } + + Error error = mBuffer->getIndexRange(type, offset, count, primitiveRestartEnabled, outRange); + if (error.isError()) + { + return error; + } + + mIndexRangeCache.addRange(type, offset, count, primitiveRestartEnabled, *outRange); + + return Error(GL_NO_ERROR); +} + } |