- c.prog_data.urb_read_length = c.nr_attr_regs;
- c.prog_data.urb_entry_size = c.nr_setup_regs * 2;
- c.has_flat_shading = brw_any_flat_varyings(&key->interpolation_mode);
-
- /* Which primitive? Or all three?
- */
- switch (key->primitive) {
- case SF_TRIANGLES:
- c.nr_verts = 3;
- brw_emit_tri_setup( &c, true );
- break;
- case SF_LINES:
- c.nr_verts = 2;
- brw_emit_line_setup( &c, true );
- break;
- case SF_POINTS:
- c.nr_verts = 1;
- if (key->do_point_sprite)
- brw_emit_point_sprite_setup( &c, true );
- else
- brw_emit_point_setup( &c, true );
- break;
- case SF_UNFILLED_TRIS:
- c.nr_verts = 3;
- brw_emit_anyprim_setup( &c );
- break;
- default:
- unreachable("not reached");
- }
-
- /* FINISHME: SF programs use calculated jumps (i.e., JMPI with a register
- * source). Compacting would be difficult.
- */
- /* brw_compact_instructions(&c.func, 0, 0, NULL); */
-
- /* get the program
- */
- program = brw_get_program(&c.func, &program_size);
-
- if (unlikely(INTEL_DEBUG & DEBUG_SF)) {
- fprintf(stderr, "sf:\n");
- brw_disassemble(brw->intelScreen->devinfo,
- c.func.store, 0, program_size, stderr);
- fprintf(stderr, "\n");
- }
+ struct brw_sf_prog_data prog_data;
+ program = brw_compile_sf(brw->screen->compiler, mem_ctx, key, &prog_data,
+ &brw->vue_map_geom_out, &program_size);