gallium/util: use uint sampler for stencil-reads
[mesa.git] / src / gallium / auxiliary / draw / draw_vs_llvm.c
index d13ad24fff0bf50d8485f55001ba2078a3003c1e..42551b93381ccbad7901c03509f6085eedab4465 100644 (file)
@@ -28,6 +28,7 @@
 #include "util/u_math.h"
 #include "util/u_memory.h"
 #include "pipe/p_shader_tokens.h"
+#include "pipe/p_screen.h"
 
 #include "draw_private.h"
 #include "draw_context.h"
@@ -36,6 +37,8 @@
 
 #include "tgsi/tgsi_parse.h"
 #include "tgsi/tgsi_scan.h"
+#include "nir/nir_to_tgsi_info.h"
+#include "nir.h"
 
 static void
 vs_llvm_prepare(struct draw_vertex_shader *shader,
@@ -52,7 +55,8 @@ vs_llvm_run_linear( struct draw_vertex_shader *shader,
                     const unsigned constants_size[PIPE_MAX_CONSTANT_BUFFERS],
                    unsigned count,
                    unsigned input_stride,
-                   unsigned output_stride )
+                   unsigned output_stride,
+                   const unsigned *elts)
 {
    /* we should never get here since the entire pipeline is
     * generated in draw_pt_fetch_shade_pipeline_llvm.c */
@@ -64,19 +68,7 @@ static void
 vs_llvm_delete( struct draw_vertex_shader *dvs )
 {
    struct llvm_vertex_shader *shader = llvm_vertex_shader(dvs);
-   struct pipe_fence_handle *fence = NULL;
    struct draw_llvm_variant_list_item *li;
-   struct pipe_context *pipe = dvs->draw->pipe;
-
-   /*
-    * XXX: This might be not neccessary at all.
-    */
-   pipe->flush(pipe, 0, &fence);
-   if (fence) {
-      pipe->screen->fence_finish(pipe->screen, fence, 0);
-      pipe->screen->fence_reference(pipe->screen, &fence, NULL);
-   }
-
 
    li = first_elem(&shader->variants);
    while(!at_end(&shader->variants, li)) {
@@ -86,6 +78,8 @@ vs_llvm_delete( struct draw_vertex_shader *dvs )
    }
 
    assert(shader->variants_cached == 0);
+   if (dvs->state.ir.nir)
+      ralloc_free(dvs->state.ir.nir);
    FREE((void*) dvs->state.tokens);
    FREE( dvs );
 }
@@ -97,23 +91,41 @@ draw_create_vs_llvm(struct draw_context *draw,
 {
    struct llvm_vertex_shader *vs = CALLOC_STRUCT( llvm_vertex_shader );
 
-   if (vs == NULL)
+   if (!vs)
       return NULL;
 
-   /* we make a private copy of the tokens */
-   vs->base.state.tokens = tgsi_dup_tokens(state->tokens);
-   if (!vs->base.state.tokens) {
-      FREE(vs);
-      return NULL;
+   /* due to some bugs in the feedback state tracker we have to check
+      for ir.nir & PIPE_SHADER_IR_NIR here. */
+   if (state->ir.nir && state->type == PIPE_SHADER_IR_NIR) {
+      vs->base.state.ir.nir = state->ir.nir;
+      if (!draw->pipe->screen->get_param(draw->pipe->screen, PIPE_CAP_PACKED_UNIFORMS))
+         NIR_PASS_V(state->ir.nir, nir_lower_uniforms_to_ubo, 16);
+      nir_tgsi_scan_shader(state->ir.nir, &vs->base.info, true);
+   } else {
+      /* we make a private copy of the tokens */
+      vs->base.state.tokens = tgsi_dup_tokens(state->tokens);
+      if (!vs->base.state.tokens) {
+         FREE(vs);
+         return NULL;
+      }
+
+      tgsi_scan_shader(state->tokens, &vs->base.info);
    }
 
-   tgsi_scan_shader(state->tokens, &vs->base.info);
+   vs->variant_key_size = 
+      draw_llvm_variant_key_size(
+         vs->base.info.file_max[TGSI_FILE_INPUT]+1,
+         MAX2(vs->base.info.file_max[TGSI_FILE_SAMPLER]+1,
+              vs->base.info.file_max[TGSI_FILE_SAMPLER_VIEW]+1),
+         vs->base.info.file_max[TGSI_FILE_IMAGE]+1);
 
+   vs->base.state.type = state->type;
+   vs->base.state.stream_output = state->stream_output;
    vs->base.draw = draw;
    vs->base.prepare = vs_llvm_prepare;
    vs->base.run_linear = vs_llvm_run_linear;
    vs->base.delete = vs_llvm_delete;
-   vs->base.create_varient = draw_vs_create_varient_generic;
+   vs->base.create_variant = draw_vs_create_variant_generic;
 
    make_empty_list(&vs->variants);