[Mesa-dev] [PATCH] radeonsi/nir: collect more accurate output_usagemask
Marek Olšák
maraeo at gmail.com
Wed Feb 21 20:48:40 UTC 2018
Reviewed-by: Marek Olšák <marek.olsak at amd.com>
Marek
On Wed, Feb 21, 2018 at 7:03 AM, Timothy Arceri <tarceri at itsqueeze.com> wrote:
> Fixes assert in glsl-1.50-gs-max-output-components piglit test.
>
> Note that the double handling will only work for doubles that
> don't take up multiple slots i.e. double and dvec2. However
> dual slot double handling is an existing bug which is made no
> worse by this patch.
> ---
> src/gallium/drivers/radeonsi/si_shader_nir.c | 56 +++++++++++++++++++++-------
> 1 file changed, 43 insertions(+), 13 deletions(-)
>
> diff --git a/src/gallium/drivers/radeonsi/si_shader_nir.c b/src/gallium/drivers/radeonsi/si_shader_nir.c
> index 3294019cea..7b10410dd7 100644
> --- a/src/gallium/drivers/radeonsi/si_shader_nir.c
> +++ b/src/gallium/drivers/radeonsi/si_shader_nir.c
> @@ -462,21 +462,35 @@ void si_nir_scan_shader(const struct nir_shader *nir,
> }
>
> i = variable->data.driver_location;
> - if (processed_outputs & ((uint64_t)1 << i))
> - continue;
> -
> - processed_outputs |= ((uint64_t)1 << i);
> - num_outputs++;
> -
> - info->output_semantic_name[i] = semantic_name;
> - info->output_semantic_index[i] = semantic_index;
> - info->output_usagemask[i] = TGSI_WRITEMASK_XYZW;
>
> unsigned num_components = 4;
> unsigned vector_elements = glsl_get_vector_elements(glsl_without_array(variable->type));
> if (vector_elements)
> num_components = vector_elements;
>
> + if (glsl_type_is_64bit(glsl_without_array(variable->type)))
> + num_components = MIN2(num_components * 2, 4);
> +
> + ubyte usagemask = 0;
> + for (unsigned j = 0; j < num_components; j++) {
> + switch (j + variable->data.location_frac) {
> + case 0:
> + usagemask |= TGSI_WRITEMASK_X;
> + break;
> + case 1:
> + usagemask |= TGSI_WRITEMASK_Y;
> + break;
> + case 2:
> + usagemask |= TGSI_WRITEMASK_Z;
> + break;
> + case 3:
> + usagemask |= TGSI_WRITEMASK_W;
> + break;
> + default:
> + unreachable("error calculating component index");
> + }
> + }
> +
> unsigned gs_out_streams;
> if (variable->data.stream & (1u << 31)) {
> gs_out_streams = variable->data.stream & ~(1u << 31);
> @@ -492,23 +506,39 @@ void si_nir_scan_shader(const struct nir_shader *nir,
> unsigned streamz = (gs_out_streams >> 4) & 3;
> unsigned streamw = (gs_out_streams >> 6) & 3;
>
> - if (info->output_usagemask[i] & TGSI_WRITEMASK_X) {
> + if (usagemask & TGSI_WRITEMASK_X) {
> + info->output_usagemask[i] |= TGSI_WRITEMASK_X;
> info->output_streams[i] |= streamx;
> info->num_stream_output_components[streamx]++;
> }
> - if (info->output_usagemask[i] & TGSI_WRITEMASK_Y) {
> + if (usagemask & TGSI_WRITEMASK_Y) {
> + info->output_usagemask[i] |= TGSI_WRITEMASK_Y;
> info->output_streams[i] |= streamy << 2;
> info->num_stream_output_components[streamy]++;
> }
> - if (info->output_usagemask[i] & TGSI_WRITEMASK_Z) {
> + if (usagemask & TGSI_WRITEMASK_Z) {
> + info->output_usagemask[i] |= TGSI_WRITEMASK_Z;
> info->output_streams[i] |= streamz << 4;
> info->num_stream_output_components[streamz]++;
> }
> - if (info->output_usagemask[i] & TGSI_WRITEMASK_W) {
> + if (usagemask & TGSI_WRITEMASK_W) {
> + info->output_usagemask[i] |= TGSI_WRITEMASK_W;
> info->output_streams[i] |= streamw << 6;
> info->num_stream_output_components[streamw]++;
> }
>
> + /* make sure we only count this location once against the
> + * num_outputs counter.
> + */
> + if (processed_outputs & ((uint64_t)1 << i))
> + continue;
> +
> + processed_outputs |= ((uint64_t)1 << i);
> + num_outputs++;
> +
> + info->output_semantic_name[i] = semantic_name;
> + info->output_semantic_index[i] = semantic_index;
> +
> switch (semantic_name) {
> case TGSI_SEMANTIC_PRIMID:
> info->writes_primid = true;
> --
> 2.14.3
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list