Commit 8f775607 by Jamie Madill Committed by Commit Bot

Introduce a gl::BufferState class.

This state can share vital pieces of information with the impl. The most elementary state is the buffer size, which then the impl doesn't need to replicate. BUG=angleproject:1579 Change-Id: I341393c64a6e49de65c1d53b1bad2fa143209862 Reviewed-on: https://chromium-review.googlesource.com/406644Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>
parent bbe9fb5e
...@@ -10,54 +10,62 @@ ...@@ -10,54 +10,62 @@
#include "libANGLE/Buffer.h" #include "libANGLE/Buffer.h"
#include "libANGLE/renderer/BufferImpl.h" #include "libANGLE/renderer/BufferImpl.h"
#include "libANGLE/renderer/GLImplFactory.h"
namespace gl namespace gl
{ {
Buffer::Buffer(rx::BufferImpl *impl, GLuint id) BufferState::BufferState()
: RefCountObject(id), : mLabel(),
mBuffer(impl),
mLabel(),
mUsage(GL_STATIC_DRAW), mUsage(GL_STATIC_DRAW),
mSize(0), mSize(0),
mAccessFlags(0), mAccessFlags(0),
mAccess(GL_WRITE_ONLY_OES), mAccess(GL_WRITE_ONLY_OES),
mMapped(GL_FALSE), mMapped(GL_FALSE),
mMapPointer(NULL), mMapPointer(nullptr),
mMapOffset(0), mMapOffset(0),
mMapLength(0) mMapLength(0)
{ {
} }
BufferState::~BufferState()
{
}
Buffer::Buffer(rx::GLImplFactory *factory, GLuint id)
: RefCountObject(id), mImpl(factory->createBuffer(mState))
{
}
Buffer::~Buffer() Buffer::~Buffer()
{ {
SafeDelete(mBuffer); SafeDelete(mImpl);
} }
void Buffer::setLabel(const std::string &label) void Buffer::setLabel(const std::string &label)
{ {
mLabel = label; mState.mLabel = label;
} }
const std::string &Buffer::getLabel() const const std::string &Buffer::getLabel() const
{ {
return mLabel; return mState.mLabel;
} }
Error Buffer::bufferData(GLenum target, const void *data, GLsizeiptr size, GLenum usage) Error Buffer::bufferData(GLenum target, const void *data, GLsizeiptr size, GLenum usage)
{ {
ANGLE_TRY(mBuffer->setData(target, data, size, usage)); ANGLE_TRY(mImpl->setData(target, data, size, usage));
mIndexRangeCache.clear(); mIndexRangeCache.clear();
mUsage = usage; mState.mUsage = usage;
mSize = size; mState.mSize = size;
return NoError(); return NoError();
} }
Error Buffer::bufferSubData(GLenum target, const void *data, GLsizeiptr size, GLintptr offset) Error Buffer::bufferSubData(GLenum target, const void *data, GLsizeiptr size, GLintptr offset)
{ {
ANGLE_TRY(mBuffer->setSubData(target, data, size, offset)); ANGLE_TRY(mImpl->setSubData(target, data, size, offset));
mIndexRangeCache.invalidateRange(static_cast<unsigned int>(offset), static_cast<unsigned int>(size)); mIndexRangeCache.invalidateRange(static_cast<unsigned int>(offset), static_cast<unsigned int>(size));
...@@ -66,7 +74,7 @@ Error Buffer::bufferSubData(GLenum target, const void *data, GLsizeiptr size, GL ...@@ -66,7 +74,7 @@ Error Buffer::bufferSubData(GLenum target, const void *data, GLsizeiptr size, GL
Error Buffer::copyBufferSubData(Buffer* source, GLintptr sourceOffset, GLintptr destOffset, GLsizeiptr size) Error Buffer::copyBufferSubData(Buffer* source, GLintptr sourceOffset, GLintptr destOffset, GLsizeiptr size)
{ {
ANGLE_TRY(mBuffer->copySubData(source->getImplementation(), sourceOffset, destOffset, size)); ANGLE_TRY(mImpl->copySubData(source->getImplementation(), sourceOffset, destOffset, size));
mIndexRangeCache.invalidateRange(static_cast<unsigned int>(destOffset), static_cast<unsigned int>(size)); mIndexRangeCache.invalidateRange(static_cast<unsigned int>(destOffset), static_cast<unsigned int>(size));
...@@ -75,22 +83,22 @@ Error Buffer::copyBufferSubData(Buffer* source, GLintptr sourceOffset, GLintptr ...@@ -75,22 +83,22 @@ Error Buffer::copyBufferSubData(Buffer* source, GLintptr sourceOffset, GLintptr
Error Buffer::map(GLenum access) Error Buffer::map(GLenum access)
{ {
ASSERT(!mMapped); ASSERT(!mState.mMapped);
Error error = mBuffer->map(access, &mMapPointer); Error error = mImpl->map(access, &mState.mMapPointer);
if (error.isError()) if (error.isError())
{ {
mMapPointer = NULL; mState.mMapPointer = nullptr;
return error; return error;
} }
ASSERT(access == GL_WRITE_ONLY_OES); ASSERT(access == GL_WRITE_ONLY_OES);
mMapped = GL_TRUE; mState.mMapped = GL_TRUE;
mMapOffset = 0; mState.mMapOffset = 0;
mMapLength = mSize; mState.mMapLength = mState.mSize;
mAccess = access; mState.mAccess = access;
mAccessFlags = GL_MAP_WRITE_BIT; mState.mAccessFlags = GL_MAP_WRITE_BIT;
mIndexRangeCache.clear(); mIndexRangeCache.clear();
return error; return error;
...@@ -98,21 +106,21 @@ Error Buffer::map(GLenum access) ...@@ -98,21 +106,21 @@ Error Buffer::map(GLenum access)
Error Buffer::mapRange(GLintptr offset, GLsizeiptr length, GLbitfield access) Error Buffer::mapRange(GLintptr offset, GLsizeiptr length, GLbitfield access)
{ {
ASSERT(!mMapped); ASSERT(!mState.mMapped);
ASSERT(offset + length <= mSize); ASSERT(offset + length <= mState.mSize);
Error error = mBuffer->mapRange(offset, length, access, &mMapPointer); Error error = mImpl->mapRange(offset, length, access, &mState.mMapPointer);
if (error.isError()) if (error.isError())
{ {
mMapPointer = NULL; mState.mMapPointer = nullptr;
return error; return error;
} }
mMapped = GL_TRUE; mState.mMapped = GL_TRUE;
mMapOffset = static_cast<GLint64>(offset); mState.mMapOffset = static_cast<GLint64>(offset);
mMapLength = static_cast<GLint64>(length); mState.mMapLength = static_cast<GLint64>(length);
mAccess = GL_WRITE_ONLY_OES; mState.mAccess = GL_WRITE_ONLY_OES;
mAccessFlags = access; mState.mAccessFlags = access;
// The OES_mapbuffer extension states that GL_WRITE_ONLY_OES is the only valid // 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 // value for GL_BUFFER_ACCESS_OES because it was written against ES2. Since there is
...@@ -129,21 +137,21 @@ Error Buffer::mapRange(GLintptr offset, GLsizeiptr length, GLbitfield access) ...@@ -129,21 +137,21 @@ Error Buffer::mapRange(GLintptr offset, GLsizeiptr length, GLbitfield access)
Error Buffer::unmap(GLboolean *result) Error Buffer::unmap(GLboolean *result)
{ {
ASSERT(mMapped); ASSERT(mState.mMapped);
Error error = mBuffer->unmap(result); Error error = mImpl->unmap(result);
if (error.isError()) if (error.isError())
{ {
*result = GL_FALSE; *result = GL_FALSE;
return error; return error;
} }
mMapped = GL_FALSE; mState.mMapped = GL_FALSE;
mMapPointer = NULL; mState.mMapPointer = nullptr;
mMapOffset = 0; mState.mMapOffset = 0;
mMapLength = 0; mState.mMapLength = 0;
mAccess = GL_WRITE_ONLY_OES; mState.mAccess = GL_WRITE_ONLY_OES;
mAccessFlags = 0; mState.mAccessFlags = 0;
return error; return error;
} }
...@@ -169,7 +177,7 @@ Error Buffer::getIndexRange(GLenum type, ...@@ -169,7 +177,7 @@ Error Buffer::getIndexRange(GLenum type,
return NoError(); return NoError();
} }
ANGLE_TRY(mBuffer->getIndexRange(type, offset, count, primitiveRestartEnabled, outRange)); ANGLE_TRY(mImpl->getIndexRange(type, offset, count, primitiveRestartEnabled, outRange));
mIndexRangeCache.addRange(type, offset, count, primitiveRestartEnabled, *outRange); mIndexRangeCache.addRange(type, offset, count, primitiveRestartEnabled, *outRange);
......
...@@ -20,16 +20,50 @@ ...@@ -20,16 +20,50 @@
namespace rx namespace rx
{ {
class BufferImpl; class BufferImpl;
class GLImplFactory;
}; };
namespace gl namespace gl
{ {
class Buffer;
class BufferState final : angle::NonCopyable
{
public:
BufferState();
~BufferState();
const std::string &getLabel();
GLenum getUsage() const { return mUsage; }
GLbitfield getAccessFlags() const { return mAccessFlags; }
GLenum getAccess() const { return mAccess; }
GLboolean isMapped() const { return mMapped; }
GLvoid *getMapPointer() const { return mMapPointer; }
GLint64 getMapOffset() const { return mMapOffset; }
GLint64 getMapLength() const { return mMapLength; }
GLint64 getSize() const { return mSize; }
private:
friend class Buffer;
std::string mLabel;
GLenum mUsage;
GLint64 mSize;
GLbitfield mAccessFlags;
GLenum mAccess;
GLboolean mMapped;
GLvoid *mMapPointer;
GLint64 mMapOffset;
GLint64 mMapLength;
};
class Buffer final : public RefCountObject, public LabeledObject class Buffer final : public RefCountObject, public LabeledObject
{ {
public: public:
Buffer(rx::BufferImpl *impl, GLuint id); Buffer(rx::GLImplFactory *factory, GLuint id);
virtual ~Buffer(); ~Buffer() override;
void setLabel(const std::string &label) override; void setLabel(const std::string &label) override;
const std::string &getLabel() const override; const std::string &getLabel() const override;
...@@ -50,30 +84,20 @@ class Buffer final : public RefCountObject, public LabeledObject ...@@ -50,30 +84,20 @@ class Buffer final : public RefCountObject, public LabeledObject
bool primitiveRestartEnabled, bool primitiveRestartEnabled,
IndexRange *outRange) const; IndexRange *outRange) const;
GLenum getUsage() const { return mUsage; } GLenum getUsage() const { return mState.mUsage; }
GLbitfield getAccessFlags() const { return mAccessFlags; } GLbitfield getAccessFlags() const { return mState.mAccessFlags; }
GLenum getAccess() const { return mAccess; } GLenum getAccess() const { return mState.mAccess; }
GLboolean isMapped() const { return mMapped; } GLboolean isMapped() const { return mState.mMapped; }
GLvoid *getMapPointer() const { return mMapPointer; } GLvoid *getMapPointer() const { return mState.mMapPointer; }
GLint64 getMapOffset() const { return mMapOffset; } GLint64 getMapOffset() const { return mState.mMapOffset; }
GLint64 getMapLength() const { return mMapLength; } GLint64 getMapLength() const { return mState.mMapLength; }
GLint64 getSize() const { return mSize; } GLint64 getSize() const { return mState.mSize; }
rx::BufferImpl *getImplementation() const { return mBuffer; } rx::BufferImpl *getImplementation() const { return mImpl; }
private: private:
rx::BufferImpl *mBuffer; BufferState mState;
rx::BufferImpl *mImpl;
std::string mLabel;
GLenum mUsage;
GLint64 mSize;
GLbitfield mAccessFlags;
GLenum mAccess;
GLboolean mMapped;
GLvoid *mMapPointer;
GLint64 mMapOffset;
GLint64 mMapLength;
mutable IndexRangeCache mIndexRangeCache; mutable IndexRangeCache mIndexRangeCache;
}; };
......
...@@ -438,7 +438,7 @@ Buffer *ResourceManager::checkBufferAllocation(rx::GLImplFactory *factory, GLuin ...@@ -438,7 +438,7 @@ Buffer *ResourceManager::checkBufferAllocation(rx::GLImplFactory *factory, GLuin
return bufferMapIt->second; return bufferMapIt->second;
} }
Buffer *buffer = new Buffer(factory->createBuffer(), handle); Buffer *buffer = new Buffer(factory, handle);
buffer->addRef(); buffer->addRef();
if (handleAllocated) if (handleAllocated)
......
...@@ -48,7 +48,7 @@ TEST_F(ResourceManagerTest, ReallocateBoundTexture) ...@@ -48,7 +48,7 @@ TEST_F(ResourceManagerTest, ReallocateBoundTexture)
TEST_F(ResourceManagerTest, ReallocateBoundBuffer) TEST_F(ResourceManagerTest, ReallocateBoundBuffer)
{ {
EXPECT_CALL(mMockFactory, createBuffer()).Times(1).RetiresOnSaturation(); EXPECT_CALL(mMockFactory, createBuffer(_)).Times(1).RetiresOnSaturation();
mResourceManager->checkBufferAllocation(&mMockFactory, 1); mResourceManager->checkBufferAllocation(&mMockFactory, 1);
GLuint newBuffer = mResourceManager->createBuffer(); GLuint newBuffer = mResourceManager->createBuffer();
......
...@@ -101,9 +101,16 @@ TEST_F(TransformFeedbackTest, SideEffectsOfPauseAndResume) ...@@ -101,9 +101,16 @@ TEST_F(TransformFeedbackTest, SideEffectsOfPauseAndResume)
TEST_F(TransformFeedbackTest, BufferBinding) TEST_F(TransformFeedbackTest, BufferBinding)
{ {
rx::MockBufferImpl *bufferImpl = new rx::MockBufferImpl; rx::MockBufferImpl *bufferImpl = new rx::MockBufferImpl;
gl::Buffer *buffer = new gl::Buffer(bufferImpl, 1);
EXPECT_CALL(*bufferImpl, destructor()).Times(1).RetiresOnSaturation(); EXPECT_CALL(*bufferImpl, destructor()).Times(1).RetiresOnSaturation();
rx::MockGLFactory mockGLFactory;
EXPECT_CALL(mockGLFactory, createBuffer(_))
.Times(1)
.WillOnce(Return(bufferImpl))
.RetiresOnSaturation();
gl::Buffer *buffer = new gl::Buffer(&mockGLFactory, 1);
static const size_t bindIndex = 0; static const size_t bindIndex = 0;
EXPECT_EQ(mFeedback->getIndexedBufferCount(), mCaps.maxTransformFeedbackSeparateAttributes); EXPECT_EQ(mFeedback->getIndexedBufferCount(), mCaps.maxTransformFeedbackSeparateAttributes);
......
...@@ -15,12 +15,18 @@ ...@@ -15,12 +15,18 @@
#include <stdint.h> #include <stdint.h>
namespace gl
{
class BufferState;
}
namespace rx namespace rx
{ {
class BufferImpl : angle::NonCopyable class BufferImpl : angle::NonCopyable
{ {
public: public:
BufferImpl(const gl::BufferState &state) : mState(state) {}
virtual ~BufferImpl() { } virtual ~BufferImpl() { }
virtual gl::Error setData(GLenum target, const void *data, size_t size, GLenum usage) = 0; virtual gl::Error setData(GLenum target, const void *data, size_t size, GLenum usage) = 0;
...@@ -38,6 +44,9 @@ class BufferImpl : angle::NonCopyable ...@@ -38,6 +44,9 @@ class BufferImpl : angle::NonCopyable
size_t count, size_t count,
bool primitiveRestartEnabled, bool primitiveRestartEnabled,
gl::IndexRange *outRange) = 0; gl::IndexRange *outRange) = 0;
protected:
const gl::BufferState &mState;
}; };
} }
......
...@@ -19,6 +19,7 @@ namespace rx ...@@ -19,6 +19,7 @@ namespace rx
class MockBufferImpl : public BufferImpl class MockBufferImpl : public BufferImpl
{ {
public: public:
MockBufferImpl() : BufferImpl(mMockState) {}
~MockBufferImpl() { destructor(); } ~MockBufferImpl() { destructor(); }
MOCK_METHOD4(setData, gl::Error(GLenum, const void *, size_t, GLenum)); MOCK_METHOD4(setData, gl::Error(GLenum, const void *, size_t, GLenum));
...@@ -31,6 +32,9 @@ class MockBufferImpl : public BufferImpl ...@@ -31,6 +32,9 @@ class MockBufferImpl : public BufferImpl
MOCK_METHOD5(getIndexRange, gl::Error(GLenum, size_t, size_t, bool, gl::IndexRange *)); MOCK_METHOD5(getIndexRange, gl::Error(GLenum, size_t, size_t, bool, gl::IndexRange *));
MOCK_METHOD0(destructor, void()); MOCK_METHOD0(destructor, void());
protected:
gl::BufferState mMockState;
}; };
} }
......
...@@ -63,7 +63,7 @@ class GLImplFactory : angle::NonCopyable ...@@ -63,7 +63,7 @@ class GLImplFactory : angle::NonCopyable
virtual RenderbufferImpl *createRenderbuffer() = 0; virtual RenderbufferImpl *createRenderbuffer() = 0;
// Buffer creation // Buffer creation
virtual BufferImpl *createBuffer() = 0; virtual BufferImpl *createBuffer(const gl::BufferState &state) = 0;
// Vertex Array creation // Vertex Array creation
virtual VertexArrayImpl *createVertexArray(const gl::VertexArrayState &data) = 0; virtual VertexArrayImpl *createVertexArray(const gl::VertexArrayState &data) = 0;
......
...@@ -19,7 +19,7 @@ namespace rx ...@@ -19,7 +19,7 @@ namespace rx
class MockTextureImpl : public TextureImpl class MockTextureImpl : public TextureImpl
{ {
public: public:
MockTextureImpl() : TextureImpl(gl::TextureState(GL_TEXTURE_2D)) {} MockTextureImpl() : TextureImpl(mMockState), mMockState(GL_TEXTURE_2D) {}
virtual ~MockTextureImpl() { destructor(); } virtual ~MockTextureImpl() { destructor(); }
MOCK_METHOD8(setImage, gl::Error(GLenum, size_t, GLenum, const gl::Extents &, GLenum, GLenum, const gl::PixelUnpackState &, const uint8_t *)); MOCK_METHOD8(setImage, gl::Error(GLenum, size_t, GLenum, const gl::Extents &, GLenum, GLenum, const gl::PixelUnpackState &, const uint8_t *));
MOCK_METHOD7(setSubImage, gl::Error(GLenum, size_t, const gl::Box &, GLenum, GLenum, const gl::PixelUnpackState &, const uint8_t *)); MOCK_METHOD7(setSubImage, gl::Error(GLenum, size_t, const gl::Box &, GLenum, GLenum, const gl::PixelUnpackState &, const uint8_t *));
...@@ -51,6 +51,9 @@ class MockTextureImpl : public TextureImpl ...@@ -51,6 +51,9 @@ class MockTextureImpl : public TextureImpl
MOCK_METHOD1(syncState, void(const gl::Texture::DirtyBits &)); MOCK_METHOD1(syncState, void(const gl::Texture::DirtyBits &));
MOCK_METHOD0(destructor, void()); MOCK_METHOD0(destructor, void());
protected:
gl::TextureState mMockState;
}; };
} }
......
...@@ -19,8 +19,8 @@ namespace rx ...@@ -19,8 +19,8 @@ namespace rx
unsigned int BufferD3D::mNextSerial = 1; unsigned int BufferD3D::mNextSerial = 1;
BufferD3D::BufferD3D(BufferFactoryD3D *factory) BufferD3D::BufferD3D(const gl::BufferState &state, BufferFactoryD3D *factory)
: BufferImpl(), : BufferImpl(state),
mFactory(factory), mFactory(factory),
mStaticIndexBuffer(nullptr), mStaticIndexBuffer(nullptr),
mStaticBufferCacheTotalSize(0), mStaticBufferCacheTotalSize(0),
......
...@@ -30,7 +30,7 @@ enum class D3DBufferUsage ...@@ -30,7 +30,7 @@ enum class D3DBufferUsage
class BufferD3D : public BufferImpl class BufferD3D : public BufferImpl
{ {
public: public:
BufferD3D(BufferFactoryD3D *factory); BufferD3D(const gl::BufferState &state, BufferFactoryD3D *factory);
virtual ~BufferD3D(); virtual ~BufferD3D();
unsigned int getSerial() const { return mSerial; } unsigned int getSerial() const { return mSerial; }
......
...@@ -249,8 +249,8 @@ class Buffer11::SystemMemoryStorage : public Buffer11::BufferStorage ...@@ -249,8 +249,8 @@ class Buffer11::SystemMemoryStorage : public Buffer11::BufferStorage
MemoryBuffer mSystemCopy; MemoryBuffer mSystemCopy;
}; };
Buffer11::Buffer11(Renderer11 *renderer) Buffer11::Buffer11(const gl::BufferState &state, Renderer11 *renderer)
: BufferD3D(renderer), : BufferD3D(state, renderer),
mRenderer(renderer), mRenderer(renderer),
mSize(0), mSize(0),
mMappedStorage(nullptr), mMappedStorage(nullptr),
......
...@@ -48,7 +48,7 @@ typedef size_t DataRevision; ...@@ -48,7 +48,7 @@ typedef size_t DataRevision;
class Buffer11 : public BufferD3D class Buffer11 : public BufferD3D
{ {
public: public:
Buffer11(Renderer11 *renderer); Buffer11(const gl::BufferState &state, Renderer11 *renderer);
virtual ~Buffer11(); virtual ~Buffer11();
gl::ErrorOrResult<ID3D11Buffer *> getBuffer(BufferUsage usage); gl::ErrorOrResult<ID3D11Buffer *> getBuffer(BufferUsage usage);
......
...@@ -94,9 +94,9 @@ RenderbufferImpl *Context11::createRenderbuffer() ...@@ -94,9 +94,9 @@ RenderbufferImpl *Context11::createRenderbuffer()
return new RenderbufferD3D(mRenderer); return new RenderbufferD3D(mRenderer);
} }
BufferImpl *Context11::createBuffer() BufferImpl *Context11::createBuffer(const gl::BufferState &state)
{ {
Buffer11 *buffer = new Buffer11(mRenderer); Buffer11 *buffer = new Buffer11(state, mRenderer);
mRenderer->onBufferCreate(buffer); mRenderer->onBufferCreate(buffer);
return buffer; return buffer;
} }
......
...@@ -39,7 +39,7 @@ class Context11 : public ContextImpl ...@@ -39,7 +39,7 @@ class Context11 : public ContextImpl
RenderbufferImpl *createRenderbuffer() override; RenderbufferImpl *createRenderbuffer() override;
// Buffer creation // Buffer creation
BufferImpl *createBuffer() override; BufferImpl *createBuffer(const gl::BufferState &state) override;
// Vertex Array creation // Vertex Array creation
VertexArrayImpl *createVertexArray(const gl::VertexArrayState &data) override; VertexArrayImpl *createVertexArray(const gl::VertexArrayState &data) override;
......
...@@ -12,9 +12,8 @@ ...@@ -12,9 +12,8 @@
namespace rx namespace rx
{ {
Buffer9::Buffer9(Renderer9 *renderer) Buffer9::Buffer9(const gl::BufferState &state, Renderer9 *renderer)
: BufferD3D(renderer), : BufferD3D(state, renderer), mSize(0)
mSize(0)
{} {}
Buffer9::~Buffer9() Buffer9::~Buffer9()
......
...@@ -20,7 +20,7 @@ class Renderer9; ...@@ -20,7 +20,7 @@ class Renderer9;
class Buffer9 : public BufferD3D class Buffer9 : public BufferD3D
{ {
public: public:
Buffer9(Renderer9 *renderer); Buffer9(const gl::BufferState &state, Renderer9 *renderer);
virtual ~Buffer9(); virtual ~Buffer9();
// BufferD3D implementation // BufferD3D implementation
......
...@@ -82,9 +82,9 @@ RenderbufferImpl *Context9::createRenderbuffer() ...@@ -82,9 +82,9 @@ RenderbufferImpl *Context9::createRenderbuffer()
return new RenderbufferD3D(mRenderer); return new RenderbufferD3D(mRenderer);
} }
BufferImpl *Context9::createBuffer() BufferImpl *Context9::createBuffer(const gl::BufferState &state)
{ {
return new Buffer9(mRenderer); return new Buffer9(state, mRenderer);
} }
VertexArrayImpl *Context9::createVertexArray(const gl::VertexArrayState &data) VertexArrayImpl *Context9::createVertexArray(const gl::VertexArrayState &data)
......
...@@ -39,7 +39,7 @@ class Context9 : public ContextImpl ...@@ -39,7 +39,7 @@ class Context9 : public ContextImpl
RenderbufferImpl *createRenderbuffer() override; RenderbufferImpl *createRenderbuffer() override;
// Buffer creation // Buffer creation
BufferImpl *createBuffer() override; BufferImpl *createBuffer(const gl::BufferState &state) override;
// Vertex Array creation // Vertex Array creation
VertexArrayImpl *createVertexArray(const gl::VertexArrayState &data) override; VertexArrayImpl *createVertexArray(const gl::VertexArrayState &data) override;
......
...@@ -29,8 +29,10 @@ static const GLenum SourceBufferOperationTarget = GL_COPY_READ_BUFFER; ...@@ -29,8 +29,10 @@ static const GLenum SourceBufferOperationTarget = GL_COPY_READ_BUFFER;
// supported GL versions and doesn't affect any current state when it changes. // supported GL versions and doesn't affect any current state when it changes.
static const GLenum DestBufferOperationTarget = GL_ARRAY_BUFFER; static const GLenum DestBufferOperationTarget = GL_ARRAY_BUFFER;
BufferGL::BufferGL(const FunctionsGL *functions, StateManagerGL *stateManager) BufferGL::BufferGL(const gl::BufferState &state,
: BufferImpl(), const FunctionsGL *functions,
StateManagerGL *stateManager)
: BufferImpl(state),
mIsMapped(false), mIsMapped(false),
mMapOffset(0), mMapOffset(0),
mMapSize(0), mMapSize(0),
......
...@@ -21,7 +21,9 @@ class StateManagerGL; ...@@ -21,7 +21,9 @@ class StateManagerGL;
class BufferGL : public BufferImpl class BufferGL : public BufferImpl
{ {
public: public:
BufferGL(const FunctionsGL *functions, StateManagerGL *stateManager); BufferGL(const gl::BufferState &state,
const FunctionsGL *functions,
StateManagerGL *stateManager);
~BufferGL() override; ~BufferGL() override;
gl::Error setData(GLenum target, const void *data, size_t size, GLenum usage) override; gl::Error setData(GLenum target, const void *data, size_t size, GLenum usage) override;
......
...@@ -78,9 +78,9 @@ RenderbufferImpl *ContextGL::createRenderbuffer() ...@@ -78,9 +78,9 @@ RenderbufferImpl *ContextGL::createRenderbuffer()
getNativeTextureCaps()); getNativeTextureCaps());
} }
BufferImpl *ContextGL::createBuffer() BufferImpl *ContextGL::createBuffer(const gl::BufferState &state)
{ {
return new BufferGL(getFunctions(), getStateManager()); return new BufferGL(state, getFunctions(), getStateManager());
} }
VertexArrayImpl *ContextGL::createVertexArray(const gl::VertexArrayState &data) VertexArrayImpl *ContextGL::createVertexArray(const gl::VertexArrayState &data)
......
...@@ -47,7 +47,7 @@ class ContextGL : public ContextImpl ...@@ -47,7 +47,7 @@ class ContextGL : public ContextImpl
RenderbufferImpl *createRenderbuffer() override; RenderbufferImpl *createRenderbuffer() override;
// Buffer creation // Buffer creation
BufferImpl *createBuffer() override; BufferImpl *createBuffer(const gl::BufferState &state) override;
// Vertex Array creation // Vertex Array creation
VertexArrayImpl *createVertexArray(const gl::VertexArrayState &data) override; VertexArrayImpl *createVertexArray(const gl::VertexArrayState &data) override;
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
namespace rx namespace rx
{ {
BufferNULL::BufferNULL() : BufferImpl() BufferNULL::BufferNULL(const gl::BufferState &state) : BufferImpl(state)
{ {
} }
......
...@@ -18,7 +18,7 @@ namespace rx ...@@ -18,7 +18,7 @@ namespace rx
class BufferNULL : public BufferImpl class BufferNULL : public BufferImpl
{ {
public: public:
BufferNULL(); BufferNULL(const gl::BufferState &state);
~BufferNULL() override; ~BufferNULL() override;
gl::Error setData(GLenum target, const void *data, size_t size, GLenum usage) override; gl::Error setData(GLenum target, const void *data, size_t size, GLenum usage) override;
......
...@@ -124,7 +124,7 @@ RenderbufferImpl *ContextNULL::createRenderbuffer() ...@@ -124,7 +124,7 @@ RenderbufferImpl *ContextNULL::createRenderbuffer()
return static_cast<RenderbufferImpl *>(0); return static_cast<RenderbufferImpl *>(0);
} }
BufferImpl *ContextNULL::createBuffer() BufferImpl *ContextNULL::createBuffer(const gl::BufferState &state)
{ {
UNIMPLEMENTED(); UNIMPLEMENTED();
return static_cast<BufferImpl *>(0); return static_cast<BufferImpl *>(0);
......
...@@ -70,7 +70,7 @@ class ContextNULL : public ContextImpl ...@@ -70,7 +70,7 @@ class ContextNULL : public ContextImpl
RenderbufferImpl *createRenderbuffer() override; RenderbufferImpl *createRenderbuffer() override;
// Buffer creation // Buffer creation
BufferImpl *createBuffer() override; BufferImpl *createBuffer(const gl::BufferState &state) override;
// Vertex Array creation // Vertex Array creation
VertexArrayImpl *createVertexArray(const gl::VertexArrayState &data) override; VertexArrayImpl *createVertexArray(const gl::VertexArrayState &data) override;
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
namespace rx namespace rx
{ {
BufferVk::BufferVk() : BufferImpl() BufferVk::BufferVk(const gl::BufferState &state) : BufferImpl(state)
{ {
} }
......
...@@ -18,7 +18,7 @@ namespace rx ...@@ -18,7 +18,7 @@ namespace rx
class BufferVk : public BufferImpl class BufferVk : public BufferImpl
{ {
public: public:
BufferVk(); BufferVk(const gl::BufferState &state);
~BufferVk() override; ~BufferVk() override;
gl::Error setData(GLenum target, const void *data, size_t size, GLenum usage) override; gl::Error setData(GLenum target, const void *data, size_t size, GLenum usage) override;
......
...@@ -211,9 +211,9 @@ RenderbufferImpl *ContextVk::createRenderbuffer() ...@@ -211,9 +211,9 @@ RenderbufferImpl *ContextVk::createRenderbuffer()
return new RenderbufferVk(); return new RenderbufferVk();
} }
BufferImpl *ContextVk::createBuffer() BufferImpl *ContextVk::createBuffer(const gl::BufferState &state)
{ {
return new BufferVk(); return new BufferVk(state);
} }
VertexArrayImpl *ContextVk::createVertexArray(const gl::VertexArrayState &state) VertexArrayImpl *ContextVk::createVertexArray(const gl::VertexArrayState &state)
......
...@@ -97,7 +97,7 @@ class ContextVk : public ContextImpl ...@@ -97,7 +97,7 @@ class ContextVk : public ContextImpl
RenderbufferImpl *createRenderbuffer() override; RenderbufferImpl *createRenderbuffer() override;
// Buffer creation // Buffer creation
BufferImpl *createBuffer() override; BufferImpl *createBuffer(const gl::BufferState &state) override;
// Vertex Array creation // Vertex Array creation
VertexArrayImpl *createVertexArray(const gl::VertexArrayState &state) override; VertexArrayImpl *createVertexArray(const gl::VertexArrayState &state) override;
......
...@@ -41,7 +41,7 @@ class NullFactory : public GLImplFactory ...@@ -41,7 +41,7 @@ class NullFactory : public GLImplFactory
RenderbufferImpl *createRenderbuffer() override { return nullptr; } RenderbufferImpl *createRenderbuffer() override { return nullptr; }
// Buffer creation // Buffer creation
BufferImpl *createBuffer() override { return nullptr; } BufferImpl *createBuffer(const gl::BufferState &state) override { return nullptr; }
// Vertex Array creation // Vertex Array creation
VertexArrayImpl *createVertexArray(const gl::VertexArrayState &data) override VertexArrayImpl *createVertexArray(const gl::VertexArrayState &data) override
...@@ -80,7 +80,7 @@ class MockGLFactory : public GLImplFactory ...@@ -80,7 +80,7 @@ class MockGLFactory : public GLImplFactory
MOCK_METHOD1(createFramebuffer, FramebufferImpl *(const gl::FramebufferState &)); MOCK_METHOD1(createFramebuffer, FramebufferImpl *(const gl::FramebufferState &));
MOCK_METHOD1(createTexture, TextureImpl *(const gl::TextureState &)); MOCK_METHOD1(createTexture, TextureImpl *(const gl::TextureState &));
MOCK_METHOD0(createRenderbuffer, RenderbufferImpl *()); MOCK_METHOD0(createRenderbuffer, RenderbufferImpl *());
MOCK_METHOD0(createBuffer, BufferImpl *()); MOCK_METHOD1(createBuffer, BufferImpl *(const gl::BufferState &));
MOCK_METHOD1(createVertexArray, VertexArrayImpl *(const gl::VertexArrayState &)); MOCK_METHOD1(createVertexArray, VertexArrayImpl *(const gl::VertexArrayState &));
MOCK_METHOD1(createQuery, QueryImpl *(GLenum type)); MOCK_METHOD1(createQuery, QueryImpl *(GLenum type));
MOCK_METHOD0(createFenceNV, FenceNVImpl *()); MOCK_METHOD0(createFenceNV, FenceNVImpl *());
......
...@@ -35,7 +35,7 @@ class D3D11EmulatedIndexedBufferTest : public ANGLETest ...@@ -35,7 +35,7 @@ class D3D11EmulatedIndexedBufferTest : public ANGLETest
rx::Context11 *context11 = rx::GetImplAs<rx::Context11>(context); rx::Context11 *context11 = rx::GetImplAs<rx::Context11>(context);
mRenderer = context11->getRenderer(); mRenderer = context11->getRenderer();
mSourceBuffer = new rx::Buffer11(mRenderer); mSourceBuffer = new rx::Buffer11(mBufferState, mRenderer);
GLfloat testData[] = { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }; GLfloat testData[] = { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f };
gl::Error error = gl::Error error =
mSourceBuffer->setData(GL_ARRAY_BUFFER, testData, sizeof(testData), GL_STATIC_DRAW); mSourceBuffer->setData(GL_ARRAY_BUFFER, testData, sizeof(testData), GL_STATIC_DRAW);
...@@ -127,6 +127,7 @@ class D3D11EmulatedIndexedBufferTest : public ANGLETest ...@@ -127,6 +127,7 @@ class D3D11EmulatedIndexedBufferTest : public ANGLETest
std::vector<GLubyte> mubyteIndices; std::vector<GLubyte> mubyteIndices;
std::vector<GLuint> muintIndices; std::vector<GLuint> muintIndices;
std::vector<GLushort> mushortIndices; std::vector<GLushort> mushortIndices;
gl::BufferState mBufferState;
}; };
// This tests that a GL_UNSIGNED_BYTE indices list can be successfully expanded // This tests that a GL_UNSIGNED_BYTE indices list can be successfully expanded
...@@ -163,7 +164,8 @@ TEST_P(D3D11EmulatedIndexedBufferTest, TestNativeToExpandedUsingGLuintIndices) ...@@ -163,7 +164,8 @@ TEST_P(D3D11EmulatedIndexedBufferTest, TestNativeToExpandedUsingGLuintIndices)
TEST_P(D3D11EmulatedIndexedBufferTest, TestSourceBufferRemainsUntouchedAfterExpandOperation) TEST_P(D3D11EmulatedIndexedBufferTest, TestSourceBufferRemainsUntouchedAfterExpandOperation)
{ {
// Copy the original source buffer before any expand calls have been made // Copy the original source buffer before any expand calls have been made
rx::Buffer11 *cleanSourceBuffer = new rx::Buffer11(mRenderer); gl::BufferState cleanSourceState;
rx::Buffer11 *cleanSourceBuffer = new rx::Buffer11(cleanSourceState, mRenderer);
cleanSourceBuffer->copySubData(mSourceBuffer, 0, 0, mSourceBuffer->getSize()); cleanSourceBuffer->copySubData(mSourceBuffer, 0, 0, mSourceBuffer->getSize());
// Do a basic exanded and compare test. // Do a basic exanded and compare test.
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include <gmock/gmock.h> #include <gmock/gmock.h>
#include "angle_unittests_utils.h"
#include "libANGLE/renderer/d3d/BufferD3D.h" #include "libANGLE/renderer/d3d/BufferD3D.h"
#include "libANGLE/renderer/d3d/IndexBuffer.h" #include "libANGLE/renderer/d3d/IndexBuffer.h"
#include "libANGLE/renderer/d3d/IndexDataManager.h" #include "libANGLE/renderer/d3d/IndexDataManager.h"
...@@ -75,11 +76,7 @@ class MockBufferFactoryD3D : public rx::BufferFactoryD3D ...@@ -75,11 +76,7 @@ class MockBufferFactoryD3D : public rx::BufferFactoryD3D
class MockBufferD3D : public rx::BufferD3D class MockBufferD3D : public rx::BufferD3D
{ {
public: public:
MockBufferD3D(rx::BufferFactoryD3D *factory) MockBufferD3D(rx::BufferFactoryD3D *factory) : BufferD3D(mockState, factory), mData() {}
: BufferD3D(factory),
mData()
{
}
// BufferImpl // BufferImpl
gl::Error setData(GLenum target, const void *data, size_t size, GLenum) override gl::Error setData(GLenum target, const void *data, size_t size, GLenum) override
...@@ -112,9 +109,30 @@ class MockBufferD3D : public rx::BufferD3D ...@@ -112,9 +109,30 @@ class MockBufferD3D : public rx::BufferD3D
} }
private: private:
gl::BufferState mockState;
std::vector<uint8_t> mData; std::vector<uint8_t> mData;
}; };
class MockGLFactoryD3D : public rx::MockGLFactory
{
public:
MockGLFactoryD3D(MockBufferFactoryD3D *bufferFactory) : mBufferFactory(bufferFactory) {}
rx::BufferImpl *createBuffer(const gl::BufferState &state) override
{
MockBufferD3D *mockBufferD3D = new MockBufferD3D(mBufferFactory);
EXPECT_CALL(*mBufferFactory, createVertexBuffer())
.WillOnce(Return(nullptr))
.RetiresOnSaturation();
mockBufferD3D->initializeStaticData();
return mockBufferD3D;
}
MockBufferFactoryD3D *mBufferFactory;
};
class IndexDataManagerPerfTest : public ANGLEPerfTest class IndexDataManagerPerfTest : public ANGLEPerfTest
{ {
public: public:
...@@ -125,27 +143,19 @@ class IndexDataManagerPerfTest : public ANGLEPerfTest ...@@ -125,27 +143,19 @@ class IndexDataManagerPerfTest : public ANGLEPerfTest
rx::IndexDataManager mIndexDataManager; rx::IndexDataManager mIndexDataManager;
GLsizei mIndexCount; GLsizei mIndexCount;
unsigned int mBufferSize; unsigned int mBufferSize;
MockBufferFactoryD3D mMockFactory; MockBufferFactoryD3D mMockBufferFactory;
MockGLFactoryD3D mMockGLFactory;
gl::Buffer mIndexBuffer; gl::Buffer mIndexBuffer;
}; };
MockBufferD3D *InitMockBufferD3D(MockBufferFactoryD3D *mockFactory)
{
MockBufferD3D *mockBufferD3D = new MockBufferD3D(mockFactory);
EXPECT_CALL(*mockFactory, createVertexBuffer()).WillOnce(Return(nullptr)).RetiresOnSaturation();
mockBufferD3D->initializeStaticData();
return mockBufferD3D;
}
IndexDataManagerPerfTest::IndexDataManagerPerfTest() IndexDataManagerPerfTest::IndexDataManagerPerfTest()
: ANGLEPerfTest("IndexDataManger", "_run"), : ANGLEPerfTest("IndexDataManger", "_run"),
mIndexDataManager(&mMockFactory, rx::RENDERER_D3D11), mIndexDataManager(&mMockBufferFactory, rx::RENDERER_D3D11),
mIndexCount(4000), mIndexCount(4000),
mBufferSize(mIndexCount * sizeof(GLushort)), mBufferSize(mIndexCount * sizeof(GLushort)),
mMockFactory(mBufferSize, GL_UNSIGNED_SHORT), mMockBufferFactory(mBufferSize, GL_UNSIGNED_SHORT),
mIndexBuffer(InitMockBufferD3D(&mMockFactory), 1) mMockGLFactory(&mMockBufferFactory),
mIndexBuffer(&mMockGLFactory, 1)
{ {
std::vector<GLushort> indexData(mIndexCount); std::vector<GLushort> indexData(mIndexCount);
for (GLsizei index = 0; index < mIndexCount; ++index) for (GLsizei index = 0; index < mIndexCount; ++index)
...@@ -173,4 +183,4 @@ TEST_F(IndexDataManagerPerfTest, Run) ...@@ -173,4 +183,4 @@ TEST_F(IndexDataManagerPerfTest, Run)
run(); run();
} }
} } // anonymous namespace
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