void Parse(Builder& target)
 {
   ParseSignature();
   ParseRegisters(target);
   ParseTextSection(target);
   ParseStackSection(target);
   ParseRegion(target);
 }
HRESULT
Vc4Disasm::Run(const VC4_QPU_INSTRUCTION* pShader, ULONG ShaderSize, TCHAR *pTitle)
{
    if (pTitle) this->xprintf(TEXT("---------- %s ----------\n"), pTitle);
    ULONG cInstruction = ShaderSize / sizeof(VC4_QPU_INSTRUCTION);
    for (ULONG i = 0; i < cInstruction; i++)
    {
        VC4_QPU_INSTRUCTION Instruction = pShader[i];
        ParseSignature(Instruction);
        switch (VC4_QPU_GET_SIG(Instruction))
        {
        case VC4_QPU_SIG_BREAK:
        case VC4_QPU_SIG_NO_SIGNAL:
        case VC4_QPU_SIG_THREAD_SWITCH:
        case VC4_QPU_SIG_PROGRAM_END:
        case VC4_QPU_SIG_WAIT_FOR_SCOREBOARD:
        case VC4_QPU_SIG_SCOREBOARD_UNBLOCK:
        case VC4_QPU_SIG_LAST_THREAD_SWITCH:
        case VC4_QPU_SIG_COVERAGE_LOAD:
        case VC4_QPU_SIG_COLOR_LOAD:
        case VC4_QPU_SIG_COLOR_LOAD_AND_PROGRAM_END:
        case VC4_QPU_SIG_LOAD_TMU0:
        case VC4_QPU_SIG_LOAD_TMU1:
        case VC4_QPU_SIG_ALPAH_MASK_LOAD:
        case VC4_QPU_SIG_ALU_WITH_RADDR_B:
            ParseALUInstruction(Instruction);
            break;
        case VC4_QPU_SIG_LOAD_IMMEDIATE:
            if (VC4_QPU_IS_OPCODE_SEMAPHORE(Instruction))
            {
                ParseSemaphoreInstruction(Instruction);
            }
            else
            {
                ParseLoadImmInstruction(Instruction);
            }
            break;
        case VC4_QPU_SIG_BRANCH:
            ParseBranchInstruction(Instruction);
            break;
        default:
            this->xprintf(TEXT("Invalid signature"));
            break;
        }
        ParseFlags(Instruction);
        Flush(0);
    }
    return S_OK;
}