From df121b868a13e7ca76f19d1488b625c02d632a47 Mon Sep 17 00:00:00 2001 From: Alex Deucher Date: Fri, 4 Nov 2011 18:33:31 -0400 Subject: [PATCH] Revert "r600g: precalculate semantic indices for SPI setup" This reverts commit c15f8569fddac5f8aee77863922fd5bb992cfe8a. This breaks r6xx. --- src/gallium/drivers/r600/evergreen_state.c | 19 +++--- src/gallium/drivers/r600/r600_shader.c | 67 ++++++++------------ src/gallium/drivers/r600/r600_shader.h | 2 +- src/gallium/drivers/r600/r600_state.c | 20 +++--- src/gallium/drivers/r600/r600_state_common.c | 13 ++-- 5 files changed, 57 insertions(+), 64 deletions(-) diff --git a/src/gallium/drivers/r600/evergreen_state.c b/src/gallium/drivers/r600/evergreen_state.c index 904267da1bd..fd2e5da8664 100644 --- a/src/gallium/drivers/r600/evergreen_state.c +++ b/src/gallium/drivers/r600/evergreen_state.c @@ -2375,20 +2375,20 @@ void evergreen_pipe_shader_vs(struct pipe_context *ctx, struct r600_pipe_shader struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; struct r600_pipe_state *rstate = &shader->rstate; struct r600_shader *rshader = &shader->shader; - unsigned spi_vs_out_id[10] = {}; - unsigned i, tmp, nparams = 0; + unsigned spi_vs_out_id[10]; + unsigned i, tmp, nparams; /* clear previous register */ rstate->nregs = 0; - for (i = 0; i < rshader->noutput; i++) { - if (rshader->output[i].spi_sid) { - tmp = rshader->output[i].spi_sid << ((nparams & 3) * 8); - spi_vs_out_id[nparams / 4] |= tmp; - nparams++; - } + /* so far never got proper semantic id from tgsi */ + for (i = 0; i < 10; i++) { + spi_vs_out_id[i] = 0; + } + for (i = 0; i < 32; i++) { + tmp = i << ((i & 3) * 8); + spi_vs_out_id[i / 4] |= tmp; } - for (i = 0; i < 10; i++) { r600_pipe_state_add_reg(rstate, R_02861C_SPI_VS_OUT_ID_0 + i * 4, @@ -2399,6 +2399,7 @@ void evergreen_pipe_shader_vs(struct pipe_context *ctx, struct r600_pipe_shader * VS is required to export at least one param and r600_shader_from_tgsi() * takes care of adding a dummy export. */ + nparams = rshader->noutput - rshader->npos; if (nparams < 1) nparams = 1; diff --git a/src/gallium/drivers/r600/r600_shader.c b/src/gallium/drivers/r600/r600_shader.c index 448e03ae39e..87164ce48df 100644 --- a/src/gallium/drivers/r600/r600_shader.c +++ b/src/gallium/drivers/r600/r600_shader.c @@ -57,6 +57,24 @@ issued in the w slot as well. The compiler must issue the source argument to slots z, y, and x */ + +int r600_find_vs_semantic_index(struct r600_shader *vs, + struct r600_shader *ps, int id) +{ + struct r600_shader_io *input = &ps->input[id]; + int index = 0; + + for (int i = 0; i < vs->noutput; i++) { + if (input->name == vs->output[i].name && + input->sid == vs->output[i].sid) + return index; + else if (vs->output[i].name != TGSI_SEMANTIC_POSITION && + vs->output[i].name != TGSI_SEMANTIC_PSIZE) + index++; + } + return 0; +} + static int r600_pipe_shader(struct pipe_context *ctx, struct r600_pipe_shader *shader) { struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx; @@ -343,44 +361,6 @@ static int evergreen_interp_flat(struct r600_shader_ctx *ctx, int input) * DB_SOURCE_FORMAT - export control restrictions * */ - - -/* Map name/sid pair from tgsi to the 8-bit semantic index for SPI setup */ -static int r600_spi_sid(struct r600_shader_io * io) -{ - int index, name = io->name; - - /* These params are handled differently, they don't need - * semantic indices, so we'll use 0 for them. - */ - if (name == TGSI_SEMANTIC_POSITION || - name == TGSI_SEMANTIC_PSIZE || - name == TGSI_SEMANTIC_FACE) - index = 0; - else { - if (name == TGSI_SEMANTIC_GENERIC) { - /* For generic params simply use sid from tgsi */ - index = io->sid; - } else { - - /* FIXME: two-side rendering is broken in r600g, this will - * keep old functionality */ - if (name == TGSI_SEMANTIC_BCOLOR) - name = TGSI_SEMANTIC_COLOR; - - /* For non-generic params - pack name and sid into 8 bits */ - index = 0x80 | (name<<3) | (io->sid); - } - - /* Make sure that all really used indices have nonzero value, so - * we can just compare it to 0 later instead of comparing the name - * with different values to detect special cases. */ - index++; - } - - return index; -}; - static int tgsi_declaration(struct r600_shader_ctx *ctx) { struct tgsi_full_declaration *d = &ctx->parse.FullToken.FullDeclaration; @@ -392,13 +372,13 @@ static int tgsi_declaration(struct r600_shader_ctx *ctx) i = ctx->shader->ninput++; ctx->shader->input[i].name = d->Semantic.Name; ctx->shader->input[i].sid = d->Semantic.Index; - ctx->shader->input[i].spi_sid = r600_spi_sid(&ctx->shader->input[i]); ctx->shader->input[i].interpolate = d->Declaration.Interpolate; ctx->shader->input[i].centroid = d->Declaration.Centroid; ctx->shader->input[i].gpr = ctx->file_offset[TGSI_FILE_INPUT] + d->Range.First; if (ctx->type == TGSI_PROCESSOR_FRAGMENT && ctx->bc->chip_class >= EVERGREEN) { /* turn input into interpolate on EG */ - if (ctx->shader->input[i].spi_sid) { + if (ctx->shader->input[i].name != TGSI_SEMANTIC_POSITION && + ctx->shader->input[i].name != TGSI_SEMANTIC_FACE) { ctx->shader->input[i].lds_pos = ctx->shader->nlds++; if (ctx->shader->input[i].interpolate > 0) { evergreen_interp_alu(ctx, i); @@ -412,9 +392,14 @@ static int tgsi_declaration(struct r600_shader_ctx *ctx) i = ctx->shader->noutput++; ctx->shader->output[i].name = d->Semantic.Name; ctx->shader->output[i].sid = d->Semantic.Index; - ctx->shader->output[i].spi_sid = r600_spi_sid(&ctx->shader->output[i]); ctx->shader->output[i].gpr = ctx->file_offset[TGSI_FILE_OUTPUT] + d->Range.First; ctx->shader->output[i].interpolate = d->Declaration.Interpolate; + if (ctx->type == TGSI_PROCESSOR_VERTEX) { + /* these don't count as vertex param exports */ + if ((ctx->shader->output[i].name == TGSI_SEMANTIC_POSITION) || + (ctx->shader->output[i].name == TGSI_SEMANTIC_PSIZE)) + ctx->shader->npos++; + } break; case TGSI_FILE_CONSTANT: case TGSI_FILE_TEMPORARY: diff --git a/src/gallium/drivers/r600/r600_shader.h b/src/gallium/drivers/r600/r600_shader.h index 9990ba646af..ada369ade68 100644 --- a/src/gallium/drivers/r600/r600_shader.h +++ b/src/gallium/drivers/r600/r600_shader.h @@ -30,7 +30,6 @@ struct r600_shader_io { unsigned gpr; unsigned done; int sid; - int spi_sid; unsigned interpolate; boolean centroid; unsigned lds_pos; /* for evergreen */ @@ -41,6 +40,7 @@ struct r600_shader { struct r600_bytecode bc; unsigned ninput; unsigned noutput; + unsigned npos; unsigned nlds; struct r600_shader_io input[32]; struct r600_shader_io output[32]; diff --git a/src/gallium/drivers/r600/r600_state.c b/src/gallium/drivers/r600/r600_state.c index ce65da668df..bf3da791c81 100644 --- a/src/gallium/drivers/r600/r600_state.c +++ b/src/gallium/drivers/r600/r600_state.c @@ -2142,19 +2142,22 @@ void r600_pipe_shader_vs(struct pipe_context *ctx, struct r600_pipe_shader *shad struct r600_pipe_state *rstate = &shader->rstate; struct r600_shader *rshader = &shader->shader; unsigned spi_vs_out_id[10]; - unsigned i, tmp, nparams = 0; + unsigned i, tmp, nparams; /* clear previous register */ rstate->nregs = 0; - for (i = 0; i < rshader->noutput; i++) { - if (rshader->output[i].spi_sid) { - tmp = rshader->output[i].spi_sid << ((nparams & 3) * 8); - spi_vs_out_id[nparams / 4] |= tmp; - nparams++; - } + /* so far never got proper semantic id from tgsi */ + /* FIXME better to move this in config things so they get emited + * only one time per cs + */ + for (i = 0; i < 10; i++) { + spi_vs_out_id[i] = 0; + } + for (i = 0; i < 32; i++) { + tmp = i << ((i & 3) * 8); + spi_vs_out_id[i / 4] |= tmp; } - for (i = 0; i < 10; i++) { r600_pipe_state_add_reg(rstate, R_028614_SPI_VS_OUT_ID_0 + i * 4, @@ -2165,6 +2168,7 @@ void r600_pipe_shader_vs(struct pipe_context *ctx, struct r600_pipe_shader *shad * VS is required to export at least one param and r600_shader_from_tgsi() * takes care of adding a dummy export. */ + nparams = rshader->noutput - rshader->npos; if (nparams < 1) nparams = 1; diff --git a/src/gallium/drivers/r600/r600_state_common.c b/src/gallium/drivers/r600/r600_state_common.c index 3d0345addce..b24bb549371 100644 --- a/src/gallium/drivers/r600/r600_state_common.c +++ b/src/gallium/drivers/r600/r600_state_common.c @@ -366,11 +366,14 @@ static void r600_spi_update(struct r600_pipe_context *rctx) rstate->nregs = 0; for (i = 0; i < rshader->ninput; i++) { - - sid = rshader->input[i].spi_sid; - - if (!sid && (rctx->chip_class >= EVERGREEN)) - continue; + if (rshader->input[i].name == TGSI_SEMANTIC_POSITION || + rshader->input[i].name == TGSI_SEMANTIC_FACE) + if (rctx->chip_class >= EVERGREEN) + continue; + else + sid=0; + else + sid=r600_find_vs_semantic_index(&rctx->vs_shader->shader, rshader, i); tmp = S_028644_SEMANTIC(sid); -- 2.30.2