/**************************************************************************
*
- * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * Copyright 2008 VMware, Inc.
* All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
struct tgsi_transform_context *ctx)
{
uint procType;
+ boolean first_instruction = TRUE;
/* input shader */
struct tgsi_parse_context parse;
struct tgsi_full_instruction *fullinst
= &parse.FullToken.FullInstruction;
- if (ctx->transform_instruction)
- ctx->transform_instruction(ctx, fullinst);
- else
+ if (first_instruction && ctx->prolog) {
+ ctx->prolog(ctx);
+ }
+
+ /* 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;
}
break;
}
}
- if (ctx->epilog) {
- ctx->epilog(ctx);
- }
-
tgsi_parse_free (&parse);
return ctx->ti;