draw: pass sampler state down to llvm jit state
[mesa.git] / src / gallium / auxiliary / draw / draw_vs_aos_io.c
index b0c51d7fa19284da00046349101b31dbaa68631e..8f8bbe7cb88265c46e7be26786085856cce1d86b 100644 (file)
@@ -54,6 +54,7 @@ static void emit_load_R32G32B32( struct aos_compilation *cp,
                                 struct x86_reg data,
                                 struct x86_reg src_ptr )
 {
+#if 1
    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) );
@@ -62,6 +63,16 @@ static void emit_load_R32G32B32( struct aos_compilation *cp,
    /* data = ? 0 z 1 */
    sse_movlps(cp->func, data, src_ptr);
    /* data = x y z 1 */
+#else
+   sse_movups(cp->func, data, src_ptr);
+   /* data = x y z ? */
+   sse2_pshufd(cp->func, data, data, SHUF(W,X,Y,Z) );
+   /* data = ? x y z */
+   sse_movss(cp->func, data, aos_get_internal_xmm( cp, IMM_ONES ) );
+   /* data = 1 x y z */
+   sse2_pshufd(cp->func, data, data, SHUF(Y,Z,W,X) );
+   /* data = x y z 1 */
+#endif
 }
 
 static void emit_load_R32G32( struct aos_compilation *cp, 
@@ -128,7 +139,7 @@ static boolean get_buffer_ptr( struct aos_compilation *cp,
       x86_mov(cp->func, ptr, buf_ptr);
       x86_mov(cp->func, elt, buf_stride);
       x86_add(cp->func, elt, ptr);
-      sse_prefetchnta(cp->func, x86_deref(elt));
+      if (buf_idx == 0) sse_prefetchnta(cp->func, x86_make_disp(elt, 192));
       x86_mov(cp->func, buf_ptr, elt);
    }
    else {
@@ -180,7 +191,7 @@ static boolean load_input( struct aos_compilation *cp,
    case PIPE_FORMAT_R32G32B32A32_FLOAT:
       emit_load_R32G32B32A32(cp, dataXMM, src);
       break;
-   case PIPE_FORMAT_B8G8R8A8_UNORM:
+   case PIPE_FORMAT_A8R8G8B8_UNORM:
       emit_load_R8G8B8A8_UNORM(cp, dataXMM, src);
       emit_swizzle(cp, dataXMM, dataXMM, SHUF(Z,Y,X,W));
       break;
@@ -188,7 +199,7 @@ static boolean load_input( struct aos_compilation *cp,
       emit_load_R8G8B8A8_UNORM(cp, dataXMM, src);
       break;
    default:
-      ERROR(cp, "unhandled input format");
+      AOS_ERROR(cp, "unhandled input format");
       return FALSE;
    }
 
@@ -306,7 +317,7 @@ boolean aos_incr_inputs( struct aos_compilation *cp, boolean linear )
                                              Offset(struct aos_buffer, stride)));
 
       x86_add(cp->func, cp->idx_EBX, stride);
-      sse_prefetchnta(cp->func, x86_deref(cp->idx_EBX));
+      sse_prefetchnta(cp->func, x86_make_disp(cp->idx_EBX, 192));
    }
    else if (linear) {
       /* Nothing to do */
@@ -390,16 +401,14 @@ static boolean emit_output( struct aos_compilation *cp,
       emit_store_R32G32B32A32(cp, ptr, dataXMM);
       break;
    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);
-      }
+      emit_store_R8G8B8A8_UNORM(cp, ptr, dataXMM);
+      break;
+   case EMIT_4UB_BGRA:
+      emit_swizzle(cp, dataXMM, dataXMM, SHUF(Z,Y,X,W));
+      emit_store_R8G8B8A8_UNORM(cp, ptr, dataXMM);
       break;
    default:
-      ERROR(cp, "unhandled output format");
+      AOS_ERROR(cp, "unhandled output format");
       return FALSE;
    }
 
@@ -430,7 +439,7 @@ boolean aos_emit_outputs( struct aos_compilation *cp )
 
       if (data.file != file_XMM) {
          struct x86_reg tmp = aos_get_xmm_reg( cp );
-         sse_movups(cp->func, tmp, data);
+         sse_movaps(cp->func, tmp, data);
          data = tmp;
       }