radv: Use new, NIR-based I/O lowering.
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/9201>
This commit is contained in:
@@ -12201,8 +12201,6 @@ void select_program(Program *program,
|
|||||||
bld.barrier(aco_opcode::p_barrier,
|
bld.barrier(aco_opcode::p_barrier,
|
||||||
memory_sync_info(storage_vmem_output, semantic_release, scope_device));
|
memory_sync_info(storage_vmem_output, semantic_release, scope_device));
|
||||||
bld.sopp(aco_opcode::s_sendmsg, bld.m0(ctx.gs_wave_id), -1, sendmsg_gs_done(false, false, 0));
|
bld.sopp(aco_opcode::s_sendmsg, bld.m0(ctx.gs_wave_id), -1, sendmsg_gs_done(false, false, 0));
|
||||||
} else if (nir->info.stage == MESA_SHADER_TESS_CTRL) {
|
|
||||||
write_tcs_tess_factors(&ctx);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ctx.stage == fragment_fs) {
|
if (ctx.stage == fragment_fs) {
|
||||||
|
@@ -860,6 +860,35 @@ load_patch_vertices_in(struct ac_shader_abi *abi)
|
|||||||
return LLVMConstInt(ctx->ac.i32, ctx->args->options->key.tcs.input_vertices, false);
|
return LLVMConstInt(ctx->ac.i32, ctx->args->options->key.tcs.input_vertices, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static LLVMValueRef
|
||||||
|
load_ring_tess_factors(struct ac_shader_abi *abi)
|
||||||
|
{
|
||||||
|
struct radv_shader_context *ctx = radv_shader_context_from_abi(abi);
|
||||||
|
assert(ctx->stage == MESA_SHADER_TESS_CTRL);
|
||||||
|
|
||||||
|
return ctx->hs_ring_tess_factor;
|
||||||
|
}
|
||||||
|
|
||||||
|
static LLVMValueRef
|
||||||
|
load_ring_tess_offchip(struct ac_shader_abi *abi)
|
||||||
|
{
|
||||||
|
struct radv_shader_context *ctx = radv_shader_context_from_abi(abi);
|
||||||
|
assert(ctx->stage == MESA_SHADER_TESS_CTRL ||
|
||||||
|
ctx->stage == MESA_SHADER_TESS_EVAL);
|
||||||
|
|
||||||
|
return ctx->hs_ring_tess_offchip;
|
||||||
|
}
|
||||||
|
|
||||||
|
static LLVMValueRef
|
||||||
|
load_ring_esgs(struct ac_shader_abi *abi)
|
||||||
|
{
|
||||||
|
struct radv_shader_context *ctx = radv_shader_context_from_abi(abi);
|
||||||
|
assert(ctx->stage == MESA_SHADER_VERTEX ||
|
||||||
|
ctx->stage == MESA_SHADER_TESS_EVAL ||
|
||||||
|
ctx->stage == MESA_SHADER_GEOMETRY);
|
||||||
|
|
||||||
|
return ctx->esgs_ring;
|
||||||
|
}
|
||||||
|
|
||||||
static LLVMValueRef radv_load_base_vertex(struct ac_shader_abi *abi, bool non_indexed_is_zero)
|
static LLVMValueRef radv_load_base_vertex(struct ac_shader_abi *abi, bool non_indexed_is_zero)
|
||||||
{
|
{
|
||||||
@@ -3498,7 +3527,6 @@ write_tess_factors(struct radv_shader_context *ctx)
|
|||||||
static void
|
static void
|
||||||
handle_tcs_outputs_post(struct radv_shader_context *ctx)
|
handle_tcs_outputs_post(struct radv_shader_context *ctx)
|
||||||
{
|
{
|
||||||
write_tess_factors(ctx);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
@@ -3902,6 +3930,9 @@ LLVMModuleRef ac_translate_nir_to_llvm(struct ac_llvm_compiler *ac_llvm,
|
|||||||
ctx.abi.load_ssbo = radv_load_ssbo;
|
ctx.abi.load_ssbo = radv_load_ssbo;
|
||||||
ctx.abi.load_sampler_desc = radv_get_sampler_desc;
|
ctx.abi.load_sampler_desc = radv_get_sampler_desc;
|
||||||
ctx.abi.load_resource = radv_load_resource;
|
ctx.abi.load_resource = radv_load_resource;
|
||||||
|
ctx.abi.load_ring_tess_factors = load_ring_tess_factors;
|
||||||
|
ctx.abi.load_ring_tess_offchip = load_ring_tess_offchip;
|
||||||
|
ctx.abi.load_ring_esgs = load_ring_esgs;
|
||||||
ctx.abi.clamp_shadow_reference = false;
|
ctx.abi.clamp_shadow_reference = false;
|
||||||
ctx.abi.adjust_frag_coord_z = args->options->adjust_frag_coord_z;
|
ctx.abi.adjust_frag_coord_z = args->options->adjust_frag_coord_z;
|
||||||
ctx.abi.robust_buffer_access = args->options->robust_buffer_access;
|
ctx.abi.robust_buffer_access = args->options->robust_buffer_access;
|
||||||
|
@@ -3454,6 +3454,9 @@ VkResult radv_create_shaders(struct radv_pipeline *pipeline,
|
|||||||
nir_opt_sink(nir[i], nir_move_load_input | nir_move_const_undef | nir_move_copies);
|
nir_opt_sink(nir[i], nir_move_load_input | nir_move_const_undef | nir_move_copies);
|
||||||
nir_opt_move(nir[i], nir_move_load_input | nir_move_const_undef | nir_move_copies);
|
nir_opt_move(nir[i], nir_move_load_input | nir_move_const_undef | nir_move_copies);
|
||||||
|
|
||||||
|
/* Lower I/O intrinsics to memory instructions. */
|
||||||
|
bool io_to_mem = radv_lower_io_to_mem(device, nir[i], &infos[i], pipeline_key);
|
||||||
|
|
||||||
/* optimize the lowered ALU operations */
|
/* optimize the lowered ALU operations */
|
||||||
bool more_algebraic = true;
|
bool more_algebraic = true;
|
||||||
while (more_algebraic) {
|
while (more_algebraic) {
|
||||||
@@ -3465,7 +3468,7 @@ VkResult radv_create_shaders(struct radv_pipeline *pipeline,
|
|||||||
NIR_PASS(more_algebraic, nir[i], nir_opt_algebraic);
|
NIR_PASS(more_algebraic, nir[i], nir_opt_algebraic);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i == MESA_SHADER_COMPUTE)
|
if (io_to_mem || i == MESA_SHADER_COMPUTE)
|
||||||
NIR_PASS_V(nir[i], nir_opt_offsets);
|
NIR_PASS_V(nir[i], nir_opt_offsets);
|
||||||
|
|
||||||
/* Do late algebraic optimization to turn add(a,
|
/* Do late algebraic optimization to turn add(a,
|
||||||
|
@@ -40,6 +40,7 @@
|
|||||||
#include "sid.h"
|
#include "sid.h"
|
||||||
#include "ac_binary.h"
|
#include "ac_binary.h"
|
||||||
#include "ac_llvm_util.h"
|
#include "ac_llvm_util.h"
|
||||||
|
#include "ac_nir.h"
|
||||||
#include "ac_nir_to_llvm.h"
|
#include "ac_nir_to_llvm.h"
|
||||||
#include "ac_rtld.h"
|
#include "ac_rtld.h"
|
||||||
#include "vk_format.h"
|
#include "vk_format.h"
|
||||||
@@ -759,6 +760,77 @@ radv_lower_io(struct radv_device *device, nir_shader *nir)
|
|||||||
nir_var_shader_in | nir_var_shader_out);
|
nir_var_shader_in | nir_var_shader_out);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
radv_lower_io_to_mem(struct radv_device *device, struct nir_shader *nir,
|
||||||
|
struct radv_shader_info *info, const struct radv_pipeline_key *pl_key)
|
||||||
|
{
|
||||||
|
bool llvm = radv_use_llvm_for_stage(device, nir->info.stage);
|
||||||
|
|
||||||
|
if (nir->info.stage == MESA_SHADER_VERTEX) {
|
||||||
|
if (info->vs.as_ls) {
|
||||||
|
ac_nir_lower_ls_outputs_to_mem(
|
||||||
|
nir,
|
||||||
|
info->vs.tcs_in_out_eq,
|
||||||
|
info->vs.tcs_temp_only_input_mask,
|
||||||
|
info->vs.num_linked_outputs);
|
||||||
|
return true;
|
||||||
|
} else if (info->vs.as_es) {
|
||||||
|
ac_nir_lower_es_outputs_to_mem(
|
||||||
|
nir,
|
||||||
|
device->physical_device->rad_info.chip_class,
|
||||||
|
info->vs.num_linked_outputs);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} else if (nir->info.stage == MESA_SHADER_TESS_CTRL) {
|
||||||
|
ac_nir_lower_hs_inputs_to_mem(
|
||||||
|
nir,
|
||||||
|
info->vs.tcs_in_out_eq,
|
||||||
|
info->tcs.num_linked_inputs);
|
||||||
|
ac_nir_lower_hs_outputs_to_mem(
|
||||||
|
nir, device->physical_device->rad_info.chip_class,
|
||||||
|
info->tcs.tes_reads_tess_factors,
|
||||||
|
llvm ? UINT64_MAX : info->tcs.tes_inputs_read,
|
||||||
|
llvm ? UINT64_MAX : info->tcs.tes_patch_inputs_read,
|
||||||
|
info->tcs.num_linked_inputs,
|
||||||
|
info->tcs.num_linked_outputs,
|
||||||
|
info->tcs.num_linked_patch_outputs,
|
||||||
|
true);
|
||||||
|
ac_nir_lower_tess_to_const(
|
||||||
|
nir,
|
||||||
|
pl_key->tess_input_vertices,
|
||||||
|
info->num_tess_patches,
|
||||||
|
ac_nir_lower_patch_vtx_in | ac_nir_lower_num_patches);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
} else if (nir->info.stage == MESA_SHADER_TESS_EVAL) {
|
||||||
|
ac_nir_lower_tes_inputs_to_mem(
|
||||||
|
nir,
|
||||||
|
info->tes.num_linked_inputs,
|
||||||
|
info->tes.num_linked_patch_inputs);
|
||||||
|
ac_nir_lower_tess_to_const(
|
||||||
|
nir,
|
||||||
|
nir->info.tess.tcs_vertices_out,
|
||||||
|
info->num_tess_patches,
|
||||||
|
ac_nir_lower_patch_vtx_in | ac_nir_lower_num_patches);
|
||||||
|
|
||||||
|
if (info->tes.as_es) {
|
||||||
|
ac_nir_lower_es_outputs_to_mem(
|
||||||
|
nir,
|
||||||
|
device->physical_device->rad_info.chip_class,
|
||||||
|
info->tes.num_linked_outputs);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
} else if (nir->info.stage == MESA_SHADER_GEOMETRY) {
|
||||||
|
ac_nir_lower_gs_inputs_to_mem(
|
||||||
|
nir,
|
||||||
|
device->physical_device->rad_info.chip_class,
|
||||||
|
info->gs.num_linked_inputs);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
static void *
|
static void *
|
||||||
radv_alloc_shader_memory(struct radv_device *device,
|
radv_alloc_shader_memory(struct radv_device *device,
|
||||||
|
@@ -594,4 +594,8 @@ get_tcs_num_patches(unsigned tcs_num_input_vertices,
|
|||||||
void
|
void
|
||||||
radv_lower_io(struct radv_device *device, nir_shader *nir);
|
radv_lower_io(struct radv_device *device, nir_shader *nir);
|
||||||
|
|
||||||
|
bool
|
||||||
|
radv_lower_io_to_mem(struct radv_device *device, struct nir_shader *nir,
|
||||||
|
struct radv_shader_info *info, const struct radv_pipeline_key *pl_key);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Reference in New Issue
Block a user