Hi, Am 30.11.2015 um 07:20 schrieb Dave Airlie: > From: Dave Airlie <airl...@redhat.com> > > This moves to using an array of hw stages for the atoms. > > Signed-off-by: Dave Airlie <airl...@redhat.com> > --- > src/gallium/drivers/r600/evergreen_state.c | 8 +++----- > src/gallium/drivers/r600/r600_hw_context.c | 8 ++++---- > src/gallium/drivers/r600/r600_pipe.h | 7 ++----- > src/gallium/drivers/r600/r600_state.c | 8 +++----- > src/gallium/drivers/r600/r600_state_common.c | 25 ++++++++++++------------- > 5 files changed, 24 insertions(+), 32 deletions(-) > > diff --git a/src/gallium/drivers/r600/evergreen_state.c > b/src/gallium/drivers/r600/evergreen_state.c > index 5333761..fd4c8b5 100644 > --- a/src/gallium/drivers/r600/evergreen_state.c > +++ b/src/gallium/drivers/r600/evergreen_state.c > @@ -3496,7 +3496,7 @@ fallback: > void evergreen_init_state_functions(struct r600_context *rctx) > { > unsigned id = 1; > - > + unsigned i; > /* !!! > * To avoid GPU lockup registers must be emited in a specific order > * (no kidding ...). The order below is important and have been > @@ -3555,10 +3555,8 @@ void evergreen_init_state_functions(struct > r600_context *rctx) > r600_add_atom(rctx, &rctx->b.render_cond_atom, id++); > r600_add_atom(rctx, &rctx->b.streamout.begin_atom, id++); > r600_add_atom(rctx, &rctx->b.streamout.enable_atom, id++); > - r600_init_atom(rctx, &rctx->vertex_shader.atom, id++, r600_emit_shader, > 23); As this is effectively changed to r600_init_atom(rctx, &rctx->vertex_shader.atom, id++, r600_emit_shader, 0);
Can you add something in the comment why this change is needed. All the Best Michael > - r600_init_atom(rctx, &rctx->pixel_shader.atom, id++, r600_emit_shader, > 0); > - r600_init_atom(rctx, &rctx->geometry_shader.atom, id++, > r600_emit_shader, 0); > - r600_init_atom(rctx, &rctx->export_shader.atom, id++, r600_emit_shader, > 0); > + for (i = 0; i < EG_NUM_HW_STAGES; i++) > + r600_init_atom(rctx, &rctx->hw_shader_stages[i].atom, id++, > r600_emit_shader, 0); > r600_init_atom(rctx, &rctx->shader_stages.atom, id++, > evergreen_emit_shader_stages, 6); > r600_init_atom(rctx, &rctx->gs_rings.atom, id++, > evergreen_emit_gs_rings, 26); > > diff --git a/src/gallium/drivers/r600/r600_hw_context.c > b/src/gallium/drivers/r600/r600_hw_context.c > index 6409f0b..13b6918 100644 > --- a/src/gallium/drivers/r600/r600_hw_context.c > +++ b/src/gallium/drivers/r600/r600_hw_context.c > @@ -300,7 +300,7 @@ void r600_begin_new_cs(struct r600_context *ctx) > r600_mark_atom_dirty(ctx, &ctx->db_misc_state.atom); > r600_mark_atom_dirty(ctx, &ctx->db_state.atom); > r600_mark_atom_dirty(ctx, &ctx->framebuffer.atom); > - r600_mark_atom_dirty(ctx, &ctx->pixel_shader.atom); > + r600_mark_atom_dirty(ctx, > &ctx->hw_shader_stages[R600_HW_STAGE_PS].atom); > r600_mark_atom_dirty(ctx, &ctx->poly_offset_state.atom); > r600_mark_atom_dirty(ctx, &ctx->vgt_state.atom); > r600_mark_atom_dirty(ctx, &ctx->sample_mask.atom); > @@ -315,13 +315,13 @@ void r600_begin_new_cs(struct r600_context *ctx) > } > r600_mark_atom_dirty(ctx, &ctx->stencil_ref.atom); > r600_mark_atom_dirty(ctx, &ctx->vertex_fetch_shader.atom); > - r600_mark_atom_dirty(ctx, &ctx->export_shader.atom); > + r600_mark_atom_dirty(ctx, > &ctx->hw_shader_stages[R600_HW_STAGE_ES].atom); > r600_mark_atom_dirty(ctx, &ctx->shader_stages.atom); > if (ctx->gs_shader) { > - r600_mark_atom_dirty(ctx, &ctx->geometry_shader.atom); > + r600_mark_atom_dirty(ctx, > &ctx->hw_shader_stages[R600_HW_STAGE_GS].atom); > r600_mark_atom_dirty(ctx, &ctx->gs_rings.atom); > } > - r600_mark_atom_dirty(ctx, &ctx->vertex_shader.atom); > + r600_mark_atom_dirty(ctx, > &ctx->hw_shader_stages[R600_HW_STAGE_VS].atom); > r600_mark_atom_dirty(ctx, &ctx->b.streamout.enable_atom); > r600_mark_atom_dirty(ctx, &ctx->b.render_cond_atom); > > diff --git a/src/gallium/drivers/r600/r600_pipe.h > b/src/gallium/drivers/r600/r600_pipe.h > index 0e57efe..0ca4052 100644 > --- a/src/gallium/drivers/r600/r600_pipe.h > +++ b/src/gallium/drivers/r600/r600_pipe.h > @@ -38,7 +38,7 @@ > > #include "tgsi/tgsi_scan.h" > > -#define R600_NUM_ATOMS 43 > +#define R600_NUM_ATOMS 45 > > #define R600_MAX_VIEWPORTS 16 > > @@ -481,10 +481,7 @@ struct r600_context { > struct r600_viewport_state viewport; > /* Shaders and shader resources. */ > struct r600_cso_state vertex_fetch_shader; > - struct r600_shader_state vertex_shader; > - struct r600_shader_state pixel_shader; > - struct r600_shader_state geometry_shader; > - struct r600_shader_state export_shader; > + struct r600_shader_state hw_shader_stages[EG_NUM_HW_STAGES]; > struct r600_cs_shader_state cs_shader_state; > struct r600_shader_stages_state shader_stages; > struct r600_gs_rings_state gs_rings; > diff --git a/src/gallium/drivers/r600/r600_state.c > b/src/gallium/drivers/r600/r600_state.c > index a16d4bd..9638c66 100644 > --- a/src/gallium/drivers/r600/r600_state.c > +++ b/src/gallium/drivers/r600/r600_state.c > @@ -3063,7 +3063,7 @@ fallback: > void r600_init_state_functions(struct r600_context *rctx) > { > unsigned id = 1; > - > + unsigned i; > /* !!! > * To avoid GPU lockup registers must be emited in a specific order > * (no kidding ...). The order below is important and have been > @@ -3118,10 +3118,8 @@ void r600_init_state_functions(struct r600_context > *rctx) > r600_add_atom(rctx, &rctx->b.render_cond_atom, id++); > r600_add_atom(rctx, &rctx->b.streamout.begin_atom, id++); > r600_add_atom(rctx, &rctx->b.streamout.enable_atom, id++); > - r600_init_atom(rctx, &rctx->vertex_shader.atom, id++, r600_emit_shader, > 23); > - r600_init_atom(rctx, &rctx->pixel_shader.atom, id++, r600_emit_shader, > 0); > - r600_init_atom(rctx, &rctx->geometry_shader.atom, id++, > r600_emit_shader, 0); > - r600_init_atom(rctx, &rctx->export_shader.atom, id++, r600_emit_shader, > 0); > + for (i = 0; i < R600_NUM_HW_STAGES; i++) > + r600_init_atom(rctx, &rctx->hw_shader_stages[i].atom, id++, > r600_emit_shader, 0); > r600_init_atom(rctx, &rctx->shader_stages.atom, id++, > r600_emit_shader_stages, 0); > r600_init_atom(rctx, &rctx->gs_rings.atom, id++, r600_emit_gs_rings, 0); > > diff --git a/src/gallium/drivers/r600/r600_state_common.c > b/src/gallium/drivers/r600/r600_state_common.c > index 4ea122a..b544abb 100644 > --- a/src/gallium/drivers/r600/r600_state_common.c > +++ b/src/gallium/drivers/r600/r600_state_common.c > @@ -1327,9 +1327,9 @@ static bool r600_update_derived_state(struct > r600_context *rctx) > } > > /* gs_shader provides GS and VS (copy shader) */ > - if (unlikely(rctx->geometry_shader.shader != > rctx->gs_shader->current)) { > - update_shader_atom(ctx, &rctx->geometry_shader, > rctx->gs_shader->current); > - update_shader_atom(ctx, &rctx->vertex_shader, > rctx->gs_shader->current->gs_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); > /* Update clip misc state. */ > r600_update_clip_state(rctx, > rctx->gs_shader->current->gs_copy_shader); > rctx->b.streamout.enabled_stream_buffers_mask = > rctx->gs_shader->current->gs_copy_shader->enabled_stream_buffers_mask; > @@ -1340,13 +1340,13 @@ static bool r600_update_derived_state(struct > r600_context *rctx) > return false; > > /* vs_shader is used as ES */ > - if (unlikely(vs_dirty || rctx->export_shader.shader != > rctx->vs_shader->current)) { > - update_shader_atom(ctx, &rctx->export_shader, > rctx->vs_shader->current); > + 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); > } > } else { > - if (unlikely(rctx->geometry_shader.shader)) { > - update_shader_atom(ctx, &rctx->geometry_shader, NULL); > - update_shader_atom(ctx, &rctx->export_shader, NULL); > + if (unlikely(rctx->hw_shader_stages[R600_HW_STAGE_GS].shader)) { > + update_shader_atom(ctx, > &rctx->hw_shader_stages[R600_HW_STAGE_GS], NULL); > + update_shader_atom(ctx, > &rctx->hw_shader_stages[R600_HW_STAGE_ES], NULL); > rctx->shader_stages.geom_enable = false; > r600_mark_atom_dirty(rctx, &rctx->shader_stages.atom); > } > @@ -1355,8 +1355,8 @@ static bool r600_update_derived_state(struct > r600_context *rctx) > if (unlikely(!rctx->vs_shader->current)) > return false; > > - if (unlikely(vs_dirty || rctx->vertex_shader.shader != > rctx->vs_shader->current)) { > - update_shader_atom(ctx, &rctx->vertex_shader, > rctx->vs_shader->current); > + 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); > > /* Update clip misc state. */ > r600_update_clip_state(rctx, rctx->vs_shader->current); > @@ -1364,8 +1364,7 @@ static bool r600_update_derived_state(struct > r600_context *rctx) > } > } > > - > - if (unlikely(ps_dirty || rctx->pixel_shader.shader != > rctx->ps_shader->current || > + 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)) { > > @@ -1394,7 +1393,7 @@ static bool r600_update_derived_state(struct > r600_context *rctx) > } > > r600_mark_atom_dirty(rctx, &rctx->shader_stages.atom); > - update_shader_atom(ctx, &rctx->pixel_shader, > rctx->ps_shader->current); > + update_shader_atom(ctx, > &rctx->hw_shader_stages[R600_HW_STAGE_PS], rctx->ps_shader->current); > } > > if (rctx->b.chip_class >= EVERGREEN) { > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev