+}
+
+static uint32_t
+vir_get_max_temps(struct v3d_compile *c)
+{
+ int max_ip = 0;
+ vir_for_each_inst_inorder(inst, c)
+ max_ip++;
+
+ uint32_t *pressure = rzalloc_array(NULL, uint32_t, max_ip);
+
+ for (int t = 0; t < c->num_temps; t++) {
+ for (int i = c->temp_start[t]; (i < c->temp_end[t] &&
+ i < max_ip); i++) {
+ if (i > max_ip)
+ break;
+ pressure[i]++;
+ }
+ }
+
+ uint32_t max_temps = 0;
+ for (int i = 0; i < max_ip; i++)
+ max_temps = MAX2(max_temps, pressure[i]);
+
+ ralloc_free(pressure);
+
+ return max_temps;
+}
+
+uint64_t *v3d_compile(const struct v3d_compiler *compiler,
+ struct v3d_key *key,
+ struct v3d_prog_data **out_prog_data,
+ nir_shader *s,
+ void (*debug_output)(const char *msg,
+ void *debug_output_data),
+ void *debug_output_data,
+ int program_id, int variant_id,
+ uint32_t *final_assembly_size)
+{
+ struct v3d_prog_data *prog_data;
+ struct v3d_compile *c = vir_compile_init(compiler, key, s,
+ debug_output, debug_output_data,
+ program_id, variant_id);
+
+ switch (c->s->info.stage) {
+ case MESA_SHADER_VERTEX:
+ c->vs_key = (struct v3d_vs_key *)key;
+ prog_data = rzalloc_size(NULL, sizeof(struct v3d_vs_prog_data));
+ break;
+ case MESA_SHADER_GEOMETRY:
+ c->gs_key = (struct v3d_gs_key *)key;
+ prog_data = rzalloc_size(NULL, sizeof(struct v3d_gs_prog_data));
+ break;
+ case MESA_SHADER_FRAGMENT:
+ c->fs_key = (struct v3d_fs_key *)key;
+ prog_data = rzalloc_size(NULL, sizeof(struct v3d_fs_prog_data));
+ break;
+ case MESA_SHADER_COMPUTE:
+ prog_data = rzalloc_size(NULL,
+ sizeof(struct v3d_compute_prog_data));
+ break;
+ default:
+ unreachable("unsupported shader stage");
+ }
+
+
+ switch (c->s->info.stage) {
+ case MESA_SHADER_VERTEX:
+ v3d_nir_lower_vs_early(c);
+ break;
+ case MESA_SHADER_GEOMETRY:
+ v3d_nir_lower_gs_early(c);
+ break;
+ case MESA_SHADER_FRAGMENT:
+ v3d_nir_lower_fs_early(c);
+ break;
+ default:
+ break;
+ }
+
+ v3d_lower_nir(c);
+
+ switch (c->s->info.stage) {
+ case MESA_SHADER_VERTEX:
+ v3d_nir_lower_vs_late(c);
+ break;
+ case MESA_SHADER_GEOMETRY:
+ v3d_nir_lower_gs_late(c);
+ break;
+ case MESA_SHADER_FRAGMENT:
+ v3d_nir_lower_fs_late(c);
+ break;
+ default:
+ break;
+ }
+
+ NIR_PASS_V(c->s, v3d_nir_lower_io, c);
+ NIR_PASS_V(c->s, v3d_nir_lower_txf_ms, c);
+ NIR_PASS_V(c->s, v3d_nir_lower_image_load_store);
+ NIR_PASS_V(c->s, nir_lower_idiv, nir_lower_idiv_fast);