[Mesa-dev] [PATCH 3/3 v2] r600g: get rid of dummy pixel shader

Marek Olšák maraeo at gmail.com
Mon Apr 10 20:48:22 UTC 2017


Pushed the series, thanks!

Marek

On Mon, Apr 10, 2017 at 10:04 PM, Constantine Kharlamov
<Hi-Angel at yandex.ru> wrote:
> The idea is taken from radeonsi. The code mostly was already checking for null
> pixel shader, so little checks had to be added.
>
> Interestingly, acc. to testing with GTAⅣ, though binding of null shader happens
> a lot at the start (then just stops), but draw_vbo() never actually sees null
> ps.
>
> v2: added a check I missed because of a macros using a prefix to choose
> a shader.
>
> Signed-off-by: Constantine Kharlamov <Hi-Angel at yandex.ru>
> Reviewed-by: Marek Olšák <marek.olsak at amd.com>
> ---
>  src/gallium/drivers/r600/r600_pipe.c         |  9 -----
>  src/gallium/drivers/r600/r600_pipe.h         |  3 --
>  src/gallium/drivers/r600/r600_state_common.c | 58 ++++++++++++++--------------
>  3 files changed, 30 insertions(+), 40 deletions(-)
>
> diff --git a/src/gallium/drivers/r600/r600_pipe.c b/src/gallium/drivers/r600/r600_pipe.c
> index 5014f2525c..7d8efd2c9b 100644
> --- a/src/gallium/drivers/r600/r600_pipe.c
> +++ b/src/gallium/drivers/r600/r600_pipe.c
> @@ -82,9 +82,6 @@ static void r600_destroy_context(struct pipe_context *context)
>         if (rctx->fixed_func_tcs_shader)
>                 rctx->b.b.delete_tcs_state(&rctx->b.b, rctx->fixed_func_tcs_shader);
>
> -       if (rctx->dummy_pixel_shader) {
> -               rctx->b.b.delete_fs_state(&rctx->b.b, rctx->dummy_pixel_shader);
> -       }
>         if (rctx->custom_dsa_flush) {
>                 rctx->b.b.delete_depth_stencil_alpha_state(&rctx->b.b, rctx->custom_dsa_flush);
>         }
> @@ -209,12 +206,6 @@ static struct pipe_context *r600_create_context(struct pipe_screen *screen,
>
>         r600_begin_new_cs(rctx);
>
> -       rctx->dummy_pixel_shader =
> -               util_make_fragment_cloneinput_shader(&rctx->b.b, 0,
> -                                                    TGSI_SEMANTIC_GENERIC,
> -                                                    TGSI_INTERPOLATE_CONSTANT);
> -       rctx->b.b.bind_fs_state(&rctx->b.b, rctx->dummy_pixel_shader);
> -
>         return &rctx->b.b;
>
>  fail:
> diff --git a/src/gallium/drivers/r600/r600_pipe.h b/src/gallium/drivers/r600/r600_pipe.h
> index 7f1ecc278b..e636ef0024 100644
> --- a/src/gallium/drivers/r600/r600_pipe.h
> +++ b/src/gallium/drivers/r600/r600_pipe.h
> @@ -432,9 +432,6 @@ struct r600_context {
>         void                            *custom_blend_resolve;
>         void                            *custom_blend_decompress;
>         void                            *custom_blend_fastclear;
> -       /* With rasterizer discard, there doesn't have to be a pixel shader.
> -        * In that case, we bind this one: */
> -       void                            *dummy_pixel_shader;
>         /* These dummy CMASK and FMASK buffers are used to get around the R6xx hardware
>          * bug where valid CMASK and FMASK are required to be present to avoid
>          * a hardlock in certain operations but aren't actually used
> diff --git a/src/gallium/drivers/r600/r600_state_common.c b/src/gallium/drivers/r600/r600_state_common.c
> index 5be49dcdfe..0131ea80d2 100644
> --- a/src/gallium/drivers/r600/r600_state_common.c
> +++ b/src/gallium/drivers/r600/r600_state_common.c
> @@ -725,7 +725,8 @@ static inline void r600_shader_selector_key(const struct pipe_context *ctx,
>                 if (!key->vs.as_ls)
>                         key->vs.as_es = (rctx->gs_shader != NULL);
>
> -               if (rctx->ps_shader->current->shader.gs_prim_id_input && !rctx->gs_shader) {
> +               if (rctx->ps_shader && rctx->ps_shader->current->shader.gs_prim_id_input &&
> +                   !rctx->gs_shader) {
>                         key->vs.as_gs_a = true;
>                         key->vs.prim_id_out = rctx->ps_shader->current->shader.input[rctx->ps_shader->current->shader.ps_prim_id_input].spi_sid;
>                 }
> @@ -909,9 +910,6 @@ static void r600_bind_ps_state(struct pipe_context *ctx, void *state)
>  {
>         struct r600_context *rctx = (struct r600_context *)ctx;
>
> -       if (!state)
> -               state = rctx->dummy_pixel_shader;
> -
>         rctx->ps_shader = (struct r600_pipe_shader_selector *)state;
>  }
>
> @@ -1478,7 +1476,8 @@ static bool r600_update_derived_state(struct r600_context *rctx)
>                 }
>         }
>
> -       SELECT_SHADER_OR_FAIL(ps);
> +       if (rctx->ps_shader)
> +               SELECT_SHADER_OR_FAIL(ps);
>
>         r600_mark_atom_dirty(rctx, &rctx->shader_stages.atom);
>
> @@ -1555,37 +1554,40 @@ static bool r600_update_derived_state(struct r600_context *rctx)
>                 rctx->b.streamout.enabled_stream_buffers_mask = clip_so_current->enabled_stream_buffers_mask;
>         }
>
> -       if (unlikely(ps_dirty || rctx->hw_shader_stages[R600_HW_STAGE_PS].shader != rctx->ps_shader->current ||
> -               rctx->rasterizer->sprite_coord_enable != rctx->ps_shader->current->sprite_coord_enable ||
> -               rctx->rasterizer->flatshade != rctx->ps_shader->current->flatshade)) {
> +       if (rctx->ps_shader) {
> +               if (unlikely((ps_dirty || rctx->hw_shader_stages[R600_HW_STAGE_PS].shader != rctx->ps_shader->current ||
> +                             rctx->rasterizer->sprite_coord_enable != rctx->ps_shader->current->sprite_coord_enable ||
> +                             rctx->rasterizer->flatshade != rctx->ps_shader->current->flatshade))) {
>
> -               if (rctx->cb_misc_state.nr_ps_color_outputs != rctx->ps_shader->current->nr_ps_color_outputs) {
> -                       rctx->cb_misc_state.nr_ps_color_outputs = rctx->ps_shader->current->nr_ps_color_outputs;
> -                       r600_mark_atom_dirty(rctx, &rctx->cb_misc_state.atom);
> -               }
> +                       if (rctx->cb_misc_state.nr_ps_color_outputs != rctx->ps_shader->current->nr_ps_color_outputs) {
> +                               rctx->cb_misc_state.nr_ps_color_outputs = rctx->ps_shader->current->nr_ps_color_outputs;
> +                               r600_mark_atom_dirty(rctx, &rctx->cb_misc_state.atom);
> +                       }
>
> -               if (rctx->b.chip_class <= R700) {
> -                       bool multiwrite = rctx->ps_shader->current->shader.fs_write_all;
> +                       if (rctx->b.chip_class <= R700) {
> +                               bool multiwrite = rctx->ps_shader->current->shader.fs_write_all;
>
> -                       if (rctx->cb_misc_state.multiwrite != multiwrite) {
> -                               rctx->cb_misc_state.multiwrite = multiwrite;
> -                               r600_mark_atom_dirty(rctx, &rctx->cb_misc_state.atom);
> +                               if (rctx->cb_misc_state.multiwrite != multiwrite) {
> +                                       rctx->cb_misc_state.multiwrite = multiwrite;
> +                                       r600_mark_atom_dirty(rctx, &rctx->cb_misc_state.atom);
> +                               }
>                         }
> -               }
>
> -               if (unlikely(!ps_dirty && rctx->ps_shader && rctx->rasterizer &&
> -                               ((rctx->rasterizer->sprite_coord_enable != rctx->ps_shader->current->sprite_coord_enable) ||
> -                                               (rctx->rasterizer->flatshade != rctx->ps_shader->current->flatshade)))) {
> +                       if (unlikely(!ps_dirty && rctx->rasterizer &&
> +                                    ((rctx->rasterizer->sprite_coord_enable != rctx->ps_shader->current->sprite_coord_enable) ||
> +                                     (rctx->rasterizer->flatshade != rctx->ps_shader->current->flatshade)))) {
>
> -                       if (rctx->b.chip_class >= EVERGREEN)
> -                               evergreen_update_ps_state(ctx, rctx->ps_shader->current);
> -                       else
> -                               r600_update_ps_state(ctx, rctx->ps_shader->current);
> +                               if (rctx->b.chip_class >= EVERGREEN)
> +                                       evergreen_update_ps_state(ctx, rctx->ps_shader->current);
> +                               else
> +                                       r600_update_ps_state(ctx, rctx->ps_shader->current);
> +                       }
> +
> +                       r600_mark_atom_dirty(rctx, &rctx->shader_stages.atom);
>                 }
>
> -               r600_mark_atom_dirty(rctx, &rctx->shader_stages.atom);
> +               UPDATE_SHADER(R600_HW_STAGE_PS, ps);
>         }
> -       UPDATE_SHADER(R600_HW_STAGE_PS, ps);
>
>         if (rctx->b.chip_class >= EVERGREEN) {
>                 evergreen_update_db_shader_control(rctx);
> @@ -1641,7 +1643,7 @@ static bool r600_update_derived_state(struct r600_context *rctx)
>                 }
>         }
>
> -       blend_disable = (rctx->dual_src_blend &&
> +       blend_disable = (rctx->dual_src_blend && rctx->ps_shader &&
>                         rctx->ps_shader->current->nr_ps_color_outputs < 2);
>
>         if (blend_disable != rctx->force_blend_disable) {
> --
> 2.12.2
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list