freedreno/a3xx: handle VS only outputting BCOLOR
authorRob Clark <robclark@freedesktop.org>
Fri, 3 Oct 2014 14:08:59 +0000 (10:08 -0400)
committerRob Clark <robclark@freedesktop.org>
Fri, 3 Oct 2014 18:19:52 +0000 (14:19 -0400)
Possibly we should map the front color to black (zeroes).  But not sure
there is a way to do that without generating a shader variant.

Signed-off-by: Rob Clark <robclark@freedesktop.org>
src/gallium/drivers/freedreno/a3xx/fd3_program.c

index d2a32486781834d746c814eb5df1de423037ac64..64c9668129bfb49513e70c5617459075cf31677c 100644 (file)
@@ -140,13 +140,21 @@ find_output(const struct ir3_shader_variant *so, ir3_semantic semantic)
         * in the vertex shader.. but the fragment shader doesn't know this
         * so  it will always have both IN.COLOR[n] and IN.BCOLOR[n].  So
         * at link time if there is no matching OUT.BCOLOR[n], we must map
-        * OUT.COLOR[n] to IN.BCOLOR[n].
+        * OUT.COLOR[n] to IN.BCOLOR[n].  And visa versa if there is only
+        * a OUT.BCOLOR[n] but no matching OUT.COLOR[n]
         */
        if (sem2name(semantic) == TGSI_SEMANTIC_BCOLOR) {
                unsigned idx = sem2idx(semantic);
-               return find_output(so, ir3_semantic_name(TGSI_SEMANTIC_COLOR, idx));
+               semantic = ir3_semantic_name(TGSI_SEMANTIC_COLOR, idx);
+       } else if (sem2name(semantic) == TGSI_SEMANTIC_COLOR) {
+               unsigned idx = sem2idx(semantic);
+               semantic = ir3_semantic_name(TGSI_SEMANTIC_BCOLOR, idx);
        }
 
+       for (j = 0; j < so->outputs_count; j++)
+               if (so->outputs[j].semantic == semantic)
+                       return j;
+
        debug_assert(0);
 
        return 0;