void ShGetInfo(const ShHandle handle, ShShaderInfo pname, size_t* params) { if (!handle || !params) return; TShHandleBase* base = static_cast<TShHandleBase*>(handle); TCompiler* compiler = base->getAsCompiler(); if (!compiler) return; switch(pname) { case SH_INFO_LOG_LENGTH: *params = compiler->getInfoSink().info.size() + 1; break; case SH_OBJECT_CODE_LENGTH: *params = compiler->getInfoSink().obj.size() + 1; break; case SH_ACTIVE_UNIFORMS: *params = compiler->getUniforms().size(); break; case SH_ACTIVE_UNIFORM_MAX_LENGTH: *params = 1 + MAX_SYMBOL_NAME_LEN; break; case SH_ACTIVE_ATTRIBUTES: *params = compiler->getAttribs().size(); break; case SH_ACTIVE_ATTRIBUTE_MAX_LENGTH: *params = 1 + MAX_SYMBOL_NAME_LEN; break; case SH_VARYINGS: *params = compiler->getVaryings().size(); break; case SH_VARYING_MAX_LENGTH: *params = 1 + MAX_SYMBOL_NAME_LEN; break; case SH_MAPPED_NAME_MAX_LENGTH: // Use longer length than MAX_SHORTENED_IDENTIFIER_SIZE to // handle array and struct dereferences. *params = 1 + MAX_SYMBOL_NAME_LEN; break; case SH_NAME_MAX_LENGTH: *params = 1 + MAX_SYMBOL_NAME_LEN; break; case SH_HASHED_NAME_MAX_LENGTH: if (compiler->getHashFunction() == NULL) { *params = 0; } else { // 64 bits hashing output requires 16 bytes for hex // representation. const char HashedNamePrefix[] = HASHED_NAME_PREFIX; *params = 16 + sizeof(HashedNamePrefix); } break; case SH_HASHED_NAMES_COUNT: *params = compiler->getNameMap().size(); break; default: UNREACHABLE(); } }
void ShGetVariableInfo(const ShHandle handle, ShShaderInfo varType, int index, size_t* length, int* size, ShDataType* type, ShPrecisionType* precision, int* staticUse, char* name, char* mappedName) { if (!handle || !size || !type || !precision || !staticUse || !name) return; ASSERT((varType == SH_ACTIVE_ATTRIBUTES) || (varType == SH_ACTIVE_UNIFORMS) || (varType == SH_VARYINGS)); TShHandleBase* base = reinterpret_cast<TShHandleBase*>(handle); TCompiler* compiler = base->getAsCompiler(); if (compiler == 0) return; const TVariableInfoList& varList = varType == SH_ACTIVE_ATTRIBUTES ? compiler->getAttribs() : (varType == SH_ACTIVE_UNIFORMS ? compiler->getUniforms() : compiler->getVaryings()); if (index < 0 || index >= static_cast<int>(varList.size())) return; const TVariableInfo& varInfo = varList[index]; if (length) *length = varInfo.name.size(); *size = varInfo.size; *type = varInfo.type; switch (varInfo.precision) { case EbpLow: *precision = SH_PRECISION_LOWP; break; case EbpMedium: *precision = SH_PRECISION_MEDIUMP; break; case EbpHigh: *precision = SH_PRECISION_HIGHP; break; default: // Some types does not support precision, for example, boolean. *precision = SH_PRECISION_UNDEFINED; break; } *staticUse = varInfo.staticUse ? 1 : 0; // This size must match that queried by // SH_ACTIVE_UNIFORM_MAX_LENGTH, SH_ACTIVE_ATTRIBUTE_MAX_LENGTH, SH_VARYING_MAX_LENGTH // in ShGetInfo, below. size_t variableLength = 1 + MAX_SYMBOL_NAME_LEN; ASSERT(checkVariableMaxLengths(handle, variableLength)); strncpy(name, varInfo.name.c_str(), variableLength); name[variableLength - 1] = 0; if (mappedName) { // This size must match that queried by // SH_MAPPED_NAME_MAX_LENGTH in ShGetInfo, below. size_t maxMappedNameLength = 1 + MAX_SYMBOL_NAME_LEN; ASSERT(checkMappedNameMaxLength(handle, maxMappedNameLength)); strncpy(mappedName, varInfo.mappedName.c_str(), maxMappedNameLength); mappedName[maxMappedNameLength - 1] = 0; } }