TransformFeedback buffer binding
Added get/set functions for binding
a transform feedback buffer.
Change-Id: I409841a35644ff8d5f99c0a6b4c3a43568676822
Reviewed-on: https://swiftshader-review.googlesource.com/2930
Tested-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/OpenGL/libGLESv2/Context.cpp b/src/OpenGL/libGLESv2/Context.cpp
index 62af797..bf1e22b 100644
--- a/src/OpenGL/libGLESv2/Context.cpp
+++ b/src/OpenGL/libGLESv2/Context.cpp
@@ -1096,6 +1096,18 @@
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 @@
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:
diff --git a/src/OpenGL/libGLESv2/Context.h b/src/OpenGL/libGLESv2/Context.h
index 9078985..2c1cdf4 100644
--- a/src/OpenGL/libGLESv2/Context.h
+++ b/src/OpenGL/libGLESv2/Context.h
@@ -492,6 +492,7 @@
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);
diff --git a/src/OpenGL/libGLESv2/libGLESv2.cpp b/src/OpenGL/libGLESv2/libGLESv2.cpp
index e831525..f7164e6 100644
--- a/src/OpenGL/libGLESv2/libGLESv2.cpp
+++ b/src/OpenGL/libGLESv2/libGLESv2.cpp
@@ -461,7 +461,7 @@
case GL_TRANSFORM_FEEDBACK_BUFFER:
if(clientVersion >= 3)
{
- UNIMPLEMENTED();
+ context->bindTransformFeedbackBuffer(buffer);
return;
}
else return error(GL_INVALID_ENUM);
@@ -1777,6 +1777,12 @@
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 @@
if(context)
{
+ es2::TransformFeedback* transformFeedback = context->getTransformFeedback();
+ if(transformFeedback && transformFeedback->isActive() && !transformFeedback->isPaused())
+ {
+ return error(GL_INVALID_OPERATION);
+ }
+
switch(type)
{
case GL_UNSIGNED_BYTE: