Am 05.02.2018 um 05:58 schrieb Dave Airlie: > From: Dave Airlie <airl...@redhat.com> > > If we have gaps in the shader mask we have to have 0x1 in them > according to a comment in radeonsi, and this is required to fix > the test at least on cayman. > > We also need to record the highest one written to write to the > ps exports reg. > > This fixes: > KHR-GL45.enhanced_layouts.fragment_data_location_api
Does that mean there's actually a performance benefit when there's no gaps? That's something the APIs wouldn't tell you :-). Reviewed-by: Roland Scheidegger <srol...@vmware.com> > > Signed-off-by: Dave Airlie <airl...@redhat.com> > --- > src/gallium/drivers/r600/evergreen_state.c | 2 +- > src/gallium/drivers/r600/r600_shader.c | 10 ++++++++++ > src/gallium/drivers/r600/r600_shader.h | 1 + > 3 files changed, 12 insertions(+), 1 deletion(-) > > diff --git a/src/gallium/drivers/r600/evergreen_state.c > b/src/gallium/drivers/r600/evergreen_state.c > index 4c9163c2a7..742ca5babb 100644 > --- a/src/gallium/drivers/r600/evergreen_state.c > +++ b/src/gallium/drivers/r600/evergreen_state.c > @@ -3369,7 +3369,7 @@ void evergreen_update_ps_state(struct pipe_context > *ctx, struct r600_pipe_shader > exports_ps |= 1; > } > > - num_cout = rshader->nr_ps_color_exports; > + num_cout = rshader->ps_export_highest + 1; > > exports_ps |= S_02884C_EXPORT_COLORS(num_cout); > if (!exports_ps) { > diff --git a/src/gallium/drivers/r600/r600_shader.c > b/src/gallium/drivers/r600/r600_shader.c > index 72e3063804..33eb5accea 100644 > --- a/src/gallium/drivers/r600/r600_shader.c > +++ b/src/gallium/drivers/r600/r600_shader.c > @@ -3876,6 +3876,16 @@ static int r600_shader_from_tgsi(struct r600_context > *rctx, > output[j].type = > V_SQ_CF_ALLOC_EXPORT_WORD0_SQ_EXPORT_PIXEL; > shader->nr_ps_color_exports++; > shader->ps_color_export_mask |= (0xf << > (shader->output[i].sid * 4)); > + > + /* If the i-th target format is set, > all previous target formats must > + * be non-zero to avoid hangs. - from > radeonsi, seems to apply to eg as well. > + */ > + if (shader->output[i].sid > 0) > + for (unsigned x = 0; x < > shader->output[i].sid; x++) > + > shader->ps_color_export_mask |= (1 << (x*4)); > + > + if (shader->output[i].sid > > shader->ps_export_highest) > + shader->ps_export_highest = > shader->output[i].sid; > if (shader->fs_write_all && > (rscreen->b.chip_class >= EVERGREEN)) { > for (k = 1; k < > max_color_exports; k++) { > j++; > diff --git a/src/gallium/drivers/r600/r600_shader.h > b/src/gallium/drivers/r600/r600_shader.h > index 7fca3f455e..4b23facf6f 100644 > --- a/src/gallium/drivers/r600/r600_shader.h > +++ b/src/gallium/drivers/r600/r600_shader.h > @@ -85,6 +85,7 @@ struct r600_shader { > /* Real number of ps color exports compiled in the bytecode */ > unsigned nr_ps_color_exports; > unsigned ps_color_export_mask; > + unsigned ps_export_highest; > /* bit n is set if the shader writes gl_ClipDistance[n] */ > unsigned cc_dist_mask; > unsigned clip_dist_write; > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev