int resolveSet(EShLanguage /*stage*/, const char* /*name*/, const glslang::TType& type, bool /*is_live*/) override { if (type.getQualifier().hasSet()) return type.getQualifier().layoutSet; // If a command line or API option requested a single descriptor set, use that (if not overrided by spaceN) if (getResourceSetBinding().size() == 1) return atoi(getResourceSetBinding()[0].c_str()); return 0; }
int resolveUniformLocation(EShLanguage /*stage*/, const char* /*name*/, const glslang::TType& type, bool /*is_live*/) override { // kick out of not doing this if (!doAutoLocationMapping()) return -1; // no locations added if already present, a built-in variable, a block, or an opaque if (type.getQualifier().hasLocation() || type.isBuiltIn() || type.getBasicType() == EbtBlock || type.getBasicType() == EbtAtomicUint || (type.containsOpaque() && intermediate.getSpv().openGl == 0)) return -1; // no locations on blocks of built-in variables if (type.isStruct()) { if (type.getStruct()->size() < 1) return -1; if ((*type.getStruct())[0].type->isBuiltIn()) return -1; } int location = nextUniformLocation; nextUniformLocation += TIntermediate::computeTypeUniformLocationSize(type); return location; }
bool validateBinding(EShLanguage /*stage*/, const char* /*name*/, const glslang::TType& type, bool /*is_live*/) override { if (type.getQualifier().hasBinding()) { int set; if (type.getQualifier().hasSet()) set = type.getQualifier().layoutSet; else set = 0; if (type.getBasicType() == glslang::EbtSampler) { const glslang::TSampler& sampler = type.getSampler(); if (sampler.isPureSampler()) return checkEmpty(set, baseSamplerBinding + type.getQualifier().layoutBinding); if (sampler.isTexture()) return checkEmpty(set, baseTextureBinding + type.getQualifier().layoutBinding); } if (type.getQualifier().isUniformOrBuffer()) return checkEmpty(set, baseUboBinding + type.getQualifier().layoutBinding); } return true; }
int resolveSet(EShLanguage /*stage*/, const char* /*name*/, const glslang::TType& type, bool /*is_live*/) override { if (type.getQualifier().hasSet()) return type.getQualifier().layoutSet; return 0; }
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; }