On Mon, Nov 30, 2015 at 8:20 AM, Dave Airlie <airl...@gmail.com> wrote:
> From: Dave Airlie <airl...@redhat.com>
>
> These macros will make things easier to see when tess
> is added to the mix.
>
> Signed-off-by: Dave Airlie <airl...@redhat.com>
> ---
>  src/gallium/drivers/r600/r600_state_common.c | 40 
> +++++++++++++++++-----------
>  1 file changed, 25 insertions(+), 15 deletions(-)
>
> diff --git a/src/gallium/drivers/r600/r600_state_common.c 
> b/src/gallium/drivers/r600/r600_state_common.c
> index 36afbd6..bc9c3b6 100644
> --- a/src/gallium/drivers/r600/r600_state_common.c
> +++ b/src/gallium/drivers/r600/r600_state_common.c
> @@ -1294,6 +1294,26 @@ static void r600_update_clip_state(struct r600_context 
> *rctx,
>                         return false;                                   \
>         } while(0)
>
> +#define UPDATE_SHADER(hw, sw) do {                                     \
> +               if (sw##_dirty || (rctx->hw_shader_stages[(hw)].shader != 
> rctx->sw##_shader->current)) \
> +                       update_shader_atom(ctx, 
> &rctx->hw_shader_stages[(hw)], rctx->sw##_shader->current); \
> +       } while(0)
> +
> +#define UPDATE_SHADER_CLIP(hw, sw) do {                                      
>   \
> +               if (sw##_dirty || (rctx->hw_shader_stages[(hw)].shader != 
> rctx->sw##_shader->current)) { \
> +                       update_shader_atom(ctx, 
> &rctx->hw_shader_stages[(hw)], rctx->sw##_shader->current); \
> +                       clip_so_current = rctx->sw##_shader->current;   \
> +               }                                                       \
> +       } while(0)
> +
> +#define UPDATE_SHADER_GS(hw, hw2, sw) do {                             \
> +               if (sw##_dirty || (rctx->hw_shader_stages[(hw)].shader != 
> rctx->sw##_shader->current)) { \
> +                       update_shader_atom(ctx, 
> &rctx->hw_shader_stages[(hw)], rctx->sw##_shader->current); \
> +                       update_shader_atom(ctx, 
> &rctx->hw_shader_stages[(hw2)], rctx->sw##_shader->current->gs_copy_shader); \
> +                       clip_so_current = 
> rctx->sw##_shader->current->gs_copy_shader; \
> +               }                                                       \
> +       } while(0)
> +

Why did you drop the "unlikely" from all the ifs ?

>  #define SET_NULL_SHADER(hw) do {                                             
>   \
>                 if (rctx->hw_shader_stages[(hw)].shader)        \
>                         update_shader_atom(ctx, 
> &rctx->hw_shader_stages[(hw)], NULL); \
> @@ -1338,17 +1358,11 @@ static bool r600_update_derived_state(struct 
> r600_context *rctx)
>                 }
>
>                 /* gs_shader provides GS and VS (copy shader) */
> -               if (unlikely(rctx->hw_shader_stages[R600_HW_STAGE_GS].shader 
> != rctx->gs_shader->current)) {
> -                       update_shader_atom(ctx, 
> &rctx->hw_shader_stages[R600_HW_STAGE_GS], rctx->gs_shader->current);
> -                       update_shader_atom(ctx, 
> &rctx->hw_shader_stages[R600_HW_STAGE_VS], 
> rctx->gs_shader->current->gs_copy_shader);
> -
> -                       clip_so_current = 
> rctx->gs_shader->current->gs_copy_shader;
> -               }
> +               UPDATE_SHADER_GS(R600_HW_STAGE_GS, R600_HW_STAGE_VS, gs);
>
>                 /* vs_shader is used as ES */
> -               if (unlikely(vs_dirty || 
> rctx->hw_shader_stages[R600_HW_STAGE_ES].shader != rctx->vs_shader->current)) 
> {
> -                       update_shader_atom(ctx, 
> &rctx->hw_shader_stages[R600_HW_STAGE_ES], rctx->vs_shader->current);
> -               }
> +               UPDATE_SHADER(R600_HW_STAGE_ES, vs);
> +
>         } else {
>                 if 
> (unlikely(rctx->hw_shader_stages[R600_HW_STAGE_GS].shader)) {
>                         SET_NULL_SHADER(R600_HW_STAGE_GS);
> @@ -1357,11 +1371,7 @@ static bool r600_update_derived_state(struct 
> r600_context *rctx)
>                         r600_mark_atom_dirty(rctx, &rctx->shader_stages.atom);
>                 }
>
> -               if (unlikely(vs_dirty || 
> rctx->hw_shader_stages[R600_HW_STAGE_VS].shader != rctx->vs_shader->current)) 
> {
> -                       update_shader_atom(ctx, 
> &rctx->hw_shader_stages[R600_HW_STAGE_VS], rctx->vs_shader->current);
> -
> -                       clip_so_current = rctx->vs_shader->current;
> -               }
> +               UPDATE_SHADER_CLIP(R600_HW_STAGE_VS, vs);
>         }
>
>         /* Update clip misc state. */
> @@ -1399,8 +1409,8 @@ static bool r600_update_derived_state(struct 
> r600_context *rctx)
>                 }
>
>                 r600_mark_atom_dirty(rctx, &rctx->shader_stages.atom);
> -               update_shader_atom(ctx, 
> &rctx->hw_shader_stages[R600_HW_STAGE_PS], rctx->ps_shader->current);
>         }
> +       UPDATE_SHADER(R600_HW_STAGE_PS, ps);

I'm not sure moving it outside the if is equal to the original code,
because in the large if statement before the macro call, there are
four conditions which are OR'ed between themselves. In the macro, you
have only two out of those four conditions. So, if those 2 conditions
in the macro are false, but at least one of the other two conditions
are true, you wouldn't update the PS shader in this patch, while in
the original code, the PS shader would have gotten updated.

btw, reading the original code, I'm not sure it was correct, because
calling update_shader_atom increments some memory accounting variables
unconditionally, so if you updated the shader with itself (i.e. they
weren't different), it may have resulted in wrong memory accounting.

>
>         if (rctx->b.chip_class >= EVERGREEN) {
>                 evergreen_update_db_shader_control(rctx);
> --
> 2.5.0
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Without reading yet the rest of the patch series, I feel this patch is
overkill. But I guess it would make sense when you add the tess stuff.
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to