aco/ngg: Implement NGG VS and TES.
When NGG is used, vertex and tess eval shaders are executed on the hardware NGG geometry stage. There is a series of steps they must perform: * Request GS space using GS_ALLOC_REQ * Export the primitive * Finally, export the normal VS outputs In this commit, two modes are implemented: * "late" which matches what the RADV LLVM backend currently does * "early" which is an optimized version as seen in radeonsi Vulkan doesn't allow the shader to write the edge flags, so we can currently always use the "early" mode. Exporting the primitive ID is also supported by having the GS threads write that into LDS and reading them from LDS in the ES threads. 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/3576>
This commit is contained in:
@@ -819,6 +819,13 @@ setup_vs_variables(isel_context *ctx, nir_shader *nir)
|
||||
/* radv_es_output_info *outinfo = &ctx->program->info->vs.es_info;
|
||||
outinfo->esgs_itemsize = util_bitcount64(ctx->output_masks[nir->info.stage]) * 16u; */
|
||||
}
|
||||
|
||||
if (ctx->stage == ngg_vertex_gs && ctx->args->options->key.vs_common_out.export_prim_id) {
|
||||
/* We need to store the primitive IDs in LDS */
|
||||
unsigned lds_size = ctx->program->info->ngg_info.esgs_ring_size;
|
||||
ctx->program->config->lds_size = (lds_size + ctx->program->lds_alloc_granule - 1) /
|
||||
ctx->program->lds_alloc_granule;
|
||||
}
|
||||
}
|
||||
|
||||
void setup_gs_variables(isel_context *ctx, nir_shader *nir)
|
||||
|
||||
Reference in New Issue
Block a user