Source/ThirdParty/ANGLE/src/libGLESv2/Shader.cpp
bool Shader::compareVarying(const Varying &x, const Varying &y)
{
    if(x.type == y.type)
    {
        return x.size > y.size;
    }

    switch (x.type)
    {
      case GL_FLOAT_MAT4: return true;
      case GL_FLOAT_MAT2:
        switch(y.type)
        {
          case GL_FLOAT_MAT4: return false;
          case GL_FLOAT_MAT2: return true;
          case GL_FLOAT_VEC4: return true;
          case GL_FLOAT_MAT3: return true;
          case GL_FLOAT_VEC3: return true;
          case GL_FLOAT_VEC2: return true;
          case GL_FLOAT:      return true;
          default: UNREACHABLE();
        }
        break;
      case GL_FLOAT_VEC4:
        switch(y.type)
        {
          case GL_FLOAT_MAT4: return false;
          case GL_FLOAT_MAT2: return false;
          case GL_FLOAT_VEC4: return true;
          case GL_FLOAT_MAT3: return true;
          case GL_FLOAT_VEC3: return true;
          case GL_FLOAT_VEC2: return true;
          case GL_FLOAT:      return true;
          default: UNREACHABLE();
        }
        break;
      case GL_FLOAT_MAT3:
        switch(y.type)
        {
          case GL_FLOAT_MAT4: return false;
          case GL_FLOAT_MAT2: return false;
          case GL_FLOAT_VEC4: return false;
          case GL_FLOAT_MAT3: return true;
          case GL_FLOAT_VEC3: return true;
          case GL_FLOAT_VEC2: return true;
          case GL_FLOAT:      return true;
          default: UNREACHABLE();
        }
        break;
      case GL_FLOAT_VEC3:
        switch(y.type)
        {
          case GL_FLOAT_MAT4: return false;
          case GL_FLOAT_MAT2: return false;
          case GL_FLOAT_VEC4: return false;
          case GL_FLOAT_MAT3: return false;
          case GL_FLOAT_VEC3: return true;
          case GL_FLOAT_VEC2: return true;
          case GL_FLOAT:      return true;
          default: UNREACHABLE();
        }
        break;
      case GL_FLOAT_VEC2:
        switch(y.type)
        {
          case GL_FLOAT_MAT4: return false;
          case GL_FLOAT_MAT2: return false;
          case GL_FLOAT_VEC4: return false;
          case GL_FLOAT_MAT3: return false;
          case GL_FLOAT_VEC3: return false;
          case GL_FLOAT_VEC2: return true;
          case GL_FLOAT:      return true;
          default: UNREACHABLE();
        }
        break;
      case GL_FLOAT: return false;
      default: UNREACHABLE();
    }

    return false;
}
// true if varying x has a higher priority in packing than y
true if varying x has a higher priority in packing than y
true if varying x has a higher priority in packing than y
bool Shader::compareVarying(const Varying &x, const Varying &y)
{
    if(x.type == y.type)
    {
        return x.size > y.size;
    }
    switch (x.type)
    {
      case GL_FLOAT_MAT4: return true;
      case GL_FLOAT_MAT2:
        switch(y.type)
        {
          case GL_FLOAT_MAT4: return false;
          case GL_FLOAT_MAT2: return true;
          case GL_FLOAT_VEC4: return true;
          case GL_FLOAT_MAT3: return true;
          case GL_FLOAT_VEC3: return true;
          case GL_FLOAT_VEC2: return true;
          case GL_FLOAT:      return true;
          default: UNREACHABLE();
        }
        break;
      case GL_FLOAT_VEC4:
        switch(y.type)
        {
          case GL_FLOAT_MAT4: return false;
          case GL_FLOAT_MAT2: return false;
          case GL_FLOAT_VEC4: return true;
          case GL_FLOAT_MAT3: return true;
          case GL_FLOAT_VEC3: return true;
          case GL_FLOAT_VEC2: return true;
          case GL_FLOAT:      return true;
          default: UNREACHABLE();
        }
        break;
      case GL_FLOAT_MAT3:
        switch(y.type)
        {
          case GL_FLOAT_MAT4: return false;
          case GL_FLOAT_MAT2: return false;
          case GL_FLOAT_VEC4: return false;
          case GL_FLOAT_MAT3: return true;
          case GL_FLOAT_VEC3: return true;
          case GL_FLOAT_VEC2: return true;
          case GL_FLOAT:      return true;
          default: UNREACHABLE();
        }
        break;
      case GL_FLOAT_VEC3:
        switch(y.type)
        {
          case GL_FLOAT_MAT4: return false;
          case GL_FLOAT_MAT2: return false;
          case GL_FLOAT_VEC4: return false;
          case GL_FLOAT_MAT3: return false;
          case GL_FLOAT_VEC3: return true;
          case GL_FLOAT_VEC2: return true;
          case GL_FLOAT:      return true;
          default: UNREACHABLE();
        }
        break;
      case GL_FLOAT_VEC2:
        switch(y.type)
        {
          case GL_FLOAT_MAT4: return false;
          case GL_FLOAT_MAT2: return false;
          case GL_FLOAT_VEC4: return false;
          case GL_FLOAT_MAT3: return false;
          case GL_FLOAT_VEC3: return false;
          case GL_FLOAT_VEC2: return true;
          case GL_FLOAT:      return true;
          default: UNREACHABLE();
        }
        break;
      case GL_FLOAT: return false;
      default: UNREACHABLE();
    }
    return false;
}
bool Shader :: compareVarying ( const Varying & x , const Varying & y ) { if ( x . type == y . type ) { return x . size > y . size ; } switch ( x . type ) { case GL_FLOAT_MAT4 : return true ; case GL_FLOAT_MAT2 : switch ( y . type ) { case GL_FLOAT_MAT4 : return false ; case GL_FLOAT_MAT2 : return true ; case GL_FLOAT_VEC4 : return true ; case GL_FLOAT_MAT3 : return true ; case GL_FLOAT_VEC3 : return true ; case GL_FLOAT_VEC2 : return true ; case GL_FLOAT : return true ; default : UNREACHABLE ( ) ; } break ; case GL_FLOAT_VEC4 : switch ( y . type ) { case GL_FLOAT_MAT4 : return false ; case GL_FLOAT_MAT2 : return false ; case GL_FLOAT_VEC4 : return true ; case GL_FLOAT_MAT3 : return true ; case GL_FLOAT_VEC3 : return true ; case GL_FLOAT_VEC2 : return true ; case GL_FLOAT : return true ; default : UNREACHABLE ( ) ; } break ; case GL_FLOAT_MAT3 : switch ( y . type ) { case GL_FLOAT_MAT4 : return false ; case GL_FLOAT_MAT2 : return false ; case GL_FLOAT_VEC4 : return false ; case GL_FLOAT_MAT3 : return true ; case GL_FLOAT_VEC3 : return true ; case GL_FLOAT_VEC2 : return true ; case GL_FLOAT : return true ; default : UNREACHABLE ( ) ; } break ; case GL_FLOAT_VEC3 : switch ( y . type ) { case GL_FLOAT_MAT4 : return false ; case GL_FLOAT_MAT2 : return false ; case GL_FLOAT_VEC4 : return false ; case GL_FLOAT_MAT3 : return false ; case GL_FLOAT_VEC3 : return true ; case GL_FLOAT_VEC2 : return true ; case GL_FLOAT : return true ; default : UNREACHABLE ( ) ; } break ; case GL_FLOAT_VEC2 : switch ( y . type ) { case GL_FLOAT_MAT4 : return false ; case GL_FLOAT_MAT2 : return false ; case GL_FLOAT_VEC4 : return false ; case GL_FLOAT_MAT3 : return false ; case GL_FLOAT_VEC3 : return false ; case GL_FLOAT_VEC2 : return true ; case GL_FLOAT : return true ; default : UNREACHABLE ( ) ; } break ; case GL_FLOAT : return false ; default : UNREACHABLE ( ) ; } return false ; }
true if varying x has a higher priority in packing than y
true if varying x has a higher priority in packing than y