[Mesa-dev] [PATCH 1/6] draw: rearrange code in llvm_middle_end_prepare()

Brian Paul brianp at vmware.com
Fri Dec 7 13:09:13 PST 2012


To clean it up and make it look more like the non-LLVM
fetch_pipeline_prepare() function.
---
 .../draw/draw_pt_fetch_shade_pipeline_llvm.c       |  140 ++++++++++---------
 1 files changed, 74 insertions(+), 66 deletions(-)

diff --git a/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c b/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c
index 507c158..9b8d343 100644
--- a/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c
+++ b/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c
@@ -65,23 +65,15 @@ llvm_middle_end_prepare( struct draw_pt_middle_end *middle,
 {
    struct llvm_middle_end *fpme = (struct llvm_middle_end *)middle;
    struct draw_context *draw = fpme->draw;
-   struct llvm_vertex_shader *shader =
-      llvm_vertex_shader(draw->vs.vertex_shader);
-   char store[DRAW_LLVM_MAX_VARIANT_KEY_SIZE];
-   struct draw_llvm_variant_key *key;
-   struct draw_llvm_variant *variant = NULL;
-   struct draw_llvm_variant_list_item *li;
-   const unsigned out_prim = (draw->gs.geometry_shader ? 
-                              draw->gs.geometry_shader->output_primitive :
-                              in_prim);
+   struct draw_vertex_shader *vs = draw->vs.vertex_shader;
+   struct draw_geometry_shader *gs = draw->gs.geometry_shader;
+   const unsigned out_prim = gs ? gs->output_primitive : in_prim;
 
    /* Add one to num_outputs because the pipeline occasionally tags on
     * an additional texcoord, eg for AA lines.
     */
-   const unsigned nr = MAX2( shader->base.info.num_inputs,
-                             shader->base.info.num_outputs + 1 );
-
-   unsigned i;
+   const unsigned nr = MAX2( vs->info.num_inputs,
+                             vs->info.num_outputs + 1 );
 
    fpme->input_prim = in_prim;
    fpme->opt = opt;
@@ -121,70 +113,86 @@ llvm_middle_end_prepare( struct draw_pt_middle_end *middle,
 
    /* return even number */
    *max_vertices = *max_vertices & ~1;
-   
-   key = draw_llvm_make_variant_key(fpme->llvm, store);
-
-   /* Search shader's list of variants for the key */
-   li = first_elem(&shader->variants);
-   while (!at_end(&shader->variants, li)) {
-      if (memcmp(&li->base->key, key, shader->variant_key_size) == 0) {
-         variant = li->base;
-         break;
+
+   /* Find/create the vertex shader variant */
+   {
+      struct draw_llvm_variant_key *key;
+      struct draw_llvm_variant *variant = NULL;
+      struct draw_llvm_variant_list_item *li;
+      struct llvm_vertex_shader *shader = llvm_vertex_shader(vs);
+      char store[DRAW_LLVM_MAX_VARIANT_KEY_SIZE];
+      unsigned i;
+
+      key = draw_llvm_make_variant_key(fpme->llvm, store);
+
+      /* Search shader's list of variants for the key */
+      li = first_elem(&shader->variants);
+      while (!at_end(&shader->variants, li)) {
+         if (memcmp(&li->base->key, key, shader->variant_key_size) == 0) {
+            variant = li->base;
+            break;
+         }
+         li = next_elem(li);
       }
-      li = next_elem(li);
-   }
 
-   if (variant) {
-      /* found the variant, move to head of global list (for LRU) */
-      move_to_head(&fpme->llvm->vs_variants_list, &variant->list_item_global);
-   }
-   else {
-      /* Need to create new variant */
-
-      /* First check if we've created too many variants.  If so, free
-       * 25% of the LRU to avoid using too much memory.
-       */
-      if (fpme->llvm->nr_variants >= DRAW_MAX_SHADER_VARIANTS) {
-         /*
-          * XXX: should we flush here ?
+      if (variant) {
+         /* found the variant, move to head of global list (for LRU) */
+         move_to_head(&fpme->llvm->vs_variants_list,
+                      &variant->list_item_global);
+      }
+      else {
+         /* Need to create new variant */
+
+         /* First check if we've created too many variants.  If so, free
+          * 25% of the LRU to avoid using too much memory.
           */
-         for (i = 0; i < DRAW_MAX_SHADER_VARIANTS / 4; i++) {
-            struct draw_llvm_variant_list_item *item;
-            if (is_empty_list(&fpme->llvm->vs_variants_list)) {
-               break;
+         if (fpme->llvm->nr_variants >= DRAW_MAX_SHADER_VARIANTS) {
+            /*
+             * XXX: should we flush here ?
+             */
+            for (i = 0; i < DRAW_MAX_SHADER_VARIANTS / 4; i++) {
+               struct draw_llvm_variant_list_item *item;
+               if (is_empty_list(&fpme->llvm->vs_variants_list)) {
+                  break;
+               }
+               item = last_elem(&fpme->llvm->vs_variants_list);
+               assert(item);
+               assert(item->base);
+               draw_llvm_destroy_variant(item->base);
             }
-            item = last_elem(&fpme->llvm->vs_variants_list);
-            assert(item);
-            assert(item->base);
-            draw_llvm_destroy_variant(item->base);
          }
-      }
 
-      variant = draw_llvm_create_variant(fpme->llvm, nr, key);
+         variant = draw_llvm_create_variant(fpme->llvm, nr, key);
 
-      if (variant) {
-         insert_at_head(&shader->variants, &variant->list_item_local);
-         insert_at_head(&fpme->llvm->vs_variants_list, &variant->list_item_global);
-         fpme->llvm->nr_variants++;
-         shader->variants_cached++;
+         if (variant) {
+            insert_at_head(&shader->variants, &variant->list_item_local);
+            insert_at_head(&fpme->llvm->vs_variants_list,
+                           &variant->list_item_global);
+            fpme->llvm->nr_variants++;
+            shader->variants_cached++;
+         }
       }
+
+      fpme->current_variant = variant;
    }
 
-   fpme->current_variant = variant;
+   /* Bind the VS and GS input constants, clip planes and viewport */
+   {
+      unsigned i;
 
-   for (i = 0; i < Elements(fpme->llvm->jit_context.vs_constants); ++i) {
-      fpme->llvm->jit_context.vs_constants[i] =
-         draw->pt.user.vs_constants[i];
-   }
-   for (i = 0; i < Elements(fpme->llvm->jit_context.gs_constants); ++i) {
-      fpme->llvm->jit_context.gs_constants[i] =
-         draw->pt.user.gs_constants[i];
-   }
-   fpme->llvm->jit_context.planes =
-      (float (*) [DRAW_TOTAL_CLIP_PLANES][4]) draw->pt.user.planes[0];
-   fpme->llvm->jit_context.viewport =
-      (float *)draw->viewport.scale;
-    
+      for (i = 0; i < Elements(fpme->llvm->jit_context.vs_constants); ++i) {
+         fpme->llvm->jit_context.vs_constants[i] =
+            draw->pt.user.vs_constants[i];
+      }
+      for (i = 0; i < Elements(fpme->llvm->jit_context.gs_constants); ++i) {
+         fpme->llvm->jit_context.gs_constants[i] =
+            draw->pt.user.gs_constants[i];
+      }
+      fpme->llvm->jit_context.planes =
+         (float (*) [DRAW_TOTAL_CLIP_PLANES][4]) draw->pt.user.planes[0];
+      fpme->llvm->jit_context.viewport =
+         (float *) draw->viewport.scale;
+   }    
 }
 
 
-- 
1.7.3.4



More information about the mesa-dev mailing list