r600g/gs: fix cases where number of gs inputs != number of gs outputs
authorDave Airlie <airlied@redhat.com>
Wed, 18 Dec 2013 05:55:07 +0000 (15:55 +1000)
committerDave Airlie <airlied@redhat.com>
Wed, 5 Feb 2014 00:49:39 +0000 (10:49 +1000)
this fixes a bunch of the geom shader built-in tests

Signed-off-by: Dave Airlie <airlied@redhat.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
src/gallium/drivers/r600/r600_shader.c

index f4a3194fe593ca10e7edd999fa08383d6b805a63..07b343bd5feda6d5ae71fd834e33c7f072ed9024 100644 (file)
@@ -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;