Module: Mesa Branch: staging/20.3 Commit: a29f08b1e204db4342375184829984c594bced86 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=a29f08b1e204db4342375184829984c594bced86
Author: Samuel Pitoiset <samuel.pitoi...@gmail.com> Date: Thu Jan 7 14:01:09 2021 +0100 aco: fix creating the dest vector when 16-bit vertex fetches are splitted Compute the number of components of the destination vector from the bitsize when eg. a 16-bit vec2 vertex fetches is splitted. This is because the dst will be a v1, so the p_create_vector should be created from two v2b fro both sizes to match. This prevents a regression from the next change which will split typed vertex buffer loads on GFX6 and GFX10+. Cc: mesa-stable Signed-off-by: Samuel Pitoiset <samuel.pitoi...@gmail.com> Reviewed-by: Rhys Perry <pendingchao...@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8363> (cherry picked from commit 68c25370626c9ffb360ed3649627c8cf070a7f2b) --- .pick_status.json | 2 +- src/amd/compiler/aco_instruction_selection.cpp | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index 62df7c8e3b8..a6ee33d800a 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -1894,7 +1894,7 @@ "description": "aco: fix creating the dest vector when 16-bit vertex fetches are splitted", "nominated": true, "nomination_type": 0, - "resolution": 0, + "resolution": 1, "master_sha": null, "because_sha": null }, diff --git a/src/amd/compiler/aco_instruction_selection.cpp b/src/amd/compiler/aco_instruction_selection.cpp index db236f5aced..7c3b492c004 100644 --- a/src/amd/compiler/aco_instruction_selection.cpp +++ b/src/amd/compiler/aco_instruction_selection.cpp @@ -4821,11 +4821,12 @@ void visit_load_input(isel_context *ctx, nir_intrinsic_instr *instr) static const unsigned swizzle_normal[4] = {0, 1, 2, 3}; static const unsigned swizzle_post_shuffle[4] = {2, 1, 0, 3}; const unsigned *swizzle = post_shuffle ? swizzle_post_shuffle : swizzle_normal; + unsigned num_components = instr->dest.ssa.num_components; - aco_ptr<Instruction> vec{create_instruction<Pseudo_instruction>(aco_opcode::p_create_vector, Format::PSEUDO, dst.size(), 1)}; + aco_ptr<Instruction> vec{create_instruction<Pseudo_instruction>(aco_opcode::p_create_vector, Format::PSEUDO, num_components, 1)}; std::array<Temp,NIR_MAX_VEC_COMPONENTS> elems; unsigned num_temp = 0; - for (unsigned i = 0; i < dst.size(); i++) { + for (unsigned i = 0; i < num_components; i++) { unsigned idx = i + component; if (swizzle[idx] < num_channels && channels[swizzle[idx]].id()) { Temp channel = channels[swizzle[idx]]; @@ -4845,9 +4846,9 @@ void visit_load_input(isel_context *ctx, nir_intrinsic_instr *instr) } vec->definitions[0] = Definition(dst); ctx->block->instructions.emplace_back(std::move(vec)); - emit_split_vector(ctx, dst, dst.size()); + emit_split_vector(ctx, dst, num_components); - if (num_temp == dst.size()) + if (num_temp == num_components) ctx->allocated_vec.emplace(dst.id(), elems); } } else if (ctx->shader->info.stage == MESA_SHADER_FRAGMENT) { _______________________________________________ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit