Transform feedback varyings gather operation
A few small things were missing to get the transform
feedback varyings gather operation to work properly:
- A basic implementation of
Program::gatherTransformFeedbackLinkedVaryings()
has been made as a first step.
- transformFeedbackBufferMode is now initialized in
the constructor
- transformFeedbackLinkedVaryings are now properly
reset
Also:
- Removed useless DirectX semantic information from
the LinkedVarying class
- ++it is more efficient than it++ in a loop, because
it++ create a temporary object to return the
original state of the iterator, so I made the
changes where applicable in Program.cpp.
Change-Id: I78513f185ef5ef1a17448606b5c598c22d0d217e
Reviewed-on: https://swiftshader-review.googlesource.com/3621
Tested-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/OpenGL/libGLESv2/Program.cpp b/src/OpenGL/libGLESv2/Program.cpp
index 2e78c2c..636a073 100644
--- a/src/OpenGL/libGLESv2/Program.cpp
+++ b/src/OpenGL/libGLESv2/Program.cpp
@@ -96,9 +96,8 @@
{
}
- LinkedVarying::LinkedVarying(const std::string &name, GLenum type, GLsizei size, const std::string &semanticName,
- unsigned int semanticIndex, unsigned int semanticIndexCount)
- : name(name), type(type), size(size), semanticName(semanticName), semanticIndex(semanticIndex), semanticIndexCount(semanticIndexCount)
+ LinkedVarying::LinkedVarying(const std::string &name, GLenum type, GLsizei sizet)
+ : name(name), type(type), size(size)
{
}
@@ -111,6 +110,8 @@
pixelBinary = 0;
vertexBinary = 0;
+ transformFeedbackBufferMode = GL_INTERLEAVED_ATTRIBS;
+
infoLog = 0;
validated = false;
@@ -1084,11 +1085,11 @@
bool Program::linkVaryings()
{
- for(glsl::VaryingList::iterator input = fragmentShader->varyings.begin(); input != fragmentShader->varyings.end(); input++)
+ for(glsl::VaryingList::iterator input = fragmentShader->varyings.begin(); input != fragmentShader->varyings.end(); ++input)
{
bool matched = false;
- for(glsl::VaryingList::iterator output = vertexShader->varyings.begin(); output != vertexShader->varyings.end(); output++)
+ for(glsl::VaryingList::iterator output = vertexShader->varyings.begin(); output != vertexShader->varyings.end(); ++output)
{
if(output->name == input->name)
{
@@ -1115,9 +1116,9 @@
glsl::VaryingList &psVaryings = fragmentShader->varyings;
glsl::VaryingList &vsVaryings = vertexShader->varyings;
- for(glsl::VaryingList::iterator output = vsVaryings.begin(); output != vsVaryings.end(); output++)
+ for(glsl::VaryingList::iterator output = vsVaryings.begin(); output != vsVaryings.end(); ++output)
{
- for(glsl::VaryingList::iterator input = psVaryings.begin(); input != psVaryings.end(); input++)
+ for(glsl::VaryingList::iterator input = psVaryings.begin(); input != psVaryings.end(); ++input)
{
if(output->name == input->name)
{
@@ -1169,6 +1170,33 @@
return true;
}
+ bool Program::gatherTransformFeedbackLinkedVaryings()
+ {
+ // Varyings have already been validated in linkVaryings()
+ glsl::VaryingList &vsVaryings = vertexShader->varyings;
+
+ for(std::vector<std::string>::iterator trVar = transformFeedbackVaryings.begin(); trVar != transformFeedbackVaryings.end(); ++trVar)
+ {
+ bool found = false;
+ for(glsl::VaryingList::iterator var = vsVaryings.begin(); var != vsVaryings.end(); ++var)
+ {
+ if(var->name == (*trVar))
+ {
+ transformFeedbackLinkedVaryings.push_back(LinkedVarying(var->name, var->type, var->size()));
+ found = true;
+ break;
+ }
+ }
+
+ if(!found)
+ {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
// Links the code of the vertex and pixel shader by matching up their varyings,
// compiling them into binaries, determining the attribute mappings, and collecting
// a list of uniforms
@@ -1211,6 +1239,11 @@
return;
}
+ if(!gatherTransformFeedbackLinkedVaryings())
+ {
+ return;
+ }
+
linked = true; // Success
}
@@ -1220,7 +1253,7 @@
unsigned int usedLocations = 0;
// Link attributes that have a binding location
- for(glsl::ActiveAttributes::iterator attribute = vertexShader->activeAttributes.begin(); attribute != vertexShader->activeAttributes.end(); attribute++)
+ for(glsl::ActiveAttributes::iterator attribute = vertexShader->activeAttributes.begin(); attribute != vertexShader->activeAttributes.end(); ++attribute)
{
int location = getAttributeBinding(attribute->name);
@@ -1249,7 +1282,7 @@
}
// Link attributes that don't have a binding location
- for(glsl::ActiveAttributes::iterator attribute = vertexShader->activeAttributes.begin(); attribute != vertexShader->activeAttributes.end(); attribute++)
+ for(glsl::ActiveAttributes::iterator attribute = vertexShader->activeAttributes.begin(); attribute != vertexShader->activeAttributes.end(); ++attribute)
{
int location = getAttributeBinding(attribute->name);
@@ -2283,6 +2316,7 @@
}
uniformIndex.clear();
+ transformFeedbackLinkedVaryings.clear();
delete[] infoLog;
infoLog = 0;
diff --git a/src/OpenGL/libGLESv2/Program.h b/src/OpenGL/libGLESv2/Program.h
index 89f5e48..d6af502 100644
--- a/src/OpenGL/libGLESv2/Program.h
+++ b/src/OpenGL/libGLESv2/Program.h
@@ -107,19 +107,13 @@
struct LinkedVarying
{
LinkedVarying();
- LinkedVarying(const std::string &name, GLenum type, GLsizei size, const std::string &semanticName,
- unsigned int semanticIndex, unsigned int semanticIndexCount);
+ LinkedVarying(const std::string &name, GLenum type, GLsizei size);
// Original GL name
std::string name;
GLenum type;
GLsizei size;
-
- // DirectX semantic information
- std::string semanticName;
- unsigned int semanticIndex;
- unsigned int semanticIndexCount;
};
class Program
@@ -223,6 +217,7 @@
void resetUniformBlockBindings();
bool linkVaryings();
+ bool gatherTransformFeedbackLinkedVaryings();
bool linkAttributes();
int getAttributeBinding(const std::string &name);