r600g: take into account offset to system inputs at tgsi_interp_egcm()
authorConstantine Charlamov <Hi-Angel@yandex.ru>
Sat, 24 Jun 2017 14:06:48 +0000 (17:06 +0300)
committerDave Airlie <airlied@redhat.com>
Mon, 26 Jun 2017 06:32:36 +0000 (16:32 +1000)
Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=100785
v2: I was too much twiddling whether to initialize nsys_inputs at the beginning of shader initialization or for allocation of system values, and by the time I decided to go with the first one, I forgot to change it back.

Signed-off-by: Constantine Kharlamov <Hi-Angel@yandex.ru>
Signed-off-by: Dave Airlie <airlied@redhat.com>
src/gallium/drivers/r600/r600_shader.c
src/gallium/drivers/r600/r600_shader.h

index 156dba085d2de9d32274d1df8068b0eb69696310..2eb8187341cf096a7360fd552842a14730469348 100644 (file)
@@ -1134,9 +1134,10 @@ static int allocate_system_value_inputs(struct r600_shader_ctx *ctx, int gpr_off
 
                if (enabled) {
                        int gpr = gpr_offset + num_regs++;
+                       ctx->shader->nsys_inputs++;
 
                        // add to inputs, allocate a gpr
-                       k = ctx->shader->ninput ++;
+                       k = ctx->shader->ninput++;
                        ctx->shader->input[k].name = name;
                        ctx->shader->input[k].sid = 0;
                        ctx->shader->input[k].interpolate = TGSI_INTERPOLATE_CONSTANT;
@@ -2945,6 +2946,7 @@ static int r600_shader_from_tgsi(struct r600_context *rctx,
        shader->indirect_files = ctx.info.indirect_files;
 
        shader->uses_doubles = ctx.info.uses_doubles;
+       shader->nsys_inputs = 0;
 
        indirect_gprs = ctx.info.indirect_files & ~((1 << TGSI_FILE_CONSTANT) | (1 << TGSI_FILE_SAMPLER));
        tgsi_parse_init(&ctx.parse, tokens);
@@ -6322,12 +6324,10 @@ static int tgsi_interp_egcm(struct r600_shader_ctx *ctx)
        struct r600_bytecode_alu alu;
        int r, i = 0, k, interp_gpr, interp_base_chan, tmp, lasti;
        unsigned location;
-       int input;
+       const int input = inst->Src[0].Register.Index + ctx->shader->nsys_inputs;
 
        assert(inst->Src[0].Register.File == TGSI_FILE_INPUT);
 
-       input = inst->Src[0].Register.Index;
-
        /* Interpolators have been marked for use already by allocate_system_value_inputs */
        if (inst->Instruction.Opcode == TGSI_OPCODE_INTERP_OFFSET ||
                inst->Instruction.Opcode == TGSI_OPCODE_INTERP_SAMPLE) {
index cfdb0200333f4067800909d79ea99d0bdf511d62..9032d50838322c9ef43b5df426b459448c4a1c7d 100644 (file)
@@ -49,11 +49,11 @@ struct r600_shader_io {
        int                     spi_sid;
        unsigned                interpolate;
        unsigned                ij_index;
-       unsigned        interpolate_location; //  TGSI_INTERPOLATE_LOC_CENTER, CENTROID, SAMPLE
+       unsigned                interpolate_location; //  TGSI_INTERPOLATE_LOC_CENTER, CENTROID, SAMPLE
        unsigned                lds_pos; /* for evergreen */
        unsigned                back_color_input;
        unsigned                write_mask;
-       int                             ring_offset;
+       int                     ring_offset;
 };
 
 struct r600_shader {
@@ -62,6 +62,7 @@ struct r600_shader {
        unsigned                ninput;
        unsigned                noutput;
        unsigned                nlds;
+       unsigned                nsys_inputs;
        struct r600_shader_io   input[64];
        struct r600_shader_io   output[64];
        boolean                 uses_kill;