Commit 5f56ddb9 by Jamie Madill Committed by Commit Bot

Buffer: Pass Context to all impl methods.

This allows us to retrieve Device handles for Vulkan, and could allow us to avoid storing some pointers for other back-ends. BUG=angleproject:1684 Change-Id: Iccd5b97cf1c3a332d62a38ad0fcf21c352270439 Reviewed-on: https://chromium-review.googlesource.com/426400 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent 34bf2d93
......@@ -82,20 +82,25 @@ Error Buffer::bufferSubData(const Context *context,
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)
{
ANGLE_TRY(mImpl->copySubData(source->getImplementation(), sourceOffset, destOffset, size));
ANGLE_TRY(mImpl->copySubData(rx::SafeGetImpl(context), source->getImplementation(),
sourceOffset, destOffset, size));
mIndexRangeCache.invalidateRange(static_cast<unsigned int>(destOffset), static_cast<unsigned int>(size));
return NoError();
}
Error Buffer::map(GLenum access)
Error Buffer::map(const Context *context, GLenum access)
{
ASSERT(!mState.mMapped);
Error error = mImpl->map(access, &mState.mMapPointer);
Error error = mImpl->map(rx::SafeGetImpl(context), access, &mState.mMapPointer);
if (error.isError())
{
mState.mMapPointer = nullptr;
......@@ -114,12 +119,16 @@ Error Buffer::map(GLenum access)
return error;
}
Error Buffer::mapRange(GLintptr offset, GLsizeiptr length, GLbitfield access)
Error Buffer::mapRange(const Context *context,
GLintptr offset,
GLsizeiptr length,
GLbitfield access)
{
ASSERT(!mState.mMapped);
ASSERT(offset + length <= mState.mSize);
Error error = mImpl->mapRange(offset, length, access, &mState.mMapPointer);
Error error =
mImpl->mapRange(rx::SafeGetImpl(context), offset, length, access, &mState.mMapPointer);
if (error.isError())
{
mState.mMapPointer = nullptr;
......@@ -145,11 +154,11 @@ Error Buffer::mapRange(GLintptr offset, GLsizeiptr length, GLbitfield access)
return error;
}
Error Buffer::unmap(GLboolean *result)
Error Buffer::unmap(const Context *context, GLboolean *result)
{
ASSERT(mState.mMapped);
Error error = mImpl->unmap(result);
Error error = mImpl->unmap(rx::SafeGetImpl(context), result);
if (error.isError())
{
*result = GL_FALSE;
......
......@@ -79,13 +79,14 @@ class Buffer final : public RefCountObject, public LabeledObject
const void *data,
GLsizeiptr size,
GLintptr offset);
Error copyBufferSubData(Buffer *source,
Error copyBufferSubData(const Context *context,
Buffer *source,
GLintptr sourceOffset,
GLintptr destOffset,
GLsizeiptr size);
Error map(GLenum access);
Error mapRange(GLintptr offset, GLsizeiptr length, GLbitfield access);
Error unmap(GLboolean *result);
Error map(const Context *context, GLenum access);
Error mapRange(const Context *context, GLintptr offset, GLsizeiptr length, GLbitfield access);
Error unmap(const Context *context, GLboolean *result);
void onTransformFeedback();
void onPixelUnpack();
......
......@@ -3098,7 +3098,7 @@ GLvoid *Context::mapBuffer(GLenum target, GLenum access)
Buffer *buffer = mGLState.getTargetBuffer(target);
ASSERT(buffer);
Error error = buffer->map(access);
Error error = buffer->map(this, access);
if (error.isError())
{
handleError(error);
......@@ -3114,7 +3114,7 @@ GLboolean Context::unmapBuffer(GLenum target)
ASSERT(buffer);
GLboolean result;
Error error = buffer->unmap(&result);
Error error = buffer->unmap(this, &result);
if (error.isError())
{
handleError(error);
......@@ -3132,7 +3132,7 @@ GLvoid *Context::mapBufferRange(GLenum target,
Buffer *buffer = mGLState.getTargetBuffer(target);
ASSERT(buffer);
Error error = buffer->mapRange(offset, length, access);
Error error = buffer->mapRange(this, offset, length, access);
if (error.isError())
{
handleError(error);
......@@ -3596,7 +3596,7 @@ void Context::copyBufferSubData(GLenum readTarget,
Buffer *readBuffer = mGLState.getTargetBuffer(readTarget);
Buffer *writeBuffer = mGLState.getTargetBuffer(writeTarget);
handleError(writeBuffer->copyBufferSubData(readBuffer, readOffset, writeOffset, size));
handleError(writeBuffer->copyBufferSubData(this, readBuffer, readOffset, writeOffset, size));
}
void Context::bindAttribLocation(GLuint program, GLuint index, const GLchar *name)
......
......@@ -40,13 +40,18 @@ class BufferImpl : angle::NonCopyable
const void *data,
size_t size,
size_t offset) = 0;
virtual gl::Error copySubData(BufferImpl *source,
virtual gl::Error copySubData(ContextImpl *contextImpl,
BufferImpl *source,
GLintptr sourceOffset,
GLintptr destOffset,
GLsizeiptr size) = 0;
virtual gl::Error map(GLenum access, GLvoid **mapPtr) = 0;
virtual gl::Error mapRange(size_t offset, size_t length, GLbitfield access, GLvoid **mapPtr) = 0;
virtual gl::Error unmap(GLboolean *result) = 0;
virtual gl::Error map(ContextImpl *contextImpl, GLenum access, GLvoid **mapPtr) = 0;
virtual gl::Error mapRange(ContextImpl *contextImpl,
size_t offset,
size_t length,
GLbitfield access,
GLvoid **mapPtr) = 0;
virtual gl::Error unmap(ContextImpl *contextImpl, GLboolean *result) = 0;
virtual gl::Error getIndexRange(GLenum type,
size_t offset,
......
......@@ -11,6 +11,7 @@
#include "gmock/gmock.h"
#include "libANGLE/Buffer.h"
#include "libANGLE/renderer/BufferImpl.h"
namespace rx
......@@ -23,10 +24,12 @@ class MockBufferImpl : public BufferImpl
MOCK_METHOD5(setData, gl::Error(ContextImpl *, GLenum, const void *, size_t, GLenum));
MOCK_METHOD5(setSubData, gl::Error(ContextImpl *, GLenum, const void *, size_t, size_t));
MOCK_METHOD4(copySubData, gl::Error(BufferImpl *, GLintptr, GLintptr, GLsizeiptr));
MOCK_METHOD2(map, gl::Error(GLenum, GLvoid **));
MOCK_METHOD4(mapRange, gl::Error(size_t, size_t, GLbitfield, GLvoid **));
MOCK_METHOD1(unmap, gl::Error(GLboolean *result));
MOCK_METHOD5(copySubData,
gl::Error(ContextImpl *contextImpl, BufferImpl *, GLintptr, GLintptr, GLsizeiptr));
MOCK_METHOD3(map, gl::Error(ContextImpl *contextImpl, GLenum, GLvoid **));
MOCK_METHOD5(mapRange,
gl::Error(ContextImpl *contextImpl, size_t, size_t, GLbitfield, GLvoid **));
MOCK_METHOD2(unmap, gl::Error(ContextImpl *contextImpl, GLboolean *result));
MOCK_METHOD5(getIndexRange, gl::Error(GLenum, size_t, size_t, bool, gl::IndexRange *));
......
......@@ -388,7 +388,8 @@ gl::Error Buffer11::setSubData(ContextImpl * /*context*/,
return gl::NoError();
}
gl::Error Buffer11::copySubData(BufferImpl *source,
gl::Error Buffer11::copySubData(ContextImpl *context,
BufferImpl *source,
GLintptr sourceOffset,
GLintptr destOffset,
GLsizeiptr size)
......@@ -451,15 +452,19 @@ gl::Error Buffer11::copySubData(BufferImpl *source,
return gl::NoError();
}
gl::Error Buffer11::map(GLenum access, GLvoid **mapPtr)
gl::Error Buffer11::map(ContextImpl *context, GLenum access, GLvoid **mapPtr)
{
// GL_OES_mapbuffer uses an enum instead of a bitfield for it's access, convert to a bitfield
// and call mapRange.
ASSERT(access == GL_WRITE_ONLY_OES);
return mapRange(0, mSize, GL_MAP_WRITE_BIT, mapPtr);
return mapRange(context, 0, mSize, GL_MAP_WRITE_BIT, mapPtr);
}
gl::Error Buffer11::mapRange(size_t offset, size_t length, GLbitfield access, GLvoid **mapPtr)
gl::Error Buffer11::mapRange(ContextImpl *context,
size_t offset,
size_t length,
GLbitfield access,
GLvoid **mapPtr)
{
ASSERT(!mMappedStorage);
......@@ -499,7 +504,7 @@ gl::Error Buffer11::mapRange(size_t offset, size_t length, GLbitfield access, GL
return gl::NoError();
}
gl::Error Buffer11::unmap(GLboolean *result)
gl::Error Buffer11::unmap(ContextImpl *context, GLboolean *result)
{
ASSERT(mMappedStorage);
mMappedStorage->unmap();
......
......@@ -84,13 +84,18 @@ class Buffer11 : public BufferD3D
const void *data,
size_t size,
size_t offset) override;
gl::Error copySubData(BufferImpl *source,
gl::Error copySubData(ContextImpl *contextImpl,
BufferImpl *source,
GLintptr sourceOffset,
GLintptr destOffset,
GLsizeiptr size) override;
gl::Error map(GLenum access, GLvoid **mapPtr) override;
gl::Error mapRange(size_t offset, size_t length, GLbitfield access, GLvoid **mapPtr) override;
gl::Error unmap(GLboolean *result) override;
gl::Error map(ContextImpl *contextImpl, GLenum access, GLvoid **mapPtr) override;
gl::Error mapRange(ContextImpl *contextImpl,
size_t offset,
size_t length,
GLbitfield access,
GLvoid **mapPtr) override;
gl::Error unmap(ContextImpl *contextImpl, GLboolean *result) override;
gl::Error markTransformFeedbackUsage() override;
// We use two set of dirty events. Static buffers are marked dirty whenever
......
......@@ -79,7 +79,11 @@ gl::Error Buffer9::setSubData(ContextImpl * /*context*/,
return gl::NoError();
}
gl::Error Buffer9::copySubData(BufferImpl* source, GLintptr sourceOffset, GLintptr destOffset, GLsizeiptr size)
gl::Error Buffer9::copySubData(ContextImpl *context,
BufferImpl *source,
GLintptr sourceOffset,
GLintptr destOffset,
GLsizeiptr size)
{
// Note: this method is currently unreachable
Buffer9* sourceBuffer = GetAs<Buffer9>(source);
......@@ -93,19 +97,23 @@ gl::Error Buffer9::copySubData(BufferImpl* source, GLintptr sourceOffset, GLintp
}
// We do not support buffer mapping in D3D9
gl::Error Buffer9::map(GLenum access, GLvoid **mapPtr)
gl::Error Buffer9::map(ContextImpl *context, GLenum access, GLvoid **mapPtr)
{
UNREACHABLE();
return gl::Error(GL_INVALID_OPERATION);
}
gl::Error Buffer9::mapRange(size_t offset, size_t length, GLbitfield access, GLvoid **mapPtr)
gl::Error Buffer9::mapRange(ContextImpl *context,
size_t offset,
size_t length,
GLbitfield access,
GLvoid **mapPtr)
{
UNREACHABLE();
return gl::Error(GL_INVALID_OPERATION);
}
gl::Error Buffer9::unmap(GLboolean *result)
gl::Error Buffer9::unmap(ContextImpl *context, GLboolean *result)
{
UNREACHABLE();
return gl::Error(GL_INVALID_OPERATION);
......
......@@ -39,13 +39,18 @@ class Buffer9 : public BufferD3D
const void *data,
size_t size,
size_t offset) override;
gl::Error copySubData(BufferImpl *source,
gl::Error copySubData(ContextImpl *context,
BufferImpl *source,
GLintptr sourceOffset,
GLintptr destOffset,
GLsizeiptr size) override;
gl::Error map(GLenum access, GLvoid **mapPtr) override;
gl::Error mapRange(size_t offset, size_t length, GLbitfield access, GLvoid **mapPtr) override;
gl::Error unmap(GLboolean *result) override;
gl::Error map(ContextImpl *context, GLenum access, GLvoid **mapPtr) override;
gl::Error mapRange(ContextImpl *context,
size_t offset,
size_t length,
GLbitfield access,
GLvoid **mapPtr) override;
gl::Error unmap(ContextImpl *context, GLboolean *result) override;
gl::Error markTransformFeedbackUsage() override;
private:
......
......@@ -99,7 +99,11 @@ gl::Error BufferGL::setSubData(ContextImpl * /*context*/,
return gl::NoError();
}
gl::Error BufferGL::copySubData(BufferImpl* source, GLintptr sourceOffset, GLintptr destOffset, GLsizeiptr size)
gl::Error BufferGL::copySubData(ContextImpl *context,
BufferImpl *source,
GLintptr sourceOffset,
GLintptr destOffset,
GLsizeiptr size)
{
BufferGL *sourceGL = GetAs<BufferGL>(source);
......@@ -117,7 +121,7 @@ gl::Error BufferGL::copySubData(BufferImpl* source, GLintptr sourceOffset, GLint
return gl::NoError();
}
gl::Error BufferGL::map(GLenum access, GLvoid **mapPtr)
gl::Error BufferGL::map(ContextImpl *context, GLenum access, GLvoid **mapPtr)
{
if (mShadowBufferData)
{
......@@ -143,7 +147,11 @@ gl::Error BufferGL::map(GLenum access, GLvoid **mapPtr)
return gl::NoError();
}
gl::Error BufferGL::mapRange(size_t offset, size_t length, GLbitfield access, GLvoid **mapPtr)
gl::Error BufferGL::mapRange(ContextImpl *context,
size_t offset,
size_t length,
GLbitfield access,
GLvoid **mapPtr)
{
if (mShadowBufferData)
{
......@@ -162,7 +170,7 @@ gl::Error BufferGL::mapRange(size_t offset, size_t length, GLbitfield access, GL
return gl::NoError();
}
gl::Error BufferGL::unmap(GLboolean *result)
gl::Error BufferGL::unmap(ContextImpl *context, GLboolean *result)
{
ASSERT(result);
ASSERT(mIsMapped);
......
......@@ -36,10 +36,18 @@ class BufferGL : public BufferImpl
const void *data,
size_t size,
size_t offset) override;
gl::Error copySubData(BufferImpl* source, GLintptr sourceOffset, GLintptr destOffset, GLsizeiptr size) override;
gl::Error map(GLenum access, GLvoid **mapPtr) override;
gl::Error mapRange(size_t offset, size_t length, GLbitfield access, GLvoid **mapPtr) override;
gl::Error unmap(GLboolean *result) override;
gl::Error copySubData(ContextImpl *contextImpl,
BufferImpl *source,
GLintptr sourceOffset,
GLintptr destOffset,
GLsizeiptr size) override;
gl::Error map(ContextImpl *contextImpl, GLenum access, GLvoid **mapPtr) override;
gl::Error mapRange(ContextImpl *contextImpl,
size_t offset,
size_t length,
GLbitfield access,
GLvoid **mapPtr) override;
gl::Error unmap(ContextImpl *contextImpl, GLboolean *result) override;
gl::Error getIndexRange(GLenum type,
size_t offset,
......
......@@ -51,7 +51,8 @@ gl::Error BufferNULL::setSubData(ContextImpl *context,
return gl::NoError();
}
gl::Error BufferNULL::copySubData(BufferImpl *source,
gl::Error BufferNULL::copySubData(ContextImpl *context,
BufferImpl *source,
GLintptr sourceOffset,
GLintptr destOffset,
GLsizeiptr size)
......@@ -64,19 +65,23 @@ gl::Error BufferNULL::copySubData(BufferImpl *source,
return gl::NoError();
}
gl::Error BufferNULL::map(GLenum access, GLvoid **mapPtr)
gl::Error BufferNULL::map(ContextImpl *context, GLenum access, GLvoid **mapPtr)
{
*mapPtr = mData.data();
return gl::NoError();
}
gl::Error BufferNULL::mapRange(size_t offset, size_t length, GLbitfield access, GLvoid **mapPtr)
gl::Error BufferNULL::mapRange(ContextImpl *context,
size_t offset,
size_t length,
GLbitfield access,
GLvoid **mapPtr)
{
*mapPtr = mData.data() + offset;
return gl::NoError();
}
gl::Error BufferNULL::unmap(GLboolean *result)
gl::Error BufferNULL::unmap(ContextImpl *context, GLboolean *result)
{
*result = GL_TRUE;
return gl::NoError();
......
......@@ -31,13 +31,18 @@ class BufferNULL : public BufferImpl
const void *data,
size_t size,
size_t offset) override;
gl::Error copySubData(BufferImpl *source,
gl::Error copySubData(ContextImpl *contextImpl,
BufferImpl *source,
GLintptr sourceOffset,
GLintptr destOffset,
GLsizeiptr size) override;
gl::Error map(GLenum access, GLvoid **mapPtr) override;
gl::Error mapRange(size_t offset, size_t length, GLbitfield access, GLvoid **mapPtr) override;
gl::Error unmap(GLboolean *result) override;
gl::Error map(ContextImpl *contextImpl, GLenum access, GLvoid **mapPtr) override;
gl::Error mapRange(ContextImpl *contextImpl,
size_t offset,
size_t length,
GLbitfield access,
GLvoid **mapPtr) override;
gl::Error unmap(ContextImpl *contextImpl, GLboolean *result) override;
gl::Error getIndexRange(GLenum type,
size_t offset,
......
......@@ -100,7 +100,8 @@ gl::Error BufferVk::setSubData(ContextImpl *context,
return gl::NoError();
}
gl::Error BufferVk::copySubData(BufferImpl *source,
gl::Error BufferVk::copySubData(ContextImpl *context,
BufferImpl *source,
GLintptr sourceOffset,
GLintptr destOffset,
GLsizeiptr size)
......@@ -109,7 +110,7 @@ gl::Error BufferVk::copySubData(BufferImpl *source,
return gl::Error(GL_INVALID_OPERATION);
}
gl::Error BufferVk::map(GLenum access, GLvoid **mapPtr)
gl::Error BufferVk::map(ContextImpl *context, GLenum access, GLvoid **mapPtr)
{
ASSERT(mBuffer.getHandle() != VK_NULL_HANDLE);
ASSERT(mBuffer.getMemory().getHandle() != VK_NULL_HANDLE);
......@@ -120,7 +121,11 @@ gl::Error BufferVk::map(GLenum access, GLvoid **mapPtr)
return gl::NoError();
}
gl::Error BufferVk::mapRange(size_t offset, size_t length, GLbitfield access, GLvoid **mapPtr)
gl::Error BufferVk::mapRange(ContextImpl *context,
size_t offset,
size_t length,
GLbitfield access,
GLvoid **mapPtr)
{
ASSERT(mBuffer.getHandle() != VK_NULL_HANDLE);
ASSERT(mBuffer.getMemory().getHandle() != VK_NULL_HANDLE);
......@@ -130,7 +135,7 @@ gl::Error BufferVk::mapRange(size_t offset, size_t length, GLbitfield access, GL
return gl::NoError();
}
gl::Error BufferVk::unmap(GLboolean *result)
gl::Error BufferVk::unmap(ContextImpl *context, GLboolean *result)
{
ASSERT(mBuffer.getHandle() != VK_NULL_HANDLE);
ASSERT(mBuffer.getMemory().getHandle() != VK_NULL_HANDLE);
......
......@@ -32,13 +32,18 @@ class BufferVk : public BufferImpl
const void *data,
size_t size,
size_t offset) override;
gl::Error copySubData(BufferImpl *source,
gl::Error copySubData(ContextImpl *contextImpl,
BufferImpl *source,
GLintptr sourceOffset,
GLintptr destOffset,
GLsizeiptr size) override;
gl::Error map(GLenum access, GLvoid **mapPtr) override;
gl::Error mapRange(size_t offset, size_t length, GLbitfield access, GLvoid **mapPtr) override;
gl::Error unmap(GLboolean *result) override;
gl::Error map(ContextImpl *contextImpl, GLenum access, GLvoid **mapPtr) override;
gl::Error mapRange(ContextImpl *contextImpl,
size_t offset,
size_t length,
GLbitfield access,
GLvoid **mapPtr) override;
gl::Error unmap(ContextImpl *contextImpl, GLboolean *result) override;
gl::Error getIndexRange(GLenum type,
size_t offset,
......
......@@ -166,7 +166,7 @@ TEST_P(D3D11EmulatedIndexedBufferTest, TestSourceBufferRemainsUntouchedAfterExpa
// Copy the original source buffer before any expand calls have been made
gl::BufferState cleanSourceState;
rx::Buffer11 *cleanSourceBuffer = new rx::Buffer11(cleanSourceState, mRenderer);
cleanSourceBuffer->copySubData(mSourceBuffer, 0, 0, mSourceBuffer->getSize());
cleanSourceBuffer->copySubData(nullptr, mSourceBuffer, 0, 0, mSourceBuffer->getSize());
// Do a basic exanded and compare test.
rx::SourceIndexData srcData = {nullptr, muintIndices.data(),
......
......@@ -94,10 +94,12 @@ class MockBufferD3D : public rx::BufferD3D
}
MOCK_METHOD5(setSubData, gl::Error(rx::ContextImpl *, GLenum, const void *, size_t, size_t));
MOCK_METHOD4(copySubData, gl::Error(BufferImpl*, GLintptr, GLintptr, GLsizeiptr));
MOCK_METHOD2(map, gl::Error(GLenum, GLvoid **));
MOCK_METHOD4(mapRange, gl::Error(size_t, size_t, GLbitfield, GLvoid **));
MOCK_METHOD1(unmap, gl::Error(GLboolean *));
MOCK_METHOD5(copySubData,
gl::Error(rx::ContextImpl *context, BufferImpl *, GLintptr, GLintptr, GLsizeiptr));
MOCK_METHOD3(map, gl::Error(rx::ContextImpl *context, GLenum, GLvoid **));
MOCK_METHOD5(mapRange,
gl::Error(rx::ContextImpl *context, size_t, size_t, GLbitfield, GLvoid **));
MOCK_METHOD2(unmap, gl::Error(rx::ContextImpl *context, GLboolean *));
// BufferD3D
MOCK_METHOD0(markTransformFeedbackUsage, gl::Error());
......
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