i965: Generate driver-specific IR for non-fragment shaders as well.
authorEric Anholt <eric@anholt.net>
Tue, 3 May 2011 22:27:38 +0000 (15:27 -0700)
committerEric Anholt <eric@anholt.net>
Tue, 16 Aug 2011 20:04:41 +0000 (13:04 -0700)
This will be used by the new vertex shader backend.  The scalarizing
passes are skipped for non-fragment, since vertex and geometry threads
are based on vec4s.

src/mesa/drivers/dri/i965/brw_shader.cpp

index 9471883..f4005f8 100644 (file)
@@ -75,10 +75,15 @@ brw_link_shader(struct gl_context *ctx, struct gl_shader_program *prog)
 {
    struct brw_context *brw = brw_context(ctx);
    struct intel_context *intel = &brw->intel;
+   unsigned int stage;
+
+   for (stage = 0; stage < ARRAY_SIZE(prog->_LinkedShaders); stage++) {
+      struct brw_shader *shader =
+        (struct brw_shader *)prog->_LinkedShaders[stage];
+
+      if (!shader)
+        continue;
 
-   struct brw_shader *shader =
-      (struct brw_shader *)prog->_LinkedShaders[MESA_SHADER_FRAGMENT];
-   if (shader != NULL) {
       void *mem_ctx = ralloc_context(NULL);
       bool progress;
 
@@ -116,8 +121,10 @@ brw_link_shader(struct gl_context *ctx, struct gl_shader_program *prog)
       do {
         progress = false;
 
-        brw_do_channel_expressions(shader->ir);
-        brw_do_vector_splitting(shader->ir);
+        if (stage == MESA_SHADER_FRAGMENT) {
+           brw_do_channel_expressions(shader->ir);
+           brw_do_vector_splitting(shader->ir);
+        }
 
         progress = do_lower_jumps(shader->ir, true, true,
                                   true, /* main return */