summaryrefslogtreecommitdiffstats
path: root/src/3rdparty/angle/src/libANGLE/Buffer.cpp
diff options
context:
space:
mode:
authorMiguel Costa <miguel.costa@qt.io>2018-06-26 16:56:45 +0200
committerAndre de la Rocha <andre.rocha@qt.io>2018-10-13 21:36:35 +0000
commit0a7aebadfbb3534284546aa3ca8612314c08f136 (patch)
treee94ee33ae3bb9b96fc3047c6455d47ac4920bfbf /src/3rdparty/angle/src/libANGLE/Buffer.cpp
parent656e89f875ad2008ca16cc673b687a22daa294c9 (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.cpp187
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