+ if (variant) {
+ /* found the variant, move to head of global list (for LRU) */
+ move_to_head(&fpme->llvm->gs_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_gs_variants >= DRAW_MAX_SHADER_VARIANTS) {
+ /*
+ * XXX: should we flush here ?
+ */
+ for (i = 0; i < DRAW_MAX_SHADER_VARIANTS / 4; i++) {
+ struct draw_gs_llvm_variant_list_item *item;
+ if (is_empty_list(&fpme->llvm->gs_variants_list)) {
+ break;
+ }
+ item = last_elem(&fpme->llvm->gs_variants_list);
+ assert(item);
+ assert(item->base);
+ draw_gs_llvm_destroy_variant(item->base);
+ }
+ }
+
+ variant = draw_gs_llvm_create_variant(fpme->llvm, gs->info.num_outputs, key);
+
+ if (variant) {
+ insert_at_head(&shader->variants, &variant->list_item_local);
+ insert_at_head(&fpme->llvm->gs_variants_list,
+ &variant->list_item_global);
+ fpme->llvm->nr_gs_variants++;
+ shader->variants_cached++;
+ }
+ }
+
+ gs->current_variant = variant;
+}
+
+/**
+ * Prepare/validate middle part of the vertex pipeline.
+ * NOTE: if you change this function, also look at the non-LLVM
+ * function fetch_pipeline_prepare() for similar changes.
+ */
+static void
+llvm_middle_end_prepare( struct draw_pt_middle_end *middle,
+ unsigned in_prim,
+ unsigned opt,
+ unsigned *max_vertices )
+{
+ struct llvm_middle_end *fpme = (struct llvm_middle_end *)middle;
+ struct draw_context *draw = fpme->draw;
+ 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 :
+ u_assembled_prim(in_prim);
+ const unsigned nr = MAX2(vs->info.num_inputs,
+ draw_total_vs_outputs(draw));
+