[Mesa-dev] [PATCH] r600g/cayman: hande empty vertex shaders

Dave Airlie airlied at gmail.com
Mon Nov 17 17:23:51 PST 2014


From: Dave Airlie <airlied at redhat.com>

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.

Signed-off-by: Dave Airlie <airlied at redhat.com>
---
 src/gallium/drivers/r600/sb/sb_bc_finalize.cpp | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/src/gallium/drivers/r600/sb/sb_bc_finalize.cpp b/src/gallium/drivers/r600/sb/sb_bc_finalize.cpp
index 5c22f96..f0849ca 100644
--- a/src/gallium/drivers/r600/sb/sb_bc_finalize.cpp
+++ b/src/gallium/drivers/r600/sb/sb_bc_finalize.cpp
@@ -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) {
-- 
1.9.3



More information about the mesa-dev mailing list