{\r
}\r
\r
- LinkedVarying::LinkedVarying(const std::string &name, GLenum type, GLsizei size, const std::string &semanticName,\r
- unsigned int semanticIndex, unsigned int semanticIndexCount)\r
- : name(name), type(type), size(size), semanticName(semanticName), semanticIndex(semanticIndex), semanticIndexCount(semanticIndexCount)\r
+ LinkedVarying::LinkedVarying(const std::string &name, GLenum type, GLsizei sizet)\r
+ : name(name), type(type), size(size)\r
{\r
}\r
\r
pixelBinary = 0;\r
vertexBinary = 0;\r
\r
+ transformFeedbackBufferMode = GL_INTERLEAVED_ATTRIBS;\r
+\r
infoLog = 0;\r
validated = false;\r
\r
\r
bool Program::linkVaryings()\r
{\r
- for(glsl::VaryingList::iterator input = fragmentShader->varyings.begin(); input != fragmentShader->varyings.end(); input++)\r
+ for(glsl::VaryingList::iterator input = fragmentShader->varyings.begin(); input != fragmentShader->varyings.end(); ++input)\r
{\r
bool matched = false;\r
\r
- for(glsl::VaryingList::iterator output = vertexShader->varyings.begin(); output != vertexShader->varyings.end(); output++)\r
+ for(glsl::VaryingList::iterator output = vertexShader->varyings.begin(); output != vertexShader->varyings.end(); ++output)\r
{\r
if(output->name == input->name)\r
{\r
glsl::VaryingList &psVaryings = fragmentShader->varyings;\r
glsl::VaryingList &vsVaryings = vertexShader->varyings;\r
\r
- for(glsl::VaryingList::iterator output = vsVaryings.begin(); output != vsVaryings.end(); output++)\r
+ for(glsl::VaryingList::iterator output = vsVaryings.begin(); output != vsVaryings.end(); ++output)\r
{\r
- for(glsl::VaryingList::iterator input = psVaryings.begin(); input != psVaryings.end(); input++)\r
+ for(glsl::VaryingList::iterator input = psVaryings.begin(); input != psVaryings.end(); ++input)\r
{\r
if(output->name == input->name)\r
{\r
return true;\r
}\r
\r
+ bool Program::gatherTransformFeedbackLinkedVaryings()\r
+ {\r
+ // Varyings have already been validated in linkVaryings()\r
+ glsl::VaryingList &vsVaryings = vertexShader->varyings;\r
+\r
+ for(std::vector<std::string>::iterator trVar = transformFeedbackVaryings.begin(); trVar != transformFeedbackVaryings.end(); ++trVar)\r
+ {\r
+ bool found = false;\r
+ for(glsl::VaryingList::iterator var = vsVaryings.begin(); var != vsVaryings.end(); ++var)\r
+ {\r
+ if(var->name == (*trVar))\r
+ {\r
+ transformFeedbackLinkedVaryings.push_back(LinkedVarying(var->name, var->type, var->size()));\r
+ found = true;\r
+ break;\r
+ }\r
+ }\r
+\r
+ if(!found)\r
+ {\r
+ return false;\r
+ }\r
+ }\r
+\r
+ return true;\r
+ }\r
+\r
// Links the code of the vertex and pixel shader by matching up their varyings,\r
// compiling them into binaries, determining the attribute mappings, and collecting\r
// a list of uniforms\r
return;\r
}\r
\r
+ if(!gatherTransformFeedbackLinkedVaryings())\r
+ {\r
+ return;\r
+ }\r
+\r
linked = true; // Success\r
}\r
\r
unsigned int usedLocations = 0;\r
\r
// Link attributes that have a binding location\r
- for(glsl::ActiveAttributes::iterator attribute = vertexShader->activeAttributes.begin(); attribute != vertexShader->activeAttributes.end(); attribute++)\r
+ for(glsl::ActiveAttributes::iterator attribute = vertexShader->activeAttributes.begin(); attribute != vertexShader->activeAttributes.end(); ++attribute)\r
{\r
int location = getAttributeBinding(attribute->name);\r
\r
}\r
\r
// Link attributes that don't have a binding location\r
- for(glsl::ActiveAttributes::iterator attribute = vertexShader->activeAttributes.begin(); attribute != vertexShader->activeAttributes.end(); attribute++)\r
+ for(glsl::ActiveAttributes::iterator attribute = vertexShader->activeAttributes.begin(); attribute != vertexShader->activeAttributes.end(); ++attribute)\r
{\r
int location = getAttributeBinding(attribute->name);\r
\r
}\r
\r
uniformIndex.clear();\r
+ transformFeedbackLinkedVaryings.clear();\r
\r
delete[] infoLog;\r
infoLog = 0;\r
struct LinkedVarying\r
{\r
LinkedVarying();\r
- LinkedVarying(const std::string &name, GLenum type, GLsizei size, const std::string &semanticName,\r
- unsigned int semanticIndex, unsigned int semanticIndexCount);\r
+ LinkedVarying(const std::string &name, GLenum type, GLsizei size);\r
\r
// Original GL name\r
std::string name;\r
\r
GLenum type;\r
GLsizei size;\r
-\r
- // DirectX semantic information\r
- std::string semanticName;\r
- unsigned int semanticIndex;\r
- unsigned int semanticIndexCount;\r
};\r
\r
class Program\r
void resetUniformBlockBindings();\r
\r
bool linkVaryings();\r
+ bool gatherTransformFeedbackLinkedVaryings();\r
\r
bool linkAttributes();\r
int getAttributeBinding(const std::string &name);\r