[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