gallivm: cleanup the gs interface
[mesa.git] / src / gallium / auxiliary / draw / draw_vs.c
index 7caad6f0053a77d2d0cfc76de426c7b40e490197..266cca713e1591f30f3614955e0237cde107ba85 100644 (file)
 DEBUG_GET_ONCE_BOOL_OPTION(gallium_dump_vs, "GALLIUM_DUMP_VS", FALSE)
 
 
-/**
- * Set a vertex shader constant buffer.
- * \param slot  which constant buffer in [0, PIPE_MAX_CONSTANT_BUFFERS-1]
- * \param constants  the mapped buffer
- * \param size  size of buffer in bytes
- */
-void
-draw_vs_set_constants(struct draw_context *draw,
-                      unsigned slot,
-                      const void *constants,
-                      unsigned size)
-{
-   const int alignment = 16;
-
-   /* check if buffer is 16-byte aligned */
-   if (((uintptr_t)constants) & (alignment - 1)) {
-      /* if not, copy the constants into a new, 16-byte aligned buffer */
-      if (size > draw->vs.const_storage_size[slot]) {
-         if (draw->vs.aligned_constant_storage[slot]) {
-            align_free((void *)draw->vs.aligned_constant_storage[slot]);
-         }
-         draw->vs.aligned_constant_storage[slot] =
-            align_malloc(size, alignment);
-      }
-      assert(constants);
-      memcpy((void *)draw->vs.aligned_constant_storage[slot],
-             constants,
-             size);
-      constants = draw->vs.aligned_constant_storage[slot];
-   }
-
-   draw->vs.aligned_constants[slot] = constants;
-   draw_vs_aos_machine_constants(draw->vs.aos_machine, slot, constants);
-}
-
-
 void draw_vs_set_viewport( struct draw_context *draw,
                            const struct pipe_viewport_state *viewport )
 {
-   draw_vs_aos_machine_viewport( draw->vs.aos_machine, viewport );
 }
 
 
@@ -103,15 +66,8 @@ draw_create_vertex_shader(struct draw_context *draw,
       tgsi_dump(shader->tokens, 0);
    }
 
-   if (!draw->pt.middle.llvm) {
-#if defined(PIPE_ARCH_X86)
-      vs = draw_create_vs_sse( draw, shader );
-#elif defined(PIPE_ARCH_PPC)
-      vs = draw_create_vs_ppc( draw, shader );
-#endif
-   }
 #if HAVE_LLVM
-   else {
+   if (draw->pt.middle.llvm) {
       vs = draw_create_vs_llvm(draw, shader);
    }
 #endif
@@ -123,6 +79,8 @@ draw_create_vertex_shader(struct draw_context *draw,
    if (vs)
    {
       uint i;
+      bool found_clipvertex = FALSE;
+      vs->position_output = -1;
       for (i = 0; i < vs->info.num_outputs; i++) {
          if (vs->info.output_semantic_name[i] == TGSI_SEMANTIC_POSITION &&
              vs->info.output_semantic_index[i] == 0)
@@ -130,7 +88,19 @@ draw_create_vertex_shader(struct draw_context *draw,
          else if (vs->info.output_semantic_name[i] == TGSI_SEMANTIC_EDGEFLAG &&
              vs->info.output_semantic_index[i] == 0)
             vs->edgeflag_output = i;
+         else if (vs->info.output_semantic_name[i] == TGSI_SEMANTIC_CLIPVERTEX &&
+                  vs->info.output_semantic_index[i] == 0) {
+            found_clipvertex = TRUE;
+            vs->clipvertex_output = i;
+         } else if (vs->info.output_semantic_name[i] == TGSI_SEMANTIC_CLIPDIST) {
+            if (vs->info.output_semantic_index[i] == 0)
+               vs->clipdistance_output[0] = i;
+            else
+               vs->clipdistance_output[1] = i;
+         }
       }
+      if (!found_clipvertex)
+         vs->clipvertex_output = vs->position_output;
    }
 
    assert(vs);
@@ -150,6 +120,9 @@ draw_bind_vertex_shader(struct draw_context *draw,
       draw->vs.num_vs_outputs = dvs->info.num_outputs;
       draw->vs.position_output = dvs->position_output;
       draw->vs.edgeflag_output = dvs->edgeflag_output;
+      draw->vs.clipvertex_output = dvs->clipvertex_output;
+      draw->vs.clipdistance_output[0] = dvs->clipdistance_output[0];
+      draw->vs.clipdistance_output[1] = dvs->clipdistance_output[1];
       dvs->prepare( dvs, draw );
    }
    else {
@@ -180,8 +153,8 @@ draw_vs_init( struct draw_context *draw )
 {
    draw->dump_vs = debug_get_option_gallium_dump_vs();
 
-   draw->vs.machine = tgsi_exec_machine_create();
-   if (!draw->vs.machine)
+   draw->vs.tgsi.machine = tgsi_exec_machine_create();
+   if (!draw->vs.tgsi.machine)
       return FALSE;
 
    draw->vs.emit_cache = translate_cache_create();
@@ -192,36 +165,19 @@ draw_vs_init( struct draw_context *draw )
    if (!draw->vs.fetch_cache) 
       return FALSE;
 
-   draw->vs.aos_machine = draw_vs_aos_machine();
-#ifdef PIPE_ARCH_X86
-   if (!draw->vs.aos_machine)
-      return FALSE;
-#endif
-      
    return TRUE;
 }
 
 void
 draw_vs_destroy( struct draw_context *draw )
 {
-   uint i;
-
    if (draw->vs.fetch_cache)
       translate_cache_destroy(draw->vs.fetch_cache);
 
    if (draw->vs.emit_cache)
       translate_cache_destroy(draw->vs.emit_cache);
 
-   if (draw->vs.aos_machine)
-      draw_vs_aos_machine_destroy(draw->vs.aos_machine);
-
-   for (i = 0; i < PIPE_MAX_CONSTANT_BUFFERS; i++) {
-      if (draw->vs.aligned_constant_storage[i]) {
-         align_free((void *)draw->vs.aligned_constant_storage[i]);
-      }
-   }
-
-   tgsi_exec_machine_destroy(draw->vs.machine);
+   tgsi_exec_machine_destroy(draw->vs.tgsi.machine);
 }