diff options
author | Brian Paul <[email protected]> | 2014-09-19 13:11:58 -0600 |
---|---|---|
committer | Brian Paul <[email protected]> | 2014-09-22 16:56:23 -0600 |
commit | 9e0160fc588c8f15516c75021c339e5ec9d7255d (patch) | |
tree | 9777d2bc43d7b9786cb012be0088da3ede6322b5 | |
parent | b16bb3f50f0d71f7e720c4feefcb86e15090d52f (diff) |
tgsi: fix tgsi transform's epilog callback
We want to call the caller's epilog callback when we find the TGSI
END instruction, not after it.
Reviewed-by: Charmaine Lee <[email protected]>
-rw-r--r-- | src/gallium/auxiliary/tgsi/tgsi_transform.c | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/src/gallium/auxiliary/tgsi/tgsi_transform.c b/src/gallium/auxiliary/tgsi/tgsi_transform.c index 93e5b98c915..9d316ccb9e3 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_transform.c +++ b/src/gallium/auxiliary/tgsi/tgsi_transform.c @@ -171,10 +171,22 @@ tgsi_transform_shader(const struct tgsi_token *tokens_in, ctx->prolog(ctx); } - if (ctx->transform_instruction) - ctx->transform_instruction(ctx, fullinst); - else + /* XXX Note: we may also want to look for a main/top-level + * TGSI_OPCODE_RET instruction in the future. + */ + if (fullinst->Instruction.Opcode == TGSI_OPCODE_END + && ctx->epilog) { + /* Emit caller's epilog */ + ctx->epilog(ctx); + /* Emit END */ ctx->emit_instruction(ctx, fullinst); + } + else { + if (ctx->transform_instruction) + ctx->transform_instruction(ctx, fullinst); + else + ctx->emit_instruction(ctx, fullinst); + } first_instruction = FALSE; } @@ -220,10 +232,6 @@ tgsi_transform_shader(const struct tgsi_token *tokens_in, } } - if (ctx->epilog) { - ctx->epilog(ctx); - } - tgsi_parse_free (&parse); return ctx->ti; |