static void brw_gs_ff_sync(struct brw_gs_compile *c, int num_prim) { struct brw_compile *p = &c->func; struct intel_context *intel = &c->func.brw->intel; if (intel->gen < 6) { brw_MOV(p, get_element_ud(c->reg.R0, 1), brw_imm_ud(num_prim)); brw_ff_sync(p, c->reg.R0, 0, c->reg.R0, 1, /* allocate */ 1, /* response length */ 0 /* eot */); } else { brw_MOV(p, retype(c->reg.temp, BRW_REGISTER_TYPE_UD), retype(c->reg.R0, BRW_REGISTER_TYPE_UD)); brw_MOV(p, get_element_ud(c->reg.temp, 1), brw_imm_ud(num_prim)); brw_ff_sync(p, c->reg.temp, 0, c->reg.temp, 1, /* allocate */ 1, /* response length */ 0 /* eot */); brw_MOV(p, get_element_ud(c->reg.R0, 0), get_element_ud(c->reg.temp, 0)); } }
void brw_clip_ff_sync(struct brw_clip_compile *c) { if (c->need_ff_sync) { struct brw_compile *p = &c->func; struct brw_instruction *need_ff_sync; brw_set_conditionalmod(p, BRW_CONDITIONAL_Z); brw_AND(p, brw_null_reg(), c->reg.ff_sync, brw_imm_ud(0x1)); need_ff_sync = brw_IF(p, BRW_EXECUTE_1); { brw_OR(p, c->reg.ff_sync, c->reg.ff_sync, brw_imm_ud(0x1)); brw_ff_sync(p, c->reg.R0, 0, c->reg.R0, 1, 1, /* used */ 1, /* msg length */ 1, /* response length */ 0, /* eot */ 1, /* write compelete */ 0, /* urb offset */ BRW_URB_SWIZZLE_NONE); } brw_ENDIF(p, need_ff_sync); brw_set_predicate_control(p, BRW_PREDICATE_NONE); } }
/** * Send an FF_SYNC message to ensure that all previously spawned GS threads * have finished sending primitives down the pipeline, and to allocate a URB * entry for the first output vertex. Only needed when intel->needs_ff_sync * is true. * * This function modifies c->reg.header: in DWORD 1, it stores num_prim (which * is needed by the FF_SYNC message), and in DWORD 0, it stores the handle to * the allocated URB entry (which will be needed by the URB_WRITE meesage that * follows). */ static void brw_gs_ff_sync(struct brw_gs_compile *c, int num_prim) { struct brw_compile *p = &c->func; brw_MOV(p, get_element_ud(c->reg.header, 1), brw_imm_ud(num_prim)); brw_ff_sync(p, c->reg.temp, 0, c->reg.header, 1, /* allocate */ 1, /* response length */ 0 /* eot */); brw_MOV(p, get_element_ud(c->reg.header, 0), get_element_ud(c->reg.temp, 0)); }
static void brw_gs_ff_sync(struct brw_gs_compile *c, int num_prim) { struct brw_compile *p = &c->func; brw_MOV(p, get_element_ud(c->reg.R0, 1), brw_imm_ud(num_prim)); brw_ff_sync(p, c->reg.R0, 0, c->reg.R0, 1, 1, /* used */ 1, /* msg length */ 1, /* response length */ 0, /* eot */ 1, /* write compelete */ 0, /* urb offset */ BRW_URB_SWIZZLE_NONE); }
void brw_clip_ff_sync(struct brw_clip_compile *c) { struct brw_codegen *p = &c->func; if (p->devinfo->gen == 5) { brw_AND(p, brw_null_reg(), c->reg.ff_sync, brw_imm_ud(0x1)); brw_inst_set_cond_modifier(p->devinfo, brw_last_inst, BRW_CONDITIONAL_Z); brw_IF(p, BRW_EXECUTE_1); { brw_OR(p, c->reg.ff_sync, c->reg.ff_sync, brw_imm_ud(0x1)); brw_ff_sync(p, c->reg.R0, 0, c->reg.R0, 1, /* allocate */ 1, /* response length */ 0 /* eot */); } brw_ENDIF(p); brw_set_default_predicate_control(p, BRW_PREDICATE_NONE); } }
void brw_clip_ff_sync(struct brw_clip_compile *c) { struct brw_compile *p = &c->func; struct brw_context *brw = p->brw; if (brw->gen == 5) { brw_AND(p, brw_null_reg(), c->reg.ff_sync, brw_imm_ud(0x1)); brw_last_inst->header.destreg__conditionalmod = BRW_CONDITIONAL_Z; brw_IF(p, BRW_EXECUTE_1); { brw_OR(p, c->reg.ff_sync, c->reg.ff_sync, brw_imm_ud(0x1)); brw_ff_sync(p, c->reg.R0, 0, c->reg.R0, 1, /* allocate */ 1, /* response length */ 0 /* eot */); } brw_ENDIF(p); brw_set_default_predicate_control(p, BRW_PREDICATE_NONE); } }
void brw_clip_ff_sync(struct brw_clip_compile *c) { struct intel_context *intel = &c->func.brw->intel; if (intel->needs_ff_sync) { struct brw_compile *p = &c->func; brw_set_conditionalmod(p, BRW_CONDITIONAL_Z); brw_AND(p, brw_null_reg(), c->reg.ff_sync, brw_imm_ud(0x1)); brw_IF(p, BRW_EXECUTE_1); { brw_OR(p, c->reg.ff_sync, c->reg.ff_sync, brw_imm_ud(0x1)); brw_ff_sync(p, c->reg.R0, 0, c->reg.R0, 1, /* allocate */ 1, /* response length */ 0 /* eot */); } brw_ENDIF(p); brw_set_predicate_control(p, BRW_PREDICATE_NONE); } }