mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-24 06:40:11 +01:00
r600g: get rid of dummy pixel shader
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-Angel@yandex.ru> Reviewed-by: Marek Olšák <marek.olsak@amd.com> Signed-off-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:
parent
544b40089b
commit
61e47d92c5
3 changed files with 33 additions and 43 deletions
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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->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;
|
||||
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->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->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);
|
||||
}
|
||||
|
||||
r600_mark_atom_dirty(rctx, &rctx->shader_stages.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 (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);
|
||||
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) {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue