radeonsi: Fix up and enable flat shading.
authorMichel Dänzer <michel.daenzer@amd.com>
Wed, 13 Feb 2013 11:54:13 +0000 (12:54 +0100)
committerMichel Dänzer <michel@daenzer.net>
Thu, 21 Feb 2013 08:14:36 +0000 (09:14 +0100)
Requires corresponding LLVM R600 backend fix to work correctly, but even
without that it doesn't hang anymore.

13 more little piglits.

Depends on LLVM: r175193, r175733

NOTE: This is a candidate for the 9.1 branch.

src/gallium/drivers/radeonsi/radeonsi_shader.c
src/gallium/drivers/radeonsi/radeonsi_shader.h
src/gallium/drivers/radeonsi/si_state.c
src/gallium/drivers/radeonsi/si_state_draw.c

index 7c57f4c2f3e52d5edb6bf56d157ada68603fd356..704f859efd7d8e79e0fe6f8eebbd2ea1649a52f2 100644 (file)
@@ -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";
index 07b2f9fc3e6f44df85beb368d1cf1b3dfb953e65..f54f67c4988c7612a542ef71c6d241916eef3aba 100644 (file)
@@ -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;
 };
 
index 81452ebc231794453205d7dd2b789ed17c14d9be..bb1bacdafbda5634bb3cb46eda8d92d4b16083e3 100644 (file)
@@ -421,8 +421,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(1);
        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) |
@@ -1885,7 +1884,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;
index 3704410c9bf22efedb27ab93b3be7e7ea79cbb4a..61dea74ac12c411a1335943960da7c46e79a07e3 100644 (file)
@@ -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)) {