On Fri, Nov 4, 2011 at 5:53 PM, Marek Olšák <mar...@gmail.com> wrote: > FYI, this commit completely breaks RV670. glxgears is completely > black, other apps are either black or rendered incorrectly (mostly > one-colored, the clear color I guess).
I knew I should have tested 6xx before I pushed. Reverted for now. Alex > > Marek > > On Fri, Nov 4, 2011 at 6:24 PM, Vadim Girlin <vadimgir...@gmail.com> wrote: >> There is no need to duplicate semantic mapping which is done in hw, so get >> rid of r600_find_vs_semantic_index. >> >> TGSI name/sid pair is mapped to the 8-bit semantic index for SPI. >> >> Signed-off-by: Vadim Girlin <vadimgir...@gmail.com> >> --- >> >> This patch and the next one were tested on the evergreen, >> there are some changes in the test results: >> >> Following tests are passing due to slightly different handling of >> TGSI_SEMANTIC_BCOLOR (it's still not completely correct). >> vertex-program-two-side enabled back back2 fail -> pass >> vertex-program-two-side enabled back front2 fail -> pass >> vertex-program-two-side enabled front back2 fail -> pass >> >> This test usually fails for me after these patches, but passes when >> it's run independently - probably unrelated: >> time-elapsed pass -> fail >> >> 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, 64 insertions(+), 57 deletions(-) >> >> diff --git a/src/gallium/drivers/r600/evergreen_state.c >> b/src/gallium/drivers/r600/evergreen_state.c >> index fd2e5da..904267d 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; >> + unsigned spi_vs_out_id[10] = {}; >> + unsigned i, tmp, nparams = 0; >> >> /* clear previous register */ >> rstate->nregs = 0; >> >> - /* 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 < 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++; >> + } >> } >> + >> for (i = 0; i < 10; i++) { >> r600_pipe_state_add_reg(rstate, >> R_02861C_SPI_VS_OUT_ID_0 + i * 4, >> @@ -2399,7 +2399,6 @@ 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 87164ce..448e03a 100644 >> --- a/src/gallium/drivers/r600/r600_shader.c >> +++ b/src/gallium/drivers/r600/r600_shader.c >> @@ -57,24 +57,6 @@ 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; >> @@ -361,6 +343,44 @@ 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; >> @@ -372,13 +392,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].name != >> TGSI_SEMANTIC_POSITION && >> - ctx->shader->input[i].name != >> TGSI_SEMANTIC_FACE) { >> + if (ctx->shader->input[i].spi_sid) { >> ctx->shader->input[i].lds_pos = >> ctx->shader->nlds++; >> if (ctx->shader->input[i].interpolate > 0) { >> evergreen_interp_alu(ctx, i); >> @@ -392,14 +412,9 @@ 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 ada369a..9990ba6 100644 >> --- a/src/gallium/drivers/r600/r600_shader.h >> +++ b/src/gallium/drivers/r600/r600_shader.h >> @@ -30,6 +30,7 @@ struct r600_shader_io { >> unsigned gpr; >> unsigned done; >> int sid; >> + int spi_sid; >> unsigned interpolate; >> boolean centroid; >> unsigned lds_pos; /* for evergreen */ >> @@ -40,7 +41,6 @@ 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 bf3da79..ce65da6 100644 >> --- a/src/gallium/drivers/r600/r600_state.c >> +++ b/src/gallium/drivers/r600/r600_state.c >> @@ -2142,22 +2142,19 @@ 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; >> + unsigned i, tmp, nparams = 0; >> >> /* clear previous register */ >> rstate->nregs = 0; >> >> - /* 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 < 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++; >> + } >> } >> + >> for (i = 0; i < 10; i++) { >> r600_pipe_state_add_reg(rstate, >> R_028614_SPI_VS_OUT_ID_0 + i * 4, >> @@ -2168,7 +2165,6 @@ 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 b24bb54..3d0345a 100644 >> --- a/src/gallium/drivers/r600/r600_state_common.c >> +++ b/src/gallium/drivers/r600/r600_state_common.c >> @@ -366,14 +366,11 @@ static void r600_spi_update(struct r600_pipe_context >> *rctx) >> >> rstate->nregs = 0; >> for (i = 0; i < rshader->ninput; i++) { >> - 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); >> + >> + sid = rshader->input[i].spi_sid; >> + >> + if (!sid && (rctx->chip_class >= EVERGREEN)) >> + continue; >> >> tmp = S_028644_SEMANTIC(sid); >> >> -- >> 1.7.7 >> >> _______________________________________________ >> mesa-dev mailing list >> mesa-dev@lists.freedesktop.org >> http://lists.freedesktop.org/mailman/listinfo/mesa-dev >> > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev