From 3d466f3e9f76c91083f0cfbb8a76148bdb0d52a3 Mon Sep 17 00:00:00 2001 From: Constantine Charlamov Date: Sat, 24 Jun 2017 17:06:48 +0300 Subject: [PATCH] r600g: take into account offset to system inputs at tgsi_interp_egcm() 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 Signed-off-by: Dave Airlie --- src/gallium/drivers/r600/r600_shader.c | 8 ++++---- src/gallium/drivers/r600/r600_shader.h | 5 +++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/gallium/drivers/r600/r600_shader.c b/src/gallium/drivers/r600/r600_shader.c index 156dba085d2..2eb8187341c 100644 --- a/src/gallium/drivers/r600/r600_shader.c +++ b/src/gallium/drivers/r600/r600_shader.c @@ -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) { diff --git a/src/gallium/drivers/r600/r600_shader.h b/src/gallium/drivers/r600/r600_shader.h index cfdb0200333..9032d508383 100644 --- a/src/gallium/drivers/r600/r600_shader.h +++ b/src/gallium/drivers/r600/r600_shader.h @@ -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; -- 2.30.2