+ return outputs_written;
+}
+
+static void
+brw_vs_debug_recompile(struct brw_context *brw, struct gl_program *prog,
+ const struct brw_vs_prog_key *key)
+{
+ perf_debug("Recompiling vertex shader for program %d\n", prog->Id);
+
+ bool found = false;
+ const struct brw_vs_prog_key *old_key =
+ brw_find_previous_compile(&brw->cache, BRW_CACHE_VS_PROG,
+ key->program_string_id);
+
+ if (!old_key) {
+ perf_debug(" Didn't find previous compile in the shader cache for "
+ "debug\n");
+ return;
+ }
+
+ for (unsigned int i = 0; i < VERT_ATTRIB_MAX; i++) {
+ found |= key_debug(brw, "Vertex attrib w/a flags",
+ old_key->gl_attrib_wa_flags[i],
+ key->gl_attrib_wa_flags[i]);
+ }
+
+ found |= key_debug(brw, "legacy user clipping",
+ old_key->nr_userclip_plane_consts,
+ key->nr_userclip_plane_consts);
+
+ found |= key_debug(brw, "copy edgeflag",
+ old_key->copy_edgeflag, key->copy_edgeflag);
+ found |= key_debug(brw, "PointCoord replace",
+ old_key->point_coord_replace, key->point_coord_replace);
+ found |= key_debug(brw, "vertex color clamping",
+ old_key->clamp_vertex_color, key->clamp_vertex_color);
+
+ found |= brw_debug_recompile_sampler_key(brw, &old_key->tex, &key->tex);
+
+ if (!found) {
+ perf_debug(" Something else\n");
+ }
+}
+
+static bool
+brw_codegen_vs_prog(struct brw_context *brw,
+ struct brw_program *vp,
+ struct brw_vs_prog_key *key)
+{
+ const struct brw_compiler *compiler = brw->screen->compiler;
+ const struct gen_device_info *devinfo = &brw->screen->devinfo;
+ const GLuint *program;
+ struct brw_vs_prog_data prog_data;
+ struct brw_stage_prog_data *stage_prog_data = &prog_data.base.base;
+ void *mem_ctx;
+ bool start_busy = false;
+ double start_time = 0;
+
+ memset(&prog_data, 0, sizeof(prog_data));
+
+ /* Use ALT floating point mode for ARB programs so that 0^0 == 1. */
+ if (vp->program.is_arb_asm)
+ stage_prog_data->use_alt_mode = true;
+
+ mem_ctx = ralloc_context(NULL);
+
+ brw_assign_common_binding_table_offsets(devinfo, &vp->program,
+ &prog_data.base.base, 0);
+
+ if (!vp->program.is_arb_asm) {
+ brw_nir_setup_glsl_uniforms(mem_ctx, vp->program.nir, &vp->program,
+ &prog_data.base.base,
+ compiler->scalar_stage[MESA_SHADER_VERTEX]);
+ brw_nir_analyze_ubo_ranges(compiler, vp->program.nir,
+ prog_data.base.base.ubo_ranges);
+ } else {
+ brw_nir_setup_arb_uniforms(mem_ctx, vp->program.nir, &vp->program,
+ &prog_data.base.base);
+ }
+
+ uint64_t outputs_written =
+ brw_vs_outputs_written(brw, key, vp->program.nir->info.outputs_written);
+
+ brw_compute_vue_map(devinfo,