mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 00:58:05 +02:00
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.pitoiset@gmail.com> Reviewed-by: Rhys Perry <pendingchaos02@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8363>
This commit is contained in:
parent
26ec2c1a04
commit
68c2537062
1 changed files with 5 additions and 4 deletions
|
|
@ -4937,11 +4937,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]];
|
||||
|
|
@ -4961,9 +4962,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) {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue