Re: [Mesa-dev] [PATCH 04/53] r600: move to using hw stages array for hw stage atoms
Hi, Am 30.11.2015 um 07:20 schrieb Dave Airlie: > From: Dave Airlie > > This moves to using an array of hw stages for the atoms. > > Signed-off-by: Dave Airlie > --- > 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_statevertex_shader; > - struct r600_shader_statepixel_shader; > - struct r600_shader_stategeometry_shader; > - struct r600_shader_stateexport_shader; > + struct r600_shader_statehw_shader_stages[EG_NUM_HW_STAGES]; > struct r600_cs_shader_state cs_shader_state; > str
Re: [Mesa-dev] [PATCH 04/53] r600: move to using hw stages array for hw stage atoms
On Mon, Nov 30, 2015 at 8:20 AM, Dave Airlie wrote: > From: Dave Airlie > > This moves to using an array of hw stages for the atoms. > > Signed-off-by: Dave Airlie > --- > 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); > - 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); In the original code, the vertex shader init atom call was with 23 as num_dw. Your loop makes it 0 for all shaders. Is that intentional ? > 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_statevertex_shader; > - struct r600_shader_statepixel_shader; > - struct r600_shader_stategeometry_shader; > - struct r600_shader_stateexport_shader; > + struct r600_shader_statehw_shader_stages[EG_NUM_HW_STAGES]; > struct r600_cs_shader_state c
[Mesa-dev] [PATCH 04/53] r600: move to using hw stages array for hw stage atoms
From: Dave Airlie This moves to using an array of hw stages for the atoms. Signed-off-by: Dave Airlie --- 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); - 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_statevertex_shader; - struct r600_shader_statepixel_shader; - struct r600_shader_stategeometry_shader; - struct r600_shader_stateexport_shader; + struct r600_shader_statehw_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_functi