[Mesa-dev] [PATCH 12/13] radeonsi: remove color_two_side from the shader key

Marek Olšák maraeo at gmail.com
Mon Jan 5 07:08:54 PST 2015


I will drop this patch. There is up to -15% change in performance for
legacy apps. Not worth it.

Marek

On Mon, Jan 5, 2015 at 12:18 AM, Marek Olšák <maraeo at gmail.com> wrote:
> From: Marek Olšák <marek.olsak at amd.com>
>
> This can be done using the SPI mapping only. If two_side is disabled,
> VS COLOR is loaded to both PS COLOR and PS BCOLOR inputs.
>
> The disadvantage is that the PS always chooses the color according to FACE
> even though two_side is disabled.
>
> Since PS color inputs can only be used in the GL compatibility profile, only
> legacy apps should be affected, which is acceptable.
>
> The PS shader key now only contains states for PS exports. The key can be
> eliminated completely by implementing a pixel shader export subroutine,
> so that we can stop compiling PS on demand. (it's also necessary for taking
> advantage of all the SPI color and Z formats)
> ---
>  src/gallium/drivers/radeonsi/si_pipe.h          |  1 +
>  src/gallium/drivers/radeonsi/si_shader.c        |  3 +--
>  src/gallium/drivers/radeonsi/si_shader.h        |  1 -
>  src/gallium/drivers/radeonsi/si_state_shaders.c | 27 ++++++++++++++-----------
>  4 files changed, 17 insertions(+), 15 deletions(-)
>
> diff --git a/src/gallium/drivers/radeonsi/si_pipe.h b/src/gallium/drivers/radeonsi/si_pipe.h
> index ba305e7..00825c1 100644
> --- a/src/gallium/drivers/radeonsi/si_pipe.h
> +++ b/src/gallium/drivers/radeonsi/si_pipe.h
> @@ -135,6 +135,7 @@ struct si_context {
>         /* shader information */
>         unsigned                        sprite_coord_enable;
>         bool                            flatshade;
> +       bool                            color_two_side;
>         struct si_descriptors           vertex_buffers;
>         struct si_buffer_resources      const_buffers[SI_NUM_SHADERS];
>         struct si_buffer_resources      rw_buffers[SI_NUM_SHADERS];
> diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c
> index 89099e2..1073723 100644
> --- a/src/gallium/drivers/radeonsi/si_shader.c
> +++ b/src/gallium/drivers/radeonsi/si_shader.c
> @@ -479,8 +479,7 @@ static void declare_input_fs(
>          */
>         intr_name = interp_param ? "llvm.SI.fs.interp" : "llvm.SI.fs.constant";
>
> -       if (decl->Semantic.Name == TGSI_SEMANTIC_COLOR &&
> -           si_shader_ctx->shader->key.ps.color_two_side) {
> +       if (decl->Semantic.Name == TGSI_SEMANTIC_COLOR) {
>                 LLVMValueRef args[4];
>                 LLVMValueRef face, is_face_positive;
>                 LLVMValueRef back_attr_number =
> diff --git a/src/gallium/drivers/radeonsi/si_shader.h b/src/gallium/drivers/radeonsi/si_shader.h
> index 21692f0..93461be 100644
> --- a/src/gallium/drivers/radeonsi/si_shader.h
> +++ b/src/gallium/drivers/radeonsi/si_shader.h
> @@ -121,7 +121,6 @@ union si_shader_key {
>         struct {
>                 unsigned        export_16bpc:8;
>                 unsigned        last_cbuf:3;
> -               unsigned        color_two_side:1;
>                 unsigned        alpha_func:3;
>                 unsigned        alpha_to_one:1;
>         } ps;
> diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c b/src/gallium/drivers/radeonsi/si_state_shaders.c
> index 437dd95..282fcf2 100644
> --- a/src/gallium/drivers/radeonsi/si_state_shaders.c
> +++ b/src/gallium/drivers/radeonsi/si_state_shaders.c
> @@ -360,15 +360,12 @@ static INLINE void si_shader_selector_key(struct pipe_context *ctx,
>                         key->ps.last_cbuf = MAX2(sctx->framebuffer.state.nr_cbufs, 1) - 1;
>                 key->ps.export_16bpc = sctx->framebuffer.export_16bpc;
>
> -               if (sctx->queued.named.rasterizer) {
> -                       key->ps.color_two_side = sctx->queued.named.rasterizer->two_side;
> -
> -                       if (sctx->queued.named.blend) {
> -                               key->ps.alpha_to_one = sctx->queued.named.blend->alpha_to_one &&
> -                                                      sctx->queued.named.rasterizer->multisample_enable &&
> -                                                      !sctx->framebuffer.cb0_is_integer;
> -                       }
> +               if (sctx->queued.named.rasterizer && sctx->queued.named.blend) {
> +                       key->ps.alpha_to_one = sctx->queued.named.blend->alpha_to_one &&
> +                                              sctx->queued.named.rasterizer->multisample_enable &&
> +                                              !sctx->framebuffer.cb0_is_integer;
>                 }
> +
>                 if (sctx->queued.named.dsa) {
>                         key->ps.alpha_func = sctx->queued.named.dsa->alpha_func;
>
> @@ -622,6 +619,7 @@ static void si_update_spi_map(struct si_context *sctx)
>                 unsigned index = psinfo->input_semantic_index[i];
>                 unsigned interpolate = psinfo->input_interpolate[i];
>                 unsigned param_offset = ps->ps_input_param_offset[i];
> +               bool is_bcolor = false;
>
>                 if (name == TGSI_SEMANTIC_POSITION ||
>                     name == TGSI_SEMANTIC_FACE)
> @@ -657,10 +655,13 @@ bcolor:
>                                R_028644_SPI_PS_INPUT_CNTL_0 + param_offset * 4,
>                                tmp);
>
> -               if (name == TGSI_SEMANTIC_COLOR &&
> -                   ps->key.ps.color_two_side) {
> -                       name = TGSI_SEMANTIC_BCOLOR;
> +               if (name == TGSI_SEMANTIC_COLOR && !is_bcolor) {
>                         param_offset++;
> +                       is_bcolor = true;
> +                       /* If two-sided colors are enabled, load BCOLOR,
> +                        * otherwise load COLOR again. */
> +                       if (sctx->color_two_side)
> +                               name = TGSI_SEMANTIC_BCOLOR;
>                         goto bcolor;
>                 }
>         }
> @@ -776,9 +777,11 @@ void si_update_shaders(struct si_context *sctx)
>
>         if (si_pm4_state_changed(sctx, ps) || si_pm4_state_changed(sctx, vs) ||
>             sctx->sprite_coord_enable != rs->sprite_coord_enable ||
> -           sctx->flatshade != rs->flatshade) {
> +           sctx->flatshade != rs->flatshade ||
> +           sctx->color_two_side != rs->two_side) {
>                 sctx->sprite_coord_enable = rs->sprite_coord_enable;
>                 sctx->flatshade = rs->flatshade;
> +               sctx->color_two_side = rs->two_side;
>                 si_update_spi_map(sctx);
>         }
>
> --
> 2.1.0
>


More information about the mesa-dev mailing list