From 8ae92a9209028f5fbd2abae26b5e11047c359407 Mon Sep 17 00:00:00 2001 From: Timothy Arceri Date: Mon, 6 Nov 2017 22:28:21 +1100 Subject: radeonsi: gather stream info in nir path MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reviewed-by: Nicolai Hähnle --- src/gallium/drivers/radeonsi/si_shader_nir.c | 37 ++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) (limited to 'src') diff --git a/src/gallium/drivers/radeonsi/si_shader_nir.c b/src/gallium/drivers/radeonsi/si_shader_nir.c index 32f6d86647a..847d75ba141 100644 --- a/src/gallium/drivers/radeonsi/si_shader_nir.c +++ b/src/gallium/drivers/radeonsi/si_shader_nir.c @@ -248,6 +248,43 @@ void si_nir_scan_shader(const struct nir_shader *nir, 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; + + unsigned gs_out_streams; + if (variable->data.stream & (1u << 31)) { + gs_out_streams = variable->data.stream & ~(1u << 31); + } else { + assert(variable->data.stream < 4); + gs_out_streams = 0; + for (unsigned j = 0; j < num_components; ++j) + gs_out_streams |= variable->data.stream << (2 * (variable->data.location_frac + j)); + } + + unsigned streamx = gs_out_streams & 3; + unsigned streamy = (gs_out_streams >> 2) & 3; + unsigned streamz = (gs_out_streams >> 4) & 3; + unsigned streamw = (gs_out_streams >> 6) & 3; + + if (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) { + info->output_streams[i] |= streamy << 2; + info->num_stream_output_components[streamy]++; + } + if (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) { + info->output_streams[i] |= streamw << 6; + info->num_stream_output_components[streamw]++; + } + switch (semantic_name) { case TGSI_SEMANTIC_PRIMID: info->writes_primid = true; -- cgit v1.2.3