Exemplo n.º 1
0
void brw_emit_anyprim_setup( struct brw_sf_compile *c )
{
    struct brw_compile *p = &c->func;
    struct brw_reg ip = brw_ip_reg();
    struct brw_reg payload_prim = brw_uw1_reg(BRW_GENERAL_REGISTER_FILE, 1, 0);
    struct brw_reg payload_attr = get_element_ud(brw_vec1_reg(BRW_GENERAL_REGISTER_FILE, 1, 0), 0);
    struct brw_reg primmask;
    struct brw_instruction *jmp;
    struct brw_reg v1_null_ud = vec1(retype(brw_null_reg(), BRW_REGISTER_TYPE_UD));

    GLuint saveflag;

    c->nr_verts = 3;
    alloc_regs(c);

    primmask = retype(get_element(c->tmp, 0), BRW_REGISTER_TYPE_UD);

    brw_MOV(p, primmask, brw_imm_ud(1));
    brw_SHL(p, primmask, primmask, payload_prim);

    brw_set_conditionalmod(p, BRW_CONDITIONAL_Z);
    brw_AND(p, v1_null_ud, primmask, brw_imm_ud((1<<_3DPRIM_TRILIST) |
            (1<<_3DPRIM_TRISTRIP) |
            (1<<_3DPRIM_TRIFAN) |
            (1<<_3DPRIM_TRISTRIP_REVERSE) |
            (1<<_3DPRIM_POLYGON) |
            (1<<_3DPRIM_RECTLIST) |
            (1<<_3DPRIM_TRIFAN_NOSTIPPLE)));
    jmp = brw_JMPI(p, ip, ip, brw_imm_d(0));
    {
        saveflag = p->flag_value;
        brw_push_insn_state(p);
        brw_emit_tri_setup( c, GL_FALSE );
        brw_pop_insn_state(p);
        p->flag_value = saveflag;
        /* note - thread killed in subroutine, so must
         * restore the flag which is changed when building
         * the subroutine. fix #13240
         */
    }
    brw_land_fwd_jump(p, jmp);

    brw_set_conditionalmod(p, BRW_CONDITIONAL_Z);
    brw_AND(p, v1_null_ud, primmask, brw_imm_ud((1<<_3DPRIM_LINELIST) |
            (1<<_3DPRIM_LINESTRIP) |
            (1<<_3DPRIM_LINELOOP) |
            (1<<_3DPRIM_LINESTRIP_CONT) |
            (1<<_3DPRIM_LINESTRIP_BF) |
            (1<<_3DPRIM_LINESTRIP_CONT_BF)));
    jmp = brw_JMPI(p, ip, ip, brw_imm_d(0));
    {
        saveflag = p->flag_value;
        brw_push_insn_state(p);
        brw_emit_line_setup( c, GL_FALSE );
        brw_pop_insn_state(p);
        p->flag_value = saveflag;
        /* note - thread killed in subroutine */
    }
    brw_land_fwd_jump(p, jmp);

    brw_set_conditionalmod(p, BRW_CONDITIONAL_Z);
    brw_AND(p, v1_null_ud, payload_attr, brw_imm_ud(1<<BRW_SPRITE_POINT_ENABLE));
    jmp = brw_JMPI(p, ip, ip, brw_imm_d(0));
    {
        saveflag = p->flag_value;
        brw_push_insn_state(p);
        brw_emit_point_sprite_setup( c, GL_FALSE );
        brw_pop_insn_state(p);
        p->flag_value = saveflag;
    }
    brw_land_fwd_jump(p, jmp);

    brw_emit_point_setup( c, GL_FALSE );
}
Exemplo n.º 2
0
static void compile_sf_prog( struct brw_context *brw,
			     struct brw_sf_prog_key *key )
{
   struct brw_sf_compile c;
   const GLuint *program;
   void *mem_ctx;
   GLuint program_size;

   memset(&c, 0, sizeof(c));

   mem_ctx = ralloc_context(NULL);
   /* Begin the compilation:
    */
   brw_init_compile(brw, &c.func, mem_ctx);

   c.key = *key;
   c.vue_map = brw->vue_map_geom_out;
   if (c.key.do_point_coord) {
      /*
       * gl_PointCoord is a FS instead of VS builtin variable, thus it's
       * not included in c.vue_map generated in VS stage. Here we add
       * it manually to let SF shader generate the needed interpolation
       * coefficient for FS shader.
       */
      c.vue_map.varying_to_slot[BRW_VARYING_SLOT_PNTC] = c.vue_map.num_slots;
      c.vue_map.slot_to_varying[c.vue_map.num_slots++] = BRW_VARYING_SLOT_PNTC;
   }
   c.urb_entry_read_offset = BRW_SF_URB_ENTRY_READ_OFFSET;
   c.nr_attr_regs = (c.vue_map.num_slots + 1)/2 - c.urb_entry_read_offset;
   c.nr_setup_regs = c.nr_attr_regs;

   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");
   }

   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, c.func.store, 0, program_size, stderr);
      fprintf(stderr, "\n");
   }

   brw_upload_cache(&brw->cache, BRW_SF_PROG,
		    &c.key, sizeof(c.key),
		    program, program_size,
		    &c.prog_data, sizeof(c.prog_data),
		    &brw->sf.prog_offset, &brw->sf.prog_data);
   ralloc_free(mem_ctx);
}