Commit 36c79011 by Geoff Lang

Implement basic functionality in BufferGL.

BUG=angle:881 Change-Id: I8d761741d204d26cea1c87eec725bc8ebaaaa584 Reviewed-on: https://chromium-review.googlesource.com/252800Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Tested-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent 63cbace6
...@@ -9,45 +9,78 @@ ...@@ -9,45 +9,78 @@
#include "libANGLE/renderer/gl/BufferGL.h" #include "libANGLE/renderer/gl/BufferGL.h"
#include "common/debug.h" #include "common/debug.h"
#include "libANGLE/angletypes.h"
#include "libANGLE/renderer/gl/FunctionsGL.h"
#include "libANGLE/renderer/gl/StateManagerGL.h"
namespace rx namespace rx
{ {
BufferGL::BufferGL() static const GLenum SourceBufferOperationTarget = GL_ELEMENT_ARRAY_BUFFER;
: BufferImpl() static const GLenum DestBufferOperationTarget = GL_ARRAY_BUFFER;
{}
BufferGL::BufferGL(const FunctionsGL *functions, StateManagerGL *stateManager)
: BufferImpl(),
mFunctions(functions),
mStateManager(stateManager),
mBufferID(0)
{
ASSERT(mFunctions);
ASSERT(mStateManager);
mFunctions->genBuffers(1, &mBufferID);
}
BufferGL::~BufferGL() BufferGL::~BufferGL()
{} {
if (mBufferID)
{
mFunctions->deleteBuffers(1, &mBufferID);
mBufferID = 0;
}
}
gl::Error BufferGL::setData(const void* data, size_t size, GLenum usage) gl::Error BufferGL::setData(const void* data, size_t size, GLenum usage)
{ {
UNIMPLEMENTED(); mStateManager->bindBuffer(DestBufferOperationTarget, mBufferID);
return gl::Error(GL_INVALID_OPERATION); mFunctions->bufferData(DestBufferOperationTarget, size, data, usage);
return gl::Error(GL_NO_ERROR);
} }
gl::Error BufferGL::setSubData(const void* data, size_t size, size_t offset) gl::Error BufferGL::setSubData(const void* data, size_t size, size_t offset)
{ {
UNIMPLEMENTED(); mStateManager->bindBuffer(DestBufferOperationTarget, mBufferID);
return gl::Error(GL_INVALID_OPERATION); mFunctions->bufferSubData(DestBufferOperationTarget, offset, size, data);
return gl::Error(GL_NO_ERROR);
} }
gl::Error BufferGL::copySubData(BufferImpl* source, GLintptr sourceOffset, GLintptr destOffset, GLsizeiptr size) gl::Error BufferGL::copySubData(BufferImpl* source, GLintptr sourceOffset, GLintptr destOffset, GLsizeiptr size)
{ {
UNIMPLEMENTED(); BufferGL *sourceGL = GetAs<BufferGL>(source);
return gl::Error(GL_INVALID_OPERATION);
mStateManager->bindBuffer(DestBufferOperationTarget, mBufferID);
mStateManager->bindBuffer(SourceBufferOperationTarget, sourceGL->getBufferID());
mFunctions->copyBufferSubData(SourceBufferOperationTarget, GL_ARRAY_BUFFER, sourceOffset, destOffset, size);
return gl::Error(GL_NO_ERROR);
} }
gl::Error BufferGL::map(size_t offset, size_t length, GLbitfield access, GLvoid **mapPtr) gl::Error BufferGL::map(size_t offset, size_t length, GLbitfield access, GLvoid **mapPtr)
{ {
UNIMPLEMENTED(); // TODO: look into splitting this into two functions, glMapBuffer is available in 1.5, but
return gl::Error(GL_INVALID_OPERATION); // glMapBufferRange requires 3.0
mStateManager->bindBuffer(DestBufferOperationTarget, mBufferID);
*mapPtr = mFunctions->mapBufferRange(DestBufferOperationTarget, offset, length, access);
return gl::Error(GL_NO_ERROR);
} }
gl::Error BufferGL::unmap() gl::Error BufferGL::unmap()
{ {
UNIMPLEMENTED(); mStateManager->bindBuffer(DestBufferOperationTarget, mBufferID);
return gl::Error(GL_INVALID_OPERATION); mFunctions->unmapBuffer(DestBufferOperationTarget);
return gl::Error(GL_NO_ERROR);
} }
void BufferGL::markTransformFeedbackUsage() void BufferGL::markTransformFeedbackUsage()
...@@ -61,4 +94,9 @@ gl::Error BufferGL::getData(const uint8_t **outData) ...@@ -61,4 +94,9 @@ gl::Error BufferGL::getData(const uint8_t **outData)
return gl::Error(GL_INVALID_OPERATION); return gl::Error(GL_INVALID_OPERATION);
} }
GLuint BufferGL::getBufferID() const
{
return mBufferID;
}
} }
...@@ -14,10 +14,13 @@ ...@@ -14,10 +14,13 @@
namespace rx namespace rx
{ {
class FunctionsGL;
class StateManagerGL;
class BufferGL : public BufferImpl class BufferGL : public BufferImpl
{ {
public: public:
BufferGL(); BufferGL(const FunctionsGL *functions, StateManagerGL *stateManager);
~BufferGL() override; ~BufferGL() override;
gl::Error setData(const void* data, size_t size, GLenum usage) override; gl::Error setData(const void* data, size_t size, GLenum usage) override;
...@@ -31,8 +34,15 @@ class BufferGL : public BufferImpl ...@@ -31,8 +34,15 @@ class BufferGL : public BufferImpl
// for validation, for certain indexed draw calls. // for validation, for certain indexed draw calls.
gl::Error getData(const uint8_t **outData) override; gl::Error getData(const uint8_t **outData) override;
GLuint getBufferID() const;
private: private:
DISALLOW_COPY_AND_ASSIGN(BufferGL); DISALLOW_COPY_AND_ASSIGN(BufferGL);
const FunctionsGL *mFunctions;
StateManagerGL *mStateManager;
GLuint mBufferID;
}; };
} }
......
...@@ -107,7 +107,7 @@ RenderbufferImpl *RendererGL::createRenderbuffer() ...@@ -107,7 +107,7 @@ RenderbufferImpl *RendererGL::createRenderbuffer()
BufferImpl *RendererGL::createBuffer() BufferImpl *RendererGL::createBuffer()
{ {
return new BufferGL(); return new BufferGL(mFunctions, mStateManager);
} }
VertexArrayImpl *RendererGL::createVertexArray() VertexArrayImpl *RendererGL::createVertexArray()
......
...@@ -15,7 +15,8 @@ namespace rx ...@@ -15,7 +15,8 @@ namespace rx
StateManagerGL::StateManagerGL(const FunctionsGL *functions) StateManagerGL::StateManagerGL(const FunctionsGL *functions)
: mFunctions(functions), : mFunctions(functions),
mProgram(0) mProgram(0),
mBuffers()
{ {
ASSERT(mFunctions); ASSERT(mFunctions);
} }
...@@ -29,4 +30,13 @@ void StateManagerGL::useProgram(GLuint program) ...@@ -29,4 +30,13 @@ void StateManagerGL::useProgram(GLuint program)
} }
} }
void StateManagerGL::bindBuffer(GLenum type, GLuint buffer)
{
if (mBuffers[type] == 0)
{
mBuffers[type] = buffer;
mFunctions->bindBuffer(type, buffer);
}
}
} }
...@@ -12,6 +12,8 @@ ...@@ -12,6 +12,8 @@
#include "common/debug.h" #include "common/debug.h"
#include "libANGLE/renderer/gl/functionsgl_typedefs.h" #include "libANGLE/renderer/gl/functionsgl_typedefs.h"
#include <map>
namespace rx namespace rx
{ {
...@@ -23,6 +25,7 @@ class StateManagerGL ...@@ -23,6 +25,7 @@ class StateManagerGL
StateManagerGL(const FunctionsGL *functions); StateManagerGL(const FunctionsGL *functions);
void useProgram(GLuint program); void useProgram(GLuint program);
void bindBuffer(GLenum type, GLuint buffer);
private: private:
DISALLOW_COPY_AND_ASSIGN(StateManagerGL); DISALLOW_COPY_AND_ASSIGN(StateManagerGL);
...@@ -30,6 +33,7 @@ class StateManagerGL ...@@ -30,6 +33,7 @@ class StateManagerGL
const FunctionsGL *mFunctions; const FunctionsGL *mFunctions;
GLuint mProgram; GLuint mProgram;
std::map<GLenum, GLuint> mBuffers;
}; };
} }
......
...@@ -142,3 +142,49 @@ TYPED_TEST(SimpleOperationTest, LinkProgramWithAttributes) ...@@ -142,3 +142,49 @@ TYPED_TEST(SimpleOperationTest, LinkProgramWithAttributes)
EXPECT_GL_NO_ERROR(); EXPECT_GL_NO_ERROR();
} }
TYPED_TEST(SimpleOperationTest, BufferDataWithData)
{
GLuint buffer;
glGenBuffers(1, &buffer);
glBindBuffer(GL_ARRAY_BUFFER, buffer);
std::vector<uint8_t> data(1024);
glBufferData(GL_ARRAY_BUFFER, data.size(), &data[0], GL_STATIC_DRAW);
glDeleteBuffers(1, &buffer);
EXPECT_GL_NO_ERROR();
}
TYPED_TEST(SimpleOperationTest, BufferDataWithNoData)
{
GLuint buffer;
glGenBuffers(1, &buffer);
glBindBuffer(GL_ARRAY_BUFFER, buffer);
glBufferData(GL_ARRAY_BUFFER, 1024, nullptr, GL_STATIC_DRAW);
glDeleteBuffers(1, &buffer);
EXPECT_GL_NO_ERROR();
}
TYPED_TEST(SimpleOperationTest, BufferSubData)
{
GLuint buffer;
glGenBuffers(1, &buffer);
glBindBuffer(GL_ARRAY_BUFFER, buffer);
const size_t bufferSize = 1024;
glBufferData(GL_ARRAY_BUFFER, bufferSize, nullptr, GL_STATIC_DRAW);
const size_t subDataCount = 16;
std::vector<uint8_t> data(bufferSize / subDataCount);
for (size_t i = 0; i < subDataCount; i++)
{
glBufferSubData(GL_ARRAY_BUFFER, data.size() * i, data.size(), &data[0]);
}
glDeleteBuffers(1, &buffer);
EXPECT_GL_NO_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