Merge branch 'mesa_7_5_branch' into mesa_7_6_branch
[mesa.git] / src / gallium / auxiliary / draw / draw_vs_llvm.c
index 2ebf05526a15be594d2fa60fa60d2c0ad1fd9ecd..b3535c0e48e944038763538672fae1ad21733b1e 100644 (file)
@@ -1,8 +1,8 @@
 /**************************************************************************
- * 
+ *
  * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
  * All Rights Reserved.
- * 
+ *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the
  * "Software"), to deal in the Software without restriction, including
  * distribute, sub license, and/or sell copies of the Software, and to
  * permit persons to whom the Software is furnished to do so, subject to
  * the following conditions:
- * 
+ *
  * The above copyright notice and this permission notice (including the
  * next paragraph) shall be included in all copies or substantial portions
  * of the Software.
- * 
+ *
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
@@ -22,7 +22,7 @@
  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- * 
+ *
  **************************************************************************/
 
  /*
   *   Brian Paul
   */
 
-#include "pipe/p_util.h"
+#include "util/u_memory.h"
 #include "pipe/p_shader_tokens.h"
 #include "draw_private.h"
 #include "draw_context.h"
 #include "draw_vs.h"
 
-#include "tgsi/util/tgsi_parse.h"
+#include "tgsi/tgsi_parse.h"
 
 #ifdef MESA_LLVM
 
@@ -72,46 +72,9 @@ vs_llvm_run_linear( struct draw_vertex_shader *base,
    struct draw_llvm_vertex_shader *shader =
       (struct draw_llvm_vertex_shader *)base;
 
-   struct tgsi_exec_machine *machine = shader->machine;
-   unsigned int i, j;
-   unsigned slot;
-
-
-   for (i = 0; i < count; i += MAX_TGSI_VERTICES) {
-      unsigned int max_vertices = MIN2(MAX_TGSI_VERTICES, count - i);
-
-      /* Swizzle inputs.
-       */
-      for (j = 0; j < max_vertices; j++) {
-        for (slot = 0; slot < base->info.num_inputs; slot++) {
-           machine->Inputs[slot].xyzw[0].f[j] = input[slot][0];
-           machine->Inputs[slot].xyzw[1].f[j] = input[slot][1];
-           machine->Inputs[slot].xyzw[2].f[j] = input[slot][2];
-           machine->Inputs[slot].xyzw[3].f[j] = input[slot][3];
-        }
-
-        input = (const float (*)[4])((const char *)input + input_stride);
-      } 
-
-      /* run shader */
-      gallivm_cpu_vs_exec(shader->llvm_prog,
-                          machine->Inputs,
-                          machine->Outputs,
-                         (float (*)[4]) constants,
-                          machine->Temps);
-
-
-      /* Unswizzle all output results
-       */
-      for (slot = 1; slot < base->info.num_inputs; slot++) {
-         output[slot][0] = machine->Outputs[slot].xyzw[0].f[j];
-         output[slot][1] = machine->Outputs[slot].xyzw[1].f[j];
-         output[slot][2] = machine->Outputs[slot].xyzw[2].f[j];
-         output[slot][3] = machine->Outputs[slot].xyzw[3].f[j];
-
-        output = (float (*)[4])((char *)output + output_stride);
-      }
-   } 
+   gallivm_cpu_vs_exec(shader->llvm_prog, shader->machine,
+                       input, base->info.num_inputs, output, base->info.num_outputs,
+                       constants, count, input_stride, output_stride);
 }
 
 
@@ -119,7 +82,7 @@ vs_llvm_run_linear( struct draw_vertex_shader *base,
 static void
 vs_llvm_delete( struct draw_vertex_shader *base )
 {
-   struct draw_llvm_vertex_shader *shader = 
+   struct draw_llvm_vertex_shader *shader =
       (struct draw_llvm_vertex_shader *)base;
 
    /* Do something to free compiled shader:
@@ -137,21 +100,26 @@ draw_create_vs_llvm(struct draw_context *draw,
                    const struct pipe_shader_state *templ)
 {
    struct draw_llvm_vertex_shader *vs;
-   uint nt = tgsi_num_tokens(templ->tokens);
 
    vs = CALLOC_STRUCT( draw_llvm_vertex_shader );
-   if (vs == NULL) 
+   if (vs == NULL)
       return NULL;
 
    /* we make a private copy of the tokens */
-   vs->base.state.tokens = mem_dup(templ->tokens, nt * sizeof(templ->tokens[0]));
+   vs->base.state.tokens = tgsi_dup_tokens(templ->tokens);
+   if (!vs->base.state.tokens) {
+      FREE(vs);
+      return NULL;
+   }
 
    tgsi_scan_shader(vs->base.state.tokens, &vs->base.info);
 
+   vs->base.draw = draw;
    vs->base.prepare = vs_llvm_prepare;
+   vs->base.create_varient = draw_vs_varient_generic;
    vs->base.run_linear = vs_llvm_run_linear;
    vs->base.delete = vs_llvm_delete;
-   vs->machine = &draw->machine;
+   vs->machine = draw->vs.machine;
 
    {
       struct gallivm_ir *ir = gallivm_ir_new(GALLIVM_VS);
@@ -162,16 +130,16 @@ draw_create_vs_llvm(struct draw_context *draw,
       gallivm_ir_delete(ir);
    }
 
-   draw->engine = gallivm_global_cpu_engine();
+   draw->vs.engine = gallivm_global_cpu_engine();
 
    /* XXX: Why are there two versions of this?  Shouldn't creating the
     *      engine be a separate operation to compiling a shader?
     */
-   if (!draw->engine) {
-      draw->engine = gallivm_cpu_engine_create(vs->llvm_prog);
+   if (!draw->vs.engine) {
+      draw->vs.engine = gallivm_cpu_engine_create(vs->llvm_prog);
    }
    else {
-      gallivm_cpu_jit_compile(draw->engine, vs->llvm_prog);
+      gallivm_cpu_jit_compile(draw->vs.engine, vs->llvm_prog);
    }
 
    return &vs->base;