tgsi/sse: add support for system values
authorBrian Paul <brianp@vmware.com>
Thu, 9 Dec 2010 01:20:05 +0000 (18:20 -0700)
committerBrian Paul <brianp@vmware.com>
Thu, 9 Dec 2010 01:20:05 +0000 (18:20 -0700)
src/gallium/auxiliary/tgsi/tgsi_sse2.c

index 086d983a73a38685c4893306a74e9d7b7b63a7e8..3f2cda860e0790ea08281df97473cf4b20afcb66 100644 (file)
@@ -163,6 +163,14 @@ get_immediate_base( void )
       reg_DX );
 }
 
+static struct x86_reg
+get_system_value_base( void )
+{
+   return x86_make_disp(
+      get_machine_base(),
+      Offset(struct tgsi_exec_machine, SystemValue) );
+}
+
 
 /**
  * Data access helpers.
@@ -228,6 +236,16 @@ get_temp(
       (vec * 4 + chan) * 16 );
 }
 
+static struct x86_reg
+get_system_value(
+   unsigned vec,
+   unsigned chan )
+{
+   return x86_make_disp(
+      get_system_value_base(), /* base */
+      (vec * 4 + chan) * 4 );  /* byte offset from base */
+}
+
 static struct x86_reg
 get_coef(
    unsigned vec,
@@ -422,6 +440,30 @@ emit_tempf(
       get_temp( vec, chan ) );
 }
 
+/**
+ * Copy a system value to xmm register
+ * \param xmm  the destination xmm register
+ * \param vec  the source system value register
+ * \param chan  src channel to fetch (X, Y, Z or W)
+ */
+static void
+emit_system_value(
+   struct x86_function *func,
+   unsigned xmm,
+   unsigned vec,
+   unsigned chan )
+{
+   sse_movss(
+      func,
+      make_xmm( xmm ),
+      get_system_value( vec, chan ) );
+   sse_shufps(
+      func,
+      make_xmm( xmm ),
+      make_xmm( xmm ),
+      SHUF( 0, 0, 0, 0 ) );
+}
+
 /**
  * Load an xmm register with an input attrib coefficient (a0, dadx or dady)
  * \param xmm  the destination xmm register
@@ -1281,8 +1323,15 @@ emit_fetch(
             swizzle );
          break;
 
-      case TGSI_FILE_INPUT:
       case TGSI_FILE_SYSTEM_VALUE:
+         emit_system_value(
+            func,
+            xmm,
+            reg->Register.Index,
+            swizzle );
+         break;
+
+      case TGSI_FILE_INPUT:
          emit_inputf(
             func,
             xmm,
@@ -2636,8 +2685,7 @@ emit_declaration(
    struct x86_function *func,
    struct tgsi_full_declaration *decl )
 {
-   if( decl->Declaration.File == TGSI_FILE_INPUT ||
-       decl->Declaration.File == TGSI_FILE_SYSTEM_VALUE ) {
+   if( decl->Declaration.File == TGSI_FILE_INPUT ) {
       unsigned first, last, mask;
       unsigned i, j;