From: Nicolai Hähnle <nicolai.haeh...@amd.com> --- src/gallium/drivers/radeonsi/si_shader.c | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-)
diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index e90d25c..2b030c0 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -3318,23 +3318,25 @@ static void si_export_null(struct lp_build_tgsi_context *bld_base) * v[0:3] = color0.xyzw * v[4:7] = color1.xyzw * ... * vN+0 = Depth * vN+1 = Stencil * vN+2 = SampleMask * vN+3 = SampleMaskIn (used for OpenGL smoothing) * * The alpha-ref SGPR is returned via its original location. */ -static void si_llvm_return_fs_outputs(struct lp_build_tgsi_context *bld_base) +static void si_llvm_return_fs_outputs(struct ac_shader_abi *abi, + unsigned max_outputs, + LLVMValueRef *addrs) { - struct si_shader_context *ctx = si_shader_context(bld_base); + struct si_shader_context *ctx = si_shader_context_from_abi(abi); struct si_shader *shader = ctx->shader; struct tgsi_shader_info *info = &shader->selector->info; LLVMBuilderRef builder = ctx->gallivm.builder; unsigned i, j, first_vgpr, vgpr; LLVMValueRef color[8][4] = {}; LLVMValueRef depth = NULL, stencil = NULL, samplemask = NULL; LLVMValueRef ret; if (ctx->postponed_kill) @@ -3342,51 +3344,52 @@ static void si_llvm_return_fs_outputs(struct lp_build_tgsi_context *bld_base) /* Read the output values. */ for (i = 0; i < info->num_outputs; i++) { unsigned semantic_name = info->output_semantic_name[i]; unsigned semantic_index = info->output_semantic_index[i]; switch (semantic_name) { case TGSI_SEMANTIC_COLOR: assert(semantic_index < 8); for (j = 0; j < 4; j++) { - LLVMValueRef ptr = ctx->outputs[i][j]; + LLVMValueRef ptr = addrs[4 * i + j]; LLVMValueRef result = LLVMBuildLoad(builder, ptr, ""); color[semantic_index][j] = result; } break; case TGSI_SEMANTIC_POSITION: depth = LLVMBuildLoad(builder, - ctx->outputs[i][2], ""); + addrs[4 * i + 2], ""); break; case TGSI_SEMANTIC_STENCIL: stencil = LLVMBuildLoad(builder, - ctx->outputs[i][1], ""); + addrs[4 * i + 1], ""); break; case TGSI_SEMANTIC_SAMPLEMASK: samplemask = LLVMBuildLoad(builder, - ctx->outputs[i][0], ""); + addrs[4 * i + 0], ""); break; default: fprintf(stderr, "Warning: SI unhandled fs output type:%d\n", semantic_name); } } /* Fill the return structure. */ ret = ctx->return_value; /* Set SGPRs. */ ret = LLVMBuildInsertValue(builder, ret, - bitcast(bld_base, TGSI_TYPE_SIGNED, - LLVMGetParam(ctx->main_fn, - SI_PARAM_ALPHA_REF)), + LLVMBuildBitCast(ctx->ac.builder, + LLVMGetParam(ctx->main_fn, + SI_PARAM_ALPHA_REF), + ctx->i32, ""), SI_SGPR_ALPHA_REF, ""); /* Set VGPRs */ first_vgpr = vgpr = SI_SGPR_ALPHA_REF + 1; for (i = 0; i < ARRAY_SIZE(color); i++) { if (!color[i][0]) continue; for (j = 0; j < 4; j++) ret = LLVMBuildInsertValue(builder, ret, color[i][j], vgpr++, ""); @@ -5593,21 +5596,22 @@ static bool si_compile_tgsi_main(struct si_shader_context *ctx, ctx->abi.emit_outputs = si_llvm_emit_vs_epilogue; bld_base->emit_epilogue = si_tgsi_emit_epilogue; } break; case PIPE_SHADER_GEOMETRY: bld_base->emit_fetch_funcs[TGSI_FILE_INPUT] = fetch_input_gs; bld_base->emit_epilogue = si_llvm_emit_gs_epilogue; break; case PIPE_SHADER_FRAGMENT: ctx->load_input = declare_input_fs; - bld_base->emit_epilogue = si_llvm_return_fs_outputs; + ctx->abi.emit_outputs = si_llvm_return_fs_outputs; + bld_base->emit_epilogue = si_tgsi_emit_epilogue; break; case PIPE_SHADER_COMPUTE: ctx->declare_memory_region = declare_compute_memory; break; default: assert(!"Unsupported shader type"); return false; } ctx->abi.load_ubo = load_ubo; -- 2.9.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev