ac/nir: add nir_intrinsic_load_hs_out_patch_data_offset_amd
Also add radv and radeonsi implementation. Will be used in tess lowering. Reviewed-by: Marek Olšák <marek.olsak@amd.com> Acked-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com> Reviewed-by: Timur Kristóf <timur.kristof@gmail.com> Signed-off-by: Qiang Yu <yuq825@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16705>
This commit is contained in:
@@ -3638,6 +3638,7 @@ static void visit_intrinsic(struct ac_nir_context *ctx, nir_intrinsic_instr *ins
|
|||||||
case nir_intrinsic_load_ring_esgs_amd:
|
case nir_intrinsic_load_ring_esgs_amd:
|
||||||
case nir_intrinsic_load_lshs_vertex_stride_amd:
|
case nir_intrinsic_load_lshs_vertex_stride_amd:
|
||||||
case nir_intrinsic_load_tcs_num_patches_amd:
|
case nir_intrinsic_load_tcs_num_patches_amd:
|
||||||
|
case nir_intrinsic_load_hs_out_patch_data_offset_amd:
|
||||||
result = ctx->abi->intrinsic_load(ctx->abi, instr->intrinsic);
|
result = ctx->abi->intrinsic_load(ctx->abi, instr->intrinsic);
|
||||||
break;
|
break;
|
||||||
case nir_intrinsic_load_vertex_id:
|
case nir_intrinsic_load_vertex_id:
|
||||||
|
@@ -197,6 +197,15 @@ lower_abi_instr(nir_builder *b, nir_instr *instr, void *state)
|
|||||||
return nir_imm_int(b, io_num * 16);
|
return nir_imm_int(b, io_num * 16);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case nir_intrinsic_load_hs_out_patch_data_offset_amd: {
|
||||||
|
unsigned num_patches = s->info->num_tess_patches;
|
||||||
|
unsigned out_vertices_per_patch = b->shader->info.tess.tcs_vertices_out;
|
||||||
|
unsigned num_tcs_outputs = stage == MESA_SHADER_TESS_CTRL ?
|
||||||
|
s->info->tcs.num_linked_outputs : s->info->tes.num_linked_inputs;
|
||||||
|
int per_vertex_output_patch_size = out_vertices_per_patch * num_tcs_outputs * 16u;
|
||||||
|
return nir_imm_int(b, num_patches * per_vertex_output_patch_size);
|
||||||
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
unreachable("invalid NIR RADV ABI intrinsic.");
|
unreachable("invalid NIR RADV ABI intrinsic.");
|
||||||
}
|
}
|
||||||
@@ -243,7 +252,8 @@ filter_abi_instr(const nir_instr *instr,
|
|||||||
intrin->intrinsic == nir_intrinsic_load_task_ring_entry_amd ||
|
intrin->intrinsic == nir_intrinsic_load_task_ring_entry_amd ||
|
||||||
intrin->intrinsic == nir_intrinsic_load_task_ib_addr ||
|
intrin->intrinsic == nir_intrinsic_load_task_ib_addr ||
|
||||||
intrin->intrinsic == nir_intrinsic_load_task_ib_stride ||
|
intrin->intrinsic == nir_intrinsic_load_task_ib_stride ||
|
||||||
intrin->intrinsic == nir_intrinsic_load_lshs_vertex_stride_amd;
|
intrin->intrinsic == nir_intrinsic_load_lshs_vertex_stride_amd ||
|
||||||
|
intrin->intrinsic == nir_intrinsic_load_hs_out_patch_data_offset_amd;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@@ -180,6 +180,7 @@ visit_intrinsic(nir_shader *shader, nir_intrinsic_instr *instr)
|
|||||||
case nir_intrinsic_load_mesh_inline_data_intel:
|
case nir_intrinsic_load_mesh_inline_data_intel:
|
||||||
case nir_intrinsic_load_ray_num_dss_rt_stacks_intel:
|
case nir_intrinsic_load_ray_num_dss_rt_stacks_intel:
|
||||||
case nir_intrinsic_load_lshs_vertex_stride_amd:
|
case nir_intrinsic_load_lshs_vertex_stride_amd:
|
||||||
|
case nir_intrinsic_load_hs_out_patch_data_offset_amd:
|
||||||
is_divergent = false;
|
is_divergent = false;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@@ -1399,6 +1399,9 @@ intrinsic("store_shared2_amd", [2, 1], indices=[OFFSET0, OFFSET1, ST64])
|
|||||||
# Vertex stride in LS-HS buffer
|
# Vertex stride in LS-HS buffer
|
||||||
system_value("lshs_vertex_stride_amd", 1)
|
system_value("lshs_vertex_stride_amd", 1)
|
||||||
|
|
||||||
|
# Per patch data offset in HS VRAM output buffer
|
||||||
|
system_value("hs_out_patch_data_offset_amd", 1)
|
||||||
|
|
||||||
# V3D-specific instrinc for tile buffer color reads.
|
# V3D-specific instrinc for tile buffer color reads.
|
||||||
#
|
#
|
||||||
# The hardware requires that we read the samples and components of a pixel
|
# The hardware requires that we read the samples and components of a pixel
|
||||||
|
@@ -785,6 +785,9 @@ static LLVMValueRef si_llvm_load_intrinsic(struct ac_shader_abi *abi, nir_intrin
|
|||||||
si_unpack_param(ctx, ctx->tcs_offchip_layout, 0, 6),
|
si_unpack_param(ctx, ctx->tcs_offchip_layout, 0, 6),
|
||||||
ctx->ac.i32_1, "");
|
ctx->ac.i32_1, "");
|
||||||
|
|
||||||
|
case nir_intrinsic_load_hs_out_patch_data_offset_amd:
|
||||||
|
return si_unpack_param(ctx, ctx->tcs_offchip_layout, 11, 21);
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user