Commit c2632d25 by Alexis Hetu Committed by Alexis Hétu

Uniform Buffers API implementation

Implemented the necessary functions for the API level implementation of glBindBufferBase and glBindBufferRange. Also cleaned up the TransformFeedback API functions a little for uniformity with uniform buffers. Change-Id: Iccc835f175d4e8bc4ee030343936714b7ff224ac Reviewed-on: https://swiftshader-review.googlesource.com/3030Reviewed-by: 's avatarNicolas Capens <capn@google.com> Tested-by: 's avatarAlexis Hétu <sugoi@google.com>
parent dd7ff7a5
...@@ -64,7 +64,8 @@ void Buffer::bufferData(const void *data, GLsizeiptr size, GLenum usage) ...@@ -64,7 +64,8 @@ void Buffer::bufferData(const void *data, GLsizeiptr size, GLenum usage)
if(data) if(data)
{ {
memcpy((void*)mContents->data(), data, size); char *buffer = (char*)mContents->data();
memcpy(buffer + mOffset, data, size);
} }
} }
} }
......
...@@ -36,7 +36,7 @@ class Buffer : public gl::NamedObject ...@@ -36,7 +36,7 @@ class Buffer : public gl::NamedObject
void bufferData(const void *data, GLsizeiptr size, GLenum usage); void bufferData(const void *data, GLsizeiptr size, GLenum usage);
void bufferSubData(const void *data, GLsizeiptr size, GLintptr offset); void bufferSubData(const void *data, GLsizeiptr size, GLintptr offset);
const void *data() { return mContents ? mContents->data() : 0; } const void *data() const { return mContents ? mContents->data() : 0; }
size_t size() const { return mSize; } size_t size() const { return mSize; }
GLenum usage() const { return mUsage; } GLenum usage() const { return mUsage; }
bool isMapped() const { return mIsMapped; } bool isMapped() const { return mIsMapped; }
...@@ -44,6 +44,8 @@ class Buffer : public gl::NamedObject ...@@ -44,6 +44,8 @@ class Buffer : public gl::NamedObject
GLsizeiptr length() const { return mLength; } GLsizeiptr length() const { return mLength; }
GLbitfield access() const { return mAccess; } GLbitfield access() const { return mAccess; }
void setOffset(GLintptr offset) { mOffset = offset; }
void setSize(size_t size) { mSize = size; }
void* mapRange(GLintptr offset, GLsizeiptr length, GLbitfield access); void* mapRange(GLintptr offset, GLsizeiptr length, GLbitfield access);
bool unmap(); bool unmap();
void flushMappedRange(GLintptr offset, GLsizeiptr length) {} void flushMappedRange(GLintptr offset, GLsizeiptr length) {}
......
...@@ -151,6 +151,7 @@ Context::Context(const egl::Config *config, const Context *shareContext, EGLint ...@@ -151,6 +151,7 @@ Context::Context(const egl::Config *config, const Context *shareContext, EGLint
bindReadFramebuffer(0); bindReadFramebuffer(0);
bindDrawFramebuffer(0); bindDrawFramebuffer(0);
bindRenderbuffer(0); bindRenderbuffer(0);
bindGenericUniformBuffer(0);
bindTransformFeedback(0); bindTransformFeedback(0);
mState.readFramebufferColorIndex = 0; mState.readFramebufferColorIndex = 0;
...@@ -246,7 +247,7 @@ Context::~Context() ...@@ -246,7 +247,7 @@ Context::~Context()
mState.copyWriteBuffer = NULL; mState.copyWriteBuffer = NULL;
mState.pixelPackBuffer = NULL; mState.pixelPackBuffer = NULL;
mState.pixelUnpackBuffer = NULL; mState.pixelUnpackBuffer = NULL;
mState.uniformBuffer = NULL; mState.genericUniformBuffer = NULL;
mState.renderbuffer = NULL; mState.renderbuffer = NULL;
for(int i = 0; i < MAX_COMBINED_TEXTURE_IMAGE_UNITS; ++i) for(int i = 0; i < MAX_COMBINED_TEXTURE_IMAGE_UNITS; ++i)
...@@ -1196,13 +1197,6 @@ void Context::bindTransformFeedbackBuffer(GLuint buffer) ...@@ -1196,13 +1197,6 @@ void Context::bindTransformFeedbackBuffer(GLuint buffer)
} }
} }
void Context::bindUniformBuffer(GLuint buffer)
{
mResourceManager->checkBufferAllocation(buffer);
mState.uniformBuffer = getBuffer(buffer);
}
void Context::bindTexture2D(GLuint texture) void Context::bindTexture2D(GLuint texture)
{ {
mResourceManager->checkTextureAllocation(texture, TEXTURE_2D); mResourceManager->checkTextureAllocation(texture, TEXTURE_2D);
...@@ -1278,6 +1272,46 @@ bool Context::bindVertexArray(GLuint array) ...@@ -1278,6 +1272,46 @@ bool Context::bindVertexArray(GLuint array)
return !!vertexArray; return !!vertexArray;
} }
void Context::bindGenericUniformBuffer(GLuint buffer)
{
mResourceManager->checkBufferAllocation(buffer);
mState.genericUniformBuffer = getBuffer(buffer);
}
void Context::bindIndexedUniformBuffer(GLuint buffer, GLuint index, GLintptr offset, GLsizeiptr size)
{
mResourceManager->checkBufferAllocation(buffer);
Buffer* bufferObject = getBuffer(buffer);
if(bufferObject)
{
bufferObject->setOffset(offset);
bufferObject->setSize(size);
}
mState.uniformBuffers[index] = bufferObject;
}
void Context::bindGenericTransformFeedbackBuffer(GLuint buffer)
{
mResourceManager->checkBufferAllocation(buffer);
getTransformFeedback()->setGenericBuffer(getBuffer(buffer));
}
void Context::bindIndexedTransformFeedbackBuffer(GLuint buffer, GLuint index, GLintptr offset, GLsizeiptr size)
{
mResourceManager->checkBufferAllocation(buffer);
Buffer* bufferObject = getBuffer(buffer);
if(bufferObject)
{
bufferObject->setOffset(offset);
bufferObject->setSize(size);
}
getTransformFeedback()->setBuffer(index, bufferObject);
}
bool Context::bindTransformFeedback(GLuint id) bool Context::bindTransformFeedback(GLuint id)
{ {
if(!getTransformFeedback(id)) if(!getTransformFeedback(id))
...@@ -1566,9 +1600,9 @@ Buffer *Context::getPixelUnpackBuffer() const ...@@ -1566,9 +1600,9 @@ Buffer *Context::getPixelUnpackBuffer() const
return mState.pixelUnpackBuffer; return mState.pixelUnpackBuffer;
} }
Buffer *Context::getUniformBuffer() const Buffer *Context::getGenericUniformBuffer() const
{ {
return mState.uniformBuffer; return mState.genericUniformBuffer;
} }
bool Context::getBuffer(GLenum target, es2::Buffer **buffer) const bool Context::getBuffer(GLenum target, es2::Buffer **buffer) const
...@@ -1620,7 +1654,7 @@ bool Context::getBuffer(GLenum target, es2::Buffer **buffer) const ...@@ -1620,7 +1654,7 @@ bool Context::getBuffer(GLenum target, es2::Buffer **buffer) const
case GL_UNIFORM_BUFFER: case GL_UNIFORM_BUFFER:
if(clientVersion >= 3) if(clientVersion >= 3)
{ {
*buffer = getUniformBuffer(); *buffer = getGenericUniformBuffer();
break; break;
} }
else return false; else return false;
...@@ -2137,7 +2171,6 @@ template<typename T> bool Context::getIntegerv(GLenum pname, T *params) const ...@@ -2137,7 +2171,6 @@ template<typename T> bool Context::getIntegerv(GLenum pname, T *params) const
*params = 16384; *params = 16384;
break; break;
case GL_MAX_UNIFORM_BUFFER_BINDINGS: // integer, at least 36 case GL_MAX_UNIFORM_BUFFER_BINDINGS: // integer, at least 36
UNIMPLEMENTED();
*params = IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS; *params = IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS;
break; break;
case GL_MAX_VARYING_COMPONENTS: // integer, at least 60 case GL_MAX_VARYING_COMPONENTS: // integer, at least 60
...@@ -2217,7 +2250,7 @@ template<typename T> bool Context::getIntegerv(GLenum pname, T *params) const ...@@ -2217,7 +2250,7 @@ template<typename T> bool Context::getIntegerv(GLenum pname, T *params) const
case GL_UNIFORM_BUFFER_BINDING: // name, initially 0 case GL_UNIFORM_BUFFER_BINDING: // name, initially 0
if(clientVersion >= 3) if(clientVersion >= 3)
{ {
*params = mState.uniformBuffer.name(); *params = mState.genericUniformBuffer.name();
} }
else else
{ {
...@@ -2225,15 +2258,27 @@ template<typename T> bool Context::getIntegerv(GLenum pname, T *params) const ...@@ -2225,15 +2258,27 @@ template<typename T> bool Context::getIntegerv(GLenum pname, T *params) const
} }
break; break;
case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT: // integer, defaults to 1 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT: // integer, defaults to 1
UNIMPLEMENTED();
*params = IMPLEMENTATION_UNIFORM_BUFFER_OFFSET_ALIGNMENT; *params = IMPLEMENTATION_UNIFORM_BUFFER_OFFSET_ALIGNMENT;
break; break;
case GL_UNIFORM_BUFFER_SIZE: // indexed[n] 64-bit integer, initially 0 case GL_UNIFORM_BUFFER_SIZE: // indexed[n] 64-bit integer, initially 0
UNIMPLEMENTED(); if(clientVersion >= 3)
*params = 0; {
*params = mState.genericUniformBuffer->size();
}
else
{
return false;
}
break; break;
case GL_UNIFORM_BUFFER_START: // indexed[n] 64-bit integer, initially 0 case GL_UNIFORM_BUFFER_START: // indexed[n] 64-bit integer, initially 0
UNIMPLEMENTED(); if(clientVersion >= 3)
{
*params = mState.genericUniformBuffer->offset();
}
else
{
return false;
}
*params = 0; *params = 0;
break; break;
case GL_UNPACK_IMAGE_HEIGHT: // integer, initially 0 case GL_UNPACK_IMAGE_HEIGHT: // integer, initially 0
......
...@@ -336,7 +336,8 @@ struct State ...@@ -336,7 +336,8 @@ struct State
gl::BindingPointer<Buffer> copyWriteBuffer; gl::BindingPointer<Buffer> copyWriteBuffer;
gl::BindingPointer<Buffer> pixelPackBuffer; gl::BindingPointer<Buffer> pixelPackBuffer;
gl::BindingPointer<Buffer> pixelUnpackBuffer; gl::BindingPointer<Buffer> pixelUnpackBuffer;
gl::BindingPointer<Buffer> uniformBuffer; gl::BindingPointer<Buffer> genericUniformBuffer;
gl::BindingPointer<Buffer> uniformBuffers[MAX_UNIFORM_BUFFER_BINDINGS];
GLuint readFramebuffer; GLuint readFramebuffer;
GLuint drawFramebuffer; GLuint drawFramebuffer;
...@@ -517,7 +518,6 @@ public: ...@@ -517,7 +518,6 @@ public:
void bindPixelPackBuffer(GLuint buffer); void bindPixelPackBuffer(GLuint buffer);
void bindPixelUnpackBuffer(GLuint buffer); void bindPixelUnpackBuffer(GLuint buffer);
void bindTransformFeedbackBuffer(GLuint buffer); void bindTransformFeedbackBuffer(GLuint buffer);
void bindUniformBuffer(GLuint buffer);
void bindTexture2D(GLuint texture); void bindTexture2D(GLuint texture);
void bindTextureCubeMap(GLuint texture); void bindTextureCubeMap(GLuint texture);
void bindTextureExternal(GLuint texture); void bindTextureExternal(GLuint texture);
...@@ -527,6 +527,10 @@ public: ...@@ -527,6 +527,10 @@ public:
void bindDrawFramebuffer(GLuint framebuffer); void bindDrawFramebuffer(GLuint framebuffer);
void bindRenderbuffer(GLuint renderbuffer); void bindRenderbuffer(GLuint renderbuffer);
bool bindVertexArray(GLuint array); bool bindVertexArray(GLuint array);
void bindGenericUniformBuffer(GLuint buffer);
void bindIndexedUniformBuffer(GLuint buffer, GLuint index, GLintptr offset, GLsizeiptr size);
void bindGenericTransformFeedbackBuffer(GLuint buffer);
void bindIndexedTransformFeedbackBuffer(GLuint buffer, GLuint index, GLintptr offset, GLsizeiptr size);
bool bindTransformFeedback(GLuint transformFeedback); bool bindTransformFeedback(GLuint transformFeedback);
bool bindSampler(GLuint unit, GLuint sampler); bool bindSampler(GLuint unit, GLuint sampler);
void useProgram(GLuint program); void useProgram(GLuint program);
...@@ -563,7 +567,7 @@ public: ...@@ -563,7 +567,7 @@ public:
Buffer *getCopyWriteBuffer() const; Buffer *getCopyWriteBuffer() const;
Buffer *getPixelPackBuffer() const; Buffer *getPixelPackBuffer() const;
Buffer *getPixelUnpackBuffer() const; Buffer *getPixelUnpackBuffer() const;
Buffer *getUniformBuffer() const; Buffer *getGenericUniformBuffer() const;
bool getBuffer(GLenum target, es2::Buffer **buffer) const; bool getBuffer(GLenum target, es2::Buffer **buffer) const;
Program *getCurrentProgram() const; Program *getCurrentProgram() const;
Texture2D *getTexture2D() const; Texture2D *getTexture2D() const;
......
...@@ -469,7 +469,7 @@ void BindBuffer(GLenum target, GLuint buffer) ...@@ -469,7 +469,7 @@ void BindBuffer(GLenum target, GLuint buffer)
case GL_UNIFORM_BUFFER: case GL_UNIFORM_BUFFER:
if(clientVersion >= 3) if(clientVersion >= 3)
{ {
context->bindUniformBuffer(buffer); context->bindGenericUniformBuffer(buffer);
return; return;
} }
else return error(GL_INVALID_ENUM); else return error(GL_INVALID_ENUM);
......
...@@ -1886,11 +1886,8 @@ GL_APICALL void GL_APIENTRY glBindBufferRange(GLenum target, GLuint index, GLuin ...@@ -1886,11 +1886,8 @@ GL_APICALL void GL_APIENTRY glBindBufferRange(GLenum target, GLuint index, GLuin
{ {
return error(GL_INVALID_VALUE); return error(GL_INVALID_VALUE);
} }
else context->bindIndexedTransformFeedbackBuffer(buffer, index, offset, size);
{ context->bindGenericTransformFeedbackBuffer(buffer);
es2::TransformFeedback* transformFeedback = context->getTransformFeedback();
transformFeedback->setBuffer(index, context->getBuffer(buffer), offset, size);
}
break; break;
case GL_UNIFORM_BUFFER: case GL_UNIFORM_BUFFER:
if(index >= es2::IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS) if(index >= es2::IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS)
...@@ -1901,7 +1898,8 @@ GL_APICALL void GL_APIENTRY glBindBufferRange(GLenum target, GLuint index, GLuin ...@@ -1901,7 +1898,8 @@ GL_APICALL void GL_APIENTRY glBindBufferRange(GLenum target, GLuint index, GLuin
{ {
return error(GL_INVALID_VALUE); return error(GL_INVALID_VALUE);
} }
UNIMPLEMENTED(); context->bindIndexedUniformBuffer(buffer, index, offset, size);
context->bindGenericUniformBuffer(buffer);
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_ENUM);
...@@ -1925,18 +1923,16 @@ GL_APICALL void GL_APIENTRY glBindBufferBase(GLenum target, GLuint index, GLuint ...@@ -1925,18 +1923,16 @@ GL_APICALL void GL_APIENTRY glBindBufferBase(GLenum target, GLuint index, GLuint
{ {
return error(GL_INVALID_VALUE); return error(GL_INVALID_VALUE);
} }
else context->bindIndexedTransformFeedbackBuffer(buffer, index, 0, 0);
{ context->bindGenericTransformFeedbackBuffer(buffer);
es2::TransformFeedback* transformFeedback = context->getTransformFeedback();
transformFeedback->setBuffer(index, context->getBuffer(buffer));
}
break; break;
case GL_UNIFORM_BUFFER: case GL_UNIFORM_BUFFER:
if(index >= es2::IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS) if(index >= es2::IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS)
{ {
return error(GL_INVALID_VALUE); return error(GL_INVALID_VALUE);
} }
UNIMPLEMENTED(); context->bindIndexedUniformBuffer(buffer, index, 0, 0);
context->bindGenericUniformBuffer(buffer);
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_ENUM);
...@@ -3227,7 +3223,7 @@ GL_APICALL void GL_APIENTRY glGetBufferParameteri64v(GLenum target, GLenum pname ...@@ -3227,7 +3223,7 @@ GL_APICALL void GL_APIENTRY glGetBufferParameteri64v(GLenum target, GLenum pname
UNIMPLEMENTED(); UNIMPLEMENTED();
break; break;
case GL_UNIFORM_BUFFER: case GL_UNIFORM_BUFFER:
buffer = context->getUniformBuffer(); buffer = context->getGenericUniformBuffer();
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_ENUM);
......
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