From: Marek Olšák <marek.ol...@amd.com> broken when switched to the new intrinsics. --- src/gallium/drivers/radeonsi/si_shader.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)
diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index ba29661..2c98715 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -6503,32 +6503,35 @@ static void si_init_shader_ctx(struct si_shader_context *ctx, bld_base->op_actions[TGSI_OPCODE_DDX].emit = si_llvm_emit_ddxy; bld_base->op_actions[TGSI_OPCODE_DDY].emit = si_llvm_emit_ddxy; bld_base->op_actions[TGSI_OPCODE_DDX_FINE].emit = si_llvm_emit_ddxy; bld_base->op_actions[TGSI_OPCODE_DDY_FINE].emit = si_llvm_emit_ddxy; bld_base->op_actions[TGSI_OPCODE_EMIT].emit = si_llvm_emit_vertex; bld_base->op_actions[TGSI_OPCODE_ENDPRIM].emit = si_llvm_emit_primitive; bld_base->op_actions[TGSI_OPCODE_BARRIER].emit = si_llvm_emit_barrier; } +#define EXP_TARGET (HAVE_LLVM >= 0x0500 ? 0 : 3) +#define EXP_OUT0 (HAVE_LLVM >= 0x0500 ? 2 : 5) + /* Return true if the PARAM export has been eliminated. */ static bool si_eliminate_const_output(struct si_shader_context *ctx, LLVMValueRef inst, unsigned offset) { struct si_shader *shader = ctx->shader; unsigned num_outputs = shader->selector->info.num_outputs; unsigned i, default_val; /* SPI_PS_INPUT_CNTL_i.DEFAULT_VAL */ bool is_zero[4] = {}, is_one[4] = {}; for (i = 0; i < 4; i++) { LLVMBool loses_info; - LLVMValueRef p = LLVMGetOperand(inst, (HAVE_LLVM >= 0x0500 ? 2 : 5) + i); + LLVMValueRef p = LLVMGetOperand(inst, EXP_OUT0 + i); /* It's a constant expression. Undef outputs are eliminated too. */ if (LLVMIsUndef(p)) { is_zero[i] = true; is_one[i] = true; } else if (LLVMIsAConstantFP(p)) { double a = LLVMConstRealGetDouble(p, &loses_info); if (a == 0) is_zero[i] = true; @@ -6600,24 +6603,24 @@ static void si_eliminate_const_vs_outputs(struct si_shader_context *ctx) if (!lp_is_function(callee)) continue; const char *name = LLVMGetValueName(callee); unsigned num_args = LLVMCountParams(callee); /* Check if this is an export instruction. */ if ((num_args != 9 && num_args != 8) || (strcmp(name, "llvm.SI.export") && - strcmp(name, "llvm.amdgcn.exp."))) + strcmp(name, "llvm.amdgcn.exp.f32"))) continue; - LLVMValueRef arg = LLVMGetOperand(cur, HAVE_LLVM >= 0x0500 ? 0 : 3); + LLVMValueRef arg = LLVMGetOperand(cur, EXP_TARGET); unsigned target = LLVMConstIntGetZExtValue(arg); if (target < V_008DFC_SQ_EXP_PARAM) continue; target -= V_008DFC_SQ_EXP_PARAM; /* Eliminate constant value PARAM exports. */ if (si_eliminate_const_output(ctx, cur, target)) { removed_any = true; @@ -6645,21 +6648,21 @@ static void si_eliminate_const_vs_outputs(struct si_shader_context *ctx) memcpy(current_offset, shader->info.vs_output_param_offset, sizeof(current_offset)); for (i = 0; i < exports.num; i++) { unsigned offset = exports.offset[i]; for (out = 0; out < info->num_outputs; out++) { if (current_offset[out] != offset) continue; - LLVMSetOperand(exports.inst[i], 3, + LLVMSetOperand(exports.inst[i], EXP_TARGET, LLVMConstInt(ctx->i32, V_008DFC_SQ_EXP_PARAM + new_count, 0)); shader->info.vs_output_param_offset[out] = new_count; new_count++; break; } } shader->info.nr_param_exports = new_count; } } -- 2.7.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev