Pushed the series, thanks! Marek
On Mon, Apr 10, 2017 at 10:04 PM, Constantine Kharlamov <hi-an...@yandex.ru> wrote: > The idea is taken from radeonsi. The code mostly was already checking for null > pixel shader, so little checks had to be added. > > Interestingly, acc. to testing with GTAⅣ, though binding of null shader > happens > a lot at the start (then just stops), but draw_vbo() never actually sees null > ps. > > v2: added a check I missed because of a macros using a prefix to choose > a shader. > > Signed-off-by: Constantine Kharlamov <hi-an...@yandex.ru> > Reviewed-by: Marek Olšák <marek.ol...@amd.com> > --- > src/gallium/drivers/r600/r600_pipe.c | 9 ----- > src/gallium/drivers/r600/r600_pipe.h | 3 -- > src/gallium/drivers/r600/r600_state_common.c | 58 > ++++++++++++++-------------- > 3 files changed, 30 insertions(+), 40 deletions(-) > > diff --git a/src/gallium/drivers/r600/r600_pipe.c > b/src/gallium/drivers/r600/r600_pipe.c > index 5014f2525c..7d8efd2c9b 100644 > --- a/src/gallium/drivers/r600/r600_pipe.c > +++ b/src/gallium/drivers/r600/r600_pipe.c > @@ -82,9 +82,6 @@ static void r600_destroy_context(struct pipe_context > *context) > if (rctx->fixed_func_tcs_shader) > rctx->b.b.delete_tcs_state(&rctx->b.b, > rctx->fixed_func_tcs_shader); > > - if (rctx->dummy_pixel_shader) { > - rctx->b.b.delete_fs_state(&rctx->b.b, > rctx->dummy_pixel_shader); > - } > if (rctx->custom_dsa_flush) { > rctx->b.b.delete_depth_stencil_alpha_state(&rctx->b.b, > rctx->custom_dsa_flush); > } > @@ -209,12 +206,6 @@ static struct pipe_context *r600_create_context(struct > pipe_screen *screen, > > r600_begin_new_cs(rctx); > > - rctx->dummy_pixel_shader = > - util_make_fragment_cloneinput_shader(&rctx->b.b, 0, > - TGSI_SEMANTIC_GENERIC, > - > TGSI_INTERPOLATE_CONSTANT); > - rctx->b.b.bind_fs_state(&rctx->b.b, rctx->dummy_pixel_shader); > - > return &rctx->b.b; > > fail: > diff --git a/src/gallium/drivers/r600/r600_pipe.h > b/src/gallium/drivers/r600/r600_pipe.h > index 7f1ecc278b..e636ef0024 100644 > --- a/src/gallium/drivers/r600/r600_pipe.h > +++ b/src/gallium/drivers/r600/r600_pipe.h > @@ -432,9 +432,6 @@ struct r600_context { > void *custom_blend_resolve; > void *custom_blend_decompress; > void *custom_blend_fastclear; > - /* With rasterizer discard, there doesn't have to be a pixel shader. > - * In that case, we bind this one: */ > - void *dummy_pixel_shader; > /* These dummy CMASK and FMASK buffers are used to get around the > R6xx hardware > * bug where valid CMASK and FMASK are required to be present to avoid > * a hardlock in certain operations but aren't actually used > diff --git a/src/gallium/drivers/r600/r600_state_common.c > b/src/gallium/drivers/r600/r600_state_common.c > index 5be49dcdfe..0131ea80d2 100644 > --- a/src/gallium/drivers/r600/r600_state_common.c > +++ b/src/gallium/drivers/r600/r600_state_common.c > @@ -725,7 +725,8 @@ static inline void r600_shader_selector_key(const struct > pipe_context *ctx, > if (!key->vs.as_ls) > key->vs.as_es = (rctx->gs_shader != NULL); > > - if (rctx->ps_shader->current->shader.gs_prim_id_input && > !rctx->gs_shader) { > + if (rctx->ps_shader && > rctx->ps_shader->current->shader.gs_prim_id_input && > + !rctx->gs_shader) { > key->vs.as_gs_a = true; > key->vs.prim_id_out = > rctx->ps_shader->current->shader.input[rctx->ps_shader->current->shader.ps_prim_id_input].spi_sid; > } > @@ -909,9 +910,6 @@ static void r600_bind_ps_state(struct pipe_context *ctx, > void *state) > { > struct r600_context *rctx = (struct r600_context *)ctx; > > - if (!state) > - state = rctx->dummy_pixel_shader; > - > rctx->ps_shader = (struct r600_pipe_shader_selector *)state; > } > > @@ -1478,7 +1476,8 @@ static bool r600_update_derived_state(struct > r600_context *rctx) > } > } > > - SELECT_SHADER_OR_FAIL(ps); > + if (rctx->ps_shader) > + SELECT_SHADER_OR_FAIL(ps); > > r600_mark_atom_dirty(rctx, &rctx->shader_stages.atom); > > @@ -1555,37 +1554,40 @@ static bool r600_update_derived_state(struct > r600_context *rctx) > rctx->b.streamout.enabled_stream_buffers_mask = > clip_so_current->enabled_stream_buffers_mask; > } > > - 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)) { > + if (rctx->ps_shader) { > + 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))) { > > - if (rctx->cb_misc_state.nr_ps_color_outputs != > rctx->ps_shader->current->nr_ps_color_outputs) { > - rctx->cb_misc_state.nr_ps_color_outputs = > rctx->ps_shader->current->nr_ps_color_outputs; > - r600_mark_atom_dirty(rctx, &rctx->cb_misc_state.atom); > - } > + if (rctx->cb_misc_state.nr_ps_color_outputs != > rctx->ps_shader->current->nr_ps_color_outputs) { > + rctx->cb_misc_state.nr_ps_color_outputs = > rctx->ps_shader->current->nr_ps_color_outputs; > + r600_mark_atom_dirty(rctx, > &rctx->cb_misc_state.atom); > + } > > - if (rctx->b.chip_class <= R700) { > - bool multiwrite = > rctx->ps_shader->current->shader.fs_write_all; > + if (rctx->b.chip_class <= R700) { > + bool multiwrite = > rctx->ps_shader->current->shader.fs_write_all; > > - if (rctx->cb_misc_state.multiwrite != multiwrite) { > - rctx->cb_misc_state.multiwrite = multiwrite; > - r600_mark_atom_dirty(rctx, > &rctx->cb_misc_state.atom); > + if (rctx->cb_misc_state.multiwrite != > multiwrite) { > + rctx->cb_misc_state.multiwrite = > multiwrite; > + r600_mark_atom_dirty(rctx, > &rctx->cb_misc_state.atom); > + } > } > - } > > - if (unlikely(!ps_dirty && rctx->ps_shader && rctx->rasterizer > && > - ((rctx->rasterizer->sprite_coord_enable != > rctx->ps_shader->current->sprite_coord_enable) || > - (rctx->rasterizer->flatshade > != rctx->ps_shader->current->flatshade)))) { > + if (unlikely(!ps_dirty && rctx->rasterizer && > + ((rctx->rasterizer->sprite_coord_enable > != rctx->ps_shader->current->sprite_coord_enable) || > + (rctx->rasterizer->flatshade != > rctx->ps_shader->current->flatshade)))) { > > - if (rctx->b.chip_class >= EVERGREEN) > - evergreen_update_ps_state(ctx, > rctx->ps_shader->current); > - else > - r600_update_ps_state(ctx, > rctx->ps_shader->current); > + if (rctx->b.chip_class >= EVERGREEN) > + evergreen_update_ps_state(ctx, > rctx->ps_shader->current); > + else > + r600_update_ps_state(ctx, > rctx->ps_shader->current); > + } > + > + r600_mark_atom_dirty(rctx, &rctx->shader_stages.atom); > } > > - r600_mark_atom_dirty(rctx, &rctx->shader_stages.atom); > + UPDATE_SHADER(R600_HW_STAGE_PS, ps); > } > - UPDATE_SHADER(R600_HW_STAGE_PS, ps); > > if (rctx->b.chip_class >= EVERGREEN) { > evergreen_update_db_shader_control(rctx); > @@ -1641,7 +1643,7 @@ static bool r600_update_derived_state(struct > r600_context *rctx) > } > } > > - blend_disable = (rctx->dual_src_blend && > + blend_disable = (rctx->dual_src_blend && rctx->ps_shader && > rctx->ps_shader->current->nr_ps_color_outputs < 2); > > if (blend_disable != rctx->force_blend_disable) { > -- > 2.12.2 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev