summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Paul <[email protected]>2014-09-19 13:11:58 -0600
committerBrian Paul <[email protected]>2014-09-22 16:56:23 -0600
commit9e0160fc588c8f15516c75021c339e5ec9d7255d (patch)
tree9777d2bc43d7b9786cb012be0088da3ede6322b5
parentb16bb3f50f0d71f7e720c4feefcb86e15090d52f (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.c22
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;