diff options
author | Timothy Arceri <[email protected]> | 2017-11-06 22:28:21 +1100 |
---|---|---|
committer | Timothy Arceri <[email protected]> | 2017-11-16 10:51:35 +1100 |
commit | 8ae92a9209028f5fbd2abae26b5e11047c359407 (patch) | |
tree | 08e24b8c053ddb670226ecf3a599a2aae218e929 | |
parent | cd58b98b03f1c7c044b7a39172d6b258c880ff3c (diff) |
radeonsi: gather stream info in nir path
Reviewed-by: Nicolai Hähnle <[email protected]>
-rw-r--r-- | src/gallium/drivers/radeonsi/si_shader_nir.c | 37 |
1 files changed, 37 insertions, 0 deletions
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; |