From 20adc7449cc4abe2caf6d78d2c62cc0e6e86b87c Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Wed, 18 Dec 2013 15:55:07 +1000 Subject: [PATCH] r600g/gs: fix cases where number of gs inputs != number of gs outputs this fixes a bunch of the geom shader built-in tests Signed-off-by: Dave Airlie Reviewed-by: Alex Deucher --- src/gallium/drivers/r600/r600_shader.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/r600/r600_shader.c b/src/gallium/drivers/r600/r600_shader.c index f4a3194fe59..07b343bd5fe 100644 --- a/src/gallium/drivers/r600/r600_shader.c +++ b/src/gallium/drivers/r600/r600_shader.c @@ -285,6 +285,7 @@ struct r600_shader_ctx { int fragcoord_input; int native_integers; int next_ring_offset; + int gs_out_ring_offset; int gs_next_vertex; struct r600_shader *gs_for_vs; }; @@ -619,6 +620,9 @@ static int tgsi_declaration(struct r600_shader_ctx *ctx) ctx->cv_output = i; break; } + if (ctx->type == TGSI_PROCESSOR_GEOMETRY) { + ctx->gs_out_ring_offset += 16; + } } else if (ctx->type == TGSI_PROCESSOR_FRAGMENT) { switch (d->Semantic.Name) { case TGSI_SEMANTIC_COLOR: @@ -1313,7 +1317,7 @@ static int emit_gs_ring_writes(struct r600_shader_ctx *ctx) /* next_ring_offset after parsing input decls contains total size of * single vertex data, gs_next_vertex - current vertex index */ - ring_offset += ctx->next_ring_offset * ctx->gs_next_vertex; + ring_offset += ctx->gs_out_ring_offset * ctx->gs_next_vertex; memset(&output, 0, sizeof(struct r600_bytecode_output)); output.gpr = ctx->shader->output[i].gpr; @@ -1379,6 +1383,7 @@ static int r600_shader_from_tgsi(struct r600_context *rctx, } ctx.next_ring_offset = 0; + ctx.gs_out_ring_offset = 0; ctx.gs_next_vertex = 0; ctx.face_gpr = -1; -- 2.30.2