ureg: add generic emitters for tex and branch instructions
Couldn't previously emit these except by calling the opcode-specific helper.
This commit is contained in:
parent
ae4704eabc
commit
c23894295b
|
@ -564,6 +564,19 @@ ureg_emit_dst( struct ureg_program *ureg,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void validate( unsigned opcode,
|
||||||
|
unsigned nr_dst,
|
||||||
|
unsigned nr_src )
|
||||||
|
{
|
||||||
|
#ifdef DEBUG
|
||||||
|
const struct tgsi_opcode_info *info = tgsi_get_opcode_info( opcode );
|
||||||
|
assert(info);
|
||||||
|
if(info) {
|
||||||
|
assert(nr_dst == info->num_dst);
|
||||||
|
assert(nr_src == info->num_src);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
unsigned
|
unsigned
|
||||||
ureg_emit_insn(struct ureg_program *ureg,
|
ureg_emit_insn(struct ureg_program *ureg,
|
||||||
|
@ -574,6 +587,8 @@ ureg_emit_insn(struct ureg_program *ureg,
|
||||||
{
|
{
|
||||||
union tgsi_any_token *out;
|
union tgsi_any_token *out;
|
||||||
|
|
||||||
|
validate( opcode, num_dst, num_src );
|
||||||
|
|
||||||
out = get_tokens( ureg, DOMAIN_INSN, 1 );
|
out = get_tokens( ureg, DOMAIN_INSN, 1 );
|
||||||
out[0].value = 0;
|
out[0].value = 0;
|
||||||
out[0].insn.Type = TGSI_TOKEN_TYPE_INSTRUCTION;
|
out[0].insn.Type = TGSI_TOKEN_TYPE_INSTRUCTION;
|
||||||
|
@ -676,17 +691,6 @@ ureg_insn(struct ureg_program *ureg,
|
||||||
unsigned insn, i;
|
unsigned insn, i;
|
||||||
boolean saturate;
|
boolean saturate;
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
{
|
|
||||||
const struct tgsi_opcode_info *info = tgsi_get_opcode_info( opcode );
|
|
||||||
assert(info);
|
|
||||||
if(info) {
|
|
||||||
assert(nr_dst == info->num_dst);
|
|
||||||
assert(nr_src == info->num_src);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
saturate = nr_dst ? dst[0].Saturate : FALSE;
|
saturate = nr_dst ? dst[0].Saturate : FALSE;
|
||||||
|
|
||||||
insn = ureg_emit_insn( ureg, opcode, saturate, nr_dst, nr_src );
|
insn = ureg_emit_insn( ureg, opcode, saturate, nr_dst, nr_src );
|
||||||
|
@ -700,6 +704,53 @@ ureg_insn(struct ureg_program *ureg,
|
||||||
ureg_fixup_insn_size( ureg, insn );
|
ureg_fixup_insn_size( ureg, insn );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ureg_tex_insn(struct ureg_program *ureg,
|
||||||
|
unsigned opcode,
|
||||||
|
const struct ureg_dst *dst,
|
||||||
|
unsigned nr_dst,
|
||||||
|
unsigned target,
|
||||||
|
const struct ureg_src *src,
|
||||||
|
unsigned nr_src )
|
||||||
|
{
|
||||||
|
unsigned insn, i;
|
||||||
|
boolean saturate;
|
||||||
|
|
||||||
|
saturate = nr_dst ? dst[0].Saturate : FALSE;
|
||||||
|
|
||||||
|
insn = ureg_emit_insn( ureg, opcode, saturate, nr_dst, nr_src );
|
||||||
|
|
||||||
|
ureg_emit_texture( ureg, insn, target ); \
|
||||||
|
|
||||||
|
for (i = 0; i < nr_dst; i++)
|
||||||
|
ureg_emit_dst( ureg, dst[i] );
|
||||||
|
|
||||||
|
for (i = 0; i < nr_src; i++)
|
||||||
|
ureg_emit_src( ureg, src[i] );
|
||||||
|
|
||||||
|
ureg_fixup_insn_size( ureg, insn );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
ureg_label_insn(struct ureg_program *ureg,
|
||||||
|
unsigned opcode,
|
||||||
|
const struct ureg_src *src,
|
||||||
|
unsigned nr_src,
|
||||||
|
unsigned *label_token )
|
||||||
|
{
|
||||||
|
unsigned insn, i;
|
||||||
|
|
||||||
|
insn = ureg_emit_insn( ureg, opcode, FALSE, 0, nr_src );
|
||||||
|
|
||||||
|
ureg_emit_label( ureg, insn, label_token ); \
|
||||||
|
|
||||||
|
for (i = 0; i < nr_src; i++)
|
||||||
|
ureg_emit_src( ureg, src[i] );
|
||||||
|
|
||||||
|
ureg_fixup_insn_size( ureg, insn );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void emit_decl( struct ureg_program *ureg,
|
static void emit_decl( struct ureg_program *ureg,
|
||||||
|
|
|
@ -233,6 +233,24 @@ ureg_insn(struct ureg_program *ureg,
|
||||||
unsigned nr_src );
|
unsigned nr_src );
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
ureg_tex_insn(struct ureg_program *ureg,
|
||||||
|
unsigned opcode,
|
||||||
|
const struct ureg_dst *dst,
|
||||||
|
unsigned nr_dst,
|
||||||
|
unsigned target,
|
||||||
|
const struct ureg_src *src,
|
||||||
|
unsigned nr_src );
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
ureg_label_insn(struct ureg_program *ureg,
|
||||||
|
unsigned opcode,
|
||||||
|
const struct ureg_src *src,
|
||||||
|
unsigned nr_src,
|
||||||
|
unsigned *label);
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* Internal instruction helpers, don't call these directly:
|
* Internal instruction helpers, don't call these directly:
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue