tgsi: add generic instruction builder
authorKeith Whitwell <keithw@vmware.com>
Mon, 24 Aug 2009 10:32:06 +0000 (11:32 +0100)
committerKeith Whitwell <keithw@vmware.com>
Mon, 24 Aug 2009 10:33:38 +0000 (11:33 +0100)
When translating an incoming shader (rather than building one from scratch)
it's preferable to be able to call a single, generic instruction emitter
rather than figuring out which of the opcode-specific functions to call.

src/gallium/auxiliary/tgsi/tgsi_ureg.c
src/gallium/auxiliary/tgsi/tgsi_ureg.h

index 792293136168e1264e028c41c74c55e4b6c38aa4..7762243ef89bdf981e5e113a9012014b67112137 100644 (file)
@@ -605,6 +605,29 @@ ureg_fixup_insn_size(struct ureg_program *ureg,
 }
 
 
+void
+ureg_insn(struct ureg_program *ureg,
+          unsigned opcode,
+          const struct ureg_dst *dst,
+          unsigned nr_dst,
+          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 );
+
+   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 );
+}
 
 
 
index 5a48bb7a35cf678b5216feb716d234e5405ac2ca..fbf174b20992fae09e30cb080d4c3e6eac882434 100644 (file)
@@ -199,6 +199,16 @@ ureg_fixup_label(struct ureg_program *ureg,
                  unsigned instruction_number );
 
 
+/* Generic instruction emitter.  Use if you need to pass the opcode as
+ * a parameter, rather than using the emit_OP() varients below.
+ */
+void
+ureg_insn(struct ureg_program *ureg,
+          unsigned opcode,
+          const struct ureg_dst *dst,
+          unsigned nr_dst,
+          const struct ureg_src *src,
+          unsigned nr_src );
 
 
 /***********************************************************************