bool ANGLEWebKitBridge::getUniforms(ShShaderType shaderType, Vector<ANGLEShaderSymbol> &symbols) { const ShHandle compiler = (shaderType == SH_VERTEX_SHADER ? m_vertexCompiler : m_fragmentCompiler); int numUniforms = getValidationResultValue(compiler, SH_ACTIVE_UNIFORMS); if (numUniforms < 0) return false; if (!numUniforms) return true; int maxNameLength = getValidationResultValue(compiler, SH_ACTIVE_UNIFORM_MAX_LENGTH); if (maxNameLength <= 1) return false; OwnArrayPtr<char> nameBuffer = adoptArrayPtr(new char[maxNameLength]); for (int i = 0; i < numUniforms; ++i) { ANGLEShaderSymbol symbol; symbol.symbolType = SHADER_SYMBOL_TYPE_UNIFORM; int nameLength = -1; ShGetActiveUniform(compiler, i, &nameLength, &symbol.size, &symbol.dataType, nameBuffer.get(), 0); if (nameLength <= 0) return false; symbol.name = String::fromUTF8(nameBuffer.get(), nameLength); symbols.append(symbol); } return true; }
void PrintActiveVariables(ShHandle compiler, ShShaderInfo varType, bool mapLongVariableNames) { int nameSize = 0; switch (varType) { case SH_ACTIVE_ATTRIBUTES: ShGetInfo(compiler, SH_ACTIVE_ATTRIBUTE_MAX_LENGTH, &nameSize); break; case SH_ACTIVE_UNIFORMS: ShGetInfo(compiler, SH_ACTIVE_UNIFORM_MAX_LENGTH, &nameSize); break; default: assert(0); } if (nameSize <= 1) return; char* name = new char[nameSize]; char* mappedName = NULL; if (mapLongVariableNames) { int mappedNameSize = 0; ShGetInfo(compiler, SH_MAPPED_NAME_MAX_LENGTH, &mappedNameSize); mappedName = new char[mappedNameSize]; } int activeVars = 0, size = 0; ShDataType type = SH_NONE; const char* typeName = NULL; ShGetInfo(compiler, varType, &activeVars); for (int i = 0; i < activeVars; ++i) { switch (varType) { case SH_ACTIVE_ATTRIBUTES: ShGetActiveAttrib(compiler, i, NULL, &size, &type, name, mappedName); break; case SH_ACTIVE_UNIFORMS: ShGetActiveUniform(compiler, i, NULL, &size, &type, name, mappedName); break; default: assert(0); } switch (type) { case SH_FLOAT: typeName = "GL_FLOAT"; break; case SH_FLOAT_VEC2: typeName = "GL_FLOAT_VEC2"; break; case SH_FLOAT_VEC3: typeName = "GL_FLOAT_VEC3"; break; case SH_FLOAT_VEC4: typeName = "GL_FLOAT_VEC4"; break; case SH_INT: typeName = "GL_INT"; break; case SH_INT_VEC2: typeName = "GL_INT_VEC2"; break; case SH_INT_VEC3: typeName = "GL_INT_VEC3"; break; case SH_INT_VEC4: typeName = "GL_INT_VEC4"; break; case SH_BOOL: typeName = "GL_BOOL"; break; case SH_BOOL_VEC2: typeName = "GL_BOOL_VEC2"; break; case SH_BOOL_VEC3: typeName = "GL_BOOL_VEC3"; break; case SH_BOOL_VEC4: typeName = "GL_BOOL_VEC4"; break; case SH_FLOAT_MAT2: typeName = "GL_FLOAT_MAT2"; break; case SH_FLOAT_MAT3: typeName = "GL_FLOAT_MAT3"; break; case SH_FLOAT_MAT4: typeName = "GL_FLOAT_MAT4"; break; case SH_SAMPLER_2D: typeName = "GL_SAMPLER_2D"; break; case SH_SAMPLER_CUBE: typeName = "GL_SAMPLER_CUBE"; break; case SH_SAMPLER_EXTERNAL_OES: typeName = "GL_SAMPLER_EXTERNAL_OES"; break; default: assert(0); } printf("%d: name:%s type:%s size:%d", i, name, typeName, size); if (mapLongVariableNames) printf(" mapped name:%s", mappedName); printf("\n"); } delete [] name; if (mappedName) delete [] mappedName; }