static struct ureg_src decl_immediate( struct ureg_program *ureg, const unsigned *v, unsigned nr, unsigned type ) { unsigned i, j; unsigned swizzle = 0; /* Could do a first pass where we examine all existing immediates * without expanding. */ for (i = 0; i < ureg->nr_immediates; i++) { if (ureg->immediate[i].type != type) { continue; } if (match_or_expand_immediate(v, nr, ureg->immediate[i].value.u, &ureg->immediate[i].nr, &swizzle)) { goto out; } } if (ureg->nr_immediates < UREG_MAX_IMMEDIATE) { i = ureg->nr_immediates++; ureg->immediate[i].type = type; if (match_or_expand_immediate(v, nr, ureg->immediate[i].value.u, &ureg->immediate[i].nr, &swizzle)) { goto out; } } set_bad(ureg); out: /* Make sure that all referenced elements are from this immediate. * Has the effect of making size-one immediates into scalars. */ for (j = nr; j < 4; j++) { swizzle |= (swizzle & 0x3) << (j * 2); } return ureg_swizzle(ureg_src_register(TGSI_FILE_IMMEDIATE, i), (swizzle >> 0) & 0x3, (swizzle >> 2) & 0x3, (swizzle >> 4) & 0x3, (swizzle >> 6) & 0x3); }
/* Internally generated immediates: overkill... */ static struct brw_fp_src src_imm( struct brw_wm_compile *c, const GLfloat *v, unsigned nr) { unsigned i, j; unsigned swizzle; /* Could do a first pass where we examine all existing immediates * without expanding. */ for (i = 0; i < c->nr_immediates; i++) { if (match_or_expand_immediate( v, nr, c->immediate[i].v, &c->immediate[i].nr, &swizzle )) goto out; } if (c->nr_immediates < Elements(c->immediate)) { i = c->nr_immediates++; if (match_or_expand_immediate( v, nr, c->immediate[i].v, &c->immediate[i].nr, &swizzle )) goto out; } c->error = 1; return src_undef(); out: /* Make sure that all referenced elements are from this immediate. * Has the effect of making size-one immediates into scalars. */ for (j = nr; j < 4; j++) swizzle |= (swizzle & 0x3) << (j * 2); return src_swizzle( src_reg( TGSI_FILE_IMMEDIATE, i ), BRW_GET_SWZ(swizzle, X), BRW_GET_SWZ(swizzle, Y), BRW_GET_SWZ(swizzle, Z), BRW_GET_SWZ(swizzle, W) ); }