On Tue, Aug 25, 2015 at 1:56 PM, Edward O'Callaghan <edward.ocallag...@koparo.com> wrote: > From: Edward O'Callaghan <eocallag...@alterapraxis.com> > > Signed-off-by: Edward O'Callaghan <eocallag...@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 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev