Chromium Code Reviews| Index: src/gpu/gl/GrGLShaderBuilder.cpp |
| =================================================================== |
| --- src/gpu/gl/GrGLShaderBuilder.cpp (revision 8019) |
| +++ src/gpu/gl/GrGLShaderBuilder.cpp (working copy) |
| @@ -258,6 +258,22 @@ |
| return fUniforms[handle_to_index(u)].fVariable; |
| } |
| +bool GrGLShaderBuilder::addAttribute(GrSLType type, |
| + const char* name) { |
| + for (int i = 0; i < fVSAttrs.count(); ++i) { |
| + const GrGLShaderVar& attr = fVSAttrs[i]; |
| + // if attribute already added, don't add it again |
| + if (attr.getName().equals(name)) { |
| + GrAssert(attr.getType() == type); |
| + return false; |
| + } |
| + } |
| + fVSAttrs.push_back().set(type, |
| + GrGLShaderVar::kAttribute_TypeModifier, |
| + name); |
| + return true; |
| +} |
| + |
| void GrGLShaderBuilder::addVarying(GrSLType type, |
| const char* name, |
| const char** vsOutName, |
| @@ -489,6 +505,18 @@ |
| samplerHandles->push_back(textureSamplers[i].fSamplerUniform); |
| } |
| + int numAttributes = stage.getVertexAttribIndexCount(); |
| + const int* attributeIndices = stage.getVertexAttribIndices(); |
| + SkSTArray<GrEffect::kMaxVertexAttribs, SkString> attributeNames; |
| + for (int i = 0; i < numAttributes; ++i) { |
| + SkString attributeName("aAttr"); |
|
bsalomon
2013/03/08 18:27:20
I was thinking the prepend should be done in addAt
|
| + attributeName.appendS32(attributeIndices[i]); |
| + |
| + if (this->addAttribute(effect->vertexAttribType(i), attributeName.c_str())) { |
| + fEffectAttributes.push_back().set(attributeIndices[i], attributeName); |
| + } |
| + } |
| + |
| GrGLEffect* glEffect = effect->getFactory().createGLInstance(effect); |
| // Enclose custom code in a block to avoid namespace conflicts |
| @@ -506,3 +534,16 @@ |
| return glEffect; |
| } |
| + |
| +const SkString* GrGLShaderBuilder::getEffectAttributeName(int attributeIndex) const { |
| + const AttributePair* attribEnd = this->getEffectAttributes().end(); |
| + for (const AttributePair* attrib = this->getEffectAttributes().begin(); |
| + attrib != attribEnd; |
| + ++attrib) { |
| + if (attrib->fIndex == attributeIndex) { |
| + return &attrib->fName; |
| + } |
| + } |
| + |
| + return NULL; |
| +} |