diff --git a/src/gallium/drivers/radeonsi/si_shader_info.c b/src/gallium/drivers/radeonsi/si_shader_info.c index 37efe926424..ccfc42fef72 100644 --- a/src/gallium/drivers/radeonsi/si_shader_info.c +++ b/src/gallium/drivers/radeonsi/si_shader_info.c @@ -518,6 +518,8 @@ void si_nir_gather_info(struct si_screen *sscreen, struct nir_shader *nir, info->base.num_ubos = nir->info.num_ubos; info->base.num_ssbos = nir->info.num_ssbos; info->base.num_images = nir->info.num_images; + info->base.outputs_written = nir->info.outputs_written; + info->base.outputs_written_16bit = nir->info.outputs_written_16bit; info->base.textures_used = nir->info.textures_used[0]; info->base.task_payload_size = nir->info.task_payload_size; diff --git a/src/gallium/drivers/radeonsi/si_shader_info.h b/src/gallium/drivers/radeonsi/si_shader_info.h index b988f4cc0c5..77653310c96 100644 --- a/src/gallium/drivers/radeonsi/si_shader_info.h +++ b/src/gallium/drivers/radeonsi/si_shader_info.h @@ -30,6 +30,9 @@ struct si_shader_info { uint8_t num_images; uint32_t textures_used; + uint64_t outputs_written; + uint16_t outputs_written_16bit; + unsigned task_payload_size; uint16_t workgroup_size[3]; bool workgroup_size_variable:1; diff --git a/src/gallium/drivers/radeonsi/si_shaderlib_nir.c b/src/gallium/drivers/radeonsi/si_shaderlib_nir.c index ab7404957eb..2cbaf4a05b1 100644 --- a/src/gallium/drivers/radeonsi/si_shaderlib_nir.c +++ b/src/gallium/drivers/radeonsi/si_shaderlib_nir.c @@ -171,14 +171,16 @@ void *si_create_clear_buffer_rmw_cs(struct si_context *sctx) void *si_create_passthrough_tcs(struct si_context *sctx) { unsigned locations[PIPE_MAX_SHADER_OUTPUTS]; - + unsigned num_outputs = 0; struct si_shader_info *info = &sctx->shader.vs.cso->info; - for (unsigned i = 0; i < info->num_outputs; i++) { - locations[i] = info->output_semantic[i]; + + u_foreach_bit64_two_masks(slot, info->base.outputs_written, + VARYING_SLOT_VAR0_16BIT, info->base.outputs_written_16bit) { + locations[num_outputs++] = slot; } nir_shader *tcs = nir_create_passthrough_tcs_impl(sctx->screen->nir_options, locations, - info->num_outputs, sctx->patch_vertices); + num_outputs, sctx->patch_vertices); NIR_PASS(_, tcs, nir_lower_system_values); return si_create_shader_state(sctx, tcs);