From 9fa48c0207dbc4972bef39b08e3da31dcce82320 Mon Sep 17 00:00:00 2001 From: Gert Wollny Date: Sun, 17 Jan 2021 20:58:32 +0100 Subject: [PATCH] r600/sfn: update shader array info Signed-off-by: Gert Wollny Part-of: --- src/gallium/drivers/r600/sfn/sfn_nir.cpp | 4 ++-- .../drivers/r600/sfn/sfn_shader_base.cpp | 20 ++++++++++++++----- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/gallium/drivers/r600/sfn/sfn_nir.cpp b/src/gallium/drivers/r600/sfn/sfn_nir.cpp index 43443547485..5ce326ec29e 100644 --- a/src/gallium/drivers/r600/sfn/sfn_nir.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_nir.cpp @@ -236,13 +236,13 @@ bool ShaderFromNir::lower(const nir_shader *shader, r600_pipe_shader *pipe_shade sfn_log << SfnLog::trans << "Finalize\n"; impl->finalize(); + impl->get_array_info(pipe_shader->shader); + if (!sfn_log.has_debug_flag(SfnLog::nomerge)) { sfn_log << SfnLog::trans << "Merge registers\n"; impl->remap_registers(); } - impl->get_array_info(pipe_shader->shader); - sfn_log << SfnLog::trans << "Finished translating to R600 IR\n"; return true; } diff --git a/src/gallium/drivers/r600/sfn/sfn_shader_base.cpp b/src/gallium/drivers/r600/sfn/sfn_shader_base.cpp index 768745547a4..fdd548d305e 100644 --- a/src/gallium/drivers/r600/sfn/sfn_shader_base.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_shader_base.cpp @@ -168,6 +168,13 @@ static void remap_shader_info(r600_shader& sh_info, std::vector& map, UNUSED ValueMap& values) { + for (unsigned i = 0; i < sh_info.num_arrays; ++i) { + auto new_index = map[sh_info.arrays[i].gpr_start]; + if (new_index.valid) + sh_info.arrays[i].gpr_start = new_index.new_reg; + map[sh_info.arrays[i].gpr_start].used = true; + } + for (unsigned i = 0; i < sh_info.ninput; ++i) { sfn_log << SfnLog::merge << "Input " << i << " gpr:" << sh_info.input[i].gpr << " of map.size()\n"; @@ -1167,11 +1174,14 @@ void ShaderFromNirProcessor::append_block(int nesting_change) void ShaderFromNirProcessor::get_array_info(r600_shader& shader) const { shader.num_arrays = m_reg_arrays.size(); - shader.arrays = (r600_shader_array *)calloc(shader.num_arrays, sizeof(r600_shader_array)); - for (int i = 0; i < shader.num_arrays; ++i) { - shader.arrays[i].comp_mask = m_reg_arrays[i]->mask(); - shader.arrays[i].gpr_start = m_reg_arrays[i]->sel(); - shader.arrays[i].gpr_count = m_reg_arrays[i]->size(); + if (shader.num_arrays) { + shader.arrays = (r600_shader_array *)calloc(shader.num_arrays, sizeof(r600_shader_array)); + for (unsigned i = 0; i < shader.num_arrays; ++i) { + shader.arrays[i].comp_mask = m_reg_arrays[i]->mask(); + shader.arrays[i].gpr_start = m_reg_arrays[i]->sel(); + shader.arrays[i].gpr_count = m_reg_arrays[i]->size(); + } + shader.indirect_files |= (1 << TGSI_FILE_TEMPORARY); } }