* Convert Mesa dst register to brw register.
*/
static struct brw_reg get_dst_reg(struct brw_wm_compile *c,
- struct prog_instruction *inst, int component)
+ const struct prog_instruction *inst,
+ GLuint component)
{
const int nr = 1;
return get_reg(c, inst->DstReg.File, inst->DstReg.Index, component, nr,
* Convert Mesa src register to brw register.
*/
static struct brw_reg get_src_reg(struct brw_wm_compile *c,
- struct prog_src_register *src, int index)
+ const struct prog_instruction *inst,
+ GLuint srcRegIndex, GLuint channel)
{
- const int nr = 1;
- int component = GET_SWZ(src->Swizzle, index);
+ const struct prog_src_register *src = &inst->SrcReg[srcRegIndex];
+ const GLuint nr = 1;
+ const GLuint component = GET_SWZ(src->Swizzle, channel);
+
return get_reg(c, src->File, src->Index, component, nr,
src->NegateBase, src->Abs);
}
* For instructions with more than one operand, only the second can be a literal.
*/
static struct brw_reg get_src_reg_imm(struct brw_wm_compile *c,
- struct prog_src_register *src, int index)
+ const struct prog_instruction *inst,
+ GLuint srcRegIndex, GLuint channel)
{
+ const struct prog_src_register *src = &inst->SrcReg[srcRegIndex];
if (src->File == PROGRAM_CONSTANT) {
/* a literal */
- const int component = GET_SWZ(src->Swizzle, index);
+ const int component = GET_SWZ(src->Swizzle, channel);
const GLfloat *param =
c->fp->program.Base.Parameters->ParameterValues[src->Index];
GLfloat value = param[component];
return brw_imm_f(value);
}
else {
- return get_src_reg(c, src, index);
+ return get_src_reg(c, inst, srcRegIndex, channel);
}
}
if (inst->DstReg.WriteMask & (1<<i)) {
struct brw_reg src, dst;
dst = get_dst_reg(c, inst, i);
- src = get_src_reg(c, &inst->SrcReg[0], i);
+ src = get_src_reg(c, inst, 0, i);
brw_MOV(p, dst, brw_abs(src));
}
}
if (mask & (1<<i)) {
struct brw_reg src, dst;
dst = get_dst_reg(c, inst, i);
- src = get_src_reg(c, &inst->SrcReg[0], i);
+ src = get_src_reg(c, inst, 0, i);
brw_RNDZ(p, dst, src);
}
}
if (mask & (1<<i)) {
struct brw_reg src, dst;
dst = get_dst_reg(c, inst, i);
- src = get_src_reg_imm(c, &inst->SrcReg[0], i);
+ src = get_src_reg_imm(c, inst, 0, i);
brw_MOV(p, dst, src);
}
}
dst0 = get_dst_reg(c, inst, 0);
dst1 = get_dst_reg(c, inst, 1);
- src0 = get_src_reg(c, &inst->SrcReg[0], 0);
- src1 = get_src_reg(c, &inst->SrcReg[0], 1);
+ src0 = get_src_reg(c, inst, 0, 0);
+ src1 = get_src_reg(c, inst, 0, 1);
/* Calc delta X,Y by subtracting origin in r1 from the pixel
* centers.
*/
brw_push_insn_state(p);
for (channel = 0; channel < 4; channel++) {
- src0 = get_src_reg(c, &inst->SrcReg[0], channel);
+ src0 = get_src_reg(c, inst, 0, channel);
/* mov (8) m2.0<1>:ud r28.0<8;8,1>:ud { Align1 } */
/* mov (8) m6.0<1>:ud r29.0<8;8,1>:ud { Align1 SecHalf } */
brw_MOV(p, brw_message_reg(nr + channel), src0);
if (c->key.source_depth_to_render_target) {
if (c->key.computes_depth) {
- src0 = get_src_reg(c, &inst->SrcReg[2], 2);
+ src0 = get_src_reg(c, inst, 2, 2);
brw_MOV(p, brw_message_reg(nr), src0);
}
else {
- src0 = get_src_reg(c, &inst->SrcReg[1], 1);
+ src0 = get_src_reg(c, inst, 1, 1);
brw_MOV(p, brw_message_reg(nr), src0);
}
else
#endif
{
- struct brw_reg src = get_src_reg(c, &inst->SrcReg[1], 1);
+ struct brw_reg src = get_src_reg(c, inst, 1, 1);
brw_MOV(p, brw_message_reg(nr), src);
}
nr += 2;
struct brw_reg interp3;
dst = get_dst_reg(c, inst, 3);
- src0 = get_src_reg(c, &inst->SrcReg[0], 0);
- delta0 = get_src_reg(c, &inst->SrcReg[1], 0);
- delta1 = get_src_reg(c, &inst->SrcReg[1], 1);
+ src0 = get_src_reg(c, inst, 0, 0);
+ delta0 = get_src_reg(c, inst, 1, 0);
+ delta1 = get_src_reg(c, inst, 1, 1);
interp3 = brw_vec1_grf(src0.nr+1, 4);
/* Calc 1/w - just linterp wpos[3] optimized by putting the
struct brw_reg src0;
GLuint nr, i;
- src0 = get_src_reg(c, &inst->SrcReg[0], 0);
- delta0 = get_src_reg(c, &inst->SrcReg[1], 0);
- delta1 = get_src_reg(c, &inst->SrcReg[1], 1);
+ src0 = get_src_reg(c, inst, 0, 0);
+ delta0 = get_src_reg(c, inst, 1, 0);
+ delta1 = get_src_reg(c, inst, 1, 1);
nr = src0.nr;
interp[0] = brw_vec1_grf(nr, 0);
struct brw_reg dst, src0;
GLuint nr, i;
- src0 = get_src_reg(c, &inst->SrcReg[0], 0);
+ src0 = get_src_reg(c, inst, 0, 0);
nr = src0.nr;
interp[0] = brw_vec1_grf(nr, 0);
struct brw_reg src0, w;
GLuint nr, i;
- src0 = get_src_reg(c, &inst->SrcReg[0], 0);
- delta0 = get_src_reg(c, &inst->SrcReg[1], 0);
- delta1 = get_src_reg(c, &inst->SrcReg[1], 1);
- w = get_src_reg(c, &inst->SrcReg[2], 3);
+ src0 = get_src_reg(c, inst, 0, 0);
+ delta0 = get_src_reg(c, inst, 1, 0);
+ delta1 = get_src_reg(c, inst, 1, 1);
+ w = get_src_reg(c, inst, 2, 3);
nr = src0.nr;
interp[0] = brw_vec1_grf(nr, 0);
if (mask & (1<<i)) {
struct brw_reg src0, src1, dst;
dst = get_dst_reg(c, inst, i);
- src0 = negate(get_src_reg(c, &inst->SrcReg[0], i2));
- src1 = get_src_reg_imm(c, &inst->SrcReg[1], i1);
+ src0 = negate(get_src_reg(c, inst, 0, i2));
+ src1 = get_src_reg_imm(c, inst, 1, i1);
brw_MUL(p, brw_null_reg(), src0, src1);
- src0 = get_src_reg(c, &inst->SrcReg[0], i1);
- src1 = get_src_reg_imm(c, &inst->SrcReg[1], i2);
+ src0 = get_src_reg(c, inst, 0, i1);
+ src1 = get_src_reg_imm(c, inst, 1, i2);
brw_set_saturate(p, inst->SaturateMode != SATURATE_OFF);
brw_MAC(p, dst, src0, src1);
brw_set_saturate(p, 0);
int i;
struct brw_compile *p = &c->func;
for (i = 0; i < 3; i++) {
- src0[i] = get_src_reg(c, &inst->SrcReg[0], i);
- src1[i] = get_src_reg_imm(c, &inst->SrcReg[1], i);
+ src0[i] = get_src_reg(c, inst, 0, i);
+ src1[i] = get_src_reg_imm(c, inst, 1, i);
}
dst = get_dst_reg(c, inst, get_scalar_dst_index(inst));
int i;
struct brw_compile *p = &c->func;
for (i = 0; i < 4; i++) {
- src0[i] = get_src_reg(c, &inst->SrcReg[0], i);
- src1[i] = get_src_reg_imm(c, &inst->SrcReg[1], i);
+ src0[i] = get_src_reg(c, inst, 0, i);
+ src1[i] = get_src_reg_imm(c, inst, 1, i);
}
dst = get_dst_reg(c, inst, get_scalar_dst_index(inst));
brw_MUL(p, brw_null_reg(), src0[0], src1[0]);
int i;
struct brw_compile *p = &c->func;
for (i = 0; i < 4; i++) {
- src0[i] = get_src_reg(c, &inst->SrcReg[0], i);
- src1[i] = get_src_reg_imm(c, &inst->SrcReg[1], i);
+ src0[i] = get_src_reg(c, inst, 0, i);
+ src1[i] = get_src_reg_imm(c, inst, 1, i);
}
dst = get_dst_reg(c, inst, get_scalar_dst_index(inst));
brw_MUL(p, brw_null_reg(), src0[0], src1[0]);
tmp = alloc_tmp(c);
/* Get first component of source register */
- src0 = get_src_reg(c, &inst->SrcReg[0], 0);
+ src0 = get_src_reg(c, inst, 0, 0);
/* tmp = func(src0) */
brw_MOV(p, brw_message_reg(2), src0);
for (i = 0 ; i < 4; i++) {
if (mask & (1<<i)) {
dst = get_dst_reg(c, inst, i);
- src0 = get_src_reg(c, &inst->SrcReg[0], i);
- src1 = get_src_reg_imm(c, &inst->SrcReg[1], i);
+ src0 = get_src_reg(c, inst, 0, i);
+ src1 = get_src_reg_imm(c, inst, 1, i);
brw_ADD(p, dst, src0, src1);
}
}
brw_set_saturate(p, (inst->SaturateMode != SATURATE_OFF) ? 1 : 0);
addr_reg = brw_uw8_reg(BRW_ARCHITECTURE_REGISTER_FILE,
BRW_ARF_ADDRESS, 0);
- src0 = get_src_reg(c, &inst->SrcReg[0], 0); /* channel 0 */
+ src0 = get_src_reg(c, inst, 0, 0); /* channel 0 */
brw_MOV(p, addr_reg, src0);
brw_set_saturate(p, 0);
}
for (i = 0 ; i < 4; i++) {
if (mask & (1<<i)) {
dst = get_dst_reg(c, inst, i);
- src0 = get_src_reg(c, &inst->SrcReg[0], i);
- src1 = get_src_reg_imm(c, &inst->SrcReg[1], i);
+ src0 = get_src_reg(c, inst, 0, i);
+ src1 = get_src_reg_imm(c, inst, 1, i);
brw_ADD(p, dst, src0, negate(src1));
}
}
for (i = 0 ; i < 4; i++) {
if (mask & (1<<i)) {
dst = get_dst_reg(c, inst, i);
- src0 = get_src_reg(c, &inst->SrcReg[0], i);
- src1 = get_src_reg_imm(c, &inst->SrcReg[1], i);
+ src0 = get_src_reg(c, inst, 0, i);
+ src1 = get_src_reg_imm(c, inst, 1, i);
brw_MUL(p, dst, src0, src1);
}
}
for (i = 0 ; i < 4; i++) {
if (mask & (1<<i)) {
dst = get_dst_reg(c, inst, i);
- src0 = get_src_reg_imm(c, &inst->SrcReg[0], i);
+ src0 = get_src_reg_imm(c, inst, 0, i);
brw_FRC(p, dst, src0);
}
}
for (i = 0 ; i < 4; i++) {
if (mask & (1<<i)) {
dst = get_dst_reg(c, inst, i);
- src0 = get_src_reg_imm(c, &inst->SrcReg[0], i);
+ src0 = get_src_reg_imm(c, inst, 0, i);
brw_RNDD(p, dst, src0);
}
}
for (i = 0; i < 4; i++) {
if (mask & (1<<i)) {
dst = get_dst_reg(c, inst, i);
- src0 = get_src_reg(c, &inst->SrcReg[0], i);
- src1 = get_src_reg_imm(c, &inst->SrcReg[1], i);
+ src0 = get_src_reg(c, inst, 0, i);
+ src1 = get_src_reg_imm(c, inst, 1, i);
brw_set_saturate(p, (inst->SaturateMode != SATURATE_OFF) ? 1 : 0);
brw_MOV(p, dst, src0);
brw_set_saturate(p, 0);
for (i = 0; i < 4; i++) {
if (mask & (1<<i)) {
dst = get_dst_reg(c, inst, i);
- src0 = get_src_reg_imm(c, &inst->SrcReg[0], i);
- src1 = get_src_reg(c, &inst->SrcReg[1], i);
+ src0 = get_src_reg_imm(c, inst, 0, i);
+ src1 = get_src_reg(c, inst, 1, i);
brw_set_saturate(p, (inst->SaturateMode != SATURATE_OFF) ? 1 : 0);
brw_MOV(p, dst, src0);
brw_set_saturate(p, 0);
struct brw_compile *p = &c->func;
struct brw_reg dst, src0, src1;
dst = get_dst_reg(c, inst, get_scalar_dst_index(inst));
- src0 = get_src_reg_imm(c, &inst->SrcReg[0], 0);
- src1 = get_src_reg_imm(c, &inst->SrcReg[1], 0);
+ src0 = get_src_reg_imm(c, inst, 0, 0);
+ src1 = get_src_reg_imm(c, inst, 1, 0);
brw_MOV(p, brw_message_reg(2), src0);
brw_MOV(p, brw_message_reg(3), src1);
for (i = 0; i < 4; i++) {
if (mask & (1<<i)) {
dst = get_dst_reg(c, inst, i);
- src0 = get_src_reg(c, &inst->SrcReg[0], i);
+ src0 = get_src_reg(c, inst, 0, i);
- src1 = get_src_reg_imm(c, &inst->SrcReg[1], i);
+ src1 = get_src_reg_imm(c, inst, 1, i);
if (src1.nr == dst.nr) {
tmp1 = alloc_tmp(c);
} else
tmp1 = src1;
- src2 = get_src_reg(c, &inst->SrcReg[2], i);
+ src2 = get_src_reg(c, inst, 2, i);
if (src2.nr == dst.nr) {
tmp2 = alloc_tmp(c);
brw_MOV(p, tmp2, src2);
for (i = 0; i < 4; i++) {
if (mask & (1<<i)) {
dst = get_dst_reg(c, inst, i);
- src0 = get_src_reg(c, &inst->SrcReg[0], i);
- src1 = get_src_reg_imm(c, &inst->SrcReg[1], i);
- src2 = get_src_reg_imm(c, &inst->SrcReg[2], i);
+ src0 = get_src_reg(c, inst, 0, i);
+ src1 = get_src_reg_imm(c, inst, 1, i);
+ src2 = get_src_reg_imm(c, inst, 2, i);
brw_MUL(p, dst, src0, src1);
brw_set_saturate(p, (inst->SaturateMode != SATURATE_OFF) ? 1 : 0);
for (i = 0; i < 4; i++) {
if (mask & (1<<i)) {
dst = get_dst_reg(c, inst, i);
- src0 = get_src_reg(c, &inst->SrcReg[0], i);
- src1 = get_src_reg_imm(c, &inst->SrcReg[1], i);
+ src0 = get_src_reg(c, inst, 0, i);
+ src1 = get_src_reg_imm(c, inst, 1, i);
brw_push_insn_state(p);
brw_CMP(p, brw_null_reg(), cond, src0, src1);
brw_set_predicate_control(p, BRW_PREDICATE_NONE);
struct brw_reg dst;
struct brw_reg src0, w;
GLuint nr, i;
- src0 = get_src_reg(c, &inst->SrcReg[0], 0);
- w = get_src_reg(c, &inst->SrcReg[1], 3);
+ src0 = get_src_reg(c, inst, 0, 0);
+ w = get_src_reg(c, inst, 1, 3);
nr = src0.nr;
interp[0] = brw_vec1_grf(nr, 0);
interp[1] = brw_vec1_grf(nr, 4);
struct brw_reg src0, w;
GLuint nr, i;
- src0 = get_src_reg(c, &inst->SrcReg[0], 0);
+ src0 = get_src_reg(c, inst, 0, 0);
nr = src0.nr;
- w = get_src_reg(c, &inst->SrcReg[1], 3);
+ w = get_src_reg(c, inst, 1, 3);
interp[0] = brw_vec1_grf(nr, 0);
interp[1] = brw_vec1_grf(nr, 4);
interp[2] = brw_vec1_grf(nr+1, 0);
assert( mark == 0 );
- src = get_src_reg( c, inst->SrcReg, 0 );
+ src = get_src_reg( c, inst, 0, 0 );
param = alloc_tmp( c );
assert( mark == 0 );
- src0 = get_src_reg( c, inst->SrcReg, 0 );
- src1 = get_src_reg( c, inst->SrcReg, 1 );
+ src0 = get_src_reg( c, inst, 0, 0 );
+ src1 = get_src_reg( c, inst, 0, 1 );
param0 = alloc_tmp( c );
param1 = alloc_tmp( c );
assert( mark == 0 );
- src0 = get_src_reg( c, inst->SrcReg, 0 );
- src1 = get_src_reg( c, inst->SrcReg, 1 );
- src2 = get_src_reg( c, inst->SrcReg, 2 );
+ src0 = get_src_reg( c, inst, 0, 0 );
+ src1 = get_src_reg( c, inst, 0, 1 );
+ src2 = get_src_reg( c, inst, 0, 2 );
param0 = alloc_tmp( c );
param1 = alloc_tmp( c );
assert( mark == 0 );
- src0 = get_src_reg( c, inst->SrcReg, 0 );
- src1 = get_src_reg( c, inst->SrcReg, 1 );
- src2 = get_src_reg( c, inst->SrcReg, 2 );
- src3 = get_src_reg( c, inst->SrcReg, 3 );
+ src0 = get_src_reg( c, inst, 0, 0 );
+ src1 = get_src_reg( c, inst, 0, 1 );
+ src2 = get_src_reg( c, inst, 0, 2 );
+ src3 = get_src_reg( c, inst, 0, 3 );
param0 = alloc_tmp( c );
param1 = alloc_tmp( c );
dst[0] = get_dst_reg(c, inst, 0);
dst[1] = get_dst_reg(c, inst, 1);
- src0[0] = get_src_reg(c, &inst->SrcReg[0], 0);
- src0[1] = get_src_reg(c, &inst->SrcReg[0], 1);
+ src0[0] = get_src_reg(c, inst, 0, 0);
+ src0[1] = get_src_reg(c, inst, 0, 1);
/* Calculate the pixel offset from window bottom left into destination
* X and Y channels.
for (i = 0; i < 4; i++)
dst[i] = get_dst_reg(c, inst, i);
for (i = 0; i < 4; i++)
- src[i] = get_src_reg(c, &inst->SrcReg[0], i);
+ src[i] = get_src_reg(c, inst, 0, i);
switch (inst->TexSrcTarget) {
case TEXTURE_1D_INDEX:
for (i = 0; i < 4; i++)
dst[i] = get_dst_reg(c, inst, i);
for (i = 0; i < 4; i++)
- src[i] = get_src_reg(c, &inst->SrcReg[0], i);
+ src[i] = get_src_reg(c, inst, 0, i);
switch (inst->TexSrcTarget) {
case TEXTURE_1D_INDEX: