[Feat] (MG_State/Program): BindAttribLocation

This commit is contained in:
2025-08-16 22:51:21 +08:00
parent d6620959b3
commit f328f71f62
@@ -93,38 +93,21 @@ namespace MobileGL {
int inCount = m_program->getNumPipeInputs(); int inCount = m_program->getNumPipeInputs();
m_attribs.resize(inCount); m_attribs.resize(inCount);
// Parse explicit location in shader // Get locations parsed in program
for (int i = 0; i < inCount; i++) { for (int i = 0; i < inCount; i++) {
auto& inVar = m_program->getPipeInput(i); auto& inVar = m_program->getPipeInput(i);
auto location = inVar.layoutLocation(); auto location = inVar.layoutLocation();
m_attribInNameMaxLength = std::max(m_attribInNameMaxLength, (Int)inVar.name.length()); m_attribInNameMaxLength = std::max(m_attribInNameMaxLength, (Int)inVar.name.length());
// TODO: how to parse location specified in shader? m_attribs[location] = inVar.name;
} }
// Place explicitly set locations // Implement glBindAttribLocation semantics
for (int i = 0; i < inCount; i++) { for (auto& [name, location]: m_explicitAttribLocations) {
auto& inVar = m_program->getPipeInput(i); assert(location < m_attribs.size());
if (m_attribs[location] != name) {
auto it = m_explicitAttribLocations.find(inVar.name); auto it = std::find(m_attribs.begin(), m_attribs.end(), name);
if (it != m_explicitAttribLocations.end()) { std::swap(m_attribs[location], m_attribs[std::distance(m_attribs.begin(), it)]);
m_attribs[it->second] = inVar.name;
} }
} }
// Place yet placed attributes
int nextAvailLoc = 0;
for (int i = 0; i < inCount; i++) {
auto& inVar = m_program->getPipeInput(i);
auto it = m_explicitAttribLocations.find(inVar.name);
if (it != m_explicitAttribLocations.end()) {
continue;
}
while (nextAvailLoc < inCount && !m_attribs[nextAvailLoc].empty())
++nextAvailLoc;
assert(nextAvailLoc < inCount);
m_attribs[nextAvailLoc] = inVar.name;
}
// UBO // UBO
int uboCount = m_program->getNumUniformBlocks(); int uboCount = m_program->getNumUniformBlocks();