/** Whether the shader runs on a merged HW stage (LSHS or ESGS) */
bool si_is_merged_shader(struct si_shader *shader)
{
- if (shader->selector->stage > MESA_SHADER_GEOMETRY)
+ if (shader->selector->stage > MESA_SHADER_GEOMETRY || shader->is_gs_copy_shader)
return false;
return shader->key.ge.as_ngg || si_is_multi_part_shader(shader);
/* The GS copy shader is compiled next. */
if (sel->stage == MESA_SHADER_GEOMETRY && !shader->key.ge.as_ngg) {
- struct pipe_stream_output_info so = {};
- if (si_shader_uses_streamout(shader))
- nir_gather_stream_output_info(nir, &so);
-
- shader->gs_copy_shader = si_generate_gs_copy_shader(sscreen, compiler, sel, &so, debug);
+ shader->gs_copy_shader =
+ si_nir_generate_gs_copy_shader(sscreen, compiler, shader, nir, debug,
+ &legacy_gs_output_info.info);
if (!shader->gs_copy_shader) {
fprintf(stderr, "radeonsi: can't create GS copy shader\n");
ret = false;
const struct si_shader_info *info = &sel->info;
ctx->shader = shader;
- ctx->stage = sel->stage;
+ ctx->stage = shader->is_gs_copy_shader ? MESA_SHADER_VERTEX : sel->stage;
ctx->num_const_buffers = info->base.num_ubos;
ctx->num_shader_buffers = info->base.num_ssbos;
ac_build_load_to_sgpr(
&ctx->ac, buf, LLVMConstInt(ctx->ac.i32, SI_VS_CONST_INSTANCE_DIVISORS, 0));
}
+
+ /* preload GSVS ring for GS copy shader */
+ if (shader->is_gs_copy_shader) {
+ ctx->gsvs_ring[0] =
+ ac_build_load_to_sgpr(
+ &ctx->ac,
+ ac_get_ptr_arg(&ctx->ac, &ctx->args->ac, ctx->args->internal_bindings),
+ LLVMConstInt(ctx->ac.i32, SI_RING_GSVS, 0));
+ }
break;
case MESA_SHADER_TESS_CTRL:
if (!ac_nir_translate(&ctx->ac, &ctx->abi, &ctx->args->ac, nir))
return false;
- switch (sel->stage) {
+ switch (ctx->stage) {
case MESA_SHADER_VERTEX:
if (shader->key.ge.as_ls)
si_llvm_ls_build_end(ctx);