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) ...@@ -1096,6 +1096,18 @@ void Context::bindPixelUnpackBuffer(GLuint buffer)
mState.pixelUnpackBuffer = getBuffer(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) void Context::bindUniformBuffer(GLuint buffer)
{ {
mResourceManager->checkBufferAllocation(buffer); mResourceManager->checkBufferAllocation(buffer);
...@@ -1458,8 +1470,9 @@ bool Context::getBuffer(GLenum target, es2::Buffer **buffer) ...@@ -1458,8 +1470,9 @@ bool Context::getBuffer(GLenum target, es2::Buffer **buffer)
case GL_TRANSFORM_FEEDBACK_BUFFER: case GL_TRANSFORM_FEEDBACK_BUFFER:
if(clientVersion >= 3) if(clientVersion >= 3)
{ {
UNIMPLEMENTED(); TransformFeedback* transformFeedback = getTransformFeedback();
return false; *buffer = transformFeedback ? static_cast<es2::Buffer*>(transformFeedback->getGenericBuffer()) : nullptr;
break;
} }
else return false; else return false;
case GL_UNIFORM_BUFFER: case GL_UNIFORM_BUFFER:
......
...@@ -492,6 +492,7 @@ public: ...@@ -492,6 +492,7 @@ public:
void bindCopyWriteBuffer(GLuint buffer); void bindCopyWriteBuffer(GLuint buffer);
void bindPixelPackBuffer(GLuint buffer); void bindPixelPackBuffer(GLuint buffer);
void bindPixelUnpackBuffer(GLuint buffer); void bindPixelUnpackBuffer(GLuint buffer);
void bindTransformFeedbackBuffer(GLuint buffer);
void bindUniformBuffer(GLuint buffer); void bindUniformBuffer(GLuint buffer);
void bindTexture2D(GLuint texture); void bindTexture2D(GLuint texture);
void bindTextureCubeMap(GLuint texture); void bindTextureCubeMap(GLuint texture);
......
...@@ -461,7 +461,7 @@ void GL_APIENTRY glBindBuffer(GLenum target, GLuint buffer) ...@@ -461,7 +461,7 @@ void GL_APIENTRY glBindBuffer(GLenum target, GLuint buffer)
case GL_TRANSFORM_FEEDBACK_BUFFER: case GL_TRANSFORM_FEEDBACK_BUFFER:
if(clientVersion >= 3) if(clientVersion >= 3)
{ {
UNIMPLEMENTED(); context->bindTransformFeedbackBuffer(buffer);
return; return;
} }
else return error(GL_INVALID_ENUM); else return error(GL_INVALID_ENUM);
...@@ -1777,6 +1777,12 @@ void GL_APIENTRY glDrawArrays(GLenum mode, GLint first, GLsizei count) ...@@ -1777,6 +1777,12 @@ void GL_APIENTRY glDrawArrays(GLenum mode, GLint first, GLsizei count)
if(context) if(context)
{ {
es2::TransformFeedback* transformFeedback = context->getTransformFeedback();
if(transformFeedback && transformFeedback->isActive() && (mode != transformFeedback->primitiveMode()))
{
return error(GL_INVALID_OPERATION);
}
context->drawArrays(mode, first, count); context->drawArrays(mode, first, count);
} }
} }
...@@ -1809,6 +1815,12 @@ void GL_APIENTRY glDrawElements(GLenum mode, GLsizei count, GLenum type, const G ...@@ -1809,6 +1815,12 @@ void GL_APIENTRY glDrawElements(GLenum mode, GLsizei count, GLenum type, const G
if(context) if(context)
{ {
es2::TransformFeedback* transformFeedback = context->getTransformFeedback();
if(transformFeedback && transformFeedback->isActive() && !transformFeedback->isPaused())
{
return error(GL_INVALID_OPERATION);
}
switch(type) switch(type)
{ {
case GL_UNSIGNED_BYTE: 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