Am 05.02.2018 um 07:47 schrieb Dave Airlie: > From: Dave Airlie <airl...@redhat.com> > > This has 3 srcs. Depends on how you count :-).
Reviewed-by: Roland Scheidegger <srol...@vmware.com> > > This fixes: > KHR-GL45.shader_atomic_counter_ops_tests.ShaderAtomicCounterOpsExchangeTestCase > > Signed-off-by: Dave Airlie <airl...@redhat.com> > --- > src/gallium/drivers/r600/r600_shader.c | 32 +++++++++++++++++++++++++++++++- > 1 file changed, 31 insertions(+), 1 deletion(-) > > diff --git a/src/gallium/drivers/r600/r600_shader.c > b/src/gallium/drivers/r600/r600_shader.c > index 33eb5accea..4c0d554d1a 100644 > --- a/src/gallium/drivers/r600/r600_shader.c > +++ b/src/gallium/drivers/r600/r600_shader.c > @@ -8698,6 +8698,33 @@ static int tgsi_atomic_op_gds(struct r600_shader_ctx > *ctx) > if (r) > return r; > > + if (gds_op == FETCH_OP_GDS_CMP_XCHG_RET) { > + if (inst->Src[3].Register.File == TGSI_FILE_IMMEDIATE) { > + int value = (ctx->literals[4 * > inst->Src[3].Register.Index + inst->Src[3].Register.SwizzleX]); > + memset(&alu, 0, sizeof(struct r600_bytecode_alu)); > + alu.op = ALU_OP1_MOV; > + alu.dst.sel = ctx->temp_reg; > + alu.dst.chan = is_cm ? 2 : 1; > + alu.src[0].sel = V_SQ_ALU_SRC_LITERAL; > + alu.src[0].value = value; > + alu.last = 1; > + alu.dst.write = 1; > + r = r600_bytecode_add_alu(ctx->bc, &alu); > + if (r) > + return r; > + } else { > + memset(&alu, 0, sizeof(struct r600_bytecode_alu)); > + alu.op = ALU_OP1_MOV; > + alu.dst.sel = ctx->temp_reg; > + alu.dst.chan = is_cm ? 2 : 1; > + r600_bytecode_src(&alu.src[0], &ctx->src[3], 0); > + alu.last = 1; > + alu.dst.write = 1; > + r = r600_bytecode_add_alu(ctx->bc, &alu); > + if (r) > + return r; > + } > + } > if (inst->Src[2].Register.File == TGSI_FILE_IMMEDIATE) { > int value = (ctx->literals[4 * inst->Src[2].Register.Index + > inst->Src[2].Register.SwizzleX]); > int abs_value = abs(value); > @@ -8737,7 +8764,10 @@ static int tgsi_atomic_op_gds(struct r600_shader_ctx > *ctx) > gds.src_gpr2 = 0; > gds.src_sel_x = is_cm ? 0 : 4; > gds.src_sel_y = is_cm ? 1 : 0; > - gds.src_sel_z = 7; > + if (gds_op == FETCH_OP_GDS_CMP_XCHG_RET) > + gds.src_sel_z = is_cm ? 2 : 1; > + else > + gds.src_sel_z = 7; > gds.dst_sel_x = 0; > gds.dst_sel_y = 7; > gds.dst_sel_z = 7; > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev