int getFreeSlot(int set, int base) { TSlotSet::iterator at = findSlot(set, base); if (at == slots[set].end()) return reserveSlot(set, base); // look in locksteps, if they not match, then there is a free slot for (; at != slots[set].end(); ++at, ++base) if (*at != base) break; return reserveSlot(set, base); }
int resolveBinding(EShLanguage /*stage*/, const char* /*name*/, const glslang::TType& type, bool is_live) override { int set; if (type.getQualifier().hasSet()) set = type.getQualifier().layoutSet; else set = 0; if (type.getQualifier().hasBinding()) { if (type.getBasicType() == glslang::EbtSampler) { const glslang::TSampler& sampler = type.getSampler(); if (sampler.isImage()) return reserveSlot(set, baseImageBinding + type.getQualifier().layoutBinding); if (sampler.isPureSampler()) return reserveSlot(set, baseSamplerBinding + type.getQualifier().layoutBinding); if (sampler.isTexture()) return reserveSlot(set, baseTextureBinding + type.getQualifier().layoutBinding); } if (type.getQualifier().storage == EvqUniform) return reserveSlot(set, baseUboBinding + type.getQualifier().layoutBinding); if (type.getQualifier().storage == EvqBuffer) return reserveSlot(set, baseSsboBinding + type.getQualifier().layoutBinding); } else if (is_live && doAutoMapping) { // find free slot, the caller did make sure it passes all vars with binding // first and now all are passed that do not have a binding and needs one if (type.getBasicType() == glslang::EbtSampler) { const glslang::TSampler& sampler = type.getSampler(); if (sampler.isImage()) return getFreeSlot(set, baseImageBinding); if (sampler.isPureSampler()) return getFreeSlot(set, baseSamplerBinding); if (sampler.isTexture()) return getFreeSlot(set, baseTextureBinding); } if (type.getQualifier().storage == EvqUniform) return getFreeSlot(set, baseUboBinding); if (type.getQualifier().storage == EvqBuffer) return getFreeSlot(set, baseSsboBinding); } return -1; }
int getFreeSlot(int set, int base, int size = 1) { TSlotSet::iterator at = findSlot(set, base); if (at == slots[set].end()) return reserveSlot(set, base, size); // look for a big enough gap for (; at != slots[set].end(); ++at) { if (*at - base >= size) break; base = *at + 1; } return reserveSlot(set, base, size); }