[Mesa-dev] [PATCH] radeonsi: Fix up and enable flat shading.
Tom Stellard
tom at stellard.net
Wed Feb 13 11:34:04 PST 2013
On Wed, Feb 13, 2013 at 04:34:24PM +0100, Michel Dänzer wrote:
> From: Michel Dänzer <michel.daenzer at amd.com>
>
> Requires corresponding LLVM R600 backend fix to work correctly, but even
> without that it doesn't hang anymore.
>
> 13 more little piglits.
>
> NOTE: This is a candidate for the 9.1 branch.
Since this change depends on a change to the LLVM backend, could you
commit the LLVM change first and then add the revision number of that
commit to this commit message. Something like:
Depends on LLVM: r123456
This will help make it easier if we have to bisect changes.
-Tom
>
> Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>
> ---
> src/gallium/drivers/radeonsi/radeonsi_shader.c | 11 +----------
> src/gallium/drivers/radeonsi/radeonsi_shader.h | 1 +
> src/gallium/drivers/radeonsi/si_state.c | 5 ++---
> src/gallium/drivers/radeonsi/si_state_draw.c | 10 +---------
> 4 files changed, 5 insertions(+), 22 deletions(-)
>
> diff --git a/src/gallium/drivers/radeonsi/radeonsi_shader.c b/src/gallium/drivers/radeonsi/radeonsi_shader.c
> index 7c57f4c..704f859 100644
> --- a/src/gallium/drivers/radeonsi/radeonsi_shader.c
> +++ b/src/gallium/drivers/radeonsi/radeonsi_shader.c
> @@ -301,14 +301,8 @@ static void declare_input_fs(
> /* XXX: Handle all possible interpolation modes */
> switch (decl->Interp.Interpolate) {
> case TGSI_INTERPOLATE_COLOR:
> - /* XXX: Flat shading hangs the GPU */
> - if (si_shader_ctx->rctx->queued.named.rasterizer &&
> - si_shader_ctx->rctx->queued.named.rasterizer->flatshade) {
> -#if 0
> + if (si_shader_ctx->key.flatshade) {
> intr_name = "llvm.SI.fs.interp.constant";
> -#else
> - intr_name = "llvm.SI.fs.interp.linear.center";
> -#endif
> } else {
> if (decl->Interp.Centroid)
> intr_name = "llvm.SI.fs.interp.persp.centroid";
> @@ -317,11 +311,8 @@ static void declare_input_fs(
> }
> break;
> case TGSI_INTERPOLATE_CONSTANT:
> - /* XXX: Flat shading hangs the GPU */
> -#if 0
> intr_name = "llvm.SI.fs.interp.constant";
> break;
> -#endif
> case TGSI_INTERPOLATE_LINEAR:
> if (decl->Interp.Centroid)
> intr_name = "llvm.SI.fs.interp.linear.centroid";
> diff --git a/src/gallium/drivers/radeonsi/radeonsi_shader.h b/src/gallium/drivers/radeonsi/radeonsi_shader.h
> index 07b2f9f..f54f67c 100644
> --- a/src/gallium/drivers/radeonsi/radeonsi_shader.h
> +++ b/src/gallium/drivers/radeonsi/radeonsi_shader.h
> @@ -82,6 +82,7 @@ struct si_shader_key {
> unsigned nr_cbufs:4;
> unsigned color_two_side:1;
> unsigned alpha_func:3;
> + unsigned flatshade:1;
> float alpha_ref;
> };
>
> diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c
> index 5cca085..6bd1055 100644
> --- a/src/gallium/drivers/radeonsi/si_state.c
> +++ b/src/gallium/drivers/radeonsi/si_state.c
> @@ -419,8 +419,7 @@ static void *si_create_rs_state(struct pipe_context *ctx,
> rs->offset_units = state->offset_units;
> rs->offset_scale = state->offset_scale * 12.0f;
>
> - /* XXX: Flat shading hangs the GPU */
> - tmp = S_0286D4_FLAT_SHADE_ENA(0);
> + tmp = S_0286D4_FLAT_SHADE_ENA(rs->flatshade);
> if (state->sprite_coord_enable) {
> tmp |= S_0286D4_PNT_SPRITE_ENA(1) |
> S_0286D4_PNT_SPRITE_OVRD_X(V_0286D4_SPI_PNT_SPRITE_SEL_S) |
> @@ -1875,7 +1874,7 @@ static INLINE struct si_shader_key si_shader_selector_key(struct pipe_context *c
> key.export_16bpc = rctx->export_16bpc;
> if (rctx->queued.named.rasterizer) {
> key.color_two_side = rctx->queued.named.rasterizer->two_side;
> - /*key.flatshade = rctx->queued.named.rasterizer->flatshade;*/
> + key.flatshade = rctx->queued.named.rasterizer->flatshade;
> }
> if (rctx->queued.named.dsa) {
> key.alpha_func = rctx->queued.named.dsa->alpha_func;
> diff --git a/src/gallium/drivers/radeonsi/si_state_draw.c b/src/gallium/drivers/radeonsi/si_state_draw.c
> index 3704410..61dea74 100644
> --- a/src/gallium/drivers/radeonsi/si_state_draw.c
> +++ b/src/gallium/drivers/radeonsi/si_state_draw.c
> @@ -128,11 +128,6 @@ static void si_pipe_shader_ps(struct pipe_context *ctx, struct si_pipe_shader *s
> continue;
> }
>
> - /* XXX: Flat shading hangs the GPU */
> - if (shader->shader.input[i].interpolate == TGSI_INTERPOLATE_CONSTANT ||
> - (shader->shader.input[i].interpolate == TGSI_INTERPOLATE_COLOR &&
> - rctx->queued.named.rasterizer->flatshade))
> - have_linear = TRUE;
> if (shader->shader.input[i].interpolate == TGSI_INTERPOLATE_LINEAR)
> have_linear = TRUE;
> if (shader->shader.input[i].interpolate == TGSI_INTERPOLATE_PERSPECTIVE)
> @@ -327,15 +322,12 @@ static void si_update_spi_map(struct r600_context *rctx)
> bcolor:
> tmp = 0;
>
> -#if 0
> - /* XXX: Flat shading hangs the GPU */
> if (name == TGSI_SEMANTIC_POSITION ||
> ps->input[i].interpolate == TGSI_INTERPOLATE_CONSTANT ||
> (ps->input[i].interpolate == TGSI_INTERPOLATE_COLOR &&
> - rctx->rasterizer && rctx->rasterizer->flatshade)) {
> + rctx->ps_shader->current->key.flatshade)) {
> tmp |= S_028644_FLAT_SHADE(1);
> }
> -#endif
>
> if (name == TGSI_SEMANTIC_GENERIC &&
> rctx->sprite_coord_enable & (1 << ps->input[i].sid)) {
> --
> 1.8.1.3
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list