From: Hi-Angel <hi-an...@yandex.ru>

The diff might be confusing: the assignment of last_chan and comparison with
last_chan are actually in different cycles.

Signed-off-by: Constantine Charlamov <hi-an...@yandex.ru>
---
 src/gallium/drivers/r600/r600_shader.c | 21 ++++++++++++---------
 1 file changed, 12 insertions(+), 9 deletions(-)

diff --git a/src/gallium/drivers/r600/r600_shader.c 
b/src/gallium/drivers/r600/r600_shader.c
index 972e013aef..3616de572b 100644
--- a/src/gallium/drivers/r600/r600_shader.c
+++ b/src/gallium/drivers/r600/r600_shader.c
@@ -2673,7 +2673,7 @@ static int r600_store_tcs_output(struct r600_shader_ctx 
*ctx)
 {
        struct tgsi_full_instruction *inst = 
&ctx->parse.FullToken.FullInstruction;
        const struct tgsi_full_dst_register *dst = &inst->Dst[0];
-       int chan_index, r, lasti;
+       int chan_index, r;
        int temp_reg = r600_get_temp(ctx);
        struct r600_bytecode_alu alu;
        unsigned write_mask = dst->Register.WriteMask;
@@ -2692,8 +2692,7 @@ static int r600_store_tcs_output(struct r600_shader_ctx 
*ctx)
                return r;
 
        /* LDS write */
-       lasti = tgsi_last_channel(write_mask);
-       for (chan_index = 1; chan_index <= lasti; chan_index++) {
+       for (chan_index = 1; chan_index < TGSI_NUM_CHANNELS; chan_index++) {
                if(!TGSI_IS_DST0_CHANNEL_ENABLED(inst, chan_index))
                        continue;
                r = single_alu_op2(ctx, ALU_OP2_ADD_INT,
@@ -4277,10 +4276,11 @@ static int cayman_mul_int_instr(struct r600_shader_ctx 
*ctx)
        struct tgsi_full_instruction *inst = 
&ctx->parse.FullToken.FullInstruction;
        int chan_index, j, k, r;
        struct r600_bytecode_alu alu;
-       int lasti = tgsi_last_channel(inst->Dst[0].Register.WriteMask);
+       int last_chan;
        int t1 = ctx->temp_reg;
 
        TGSI_FOR_EACH_DST0_ENABLED_CHANNEL(inst, k) {
+               last_chan = k;
                TGSI_FOR_EACH_CHANNEL(chan_index) {
                        memset(&alu, 0, sizeof(struct r600_bytecode_alu));
                        alu.op = ctx->inst_info->op;
@@ -4305,7 +4305,7 @@ static int cayman_mul_int_instr(struct r600_shader_ctx 
*ctx)
                alu.src[0].chan = chan_index;
                tgsi_dst(ctx, &inst->Dst[0], chan_index, &alu.dst);
                alu.dst.write = 1;
-               if (chan_index == lasti)
+               if (chan_index == last_chan)
                        alu.last = 1;
                r = r600_bytecode_add_alu(ctx->bc, &alu);
                if (r)
@@ -4321,7 +4321,7 @@ static int cayman_mul_double_instr(struct r600_shader_ctx 
*ctx)
        struct tgsi_full_instruction *inst = 
&ctx->parse.FullToken.FullInstruction;
        int chan_index, j, k, r;
        struct r600_bytecode_alu alu;
-       int lasti = tgsi_last_channel(inst->Dst[0].Register.WriteMask);
+       int last_chan;
        int t1 = ctx->temp_reg;
 
        /* t1 would get overwritten below if we actually tried to
@@ -4332,6 +4332,8 @@ static int cayman_mul_double_instr(struct r600_shader_ctx 
*ctx)
        k = inst->Dst[0].Register.WriteMask == TGSI_WRITEMASK_XY ? 0 : 1;
 
        TGSI_FOR_EACH_CHANNEL (chan_index) {
+               if (TGSI_IS_DST0_CHANNEL_ENABLED(inst, chan_index))
+                       last_chan = chan_index;
                memset(&alu, 0, sizeof(struct r600_bytecode_alu));
                alu.op = ctx->inst_info->op;
                for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
@@ -4354,7 +4356,7 @@ static int cayman_mul_double_instr(struct r600_shader_ctx 
*ctx)
                alu.src[0].chan = chan_index;
                tgsi_dst(ctx, &inst->Dst[0], chan_index, &alu.dst);
                alu.dst.write = 1;
-               if (chan_index == lasti)
+               if (chan_index == last_chan)
                        alu.last = 1;
                r = r600_bytecode_add_alu(ctx->bc, &alu);
                if (r)
@@ -8795,10 +8797,11 @@ static int tgsi_umad(struct r600_shader_ctx *ctx)
        struct tgsi_full_instruction *inst = 
&ctx->parse.FullToken.FullInstruction;
        struct r600_bytecode_alu alu;
        int chan_index, j, k, r;
-       int lasti = tgsi_last_channel(inst->Dst[0].Register.WriteMask);
+       int last_chan;
 
        /* src0 * src1 */
        TGSI_FOR_EACH_DST0_ENABLED_CHANNEL(inst, chan_index) {
+               last_chan = chan_index;
                if (ctx->bc->chip_class == CAYMAN) {
                        for (j = 0 ; j < 4; j++) {
                                memset(&alu, 0, sizeof(struct 
r600_bytecode_alu));
@@ -8846,7 +8849,7 @@ static int tgsi_umad(struct r600_shader_ctx *ctx)
                alu.src[0].chan = chan_index;
 
                r600_bytecode_src(&alu.src[1], &ctx->src[2], chan_index);
-               if (chan_index == lasti) {
+               if (chan_index == last_chan) {
                        alu.last = 1;
                }
                r = r600_bytecode_add_alu(ctx->bc, &alu);
-- 
2.11.1

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to