pan/mdg: Implement raw colourbuf loads on T720
[mesa.git] / src / panfrost / midgard / midgard_schedule.c
index 18c36a8d290f7c718a9adacc2b52a2c1b8575d31..59fa830f68bc074d729271f85b5ce1c4fefd168b 100644 (file)
@@ -355,7 +355,8 @@ mir_adjust_constant(midgard_instruction *ins, unsigned src,
                 bool upper)
 {
         unsigned type_size = nir_alu_type_get_type_size(ins->src_types[src]) / 8;
-        unsigned max_comp = 16 / type_size;
+        unsigned type_shift = util_logbase2(type_size);
+        unsigned max_comp = mir_components_for_type(ins->src_types[src]);
         unsigned comp_mask = mir_from_bytemask(mir_round_bytemask_up(
                                 mir_bytemask_of_read_components_index(ins, src),
                                 type_size * 8),
@@ -413,7 +414,7 @@ mir_adjust_constant(midgard_instruction *ins, unsigned src,
 
                 memcpy(&bundle_constants[i], constantp, type_size);
                 *bundle_constant_mask |= type_mask << best_place;
-                comp_mapping[comp] = best_place / type_size;
+                comp_mapping[comp] = best_place >> type_shift;
         }
 
         return true;
@@ -456,9 +457,18 @@ mir_adjust_constants(midgard_instruction *ins,
                 if (ins->src[src] != SSA_FIXED_REGISTER(REGISTER_CONSTANT))
                         continue;
 
-                if (!mir_adjust_constant(ins, src, &bundle_constant_mask,
+                /* First, try lower half (or whole for !16) */
+                if (mir_adjust_constant(ins, src, &bundle_constant_mask,
                                 comp_mapping[src], bundle_constants, false))
-                        return false;
+                        continue;
+
+                /* Next, try upper half */
+                if (mir_adjust_constant(ins, src, &bundle_constant_mask,
+                                comp_mapping[src], bundle_constants, true))
+                        continue;
+
+                /* Otherwise bail */
+                return false;
         }
 
         /* If non-destructive, we're done */