aco: Add Mesh and Task shader stages.

Signed-off-by: Timur Kristóf <timur.kristof@gmail.com>
Reviewed-by: Rhys Perry <pendingchaos02@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13580>
This commit is contained in:
Timur Kristóf
2021-10-21 11:33:10 +02:00
committed by Marge Bot
parent 7ae425c5d4
commit 6766e6a985
4 changed files with 41 additions and 7 deletions
@@ -328,6 +328,16 @@ setup_tes_variables(isel_context* ctx, nir_shader* nir)
}
}
void
setup_ms_variables(isel_context* ctx, nir_shader* nir)
{
setup_vs_output_info(ctx, nir, &ctx->program->info->ms.outinfo);
ctx->program->config->lds_size =
DIV_ROUND_UP(nir->info.shared_size, ctx->program->dev.lds_encoding_granule);
assert((ctx->program->config->lds_size * ctx->program->dev.lds_encoding_granule) < (32 * 1024));
}
void
setup_variables(isel_context* ctx, nir_shader* nir)
{
@@ -335,7 +345,8 @@ setup_variables(isel_context* ctx, nir_shader* nir)
case MESA_SHADER_FRAGMENT: {
break;
}
case MESA_SHADER_COMPUTE: {
case MESA_SHADER_COMPUTE:
case MESA_SHADER_TASK: {
ctx->program->config->lds_size =
DIV_ROUND_UP(nir->info.shared_size, ctx->program->dev.lds_encoding_granule);
break;
@@ -355,6 +366,10 @@ setup_variables(isel_context* ctx, nir_shader* nir)
setup_tes_variables(ctx, nir);
break;
}
case MESA_SHADER_MESH: {
setup_ms_variables(ctx, nir);
break;
}
default: unreachable("Unhandled shader stage.");
}
@@ -835,6 +850,8 @@ setup_isel_context(Program* program, unsigned shader_count, struct nir_shader* c
break;
case MESA_SHADER_FRAGMENT: sw_stage = sw_stage | SWStage::FS; break;
case MESA_SHADER_COMPUTE: sw_stage = sw_stage | SWStage::CS; break;
case MESA_SHADER_TASK: sw_stage = sw_stage | SWStage::TS; break;
case MESA_SHADER_MESH: sw_stage = sw_stage | SWStage::MS; break;
default: unreachable("Shader stage not implemented");
}
}
@@ -855,6 +872,10 @@ setup_isel_context(Program* program, unsigned shader_count, struct nir_shader* c
hw_stage = HWStage::CS;
else if (sw_stage == SWStage::GSCopy)
hw_stage = HWStage::VS;
else if (sw_stage == SWStage::TS)
hw_stage = HWStage::CS; /* Task shaders are implemented with compute shaders. */
else if (sw_stage == SWStage::MS)
hw_stage = HWStage::NGG; /* Mesh shaders only work on NGG and on GFX10.3+. */
else if (sw_stage == SWStage::VS_GS && gfx9_plus && !ngg)
hw_stage = HWStage::GS; /* GFX6-9: VS+GS merged into a GS (and GFX10/legacy) */
else if (sw_stage == SWStage::VS_GS && ngg)
@@ -890,6 +911,10 @@ setup_isel_context(Program* program, unsigned shader_count, struct nir_shader* c
program->workgroup_size = program->info->workgroup_size;
assert(program->workgroup_size);
/* Mesh shading only works on GFX10.3+. */
ASSERTED bool mesh_shading = ctx.stage.has(SWStage::TS) || ctx.stage.has(SWStage::MS);
assert(!mesh_shading || ctx.program->chip_class >= GFX10_3);
if (ctx.stage == tess_control_hs)
setup_tcs_info(&ctx, shaders[0], NULL);
else if (ctx.stage == vertex_tess_control_hs)