Added location to Attribute
Program now uses Attribute location.
Change-Id: I005d64509e4b1e2dd977db38b6b2c41d6ba7ddef
Reviewed-on: https://swiftshader-review.googlesource.com/3722
Tested-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/OpenGL/compiler/OutputASM.cpp b/src/OpenGL/compiler/OutputASM.cpp
index 428be87..782d2b0 100644
--- a/src/OpenGL/compiler/OutputASM.cpp
+++ b/src/OpenGL/compiler/OutputASM.cpp
@@ -91,11 +91,12 @@
registerIndex = 0;
}
- Attribute::Attribute(GLenum type, const std::string &name, int arraySize, int registerIndex)
+ Attribute::Attribute(GLenum type, const std::string &name, int arraySize, int location, int registerIndex)
{
this->type = type;
this->name = name;
this->arraySize = arraySize;
+ this->location = location;
this->registerIndex = registerIndex;
}
@@ -2232,7 +2233,7 @@
ActiveAttributes &activeAttributes = shaderObject->activeAttributes;
const char *name = symbol->getSymbol().c_str();
- activeAttributes.push_back(Attribute(glVariableType(type), name, 0, index));
+ activeAttributes.push_back(Attribute(glVariableType(type), name, type.getArraySize(), type.getLayoutQualifier().location, index));
}
}
diff --git a/src/OpenGL/compiler/OutputASM.h b/src/OpenGL/compiler/OutputASM.h
index 5cbf4dd..43b0bd2 100644
--- a/src/OpenGL/compiler/OutputASM.h
+++ b/src/OpenGL/compiler/OutputASM.h
@@ -47,11 +47,12 @@
struct Attribute
{
Attribute();
- Attribute(GLenum type, const std::string &name, int arraySize, int registerIndex);
+ Attribute(GLenum type, const std::string &name, int arraySize, int location, int registerIndex);
GLenum type;
std::string name;
int arraySize;
+ int location;
int registerIndex;
};
diff --git a/src/OpenGL/libGLESv2/Program.cpp b/src/OpenGL/libGLESv2/Program.cpp
index 0dc03f5..1cb028a 100644
--- a/src/OpenGL/libGLESv2/Program.cpp
+++ b/src/OpenGL/libGLESv2/Program.cpp
@@ -1259,7 +1259,7 @@
// Link attributes that have a binding location
for(glsl::ActiveAttributes::iterator attribute = vertexShader->activeAttributes.begin(); attribute != vertexShader->activeAttributes.end(); ++attribute)
{
- int location = getAttributeBinding(attribute->name);
+ int location = getAttributeBinding(*attribute);
if(location != -1) // Set by glBindAttribLocation
{
@@ -1288,7 +1288,7 @@
// Link attributes that don't have a binding location
for(glsl::ActiveAttributes::iterator attribute = vertexShader->activeAttributes.begin(); attribute != vertexShader->activeAttributes.end(); ++attribute)
{
- int location = getAttributeBinding(attribute->name);
+ int location = getAttributeBinding(*attribute);
if(location == -1) // Not set by glBindAttribLocation
{
@@ -1319,11 +1319,16 @@
return true;
}
- int Program::getAttributeBinding(const std::string &name)
+ int Program::getAttributeBinding(const glsl::Attribute &attribute)
{
+ if(attribute.location != -1)
+ {
+ return attribute.location;
+ }
+
for(int location = 0; location < MAX_VERTEX_ATTRIBS; location++)
{
- if(attributeBinding[location].find(name) != attributeBinding[location].end())
+ if(attributeBinding[location].find(attribute.name.c_str()) != attributeBinding[location].end())
{
return location;
}
diff --git a/src/OpenGL/libGLESv2/Program.h b/src/OpenGL/libGLESv2/Program.h
index 0037e05..48d691d 100644
--- a/src/OpenGL/libGLESv2/Program.h
+++ b/src/OpenGL/libGLESv2/Program.h
@@ -222,7 +222,7 @@
bool gatherTransformFeedbackLinkedVaryings();
bool linkAttributes();
- int getAttributeBinding(const std::string &name);
+ int getAttributeBinding(const glsl::Attribute &attribute);
bool linkUniforms(const Shader *shader);
bool defineUniform(GLenum shader, GLenum type, GLenum precision, const std::string &_name, unsigned int arraySize, int registerIndex);