llvmpipe: use alloca for fs color outputs
authorKeith Whitwell <keithw@vmware.com>
Thu, 7 Oct 2010 17:59:54 +0000 (18:59 +0100)
committerKeith Whitwell <keithw@vmware.com>
Sat, 9 Oct 2010 10:43:23 +0000 (11:43 +0100)
Don't try to emit our own phi's, let llvm mem2reg do it for us.

src/gallium/drivers/llvmpipe/lp_state_fs.c

index 0530c6132308bedb22011432e3bf15bcd8d99b1a..f75ae284cb353aec4e0721079eeaa2a0c2fff598 100644 (file)
@@ -303,8 +303,7 @@ generate_fs(struct llvmpipe_context *lp,
    /* Declare the color and z variables */
    for(cbuf = 0; cbuf < key->nr_cbufs; cbuf++) {
       for(chan = 0; chan < NUM_CHANNELS; ++chan) {
-        color[cbuf][chan] = LLVMGetUndef(vec_type);
-        lp_build_flow_scope_declare(flow, &color[cbuf][chan]);
+        color[cbuf][chan] = lp_build_alloca(builder, vec_type, "color");
       }
    }
 
@@ -369,7 +368,7 @@ generate_fs(struct llvmpipe_context *lp,
                                          &mask, alpha, alpha_ref_value);
                   }
 
-                 color[cbuf][chan] = out;
+                  LLVMBuildStore(builder, out, color[cbuf][chan]);
                   break;
                }
 
@@ -665,9 +664,18 @@ generate_fragment(struct llvmpipe_context *lp,
        * Convert the fs's output color and mask to fit to the blending type. 
        */
       for(chan = 0; chan < NUM_CHANNELS; ++chan) {
+         LLVMValueRef fs_color_vals[LP_MAX_VECTOR_LENGTH];
+         
+         for (i = 0; i < num_fs; i++) {
+            fs_color_vals[i] =
+               LLVMBuildLoad(builder, fs_out_color[cbuf][chan][i], "fs_color_vals");
+         }
+
         lp_build_conv(builder, fs_type, blend_type,
-                      fs_out_color[cbuf][chan], num_fs,
+                       fs_color_vals,
+                       num_fs,
                       &blend_in_color[chan], 1);
+
         lp_build_name(blend_in_color[chan], "color%d.%c", cbuf, "rgba"[chan]);
       }