diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/gallium/auxiliary/tgsi/tgsi_ureg.c | 31 | ||||
| -rw-r--r-- | src/gallium/auxiliary/tgsi/tgsi_ureg.h | 27 | 
2 files changed, 57 insertions, 1 deletions
| diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.c b/src/gallium/auxiliary/tgsi/tgsi_ureg.c index ba84a82b2b..2fa1eb4c10 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_ureg.c +++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.c @@ -103,6 +103,7 @@ struct ureg_program     unsigned nr_constants;     unsigned nr_samplers; +   unsigned nr_instructions;     struct ureg_tokens domain[2];  }; @@ -525,7 +526,9 @@ ureg_emit_insn(struct ureg_program *ureg,     out[0].insn.NumSrcRegs = num_src;     out[0].insn.Padding = 0;     out[0].insn.Extended = 0; - +    +   ureg->nr_instructions++; +        return ureg->domain[DOMAIN_INSN].count - 1;  } @@ -544,6 +547,31 @@ ureg_emit_label(struct ureg_program *ureg,     out[0].value = 0;     out[0].insn_ext_label.Type = TGSI_INSTRUCTION_EXT_TYPE_LABEL; +    +   *label_token = ureg->domain[DOMAIN_INSN].count - 1; +} + +/* Will return a number which can be used in a label to point to the + * next instruction to be emitted. + */ +unsigned +ureg_get_instruction_number( struct ureg_program *ureg ) +{ +   return ureg->nr_instructions; +} + +/* Patch a given label (expressed as a token number) to point to a + * given instruction (expressed as an instruction number). + */ +void +ureg_fixup_label(struct ureg_program *ureg, +                 unsigned label_token, +                 unsigned instruction_number ) +{ +   union tgsi_any_token *out = retrieve_token( ureg, DOMAIN_INSN, label_token ); + +   assert(out->insn_ext_label.Type == TGSI_INSTRUCTION_EXT_TYPE_LABEL); +   out->insn_ext_label.Label = instruction_number;  } @@ -571,6 +599,7 @@ ureg_fixup_insn_size(struct ureg_program *ureg,  {     union tgsi_any_token *out = retrieve_token( ureg, DOMAIN_INSN, insn ); +   assert(out->insn.Type == TGSI_TOKEN_TYPE_INSTRUCTION);     out->insn.NrTokens = ureg->domain[DOMAIN_INSN].count - insn - 1;  } diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.h b/src/gallium/auxiliary/tgsi/tgsi_ureg.h index 0a976fd63b..5a48bb7a35 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_ureg.h +++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.h @@ -175,6 +175,33 @@ ureg_DECL_immediate1f( struct ureg_program *ureg,  }  /*********************************************************************** + * Functions for patching up labels + */ + + +/* Will return a number which can be used in a label to point to the + * next instruction to be emitted. + */ +unsigned +ureg_get_instruction_number( struct ureg_program *ureg ); + + +/* Patch a given label (expressed as a token number) to point to a + * given instruction (expressed as an instruction number). + * + * Labels are obtained from instruction emitters, eg ureg_CAL(). + * Instruction numbers are obtained from ureg_get_instruction_number(), + * above. + */ +void +ureg_fixup_label(struct ureg_program *ureg, +                 unsigned label_token, +                 unsigned instruction_number ); + + + + +/***********************************************************************   * Internal instruction helpers, don't call these directly:   */ | 
