Beispiel #1
0
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;
}