[Mesa-dev] [PATCH 2/4] r600g: Move geometry properties state from shader to selector

Marek Olšák maraeo at gmail.com
Wed Aug 26 04:03:22 PDT 2015


On Tue, Aug 25, 2015 at 1:56 PM, Edward O'Callaghan
<edward.ocallaghan at koparo.com> wrote:
> From: Edward O'Callaghan <eocallaghan at alterapraxis.com>
>
> Signed-off-by: Edward O'Callaghan <eocallaghan at alterapraxis.com>
> ---
>  src/gallium/drivers/r600/evergreen_state.c   | 16 ++++++++--------
>  src/gallium/drivers/r600/r600_pipe.h         |  5 +++++
>  src/gallium/drivers/r600/r600_shader.c       |  6 +++---
>  src/gallium/drivers/r600/r600_shader.h       |  4 ----
>  src/gallium/drivers/r600/r600_state.c        | 12 ++++++------
>  src/gallium/drivers/r600/r600_state_common.c |  2 +-
>  6 files changed, 23 insertions(+), 22 deletions(-)
>
> diff --git a/src/gallium/drivers/r600/evergreen_state.c b/src/gallium/drivers/r600/evergreen_state.c
> index 6a91d47..d2c6ce3 100644
> --- a/src/gallium/drivers/r600/evergreen_state.c
> +++ b/src/gallium/drivers/r600/evergreen_state.c
> @@ -2143,11 +2143,11 @@ static void evergreen_emit_shader_stages(struct r600_context *rctx, struct r600_
>         if (state->geom_enable) {
>                 uint32_t cut_val;
>
> -               if (rctx->gs_shader->current->shader.gs_max_out_vertices <= 128)
> +               if (rctx->gs_shader->current->selector->gs_max_out_vertices <= 128)

You can do just:
gs_shader->gs_max_out_vertices

>                         cut_val = V_028A40_GS_CUT_128;
> -               else if (rctx->gs_shader->current->shader.gs_max_out_vertices <= 256)
> +               else if (rctx->gs_shader->current->selector->gs_max_out_vertices <= 256)

same here

>                         cut_val = V_028A40_GS_CUT_256;
> -               else if (rctx->gs_shader->current->shader.gs_max_out_vertices <= 512)
> +               else if (rctx->gs_shader->current->selector->gs_max_out_vertices <= 512)

same nere

>                         cut_val = V_028A40_GS_CUT_512;
>                 else
>                         cut_val = V_028A40_GS_CUT_1024;
> @@ -3013,7 +3013,7 @@ void evergreen_update_gs_state(struct pipe_context *ctx, struct r600_pipe_shader
>         struct r600_shader *rshader = &shader->shader;
>         struct r600_shader *cp_shader = &shader->gs_copy_shader->shader;
>         unsigned gsvs_itemsize =
> -                       (cp_shader->ring_item_size * rshader->gs_max_out_vertices) >> 2;
> +                       (cp_shader->ring_item_size * shader->selector->gs_max_out_vertices) >> 2;
>
>         r600_init_command_buffer(cb, 64);
>
> @@ -3022,14 +3022,14 @@ void evergreen_update_gs_state(struct pipe_context *ctx, struct r600_pipe_shader
>         r600_store_context_reg(cb, R_028AB8_VGT_VTX_CNT_EN, 1);
>
>         r600_store_context_reg(cb, R_028B38_VGT_GS_MAX_VERT_OUT,
> -                              S_028B38_MAX_VERT_OUT(rshader->gs_max_out_vertices));
> +                              S_028B38_MAX_VERT_OUT(shader->selector->gs_max_out_vertices));
>         r600_store_context_reg(cb, R_028A6C_VGT_GS_OUT_PRIM_TYPE,
> -                              r600_conv_prim_to_gs_out(rshader->gs_output_prim));
> +                              r600_conv_prim_to_gs_out(shader->selector->gs_output_prim));
>
>         if (rctx->screen->b.info.drm_minor >= 35) {
>                 r600_store_context_reg(cb, R_028B90_VGT_GS_INSTANCE_CNT,
> -                               S_028B90_CNT(MIN2(rshader->gs_num_invocations, 127)) |
> -                               S_028B90_ENABLE(rshader->gs_num_invocations > 0));
> +                               S_028B90_CNT(MIN2(shader->selector->gs_num_invocations, 127)) |
> +                               S_028B90_ENABLE(shader->selector->gs_num_invocations > 0));
>         }
>         r600_store_context_reg_seq(cb, R_02891C_SQ_GS_VERT_ITEMSIZE, 4);
>         r600_store_value(cb, cp_shader->ring_item_size >> 2);
> diff --git a/src/gallium/drivers/r600/r600_pipe.h b/src/gallium/drivers/r600/r600_pipe.h
> index 384ba80..72f5ab8 100644
> --- a/src/gallium/drivers/r600/r600_pipe.h
> +++ b/src/gallium/drivers/r600/r600_pipe.h
> @@ -311,6 +311,11 @@ struct r600_pipe_shader_selector {
>         /* PIPE_SHADER_[VERTEX|FRAGMENT|...] */
>         unsigned        type;
>
> +       /* geometry shader properties */
> +       unsigned        gs_output_prim;
> +       unsigned        gs_max_out_vertices;
> +       unsigned        gs_num_invocations;
> +
>         unsigned        nr_ps_max_color_exports;
>  };
>
> diff --git a/src/gallium/drivers/r600/r600_shader.c b/src/gallium/drivers/r600/r600_shader.c
> index 9d0d76f..b830479 100644
> --- a/src/gallium/drivers/r600/r600_shader.c
> +++ b/src/gallium/drivers/r600/r600_shader.c
> @@ -2010,13 +2010,13 @@ static int r600_shader_from_tgsi(struct r600_context *rctx,
>                                 /* we don't need this one */
>                                 break;
>                         case TGSI_PROPERTY_GS_OUTPUT_PRIM:
> -                               shader->gs_output_prim = property->u[0].Data;
> +                               pipeshader->selector->gs_output_prim = property->u[0].Data;

this is a layering violation. If you want to have the properties in
the selector, this must be set in r600_create_shader_state, which is
where the selector is created. r600_shader_from_tgsi should treat the
selector as read only. The selector is shared by all shader variants,
so the individual shaders shouldn't change it.

>                                 break;
>                         case TGSI_PROPERTY_GS_MAX_OUTPUT_VERTICES:
> -                               shader->gs_max_out_vertices = property->u[0].Data;
> +                               pipeshader->selector->gs_max_out_vertices = property->u[0].Data;

same here

>                                 break;
>                         case TGSI_PROPERTY_GS_INVOCATIONS:
> -                               shader->gs_num_invocations = property->u[0].Data;
> +                               pipeshader->selector->gs_num_invocations = property->u[0].Data;

same here

>                                 break;
>                         }
>                         break;
> diff --git a/src/gallium/drivers/r600/r600_shader.h b/src/gallium/drivers/r600/r600_shader.h
> index 2b99b22..f5ca9d6 100644
> --- a/src/gallium/drivers/r600/r600_shader.h
> +++ b/src/gallium/drivers/r600/r600_shader.h
> @@ -78,10 +78,6 @@ struct r600_shader {
>         /* Temporarily workaround SB not handling CF_INDEX_[01] index registers */
>         boolean                 uses_index_registers;
>
> -       /* geometry shader properties */
> -       unsigned                gs_output_prim;
> -       unsigned                gs_max_out_vertices;
> -       unsigned                gs_num_invocations;
>         /* size in bytes of a data item in the ring (single vertex data) */
>         unsigned                ring_item_size;
>
> diff --git a/src/gallium/drivers/r600/r600_state.c b/src/gallium/drivers/r600/r600_state.c
> index 5cc2283..4d4168e 100644
> --- a/src/gallium/drivers/r600/r600_state.c
> +++ b/src/gallium/drivers/r600/r600_state.c
> @@ -1951,11 +1951,11 @@ static void r600_emit_shader_stages(struct r600_context *rctx, struct r600_atom
>         if (state->geom_enable) {
>                 uint32_t cut_val;
>
> -               if (rctx->gs_shader->current->shader.gs_max_out_vertices <= 128)
> +               if (rctx->gs_shader->current->selector->gs_max_out_vertices <= 128)

gs_shader->gs_max_out_vertices. Your editor should tell you
automatically of which type gs_shader is, so you won't have to search
for it.

>                         cut_val = V_028A40_GS_CUT_128;
> -               else if (rctx->gs_shader->current->shader.gs_max_out_vertices <= 256)
> +               else if (rctx->gs_shader->current->selector->gs_max_out_vertices <= 256)

same here

>                         cut_val = V_028A40_GS_CUT_256;
> -               else if (rctx->gs_shader->current->shader.gs_max_out_vertices <= 512)
> +               else if (rctx->gs_shader->current->selector->gs_max_out_vertices <= 512)

same here

>                         cut_val = V_028A40_GS_CUT_512;
>                 else
>                         cut_val = V_028A40_GS_CUT_1024;
> @@ -2650,7 +2650,7 @@ void r600_update_gs_state(struct pipe_context *ctx, struct r600_pipe_shader *sha
>         struct r600_shader *rshader = &shader->shader;
>         struct r600_shader *cp_shader = &shader->gs_copy_shader->shader;
>         unsigned gsvs_itemsize =
> -                       (cp_shader->ring_item_size * rshader->gs_max_out_vertices) >> 2;
> +                       (cp_shader->ring_item_size * shader->selector->gs_max_out_vertices) >> 2;
>
>         r600_init_command_buffer(cb, 64);
>
> @@ -2659,10 +2659,10 @@ void r600_update_gs_state(struct pipe_context *ctx, struct r600_pipe_shader *sha
>
>         if (rctx->b.chip_class >= R700) {
>                 r600_store_context_reg(cb, R_028B38_VGT_GS_MAX_VERT_OUT,
> -                                      S_028B38_MAX_VERT_OUT(rshader->gs_max_out_vertices));
> +                                      S_028B38_MAX_VERT_OUT(shader->selector->gs_max_out_vertices));
>         }
>         r600_store_context_reg(cb, R_028A6C_VGT_GS_OUT_PRIM_TYPE,
> -                              r600_conv_prim_to_gs_out(rshader->gs_output_prim));
> +                              r600_conv_prim_to_gs_out(shader->selector->gs_output_prim));
>
>         r600_store_context_reg(cb, R_0288C8_SQ_GS_VERT_ITEMSIZE,
>                                cp_shader->ring_item_size >> 2);
> diff --git a/src/gallium/drivers/r600/r600_state_common.c b/src/gallium/drivers/r600/r600_state_common.c
> index a05dd83..47cd9f6 100644
> --- a/src/gallium/drivers/r600/r600_state_common.c
> +++ b/src/gallium/drivers/r600/r600_state_common.c
> @@ -1524,7 +1524,7 @@ static void r600_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info
>                 unsigned prim = info.mode;
>
>                 if (rctx->gs_shader) {
> -                       prim = rctx->gs_shader->current->shader.gs_output_prim;
> +                       prim = rctx->gs_shader->current->selector->gs_output_prim;

gs_shader->gs_output_prim

Marek


More information about the mesa-dev mailing list