r600g/cayman: handle empty vertex shaders
authorDave Airlie <airlied@redhat.com>
Tue, 18 Nov 2014 01:22:01 +0000 (11:22 +1000)
committerDave Airlie <airlied@redhat.com>
Tue, 18 Nov 2014 01:59:47 +0000 (11:59 +1000)
Some of the geom shader tests produce an empty vertex shader,
on cayman we'd crash in the finaliser because last_cf was NULL.

cayman doesn't need the NOP workaround, so if the code arrives
here with no last_cf, just emit an END.

fixes crashes in a bunch of piglit geom shader tests.

Cc: "10.3 10.4" <mesa-stable@lists.freedesktop.org>
Reviewed-by: Glenn Kennard <glenn.kennard@gmail.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
src/gallium/drivers/r600/sb/sb_bc_finalize.cpp

index 5c22f96469026cabffa7dffa6a0152b747dfbdb4..f0849ca6b6b9a882ea4da80c4320ca0d39921cb1 100644 (file)
@@ -83,14 +83,18 @@ int bc_finalizer::run() {
                last_cf = c;
        }
 
-       if (last_cf->bc.op_ptr->flags & CF_ALU) {
+       if (!ctx.is_cayman() && last_cf->bc.op_ptr->flags & CF_ALU) {
                last_cf = sh.create_cf(CF_OP_NOP);
                sh.root->push_back(last_cf);
        }
 
-       if (ctx.is_cayman())
-               last_cf->insert_after(sh.create_cf(CF_OP_CF_END));
-       else
+       if (ctx.is_cayman()) {
+               if (!last_cf) {
+                       cf_node *c = sh.create_cf(CF_OP_CF_END);
+                       sh.root->push_back(c);
+               } else
+                       last_cf->insert_after(sh.create_cf(CF_OP_CF_END));
+       } else
                last_cf->bc.end_of_program = 1;
 
        for (unsigned t = EXP_PIXEL; t < EXP_TYPE_COUNT; ++t) {