Commit bcac6ffc by Alexis Hetu Committed by Alexis Hétu

TransformFeedback buffer binding

Added get/set functions for binding a transform feedback buffer. Change-Id: I409841a35644ff8d5f99c0a6b4c3a43568676822 Reviewed-on: https://swiftshader-review.googlesource.com/2930Tested-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <capn@google.com>
parent 22d07660
......@@ -1096,6 +1096,18 @@ void Context::bindPixelUnpackBuffer(GLuint buffer)
mState.pixelUnpackBuffer = getBuffer(buffer);
}
void Context::bindTransformFeedbackBuffer(GLuint buffer)
{
mResourceManager->checkBufferAllocation(buffer);
TransformFeedback* transformFeedback = getTransformFeedback(mState.transformFeedback);
if(transformFeedback)
{
transformFeedback->setGenericBuffer(getBuffer(buffer));
}
}
void Context::bindUniformBuffer(GLuint buffer)
{
mResourceManager->checkBufferAllocation(buffer);
......@@ -1458,8 +1470,9 @@ bool Context::getBuffer(GLenum target, es2::Buffer **buffer)
case GL_TRANSFORM_FEEDBACK_BUFFER:
if(clientVersion >= 3)
{
UNIMPLEMENTED();
return false;
TransformFeedback* transformFeedback = getTransformFeedback();
*buffer = transformFeedback ? static_cast<es2::Buffer*>(transformFeedback->getGenericBuffer()) : nullptr;
break;
}
else return false;
case GL_UNIFORM_BUFFER:
......
......@@ -492,6 +492,7 @@ public:
void bindCopyWriteBuffer(GLuint buffer);
void bindPixelPackBuffer(GLuint buffer);
void bindPixelUnpackBuffer(GLuint buffer);
void bindTransformFeedbackBuffer(GLuint buffer);
void bindUniformBuffer(GLuint buffer);
void bindTexture2D(GLuint texture);
void bindTextureCubeMap(GLuint texture);
......
......@@ -461,7 +461,7 @@ void GL_APIENTRY glBindBuffer(GLenum target, GLuint buffer)
case GL_TRANSFORM_FEEDBACK_BUFFER:
if(clientVersion >= 3)
{
UNIMPLEMENTED();
context->bindTransformFeedbackBuffer(buffer);
return;
}
else return error(GL_INVALID_ENUM);
......@@ -1777,6 +1777,12 @@ void GL_APIENTRY glDrawArrays(GLenum mode, GLint first, GLsizei count)
if(context)
{
es2::TransformFeedback* transformFeedback = context->getTransformFeedback();
if(transformFeedback && transformFeedback->isActive() && (mode != transformFeedback->primitiveMode()))
{
return error(GL_INVALID_OPERATION);
}
context->drawArrays(mode, first, count);
}
}
......@@ -1809,6 +1815,12 @@ void GL_APIENTRY glDrawElements(GLenum mode, GLsizei count, GLenum type, const G
if(context)
{
es2::TransformFeedback* transformFeedback = context->getTransformFeedback();
if(transformFeedback && transformFeedback->isActive() && !transformFeedback->isPaused())
{
return error(GL_INVALID_OPERATION);
}
switch(type)
{
case GL_UNSIGNED_BYTE:
......
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