diff --git a/src/panfrost/midgard/compiler.h b/src/panfrost/midgard/compiler.h index fdcd4c7a8bb..1bc93fc441c 100644 --- a/src/panfrost/midgard/compiler.h +++ b/src/panfrost/midgard/compiler.h @@ -554,6 +554,7 @@ v_load_store_scratch( midgard_instruction ins = { .type = TAG_LOAD_STORE_4, .mask = mask, + .dest_type = nir_type_uint32, .dest = ~0, .src = { ~0, ~0, ~0, ~0 }, .swizzle = SWIZZLE_IDENTITY_4, @@ -573,6 +574,7 @@ v_load_store_scratch( if (is_store) { ins.src[0] = srcdest; + ins.src_types[0] = nir_type_uint32; /* Ensure we are tightly swizzled so liveness analysis is * correct */ diff --git a/src/panfrost/midgard/midgard_compile.c b/src/panfrost/midgard/midgard_compile.c index 4a387010981..1d6d4a04fca 100644 --- a/src/panfrost/midgard/midgard_compile.c +++ b/src/panfrost/midgard/midgard_compile.c @@ -1588,8 +1588,10 @@ emit_intrinsic(compiler_context *ctx, nir_intrinsic_instr *instr) ld.load_store.arg_2 = 0x1E; } - for (unsigned c = 2; c < 16; ++c) + for (unsigned c = 4; c < 16; ++c) ld.swizzle[0][c] = 0; + + ld.dest_type = nir_type_float16; } emit_mir_instruction(ctx, ld); diff --git a/src/panfrost/midgard/midgard_opt_perspective.c b/src/panfrost/midgard/midgard_opt_perspective.c index 4af8c45356e..8019246bab0 100644 --- a/src/panfrost/midgard/midgard_opt_perspective.c +++ b/src/panfrost/midgard/midgard_opt_perspective.c @@ -116,7 +116,9 @@ midgard_opt_combine_projection(compiler_context *ctx, midgard_block *block) .type = TAG_LOAD_STORE_4, .mask = ins->mask, .dest = to, + .dest_type = nir_type_float32, .src = { frcp_from, ~0, ~0, ~0 }, + .src_types = { nir_type_float32 }, .swizzle = SWIZZLE_IDENTITY_4, .load_store = { .op = frcp_component == COMPONENT_W ? diff --git a/src/panfrost/midgard/mir.c b/src/panfrost/midgard/mir.c index e77908947ed..9651f12bf65 100644 --- a/src/panfrost/midgard/mir.c +++ b/src/panfrost/midgard/mir.c @@ -440,6 +440,10 @@ mir_flip(midgard_instruction *ins) ins->alu.src1 = ins->alu.src2; ins->alu.src2 = temp; + temp = ins->src_types[0]; + ins->src_types[0] = ins->src_types[1]; + ins->src_types[1] = temp; + unsigned temp_swizzle[16]; memcpy(temp_swizzle, ins->swizzle[0], sizeof(ins->swizzle[0])); memcpy(ins->swizzle[0], ins->swizzle[1], sizeof(ins->swizzle[0]));