Merge branch 'master' into gallium-0.2
[mesa.git] / src / gallium / auxiliary / draw / draw_vs_aos_io.c
index ef265d61cfd67b13bc25dfbd9191079f85110193..26297c74f8262552d1f79b1b65dc33b4938bf991 100644 (file)
  **************************************************************************/
 
 
-#include "pipe/p_util.h"
+#include "util/u_memory.h"
 #include "pipe/p_shader_tokens.h"
-#include "tgsi/util/tgsi_parse.h"
-#include "tgsi/util/tgsi_util.h"
-#include "tgsi/exec/tgsi_exec.h"
+#include "tgsi/tgsi_parse.h"
+#include "tgsi/tgsi_util.h"
+#include "tgsi/tgsi_exec.h"
 #include "draw_vs.h"
 #include "draw_vs_aos.h"
+#include "draw_vertex.h"
 
 #include "rtasm/rtasm_x86sse.h"
 
@@ -54,9 +55,13 @@ static void emit_load_R32G32B32( struct aos_compilation *cp,
                                 struct x86_reg src_ptr )
 {
    sse_movss(cp->func, data, x86_make_disp(src_ptr, 8));
+   /* data = z ? ? ? */
    sse_shufps(cp->func, data, aos_get_internal_xmm( cp, IMM_IDENTITY ), SHUF(X,Y,Z,W) );
+   /* data = z ? 0 1 */
    sse_shufps(cp->func, data, data, SHUF(Y,Z,X,W) );
+   /* data = ? 0 z 1 */
    sse_movlps(cp->func, data, src_ptr);
+   /* data = x y z 1 */
 }
 
 static void emit_load_R32G32( struct aos_compilation *cp, 
@@ -90,25 +95,25 @@ static void emit_load_R8G8B8A8_UNORM( struct aos_compilation *cp,
 
 
 
-static void get_src_ptr( struct x86_function *func,
+static void get_src_ptr( struct aos_compilation *cp,
                          struct x86_reg src,
-                         struct x86_reg machine,
                          struct x86_reg elt,
                          unsigned a )
 {
-   struct x86_reg input_ptr = 
-      x86_make_disp(machine, 
-                   Offset(struct aos_machine, attrib[a].input_ptr));
+   struct x86_reg attrib = x86_make_disp(aos_get_x86( cp, 0, X86_ATTRIBS ), 
+                                         a * sizeof(struct aos_attrib));
 
-   struct x86_reg input_stride = 
-      x86_make_disp(machine, 
-                   Offset(struct aos_machine, attrib[a].input_stride));
+   struct x86_reg input_ptr = x86_make_disp(attrib, 
+                                            Offset(struct aos_attrib, input_ptr));
+
+   struct x86_reg input_stride = x86_make_disp(attrib, 
+                                               Offset(struct aos_attrib, input_stride));
 
    /* Calculate pointer to current attrib:
     */
-   x86_mov(func, src, input_stride);
-   x86_imul(func, src, elt);
-   x86_add(func, src, input_ptr);
+   x86_mov(cp->func, src, input_stride);
+   x86_imul(cp->func, src, elt);
+   x86_add(cp->func, src, input_ptr);
 }
 
 
@@ -117,7 +122,7 @@ static void get_src_ptr( struct x86_function *func,
 static void emit_swizzle( struct aos_compilation *cp,
                          struct x86_reg dest,
                          struct x86_reg src,
-                         unsigned shuffle )
+                         ubyte shuffle )
 {
    sse_shufps(cp->func, dest, src, shuffle);
 }
@@ -133,9 +138,8 @@ static boolean load_input( struct aos_compilation *cp,
 
    /* Figure out source pointer address:
     */
-   get_src_ptr(cp->func
+   get_src_ptr(cp, 
                src, 
-               cp->machine_EDX, 
                linear ? cp->idx_EBX : x86_deref(cp->idx_EBX),
                idx);
 
@@ -184,7 +188,6 @@ boolean aos_fetch_inputs( struct aos_compilation *cp, boolean linear )
       if (!load_input( cp, i, linear ))
          return FALSE;
       cp->insn_counter++;
-      debug_printf("\n");
    }
 
    return TRUE;
@@ -249,24 +252,27 @@ static boolean emit_output( struct aos_compilation *cp,
                             unsigned format )
 {
    switch (format) {
-   case PIPE_FORMAT_R32_FLOAT:
+   case EMIT_1F:
+   case EMIT_1F_PSIZE:
       emit_store_R32(cp, ptr, dataXMM);
       break;
-   case PIPE_FORMAT_R32G32_FLOAT:
+   case EMIT_2F:
       emit_store_R32G32(cp, ptr, dataXMM);
       break;
-   case PIPE_FORMAT_R32G32B32_FLOAT:
+   case EMIT_3F:
       emit_store_R32G32B32(cp, ptr, dataXMM);
       break;
-   case PIPE_FORMAT_R32G32B32A32_FLOAT:
+   case EMIT_4F:
       emit_store_R32G32B32A32(cp, ptr, dataXMM);
       break;
-   case PIPE_FORMAT_B8G8R8A8_UNORM:
-      emit_swizzle(cp, dataXMM, dataXMM, SHUF(Z,Y,X,W));
-      emit_store_R8G8B8A8_UNORM(cp, ptr, dataXMM);
-      break;
-   case PIPE_FORMAT_R8G8B8A8_UNORM:
-      emit_store_R8G8B8A8_UNORM(cp, ptr, dataXMM);
+   case EMIT_4UB:
+      if (1) {
+         emit_swizzle(cp, dataXMM, dataXMM, SHUF(Z,Y,X,W));
+         emit_store_R8G8B8A8_UNORM(cp, ptr, dataXMM);
+      }
+      else {
+         emit_store_R8G8B8A8_UNORM(cp, ptr, dataXMM);
+      }
       break;
    default:
       ERROR(cp, "unhandled output format");
@@ -285,10 +291,18 @@ boolean aos_emit_outputs( struct aos_compilation *cp )
    for (i = 0; i < cp->vaos->base.key.nr_outputs; i++) {
       unsigned format = cp->vaos->base.key.element[i].out.format;
       unsigned offset = cp->vaos->base.key.element[i].out.offset;
+      unsigned vs_output = cp->vaos->base.key.element[i].out.vs_output;
 
-      struct x86_reg data = aos_get_shader_reg( cp, 
-                                                TGSI_FILE_OUTPUT,
-                                                i );
+      struct x86_reg data;
+
+      if (format == EMIT_1F_PSIZE) {
+         data = aos_get_internal_xmm( cp, IMM_PSIZE );
+      }
+      else {
+         data = aos_get_shader_reg( cp, 
+                                    TGSI_FILE_OUTPUT,
+                                    vs_output );
+      }
 
       if (data.file != file_XMM) {
          struct x86_reg tmp = aos_get_xmm_reg( cp );
@@ -305,7 +319,6 @@ boolean aos_emit_outputs( struct aos_compilation *cp )
       aos_release_xmm_reg( cp, data.idx );
 
       cp->insn_counter++;
-      debug_printf("\n");
    }
 
    return TRUE;